From 2942aaf84380b86ff4b51fbe3359828d3afd91f0 Mon Sep 17 00:00:00 2001 From: Mayssoun Kh Date: Tue, 22 Jul 2025 21:42:22 +0300 Subject: [PATCH 1/2] Transaction Data Augmentation for TimeSeries using TimeGAN --- .history/data_loading_20250718171958.py | 115 + .history/data_loading_20250720214845.py | 150 + .history/data_loading_20250720214932.py | 151 + .history/data_loading_20250720214935.py | 152 + .history/data_loading_20250720214938.py | 152 + .history/data_loading_20250720215020.py | 152 + .history/data_loading_20250720215023.py | 152 + .history/data_loading_20250720215024.py | 152 + .history/data_loading_20250720215026.py | 152 + .history/data_loading_20250721232454.py | 152 + .history/data_loading_20250721232501.py | 152 + .history/data_loading_20250721232506.py | 153 + .history/data_loading_20250721232510.py | 153 + .history/data_loading_20250721232512.py | 153 + .history/data_loading_20250721232516.py | 153 + .history/data_loading_20250721232520.py | 153 + .history/data_loading_20250721232527.py | 153 + .history/data_loading_20250721232535.py | 155 + .history/data_loading_20250721232536.py | 155 + .history/data_loading_20250721232539.py | 155 + .history/data_loading_20250721232541.py | 155 + .history/data_loading_20250721232544.py | 155 + .history/data_loading_20250721233459.py | 156 + .history/data_loading_20250721233806.py | 157 + .history/data_loading_20250721233903.py | 158 + .history/data_loading_20250721233904.py | 163 + .history/data_loading_20250721233907.py | 164 + .history/data_loading_20250721233926.py | 164 + .history/data_loading_20250721233930.py | 165 + .history/data_loading_20250721233931.py | 169 + .history/data_loading_20250721233933.py | 169 + .history/data_loading_20250721233957.py | 170 + .history/data_loading_20250721233959.py | 171 + .history/data_loading_20250721234003.py | 170 + .history/data_loading_20250721234008.py | 172 + .history/data_loading_20250721234011.py | 173 + .history/data_loading_20250721234012.py | 173 + .history/data_loading_20250721234014.py | 174 + .history/data_loading_20250721234016.py | 174 + .history/data_loading_20250721234354.py | 174 + .history/data_loading_20250721234355.py | 178 + .history/data_loading_20250721234400.py | 178 + .history/data_loading_20250721234621.py | 178 + .history/data_loading_20250721234622.py | 178 + .history/data_loading_20250721234625.py | 178 + .history/data_loading_20250721234649.py | 180 + .history/data_loading_20250721234704.py | 187 + .history/data_loading_20250721234706.py | 187 + .history/data_loading_20250721234710.py | 187 + .history/data_loading_20250721234711.py | 187 + .history/data_loading_20250722135220.py | 187 + .history/data_loading_20250722135224.py | 187 + .history/data_loading_20250722135235.py | 189 + .history/data_loading_20250722135238.py | 189 + .history/data_loading_20250722135241.py | 189 + .history/data_loading_20250722135243.py | 189 + ...l_usable_synthetic_data_20250722175139.csv | 361 ++ ...l_usable_synthetic_data_20250722175933.csv | 361 ++ .history/main_timegan_20250718171958.py | 163 + .history/main_timegan_20250720213959.py | 164 + .history/main_timegan_20250720214003.py | 164 + .history/main_timegan_20250720214005.py | 164 + .history/main_timegan_20250720214010.py | 164 + .history/main_timegan_20250720214013.py | 164 + .history/main_timegan_20250720214015.py | 164 + .history/main_timegan_20250720214017.py | 164 + .history/main_timegan_20250720214022.py | 164 + .history/main_timegan_20250720214026.py | 164 + .history/main_timegan_20250720214030.py | 164 + .history/main_timegan_20250720215121.py | 163 + .history/main_timegan_20250720215124.py | 163 + .history/main_timegan_20250721232343.py | 164 + .history/main_timegan_20250721232345.py | 164 + .history/main_timegan_20250721232346.py | 164 + .history/main_timegan_20250721232348.py | 164 + .history/main_timegan_20250721232351.py | 164 + .history/main_timegan_20250721233037.py | 164 + .history/main_timegan_20250721233038.py | 164 + .history/main_timegan_20250721233418.py | 164 + .history/main_timegan_20250721233420.py | 164 + .history/main_timegan_20250722014100.py | 164 + .history/main_timegan_20250722014104.py | 164 + .history/main_timegan_20250722014118.py | 164 + .history/main_timegan_20250722014142.py | 164 + .history/main_timegan_20250722014157.py | 164 + .history/main_timegan_20250722115131.py | 164 + .history/main_timegan_20250722130555.py | 178 + .history/main_timegan_20250722130558.py | 178 + .history/main_timegan_20250722130610.py | 178 + .history/main_timegan_20250722130613.py | 178 + .history/main_timegan_20250722130615.py | 178 + .history/main_timegan_20250722130622.py | 178 + .history/main_timegan_20250722130625.py | 178 + .history/main_timegan_20250722130628.py | 178 + .history/main_timegan_20250722130630.py | 178 + .history/main_timegan_20250722130633.py | 177 + .history/main_timegan_20250722130636.py | 178 + .history/main_timegan_20250722130637.py | 178 + .history/main_timegan_20250722130638.py | 178 + .history/main_timegan_20250722130641.py | 178 + .history/main_timegan_20250722130706.py | 178 + .history/main_timegan_20250722130749.py | 165 + .history/main_timegan_20250722130802.py | 180 + .history/main_timegan_20250722130806.py | 180 + .history/main_timegan_20250722130812.py | 179 + .history/main_timegan_20250722130823.py | 179 + .history/main_timegan_20250722130824.py | 179 + .history/main_timegan_20250722130825.py | 179 + .history/main_timegan_20250722130832.py | 179 + .history/main_timegan_20250722131007.py | 179 + .history/main_timegan_20250722131017.py | 179 + .history/main_timegan_20250722131649.py | 179 + .history/main_timegan_20250722142006.py | 179 + .history/main_timegan_20250722142017.py | 179 + .history/main_timegan_20250722142018.py | 179 + .history/main_timegan_20250722142046.py | 179 + .history/main_timegan_20250722142053.py | 179 + .history/main_timegan_20250722142059.py | 179 + .history/main_timegan_20250722142103.py | 179 + .history/main_timegan_20250722142317.py | 179 + .history/main_timegan_20250722142322.py | 179 + .history/main_timegan_20250722142327.py | 179 + .history/main_timegan_20250722154118.py | 179 + .history/main_timegan_20250722154121.py | 179 + .history/main_timegan_20250722154123.py | 179 + .history/main_timegan_20250722154129.py | 179 + .history/main_timegan_20250722174053.py | 179 + .../discriminative_metrics_20250718171958.py | 129 + .../discriminative_metrics_20250720215721.py | 131 + .../discriminative_metrics_20250720220419.py | 131 + .../discriminative_metrics_20250720234927.py | 131 + .../discriminative_metrics_20250720234930.py | 131 + .../predictive_metrics_20250718171958.py | 123 + .../predictive_metrics_20250720215649.py | 125 + .../predictive_metrics_20250720220409.py | 125 + .../predictive_metrics_20250720234918.py | 125 + .../predictive_metrics_20250720234920.py | 125 + .../process_synthetic_data_20250722134015.py | 0 .../process_synthetic_data_20250722134039.py | 94 + .../process_synthetic_data_20250722134104.py | 95 + .../process_synthetic_data_20250722134106.py | 95 + .../process_synthetic_data_20250722134114.py | 95 + .../process_synthetic_data_20250722134343.py | 95 + .../process_synthetic_data_20250722134400.py | 95 + .../process_synthetic_data_20250722135144.py | 94 + .../process_synthetic_data_20250722135350.py | 100 + .../process_synthetic_data_20250722154011.py | 119 + .../process_synthetic_data_20250722154019.py | 125 + .../process_synthetic_data_20250722174102.py | 124 + .../process_synthetic_data_20250722174114.py | 124 + .../process_synthetic_data_20250722174117.py | 124 + .../process_synthetic_data_20250722174430.py | 123 + .../process_synthetic_data_20250722174532.py | 123 + .../process_synthetic_data_20250722174749.py | 93 + .../process_synthetic_data_20250722175136.py | 88 + .../process_synthetic_data_20250722180039.py | 88 + .../process_synthetic_data_20250722180359.py | 110 + .../process_synthetic_data_20250722181058.py | 100 + .../process_synthetic_data_20250722182917.py | 30 + .../process_synthetic_data_20250722182919.py | 104 + .history/requirements_20250718171958.txt | 8 + .history/requirements_20250720223149.txt | 7 + .history/requirements_20250720223155.txt | 6 + .history/requirements_20250720223158.txt | 5 + .history/requirements_20250720223201.txt | 2 + .history/requirements_20250720223207.txt | 1 + .history/requirements_20250720223211.txt | 1 + .history/timegan_20250718171958.py | 307 ++ .history/timegan_20250720215623.py | 308 ++ .history/timegan_20250720220354.py | 308 ++ .history/timegan_20250720220358.py | 308 ++ .history/timegan_20250720234909.py | 308 ++ .history/timegan_20250720234913.py | 308 ++ .history/timegan_20250722141910.py | 308 ++ .history/timegan_20250722154054.py | 309 ++ .history/utils_20250718171958.py | 145 + .history/utils_20250720215736.py | 147 + .history/utils_20250720220426.py | 147 + .history/utils_20250720234935.py | 147 + .history/utils_20250720234939.py | 147 + __pycache__/data_loading.cpython-312.pyc | Bin 0 -> 5104 bytes __pycache__/data_loading.cpython-37.pyc | Bin 0 -> 3957 bytes __pycache__/timegan.cpython-310.pyc | Bin 0 -> 9111 bytes __pycache__/timegan.cpython-312.pyc | Bin 0 -> 17473 bytes __pycache__/timegan.cpython-313.pyc | Bin 0 -> 17148 bytes __pycache__/timegan.cpython-37.pyc | Bin 0 -> 9718 bytes __pycache__/utils.cpython-312.pyc | Bin 0 -> 6409 bytes __pycache__/utils.cpython-37.pyc | Bin 0 -> 5051 bytes data/transaction_data.csv | 361 ++ data_loading.py | 78 +- final_usable_synthetic_data.csv | 361 ++ main_timegan.py | 38 +- .../discriminative_metrics.cpython-312.pyc | Bin 0 -> 6703 bytes .../discriminative_metrics.cpython-37.pyc | Bin 0 -> 4002 bytes .../predictive_metrics.cpython-312.pyc | Bin 0 -> 7398 bytes .../predictive_metrics.cpython-37.pyc | Bin 0 -> 4361 bytes .../visualization_metrics.cpython-312.pyc | Bin 0 -> 4776 bytes .../visualization_metrics.cpython-37.pyc | Bin 0 -> 2848 bytes metrics/discriminative_metrics.py | 4 +- metrics/predictive_metrics.py | 6 +- process_synthetic_data.py | 104 + requirements.txt | 9 +- synthetic_data.csv | 4189 +++++++++++++++++ timegan.py | 18 +- utils.py | 6 +- 205 files changed, 33792 insertions(+), 34 deletions(-) create mode 100644 .history/data_loading_20250718171958.py create mode 100644 .history/data_loading_20250720214845.py create mode 100644 .history/data_loading_20250720214932.py create mode 100644 .history/data_loading_20250720214935.py create mode 100644 .history/data_loading_20250720214938.py create mode 100644 .history/data_loading_20250720215020.py create mode 100644 .history/data_loading_20250720215023.py create mode 100644 .history/data_loading_20250720215024.py create mode 100644 .history/data_loading_20250720215026.py create mode 100644 .history/data_loading_20250721232454.py create mode 100644 .history/data_loading_20250721232501.py create mode 100644 .history/data_loading_20250721232506.py create mode 100644 .history/data_loading_20250721232510.py create mode 100644 .history/data_loading_20250721232512.py create mode 100644 .history/data_loading_20250721232516.py create mode 100644 .history/data_loading_20250721232520.py create mode 100644 .history/data_loading_20250721232527.py create mode 100644 .history/data_loading_20250721232535.py create mode 100644 .history/data_loading_20250721232536.py create mode 100644 .history/data_loading_20250721232539.py create mode 100644 .history/data_loading_20250721232541.py create mode 100644 .history/data_loading_20250721232544.py create mode 100644 .history/data_loading_20250721233459.py create mode 100644 .history/data_loading_20250721233806.py create mode 100644 .history/data_loading_20250721233903.py create mode 100644 .history/data_loading_20250721233904.py create mode 100644 .history/data_loading_20250721233907.py create mode 100644 .history/data_loading_20250721233926.py create mode 100644 .history/data_loading_20250721233930.py create mode 100644 .history/data_loading_20250721233931.py create mode 100644 .history/data_loading_20250721233933.py create mode 100644 .history/data_loading_20250721233957.py create mode 100644 .history/data_loading_20250721233959.py create mode 100644 .history/data_loading_20250721234003.py create mode 100644 .history/data_loading_20250721234008.py create mode 100644 .history/data_loading_20250721234011.py create mode 100644 .history/data_loading_20250721234012.py create mode 100644 .history/data_loading_20250721234014.py create mode 100644 .history/data_loading_20250721234016.py create mode 100644 .history/data_loading_20250721234354.py create mode 100644 .history/data_loading_20250721234355.py create mode 100644 .history/data_loading_20250721234400.py create mode 100644 .history/data_loading_20250721234621.py create mode 100644 .history/data_loading_20250721234622.py create mode 100644 .history/data_loading_20250721234625.py create mode 100644 .history/data_loading_20250721234649.py create mode 100644 .history/data_loading_20250721234704.py create mode 100644 .history/data_loading_20250721234706.py create mode 100644 .history/data_loading_20250721234710.py create mode 100644 .history/data_loading_20250721234711.py create mode 100644 .history/data_loading_20250722135220.py create mode 100644 .history/data_loading_20250722135224.py create mode 100644 .history/data_loading_20250722135235.py create mode 100644 .history/data_loading_20250722135238.py create mode 100644 .history/data_loading_20250722135241.py create mode 100644 .history/data_loading_20250722135243.py create mode 100644 .history/final_usable_synthetic_data_20250722175139.csv create mode 100644 .history/final_usable_synthetic_data_20250722175933.csv create mode 100644 .history/main_timegan_20250718171958.py create mode 100644 .history/main_timegan_20250720213959.py create mode 100644 .history/main_timegan_20250720214003.py create mode 100644 .history/main_timegan_20250720214005.py create mode 100644 .history/main_timegan_20250720214010.py create mode 100644 .history/main_timegan_20250720214013.py create mode 100644 .history/main_timegan_20250720214015.py create mode 100644 .history/main_timegan_20250720214017.py create mode 100644 .history/main_timegan_20250720214022.py create mode 100644 .history/main_timegan_20250720214026.py create mode 100644 .history/main_timegan_20250720214030.py create mode 100644 .history/main_timegan_20250720215121.py create mode 100644 .history/main_timegan_20250720215124.py create mode 100644 .history/main_timegan_20250721232343.py create mode 100644 .history/main_timegan_20250721232345.py create mode 100644 .history/main_timegan_20250721232346.py create mode 100644 .history/main_timegan_20250721232348.py create mode 100644 .history/main_timegan_20250721232351.py create mode 100644 .history/main_timegan_20250721233037.py create mode 100644 .history/main_timegan_20250721233038.py create mode 100644 .history/main_timegan_20250721233418.py create mode 100644 .history/main_timegan_20250721233420.py create mode 100644 .history/main_timegan_20250722014100.py create mode 100644 .history/main_timegan_20250722014104.py create mode 100644 .history/main_timegan_20250722014118.py create mode 100644 .history/main_timegan_20250722014142.py create mode 100644 .history/main_timegan_20250722014157.py create mode 100644 .history/main_timegan_20250722115131.py create mode 100644 .history/main_timegan_20250722130555.py create mode 100644 .history/main_timegan_20250722130558.py create mode 100644 .history/main_timegan_20250722130610.py create mode 100644 .history/main_timegan_20250722130613.py create mode 100644 .history/main_timegan_20250722130615.py create mode 100644 .history/main_timegan_20250722130622.py create mode 100644 .history/main_timegan_20250722130625.py create mode 100644 .history/main_timegan_20250722130628.py create mode 100644 .history/main_timegan_20250722130630.py create mode 100644 .history/main_timegan_20250722130633.py create mode 100644 .history/main_timegan_20250722130636.py create mode 100644 .history/main_timegan_20250722130637.py create mode 100644 .history/main_timegan_20250722130638.py create mode 100644 .history/main_timegan_20250722130641.py create mode 100644 .history/main_timegan_20250722130706.py create mode 100644 .history/main_timegan_20250722130749.py create mode 100644 .history/main_timegan_20250722130802.py create mode 100644 .history/main_timegan_20250722130806.py create mode 100644 .history/main_timegan_20250722130812.py create mode 100644 .history/main_timegan_20250722130823.py create mode 100644 .history/main_timegan_20250722130824.py create mode 100644 .history/main_timegan_20250722130825.py create mode 100644 .history/main_timegan_20250722130832.py create mode 100644 .history/main_timegan_20250722131007.py create mode 100644 .history/main_timegan_20250722131017.py create mode 100644 .history/main_timegan_20250722131649.py create mode 100644 .history/main_timegan_20250722142006.py create mode 100644 .history/main_timegan_20250722142017.py create mode 100644 .history/main_timegan_20250722142018.py create mode 100644 .history/main_timegan_20250722142046.py create mode 100644 .history/main_timegan_20250722142053.py create mode 100644 .history/main_timegan_20250722142059.py create mode 100644 .history/main_timegan_20250722142103.py create mode 100644 .history/main_timegan_20250722142317.py create mode 100644 .history/main_timegan_20250722142322.py create mode 100644 .history/main_timegan_20250722142327.py create mode 100644 .history/main_timegan_20250722154118.py create mode 100644 .history/main_timegan_20250722154121.py create mode 100644 .history/main_timegan_20250722154123.py create mode 100644 .history/main_timegan_20250722154129.py create mode 100644 .history/main_timegan_20250722174053.py create mode 100644 .history/metrics/discriminative_metrics_20250718171958.py create mode 100644 .history/metrics/discriminative_metrics_20250720215721.py create mode 100644 .history/metrics/discriminative_metrics_20250720220419.py create mode 100644 .history/metrics/discriminative_metrics_20250720234927.py create mode 100644 .history/metrics/discriminative_metrics_20250720234930.py create mode 100644 .history/metrics/predictive_metrics_20250718171958.py create mode 100644 .history/metrics/predictive_metrics_20250720215649.py create mode 100644 .history/metrics/predictive_metrics_20250720220409.py create mode 100644 .history/metrics/predictive_metrics_20250720234918.py create mode 100644 .history/metrics/predictive_metrics_20250720234920.py create mode 100644 .history/process_synthetic_data_20250722134015.py create mode 100644 .history/process_synthetic_data_20250722134039.py create mode 100644 .history/process_synthetic_data_20250722134104.py create mode 100644 .history/process_synthetic_data_20250722134106.py create mode 100644 .history/process_synthetic_data_20250722134114.py create mode 100644 .history/process_synthetic_data_20250722134343.py create mode 100644 .history/process_synthetic_data_20250722134400.py create mode 100644 .history/process_synthetic_data_20250722135144.py create mode 100644 .history/process_synthetic_data_20250722135350.py create mode 100644 .history/process_synthetic_data_20250722154011.py create mode 100644 .history/process_synthetic_data_20250722154019.py create mode 100644 .history/process_synthetic_data_20250722174102.py create mode 100644 .history/process_synthetic_data_20250722174114.py create mode 100644 .history/process_synthetic_data_20250722174117.py create mode 100644 .history/process_synthetic_data_20250722174430.py create mode 100644 .history/process_synthetic_data_20250722174532.py create mode 100644 .history/process_synthetic_data_20250722174749.py create mode 100644 .history/process_synthetic_data_20250722175136.py create mode 100644 .history/process_synthetic_data_20250722180039.py create mode 100644 .history/process_synthetic_data_20250722180359.py create mode 100644 .history/process_synthetic_data_20250722181058.py create mode 100644 .history/process_synthetic_data_20250722182917.py create mode 100644 .history/process_synthetic_data_20250722182919.py create mode 100644 .history/requirements_20250718171958.txt create mode 100644 .history/requirements_20250720223149.txt create mode 100644 .history/requirements_20250720223155.txt create mode 100644 .history/requirements_20250720223158.txt create mode 100644 .history/requirements_20250720223201.txt create mode 100644 .history/requirements_20250720223207.txt create mode 100644 .history/requirements_20250720223211.txt create mode 100644 .history/timegan_20250718171958.py create mode 100644 .history/timegan_20250720215623.py create mode 100644 .history/timegan_20250720220354.py create mode 100644 .history/timegan_20250720220358.py create mode 100644 .history/timegan_20250720234909.py create mode 100644 .history/timegan_20250720234913.py create mode 100644 .history/timegan_20250722141910.py create mode 100644 .history/timegan_20250722154054.py create mode 100644 .history/utils_20250718171958.py create mode 100644 .history/utils_20250720215736.py create mode 100644 .history/utils_20250720220426.py create mode 100644 .history/utils_20250720234935.py create mode 100644 .history/utils_20250720234939.py create mode 100644 __pycache__/data_loading.cpython-312.pyc create mode 100644 __pycache__/data_loading.cpython-37.pyc create mode 100644 __pycache__/timegan.cpython-310.pyc create mode 100644 __pycache__/timegan.cpython-312.pyc create mode 100644 __pycache__/timegan.cpython-313.pyc create mode 100644 __pycache__/timegan.cpython-37.pyc create mode 100644 __pycache__/utils.cpython-312.pyc create mode 100644 __pycache__/utils.cpython-37.pyc create mode 100644 data/transaction_data.csv create mode 100644 final_usable_synthetic_data.csv create mode 100644 metrics/__pycache__/discriminative_metrics.cpython-312.pyc create mode 100644 metrics/__pycache__/discriminative_metrics.cpython-37.pyc create mode 100644 metrics/__pycache__/predictive_metrics.cpython-312.pyc create mode 100644 metrics/__pycache__/predictive_metrics.cpython-37.pyc create mode 100644 metrics/__pycache__/visualization_metrics.cpython-312.pyc create mode 100644 metrics/__pycache__/visualization_metrics.cpython-37.pyc create mode 100644 process_synthetic_data.py create mode 100644 synthetic_data.csv diff --git a/.history/data_loading_20250718171958.py b/.history/data_loading_20250718171958.py new file mode 100644 index 00000000..c85a974b --- /dev/null +++ b/.history/data_loading_20250718171958.py @@ -0,0 +1,115 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720214845.py b/.history/data_loading_20250720214845.py new file mode 100644 index 00000000..2fd3f7c4 --- /dev/null +++ b/.history/data_loading_20250720214845.py @@ -0,0 +1,150 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720214932.py b/.history/data_loading_20250720214932.py new file mode 100644 index 00000000..8b38ab98 --- /dev/null +++ b/.history/data_loading_20250720214932.py @@ -0,0 +1,151 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720214935.py b/.history/data_loading_20250720214935.py new file mode 100644 index 00000000..59808c2a --- /dev/null +++ b/.history/data_loading_20250720214935.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720214938.py b/.history/data_loading_20250720214938.py new file mode 100644 index 00000000..d8a3e0b2 --- /dev/null +++ b/.history/data_loading_20250720214938.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720215020.py b/.history/data_loading_20250720215020.py new file mode 100644 index 00000000..bdac7b45 --- /dev/null +++ b/.history/data_loading_20250720215020.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ +assert data_name in ['stock','energy', 'transaction'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720215023.py b/.history/data_loading_20250720215023.py new file mode 100644 index 00000000..2dd71dc3 --- /dev/null +++ b/.history/data_loading_20250720215023.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ +a ssert data_name in ['stock','energy', 'transaction'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720215024.py b/.history/data_loading_20250720215024.py new file mode 100644 index 00000000..14f7be7e --- /dev/null +++ b/.history/data_loading_20250720215024.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ +ssert data_name in ['stock','energy', 'transaction'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250720215026.py b/.history/data_loading_20250720215026.py new file mode 100644 index 00000000..3c31db62 --- /dev/null +++ b/.history/data_loading_20250720215026.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232454.py b/.history/data_loading_20250721232454.py new file mode 100644 index 00000000..dc849f82 --- /dev/null +++ b/.history/data_loading_20250721232454.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232501.py b/.history/data_loading_20250721232501.py new file mode 100644 index 00000000..f97707ef --- /dev/null +++ b/.history/data_loading_20250721232501.py @@ -0,0 +1,152 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232506.py b/.history/data_loading_20250721232506.py new file mode 100644 index 00000000..fb3286c9 --- /dev/null +++ b/.history/data_loading_20250721232506.py @@ -0,0 +1,153 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'transaction': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232510.py b/.history/data_loading_20250721232510.py new file mode 100644 index 00000000..53ec22b0 --- /dev/null +++ b/.history/data_loading_20250721232510.py @@ -0,0 +1,153 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232512.py b/.history/data_loading_20250721232512.py new file mode 100644 index 00000000..5fdddecb --- /dev/null +++ b/.history/data_loading_20250721232512.py @@ -0,0 +1,153 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232516.py b/.history/data_loading_20250721232516.py new file mode 100644 index 00000000..9a5a87fd --- /dev/null +++ b/.history/data_loading_20250721232516.py @@ -0,0 +1,153 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232520.py b/.history/data_loading_20250721232520.py new file mode 100644 index 00000000..8a8bae72 --- /dev/null +++ b/.history/data_loading_20250721232520.py @@ -0,0 +1,153 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232527.py b/.history/data_loading_20250721232527.py new file mode 100644 index 00000000..ff933f9d --- /dev/null +++ b/.history/data_loading_20250721232527.py @@ -0,0 +1,153 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232535.py b/.history/data_loading_20250721232535.py new file mode 100644 index 00000000..1b152ff6 --- /dev/null +++ b/.history/data_loading_20250721232535.py @@ -0,0 +1,155 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # assert data_name in ['stock','energy', 'transaction'] + + # assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232536.py b/.history/data_loading_20250721232536.py new file mode 100644 index 00000000..d9244093 --- /dev/null +++ b/.history/data_loading_20250721232536.py @@ -0,0 +1,155 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # assert data_name in ['stock','energy', 'transaction'] + + assert data_name in ['stock','energy', 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232539.py b/.history/data_loading_20250721232539.py new file mode 100644 index 00000000..2bc8379a --- /dev/null +++ b/.history/data_loading_20250721232539.py @@ -0,0 +1,155 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # assert data_name in ['stock','energy', 'transaction'] + + assert data_name in 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232541.py b/.history/data_loading_20250721232541.py new file mode 100644 index 00000000..44d01b3a --- /dev/null +++ b/.history/data_loading_20250721232541.py @@ -0,0 +1,155 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # assert data_name in ['stock','energy', 'transaction'] + + assert data_name in [] 'transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721232544.py b/.history/data_loading_20250721232544.py new file mode 100644 index 00000000..7453fc95 --- /dev/null +++ b/.history/data_loading_20250721232544.py @@ -0,0 +1,155 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock or energy + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # assert data_name in ['stock','energy', 'transaction'] + + assert data_name in ['transaction'] + + # if data_name == 'stock': + # ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + # elif data_name == 'energy': + # ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + if data_name == 'transaction': + ori_data = np.loadtxt('data/transaction_data.csv', delimiter = ",",skiprows = 1) + # return transaction_data_loading(seq_len) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233459.py b/.history/data_loading_20250721233459.py new file mode 100644 index 00000000..37b7f05a --- /dev/null +++ b/.history/data_loading_20250721233459.py @@ -0,0 +1,156 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233806.py b/.history/data_loading_20250721233806.py new file mode 100644 index 00000000..7f4b09c1 --- /dev/null +++ b/.history/data_loading_20250721233806.py @@ -0,0 +1,157 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233903.py b/.history/data_loading_20250721233903.py new file mode 100644 index 00000000..ddae13a6 --- /dev/null +++ b/.history/data_loading_20250721233903.py @@ -0,0 +1,158 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233904.py b/.history/data_loading_20250721233904.py new file mode 100644 index 00000000..fc23b637 --- /dev/null +++ b/.history/data_loading_20250721233904.py @@ -0,0 +1,163 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233907.py b/.history/data_loading_20250721233907.py new file mode 100644 index 00000000..7fe20964 --- /dev/null +++ b/.history/data_loading_20250721233907.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Load the data + try: + ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233926.py b/.history/data_loading_20250721233926.py new file mode 100644 index 00000000..6caf33e2 --- /dev/null +++ b/.history/data_loading_20250721233926.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233930.py b/.history/data_loading_20250721233930.py new file mode 100644 index 00000000..d14d3360 --- /dev/null +++ b/.history/data_loading_20250721233930.py @@ -0,0 +1,165 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233931.py b/.history/data_loading_20250721233931.py new file mode 100644 index 00000000..5ae5ca76 --- /dev/null +++ b/.history/data_loading_20250721233931.py @@ -0,0 +1,169 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233933.py b/.history/data_loading_20250721233933.py new file mode 100644 index 00000000..0a61861c --- /dev/null +++ b/.history/data_loading_20250721233933.py @@ -0,0 +1,169 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233957.py b/.history/data_loading_20250721233957.py new file mode 100644 index 00000000..49fcffe8 --- /dev/null +++ b/.history/data_loading_20250721233957.py @@ -0,0 +1,170 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721233959.py b/.history/data_loading_20250721233959.py new file mode 100644 index 00000000..f719dc85 --- /dev/null +++ b/.history/data_loading_20250721233959.py @@ -0,0 +1,171 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + if 'city_name' in df.columns: + # df = df.drop(columns=['city_name']) + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234003.py b/.history/data_loading_20250721234003.py new file mode 100644 index 00000000..49fcffe8 --- /dev/null +++ b/.history/data_loading_20250721234003.py @@ -0,0 +1,170 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234008.py b/.history/data_loading_20250721234008.py new file mode 100644 index 00000000..311563df --- /dev/null +++ b/.history/data_loading_20250721234008.py @@ -0,0 +1,172 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234011.py b/.history/data_loading_20250721234011.py new file mode 100644 index 00000000..27f09394 --- /dev/null +++ b/.history/data_loading_20250721234011.py @@ -0,0 +1,173 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234012.py b/.history/data_loading_20250721234012.py new file mode 100644 index 00000000..42deafec --- /dev/null +++ b/.history/data_loading_20250721234012.py @@ -0,0 +1,173 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234014.py b/.history/data_loading_20250721234014.py new file mode 100644 index 00000000..53979de4 --- /dev/null +++ b/.history/data_loading_20250721234014.py @@ -0,0 +1,174 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + if 'city_name' in df.columns: + # df = df.drop(columns=['city_name']) + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234016.py b/.history/data_loading_20250721234016.py new file mode 100644 index 00000000..0861f0a5 --- /dev/null +++ b/.history/data_loading_20250721234016.py @@ -0,0 +1,174 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + if 'city_name' in df.columns: + df = df.drop(columns=['city_name']) + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234354.py b/.history/data_loading_20250721234354.py new file mode 100644 index 00000000..ab67b0f5 --- /dev/null +++ b/.history/data_loading_20250721234354.py @@ -0,0 +1,174 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234355.py b/.history/data_loading_20250721234355.py new file mode 100644 index 00000000..757f6bdb --- /dev/null +++ b/.history/data_loading_20250721234355.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + # Convert all data to a NumPy array for processing + ori_data = df.values + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234400.py b/.history/data_loading_20250721234400.py new file mode 100644 index 00000000..47db7eca --- /dev/null +++ b/.history/data_loading_20250721234400.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + # Convert all data to a NumPy array for processing + ori_data = df.values + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234621.py b/.history/data_loading_20250721234621.py new file mode 100644 index 00000000..449ec462 --- /dev/null +++ b/.history/data_loading_20250721234621.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + # Convert all data to a NumPy array for processing + 0 + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234622.py b/.history/data_loading_20250721234622.py new file mode 100644 index 00000000..939b010b --- /dev/null +++ b/.history/data_loading_20250721234622.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + # Convert all data to a NumPy array for processing + # ori_data = df.values + + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234625.py b/.history/data_loading_20250721234625.py new file mode 100644 index 00000000..632986e7 --- /dev/null +++ b/.history/data_loading_20250721234625.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234649.py b/.history/data_loading_20250721234649.py new file mode 100644 index 00000000..0f00c5c2 --- /dev/null +++ b/.history/data_loading_20250721234649.py @@ -0,0 +1,180 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234704.py b/.history/data_loading_20250721234704.py new file mode 100644 index 00000000..c67a1a16 --- /dev/null +++ b/.history/data_loading_20250721234704.py @@ -0,0 +1,187 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234706.py b/.history/data_loading_20250721234706.py new file mode 100644 index 00000000..bde9d0aa --- /dev/null +++ b/.history/data_loading_20250721234706.py @@ -0,0 +1,187 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234710.py b/.history/data_loading_20250721234710.py new file mode 100644 index 00000000..cbde3cbb --- /dev/null +++ b/.history/data_loading_20250721234710.py @@ -0,0 +1,187 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250721234711.py b/.history/data_loading_20250721234711.py new file mode 100644 index 00000000..bde9d0aa --- /dev/null +++ b/.history/data_loading_20250721234711.py @@ -0,0 +1,187 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'city_id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250722135220.py b/.history/data_loading_20250722135220.py new file mode 100644 index 00000000..aa37d70e --- /dev/null +++ b/.history/data_loading_20250722135220.py @@ -0,0 +1,187 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'id' in df.columns: + df = pd.get_dummies(df, columns=['city_id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250722135224.py b/.history/data_loading_20250722135224.py new file mode 100644 index 00000000..4b2d98a5 --- /dev/null +++ b/.history/data_loading_20250722135224.py @@ -0,0 +1,187 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + else: + # If there's no header, the first column is index 0 + df = df.drop(df.columns[0], axis=1) + + if 'id' in df.columns: + df = pd.get_dummies(df, columns=['id'], prefix='city') + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250722135235.py b/.history/data_loading_20250722135235.py new file mode 100644 index 00000000..7ebb2857 --- /dev/null +++ b/.history/data_loading_20250722135235.py @@ -0,0 +1,189 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) +if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- +if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250722135238.py b/.history/data_loading_20250722135238.py new file mode 100644 index 00000000..8e13bba4 --- /dev/null +++ b/.history/data_loading_20250722135238.py @@ -0,0 +1,189 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) +if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- +if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250722135241.py b/.history/data_loading_20250722135241.py new file mode 100644 index 00000000..e3254826 --- /dev/null +++ b/.history/data_loading_20250722135241.py @@ -0,0 +1,189 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- +if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250722135243.py b/.history/data_loading_20250722135243.py new file mode 100644 index 00000000..dd8434a2 --- /dev/null +++ b/.history/data_loading_20250722135243.py @@ -0,0 +1,189 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +def MinMaxScaler(data): + """Min Max normalizer. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + """ + numerator = data - np.min(data, 0) + denominator = np.max(data, 0) - np.min(data, 0) + norm_data = numerator / (denominator + 1e-7) + return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/final_usable_synthetic_data_20250722175139.csv b/.history/final_usable_synthetic_data_20250722175139.csv new file mode 100644 index 00000000..df99e46b --- /dev/null +++ b/.history/final_usable_synthetic_data_20250722175139.csv @@ -0,0 +1,361 @@ +date,transaction_number,transaction_value,city +2017-01-31,343.1675497189053,33.173469365619525,Tripoli +2017-02-28,291.5028043604319,52.39772192771157,Tripoli +2017-03-31,657.2740786139133,92.55489595709969,Tripoli +2017-04-30,515.4489586177547,57.96842636878188,Tripoli +2017-05-31,599.1612352816448,39.93153117924728,Tripoli +2017-06-30,626.2087574975601,37.241763472360034,Tripoli +2017-07-31,669.2142624019567,37.55897456954616,Tripoli +2017-08-31,698.978390728094,37.75919384212537,Tripoli +2017-09-30,718.4043735601983,37.652540182323094,Tripoli +2017-10-31,729.9089071486083,37.51208733725056,Tripoli +2017-11-30,735.6867961914618,37.359329639456064,Tripoli +2017-12-31,733.1251471074766,36.9763302207861,Tripoli +2018-01-31,466.049407168594,30.24550616459809,Beirut +2018-02-28,1113.2805790179855,62.00027583393853,Beirut +2018-03-31,662.2225553156832,79.78188448920743,Beirut +2018-04-30,326.77837913252125,50.71204412639116,Kesrouan +2018-05-31,387.43847702706233,76.47379358196179,Kesrouan +2018-06-30,377.41960202461604,79.90220053852424,Kesrouan +2018-07-31,388.97710745292846,85.06634011455188,Kesrouan +2018-08-31,368.7481981996921,85.04000738164049,Kesrouan +2018-09-30,333.3493343491337,83.8666604849546,Kesrouan +2018-10-31,295.635759434571,81.85686207226047,Kesrouan +2018-11-30,259.2472002436589,77.27917839060261,Kesrouan +2018-12-31,224.77232074183615,67.15982067005302,Kesrouan +2019-01-31,384.05763571240954,80.5344820018006,Kesrouan +2019-02-28,627.1623225884153,123.51195612197239,Kesrouan +2019-03-31,644.3389454850906,113.68406851250454,Kesrouan +2019-04-30,697.8224386619589,116.93242780087915,Kesrouan +2019-05-31,707.5287366254146,120.33570292246212,Kesrouan +2019-06-30,708.1829676372552,120.9388843662885,Kesrouan +2019-07-31,703.0470022901777,119.1146159819058,Kesrouan +2019-08-31,692.5870791424555,115.41776482678092,Kesrouan +2019-09-30,681.9737103932766,111.73694304839854,Kesrouan +2019-10-31,662.7868205668195,106.92652882841233,Kesrouan +2019-11-30,621.9187581915359,100.00434429743211,Kesrouan +2019-12-31,558.8150462910535,92.78097804600827,Kesrouan +2020-01-31,1769.9778762360575,255.54081548032485,Baabda +2020-02-29,1397.9611069018868,278.4709346341896,Baabda +2020-03-31,1520.3053289656075,195.8175158732611,Baabda +2020-04-30,1415.2256083536179,215.2950534730657,Baabda +2020-05-31,1487.9671722668122,209.43940554010848,Baabda +2020-06-30,1485.1025185007754,213.19654525227563,Baabda +2020-07-31,1491.667571963486,212.3366501201196,Baabda +2020-08-31,1502.4971464287892,213.0361470589437,Baabda +2020-09-30,1506.7000588784517,214.65664568990516,Baabda +2020-10-31,1512.6812705404966,215.2365749650801,Baabda +2020-11-30,1518.9803132419568,216.63784880836704,Baabda +2020-12-31,1522.7593070271819,217.82007190715788,Baabda +2021-01-31,490.3534774912931,287.0328321630408,Bekaa +2021-02-28,474.2447841604804,262.05638293330884,Bekaa +2021-03-31,519.0586008550301,289.9687143286853,Bekaa +2021-04-30,521.5794414699599,331.4494519221473,Bekaa +2021-05-31,519.1061027766818,338.6686585416043,Bekaa +2021-06-30,522.9944949269229,340.22759810032017,Bekaa +2021-07-31,526.4149211762851,341.2286944632164,Bekaa +2021-08-31,528.9310835716583,341.5686355995184,Bekaa +2021-09-30,531.1471201893225,341.93182890447173,Bekaa +2021-10-31,533.0887972231433,342.50429172728786,Bekaa +2021-11-30,534.9911052400801,342.3594181854807,Bekaa +2021-12-31,536.7134817356084,342.3408651826495,Bekaa +2022-01-31,1102.3871648488866,195.73152113875014,Baabda +2022-02-28,1845.6419598925731,266.9640524814568,Baabda +2022-03-31,1476.1646720789502,232.479067470539,Baabda +2022-04-30,1546.0644695156311,196.50517787594526,Baabda +2022-05-31,1544.368075131794,213.0956698260005,Baabda +2022-06-30,1509.5320370802008,217.37114493246133,Baabda +2022-07-31,1507.613247335903,217.32554561968686,Baabda +2022-08-31,1505.14717787609,218.55568280552663,Baabda +2022-09-30,1503.952576519156,217.76545715773563,Baabda +2022-10-31,1509.2406919607365,217.49485482375945,Baabda +2022-11-30,1509.5553562053751,217.55261975471308,Baabda +2022-12-31,1512.1466580040885,217.8884360676839,Baabda +2023-01-31,372.1623628321094,78.02055011818068,Kesrouan +2023-02-28,586.075823346142,112.45112923149046,Kesrouan +2023-03-31,615.0540107867679,108.01779696210416,Kesrouan +2023-04-30,668.9468841611441,110.37818795362617,Kesrouan +2023-05-31,691.7803381730696,115.08339307219185,Kesrouan +2023-06-30,695.3686765182102,116.59951800898976,Kesrouan +2023-07-31,686.0208741180081,114.06999185657374,Kesrouan +2023-08-31,671.6056242940812,109.99579768608109,Kesrouan +2023-09-30,653.8257269924284,105.7526772065087,Kesrouan +2023-10-31,624.6611304956234,100.74387116731774,Kesrouan +2023-11-30,583.268747666956,95.45748366269167,Kesrouan +2023-12-31,540.1032476537227,90.96575990690903,Kesrouan +2024-01-31,337.0208730297736,33.469064300032386,Tripoli +2024-02-29,859.4660800973261,170.2407046991949,Bekaa +2024-03-31,416.1600821181601,212.3077241438482,Bekaa +2024-04-30,373.70747079274656,289.56488194154554,Bekaa +2024-05-31,458.5995224562064,294.646594668222,Bekaa +2024-06-30,460.1706125285346,306.76161849536925,Bekaa +2024-07-31,459.95145593545953,320.85314627515805,Bekaa +2024-08-31,465.8427738094088,327.2384076003776,Bekaa +2024-09-30,473.3165534278394,330.82244396718033,Bekaa +2024-10-31,480.66488478954415,332.7227866248979,Bekaa +2024-11-30,487.1892017558076,334.2853810903629,Bekaa +2024-12-31,493.1049903166684,335.2495106821396,Bekaa +2025-01-31,981.3085091341433,54.87886407649671,Beirut +2025-02-28,835.9468710710097,62.33436911944192,Beirut +2025-03-31,350.3027701866542,61.61783335343989,Kesrouan +2025-04-30,409.59646810762086,78.54003419745268,Kesrouan +2025-05-31,413.29816331124874,84.91779426167773,Kesrouan +2025-06-30,420.70421670502117,87.68410615848191,Kesrouan +2025-07-31,409.1477908658372,87.03461182484907,Kesrouan +2025-08-31,376.90780480512245,85.32696977439838,Kesrouan +2025-09-30,368.52637862009993,84.08257845223709,Kesrouan +2025-10-31,343.8334402933332,82.88117579517241,Kesrouan +2025-11-30,325.9495425723062,81.49412127957127,Kesrouan +2025-12-31,314.55642258195246,79.69383604518985,Kesrouan +2026-01-31,371.8687145891713,28.541118721585857,Beirut +2026-02-28,375.1960802556614,28.838610726644674,Beirut +2026-03-31,541.1520325057074,37.44220900107136,Beirut +2026-04-30,563.5602003736321,36.86682225285598,Beirut +2026-05-31,525.2622798501441,33.212750911013416,Beirut +2026-06-30,479.37592734278377,32.01965011356449,Beirut +2026-07-31,440.326396868069,31.967315329780988,Beirut +2026-08-31,418.1047820015404,32.598500321032624,Beirut +2026-09-30,372.4193770172891,32.63318712651336,Beirut +2026-10-31,288.0436568476624,33.93370737375007,Beirut +2026-11-30,194.95795553492184,38.1171310430872,Beirut +2026-12-31,171.0713263418897,43.651651907341474,Beirut +2027-01-31,534.3687580938333,387.6662688027607,Bekaa +2027-02-28,513.1129436616155,288.31189288636494,Bekaa +2027-03-31,529.3388083991695,348.8339636612855,Bekaa +2027-04-30,514.1163857702049,386.20273971451417,Bekaa +2027-05-31,527.4533419726366,391.5275907615951,Bekaa +2027-06-30,537.8412925117955,392.79358084221167,Bekaa +2027-07-31,544.9990404060245,392.7099704992466,Bekaa +2027-08-31,549.8993674326657,392.2311777151146,Bekaa +2027-09-30,553.6437423931717,391.02808683921813,Bekaa +2027-10-31,556.4268511937059,389.64096270634565,Bekaa +2027-11-30,558.4393492743532,388.9841237505789,Bekaa +2027-12-31,560.5279224022518,388.06921356969,Bekaa +2028-01-31,1035.2858783509728,147.43276385665723,Kesrouan +2028-02-29,532.2620478685765,104.05728779582638,Kesrouan +2028-03-31,598.0729374675591,95.94130629468319,Kesrouan +2028-04-30,599.5655054239448,95.24943244707865,Kesrouan +2028-05-31,584.1546585057617,93.69240736332652,Kesrouan +2028-06-30,543.488983105758,90.07237886720418,Kesrouan +2028-07-31,489.8486616148302,85.81345526702135,Kesrouan +2028-08-31,423.6248651605201,81.69806507617102,Kesrouan +2028-09-30,331.7650732894384,79.66071562831586,Kesrouan +2028-10-31,203.84146263728178,83.98288651957593,Kesrouan +2028-11-30,144.39655026572353,72.34030290054447,Kesrouan +2028-12-31,345.03747006198864,56.55653589160475,Beirut +2029-01-31,1357.421671457303,227.2214667076415,Baabda +2029-02-28,1521.7046204212952,260.503117182213,Baabda +2029-03-31,1510.9284496315458,215.86201653144033,Baabda +2029-04-30,1414.487889115844,216.3829277647762,Baabda +2029-05-31,1471.942902805844,216.7744901078298,Baabda +2029-06-30,1423.8377067490856,220.92079036718675,Baabda +2029-07-31,1450.0872686538596,215.34138376719002,Baabda +2029-08-31,1441.1114206947127,218.35501102068324,Baabda +2029-09-30,1453.9818504484372,215.15759417066386,Baabda +2029-10-31,1450.2634575996226,216.33407384456328,Baabda +2029-11-30,1464.2552205947632,214.38357194279388,Baabda +2029-12-31,1466.6006639626241,214.88537323512736,Baabda +2030-01-31,383.449395197441,33.58863196368149,Tripoli +2030-02-28,512.8105867330412,34.07569179879367,Tripoli +2030-03-31,533.7758477444886,34.840803015922994,Tripoli +2030-04-30,455.2959077505421,32.129471359216026,Tripoli +2030-05-31,337.4370186524866,30.476496271141137,Tripoli +2030-06-30,282.6608974258214,31.295352021800117,Tripoli +2030-07-31,307.06968789398036,41.63081915712863,Tripoli +2030-08-31,804.4257474246251,104.10198208407252,Bekaa +2030-09-30,654.3084472780624,212.3490942073844,Bekaa +2030-10-31,437.20429708120145,186.52484584640425,Bekaa +2030-11-30,416.9769712253535,191.88224296786993,Bekaa +2030-12-31,419.2591506702873,202.8109014685773,Bekaa +2031-01-31,824.2140403682369,38.090241372004535,Beirut +2031-02-28,334.1405292350702,24.03089417592564,Beirut +2031-03-31,409.51096464864764,31.262736330143852,Beirut +2031-04-30,394.55412094528174,33.99521423304207,Beirut +2031-05-31,217.72577052783726,34.940129457909265,Beirut +2031-06-30,169.5513368216412,46.41643222417453,Beirut +2031-07-31,223.1925939564803,49.67375473624341,Beirut +2031-08-31,324.4149426125195,44.481315739387014,Tripoli +2031-09-30,585.5095428619659,41.214037957506335,Tripoli +2031-10-31,666.5674697220413,36.0180658841258,Tripoli +2031-11-30,636.6953105104507,33.96171092117532,Tripoli +2031-12-31,628.0052657799089,34.08495089589136,Tripoli +2032-01-31,654.0718733137148,114.82513039957338,Kesrouan +2032-02-29,124.70592415193202,112.35497037535339,Kesrouan +2032-03-31,396.6535619370734,53.98854619673388,Kesrouan +2032-04-30,461.7427102173829,84.09096733344215,Kesrouan +2032-05-31,433.3016543544648,81.2567089797405,Kesrouan +2032-06-30,435.8360977924131,82.93077810105305,Kesrouan +2032-07-31,455.612371310395,83.94938320770923,Kesrouan +2032-08-31,471.679032637807,84.82840568518552,Kesrouan +2032-09-30,498.2993254492907,86.43931453701,Kesrouan +2032-10-31,542.6024245134751,89.6414827658032,Kesrouan +2032-11-30,594.7738570362344,94.38224490574233,Kesrouan +2032-12-31,634.59932420387,99.22094114223944,Kesrouan +2033-01-31,982.4387669790214,59.9619865529193,Beirut +2033-02-28,849.2117107196608,221.27775292634882,Kesrouan +2033-03-31,1096.7684072435668,133.6488399905998,Kesrouan +2033-04-30,1366.368154592156,243.63855943892878,Baabda +2033-05-31,1078.6721903272783,255.24523795022978,Baabda +2033-06-30,1144.6052174429924,277.08135649249976,Baabda +2033-07-31,1235.9314763667944,268.46755928781135,Baabda +2033-08-31,1310.5146753879067,262.32298227417886,Baabda +2033-09-30,1383.4930291832743,257.44972106242597,Baabda +2033-10-31,1414.4169241238005,252.3403180660455,Baabda +2033-11-30,1417.21982539169,245.54053810252444,Baabda +2033-12-31,1419.3025687382947,237.86152680971287,Baabda +2034-01-31,521.2322456062504,337.8505859852487,Bekaa +2034-02-28,471.75273258897573,255.4470758243694,Bekaa +2034-03-31,527.9669385073444,299.7218155843394,Bekaa +2034-04-30,518.973889094751,345.06624212386373,Bekaa +2034-05-31,519.0778175415163,352.1484419531831,Bekaa +2034-06-30,524.8696692704311,353.6289228470184,Bekaa +2034-07-31,528.9652705607259,353.90053463143005,Bekaa +2034-08-31,531.8926844414298,354.24465280401665,Bekaa +2034-09-30,534.4354767019713,354.0261241890562,Bekaa +2034-10-31,536.553558599381,354.01216592613827,Bekaa +2034-11-30,538.5084785931774,353.92204636829615,Bekaa +2034-12-31,540.3736487440954,353.7338708836711,Bekaa +2035-01-31,320.0089234614911,27.43357755070161,Beirut +2035-02-28,178.03050180909264,34.84637239763589,Beirut +2035-03-31,221.8560626154597,48.261881663384145,Beirut +2035-04-30,240.9367208716771,46.43909264601893,Beirut +2035-05-31,437.47232307549126,43.36202665395207,Tripoli +2035-06-30,644.4985807308841,36.60187632218197,Tripoli +2035-07-31,597.1124630062818,32.953478787959426,Tripoli +2035-08-31,590.3949715586343,33.50446468254509,Tripoli +2035-09-30,617.5735558947435,35.08954552667599,Tripoli +2035-10-31,648.4458464749299,36.299685151302825,Tripoli +2035-11-30,676.2115833516984,36.88060647259543,Tripoli +2035-12-31,689.4924728920591,36.57183646956792,Tripoli +2036-01-31,398.92357801116,286.1198190527979,Kesrouan +2036-02-29,524.6726082681848,96.76414763413045,Kesrouan +2036-03-31,827.243943243535,109.79427308966292,Kesrouan +2036-04-30,882.6897695928817,129.57788302322783,Kesrouan +2036-05-31,892.2775286700336,128.9116979487741,Kesrouan +2036-06-30,899.2500910424293,124.13074923891276,Kesrouan +2036-07-31,905.257212843557,119.84415277334391,Kesrouan +2036-08-31,911.8300393479922,117.0224081241784,Kesrouan +2036-09-30,916.1595516161177,115.4253357050469,Kesrouan +2036-10-31,925.0290960324163,113.81954372267116,Kesrouan +2036-11-30,927.7297961961457,113.1446042763374,Kesrouan +2036-12-31,924.0874064219742,113.32618352449624,Kesrouan +2037-01-31,1792.9880949746141,257.1944345281603,Baabda +2037-02-28,1484.5644512791564,271.68032674617695,Baabda +2037-03-31,1516.390594840632,198.9848754663486,Baabda +2037-04-30,1432.4122354428835,214.04305646400277,Baabda +2037-05-31,1498.14928114548,210.4049100729956,Baabda +2037-06-30,1497.4016296877244,212.24800992929502,Baabda +2037-07-31,1494.6722844257868,213.4329306973531,Baabda +2037-08-31,1504.426444173937,213.26536192506583,Baabda +2037-09-30,1504.0048286329732,215.31092621094754,Baabda +2037-10-31,1504.4031250487626,215.77727490781476,Baabda +2037-11-30,1498.687204421882,217.38571234650422,Baabda +2037-12-31,1493.4104606524547,218.2136705554002,Baabda +2038-01-31,1312.511627385104,222.357864892297,Baabda +2038-02-28,1423.1463378712267,337.5919578219553,Baabda +2038-03-31,1514.6147426969412,360.9051112031256,Baabda +2038-04-30,1555.1528826345707,430.4166687879063,Baabda +2038-05-31,1566.2667489036992,455.61450094072654,Baabda +2038-06-30,1176.000892832651,299.14547159864213,Baabda +2038-07-31,505.08346353246753,68.22040499137029,Baabda +2038-08-31,590.086856821375,79.41129434916661,Kesrouan +2038-09-30,597.9780775694726,94.93107266491421,Kesrouan +2038-10-31,562.0825307472192,89.76928267179673,Kesrouan +2038-11-30,425.5810086886622,80.8224538449939,Kesrouan +2038-12-31,181.64359873157895,88.57346680076276,Kesrouan +2039-01-31,518.4118549944801,331.08100251320235,Bekaa +2039-02-28,487.3270293012064,266.78266468079437,Bekaa +2039-03-31,525.6592807589792,301.08010076252975,Bekaa +2039-04-30,519.1292779566393,337.0206436841175,Bekaa +2039-05-31,519.3861481966015,343.21445751295573,Bekaa +2039-06-30,523.6179936349067,344.8472609966392,Bekaa +2039-07-31,527.0727508185539,345.37227964898835,Bekaa +2039-08-31,529.6467072186033,345.50765043324793,Bekaa +2039-09-30,531.8556185480197,345.558262189564,Bekaa +2039-10-31,533.8021177466144,345.5211909925374,Bekaa +2039-11-30,535.6060392076448,345.3614541632839,Bekaa +2039-12-31,537.3026495093077,345.13255257488316,Bekaa +2040-01-31,977.2292456259925,66.65888959361214,Beirut +2040-02-29,399.2393218449272,59.94033558151031,Kesrouan +2040-03-31,513.703550887486,103.25251213831041,Kesrouan +2040-04-30,655.5838738744126,118.6481454548136,Kesrouan +2040-05-31,755.1481175743704,144.86475675746854,Kesrouan +2040-06-30,817.1041542587025,169.83215574191703,Kesrouan +2040-07-31,884.020543125217,167.53809260573223,Kesrouan +2040-08-31,1018.6892107341008,127.8746790738296,Kesrouan +2040-09-30,1294.7906756498646,164.18960627675008,Kesrouan +2040-10-31,1380.1769632163287,275.7612389833607,Baabda +2040-11-30,1161.563547417895,268.70437984083514,Baabda +2040-12-31,1166.1428046377355,286.23186805113454,Baabda +2041-01-31,454.67787896080904,75.10727616142705,Kesrouan +2041-02-28,252.23426123785885,64.6345933841466,Beirut +2041-03-31,526.5393618164915,25.207095380739442,Beirut +2041-04-30,617.6874165614905,35.93452515843212,Beirut +2041-05-31,578.9925671017759,33.09549802163875,Beirut +2041-06-30,494.3380970191834,29.976087324235856,Beirut +2041-07-31,385.11664067481,28.747255462235056,Beirut +2041-08-31,204.20204540618403,33.991141622664514,Beirut +2041-09-30,171.1905849542789,46.63913787541969,Beirut +2041-10-31,242.24439119666374,48.09304237589362,Beirut +2041-11-30,417.50474636394824,42.20155895247727,Tripoli +2041-12-31,654.6099405353342,37.06777250678503,Tripoli +2042-01-31,530.9954739030796,370.36728188155143,Bekaa +2042-02-28,496.59155939330043,273.5320765484493,Bekaa +2042-03-31,532.24585403165,321.08678183801476,Bekaa +2042-04-30,515.6456597569581,359.3149831068174,Bekaa +2042-05-31,521.5012792170601,365.17230185428855,Bekaa +2042-06-30,528.4109375295714,366.2819315433152,Bekaa +2042-07-31,533.2893129106008,365.8539941759492,Bekaa +2042-08-31,536.6102730149287,365.49302862368097,Bekaa +2042-09-30,539.1553683989443,365.60768826969553,Bekaa +2042-10-31,541.5088007263557,365.4209747477702,Bekaa +2042-11-30,543.6929534784263,364.97709502525095,Bekaa +2042-12-31,545.6660105695806,364.5879692866968,Bekaa +2043-01-31,418.84660367800245,28.530241022927832,Beirut +2043-02-28,461.1374925519743,45.33783443387956,Tripoli +2043-03-31,578.6559512115252,43.726890773419335,Tripoli +2043-04-30,610.2440093838736,43.08947503637641,Tripoli +2043-05-31,704.0472056313818,40.88551405371585,Tripoli +2043-06-30,722.547116909102,37.91233443491269,Tripoli +2043-07-31,692.2933589269088,35.768035453851695,Tripoli +2043-08-31,662.3939220966724,34.732948458188865,Tripoli +2043-09-30,644.0232736239319,34.442435584589035,Tripoli +2043-10-31,644.5023233065293,34.84799099919621,Tripoli +2043-11-30,644.9257381627071,34.96719317217044,Tripoli +2043-12-31,651.7116755610982,35.21304656615986,Tripoli +2044-01-31,1630.1915243226715,247.01320445764378,Baabda +2044-02-29,1422.826491598771,279.07773617612935,Baabda +2044-03-31,1485.4478430766621,199.77581469117155,Baabda +2044-04-30,1421.6966655895446,213.0748368575306,Baabda +2044-05-31,1490.106486083748,210.05207233716465,Baabda +2044-06-30,1483.8133451361898,214.55942517037911,Baabda +2044-07-31,1498.81905824077,212.75837414601213,Baabda +2044-08-31,1505.1280331622122,215.20563008793778,Baabda +2044-09-30,1504.6917352091014,216.88364998940287,Baabda +2044-10-31,1512.5547426946423,217.39432748384132,Baabda +2044-11-30,1515.9059312945667,218.8334209098225,Baabda +2044-12-31,1526.8795949222138,219.26288985715954,Baabda +2045-01-31,318.3424696828165,74.4065087073997,Bekaa +2045-02-28,343.7529749169593,293.24401550109616,Bekaa +2045-03-31,515.6223406317838,241.16963512127637,Bekaa +2045-04-30,510.121834022333,300.2946613021483,Bekaa +2045-05-31,528.6560042617295,314.2331355107391,Bekaa +2045-06-30,517.5522141578,320.6038816348695,Bekaa +2045-07-31,521.7631875396219,322.80584112097694,Bekaa +2045-08-31,524.425670248204,324.176814046882,Bekaa +2045-09-30,527.4238332031258,325.1285169557118,Bekaa +2045-10-31,530.2159385797304,325.9198564798454,Bekaa +2045-11-30,532.8725195344106,326.5557406369173,Bekaa +2045-12-31,535.3932881767316,327.06680102634857,Bekaa +2046-01-31,366.35856365017327,76.2878458500219,Kesrouan +2046-02-28,925.4484804225149,194.70421387316753,Kesrouan +2046-03-31,1023.1472660811204,165.68542037461367,Kesrouan +2046-04-30,1291.567670265791,191.80552473477456,Kesrouan +2046-05-31,1570.28238862588,257.44354252958817,Baabda +2046-06-30,1385.9377947509524,263.58731894459953,Baabda +2046-07-31,1457.8741291195408,247.27961235101742,Baabda +2046-08-31,1443.6507582700433,246.24228019835158,Baabda +2046-09-30,1446.782718304284,244.185698979269,Baabda +2046-10-31,1442.8201943672227,245.1831404354161,Baabda +2046-11-30,1432.0199847262134,244.3650678790605,Baabda +2046-12-31,1437.5644665994962,239.32178388620306,Baabda diff --git a/.history/final_usable_synthetic_data_20250722175933.csv b/.history/final_usable_synthetic_data_20250722175933.csv new file mode 100644 index 00000000..df99e46b --- /dev/null +++ b/.history/final_usable_synthetic_data_20250722175933.csv @@ -0,0 +1,361 @@ +date,transaction_number,transaction_value,city +2017-01-31,343.1675497189053,33.173469365619525,Tripoli +2017-02-28,291.5028043604319,52.39772192771157,Tripoli +2017-03-31,657.2740786139133,92.55489595709969,Tripoli +2017-04-30,515.4489586177547,57.96842636878188,Tripoli +2017-05-31,599.1612352816448,39.93153117924728,Tripoli +2017-06-30,626.2087574975601,37.241763472360034,Tripoli +2017-07-31,669.2142624019567,37.55897456954616,Tripoli +2017-08-31,698.978390728094,37.75919384212537,Tripoli +2017-09-30,718.4043735601983,37.652540182323094,Tripoli +2017-10-31,729.9089071486083,37.51208733725056,Tripoli +2017-11-30,735.6867961914618,37.359329639456064,Tripoli +2017-12-31,733.1251471074766,36.9763302207861,Tripoli +2018-01-31,466.049407168594,30.24550616459809,Beirut +2018-02-28,1113.2805790179855,62.00027583393853,Beirut +2018-03-31,662.2225553156832,79.78188448920743,Beirut +2018-04-30,326.77837913252125,50.71204412639116,Kesrouan +2018-05-31,387.43847702706233,76.47379358196179,Kesrouan +2018-06-30,377.41960202461604,79.90220053852424,Kesrouan +2018-07-31,388.97710745292846,85.06634011455188,Kesrouan +2018-08-31,368.7481981996921,85.04000738164049,Kesrouan +2018-09-30,333.3493343491337,83.8666604849546,Kesrouan +2018-10-31,295.635759434571,81.85686207226047,Kesrouan +2018-11-30,259.2472002436589,77.27917839060261,Kesrouan +2018-12-31,224.77232074183615,67.15982067005302,Kesrouan +2019-01-31,384.05763571240954,80.5344820018006,Kesrouan +2019-02-28,627.1623225884153,123.51195612197239,Kesrouan +2019-03-31,644.3389454850906,113.68406851250454,Kesrouan +2019-04-30,697.8224386619589,116.93242780087915,Kesrouan +2019-05-31,707.5287366254146,120.33570292246212,Kesrouan +2019-06-30,708.1829676372552,120.9388843662885,Kesrouan +2019-07-31,703.0470022901777,119.1146159819058,Kesrouan +2019-08-31,692.5870791424555,115.41776482678092,Kesrouan +2019-09-30,681.9737103932766,111.73694304839854,Kesrouan +2019-10-31,662.7868205668195,106.92652882841233,Kesrouan +2019-11-30,621.9187581915359,100.00434429743211,Kesrouan +2019-12-31,558.8150462910535,92.78097804600827,Kesrouan +2020-01-31,1769.9778762360575,255.54081548032485,Baabda +2020-02-29,1397.9611069018868,278.4709346341896,Baabda +2020-03-31,1520.3053289656075,195.8175158732611,Baabda +2020-04-30,1415.2256083536179,215.2950534730657,Baabda +2020-05-31,1487.9671722668122,209.43940554010848,Baabda +2020-06-30,1485.1025185007754,213.19654525227563,Baabda +2020-07-31,1491.667571963486,212.3366501201196,Baabda +2020-08-31,1502.4971464287892,213.0361470589437,Baabda +2020-09-30,1506.7000588784517,214.65664568990516,Baabda +2020-10-31,1512.6812705404966,215.2365749650801,Baabda +2020-11-30,1518.9803132419568,216.63784880836704,Baabda +2020-12-31,1522.7593070271819,217.82007190715788,Baabda +2021-01-31,490.3534774912931,287.0328321630408,Bekaa +2021-02-28,474.2447841604804,262.05638293330884,Bekaa +2021-03-31,519.0586008550301,289.9687143286853,Bekaa +2021-04-30,521.5794414699599,331.4494519221473,Bekaa +2021-05-31,519.1061027766818,338.6686585416043,Bekaa +2021-06-30,522.9944949269229,340.22759810032017,Bekaa +2021-07-31,526.4149211762851,341.2286944632164,Bekaa +2021-08-31,528.9310835716583,341.5686355995184,Bekaa +2021-09-30,531.1471201893225,341.93182890447173,Bekaa +2021-10-31,533.0887972231433,342.50429172728786,Bekaa +2021-11-30,534.9911052400801,342.3594181854807,Bekaa +2021-12-31,536.7134817356084,342.3408651826495,Bekaa +2022-01-31,1102.3871648488866,195.73152113875014,Baabda +2022-02-28,1845.6419598925731,266.9640524814568,Baabda +2022-03-31,1476.1646720789502,232.479067470539,Baabda +2022-04-30,1546.0644695156311,196.50517787594526,Baabda +2022-05-31,1544.368075131794,213.0956698260005,Baabda +2022-06-30,1509.5320370802008,217.37114493246133,Baabda +2022-07-31,1507.613247335903,217.32554561968686,Baabda +2022-08-31,1505.14717787609,218.55568280552663,Baabda +2022-09-30,1503.952576519156,217.76545715773563,Baabda +2022-10-31,1509.2406919607365,217.49485482375945,Baabda +2022-11-30,1509.5553562053751,217.55261975471308,Baabda +2022-12-31,1512.1466580040885,217.8884360676839,Baabda +2023-01-31,372.1623628321094,78.02055011818068,Kesrouan +2023-02-28,586.075823346142,112.45112923149046,Kesrouan +2023-03-31,615.0540107867679,108.01779696210416,Kesrouan +2023-04-30,668.9468841611441,110.37818795362617,Kesrouan +2023-05-31,691.7803381730696,115.08339307219185,Kesrouan +2023-06-30,695.3686765182102,116.59951800898976,Kesrouan +2023-07-31,686.0208741180081,114.06999185657374,Kesrouan +2023-08-31,671.6056242940812,109.99579768608109,Kesrouan +2023-09-30,653.8257269924284,105.7526772065087,Kesrouan +2023-10-31,624.6611304956234,100.74387116731774,Kesrouan +2023-11-30,583.268747666956,95.45748366269167,Kesrouan +2023-12-31,540.1032476537227,90.96575990690903,Kesrouan +2024-01-31,337.0208730297736,33.469064300032386,Tripoli +2024-02-29,859.4660800973261,170.2407046991949,Bekaa +2024-03-31,416.1600821181601,212.3077241438482,Bekaa +2024-04-30,373.70747079274656,289.56488194154554,Bekaa +2024-05-31,458.5995224562064,294.646594668222,Bekaa +2024-06-30,460.1706125285346,306.76161849536925,Bekaa +2024-07-31,459.95145593545953,320.85314627515805,Bekaa +2024-08-31,465.8427738094088,327.2384076003776,Bekaa +2024-09-30,473.3165534278394,330.82244396718033,Bekaa +2024-10-31,480.66488478954415,332.7227866248979,Bekaa +2024-11-30,487.1892017558076,334.2853810903629,Bekaa +2024-12-31,493.1049903166684,335.2495106821396,Bekaa +2025-01-31,981.3085091341433,54.87886407649671,Beirut +2025-02-28,835.9468710710097,62.33436911944192,Beirut +2025-03-31,350.3027701866542,61.61783335343989,Kesrouan +2025-04-30,409.59646810762086,78.54003419745268,Kesrouan +2025-05-31,413.29816331124874,84.91779426167773,Kesrouan +2025-06-30,420.70421670502117,87.68410615848191,Kesrouan +2025-07-31,409.1477908658372,87.03461182484907,Kesrouan +2025-08-31,376.90780480512245,85.32696977439838,Kesrouan +2025-09-30,368.52637862009993,84.08257845223709,Kesrouan +2025-10-31,343.8334402933332,82.88117579517241,Kesrouan +2025-11-30,325.9495425723062,81.49412127957127,Kesrouan +2025-12-31,314.55642258195246,79.69383604518985,Kesrouan +2026-01-31,371.8687145891713,28.541118721585857,Beirut +2026-02-28,375.1960802556614,28.838610726644674,Beirut +2026-03-31,541.1520325057074,37.44220900107136,Beirut +2026-04-30,563.5602003736321,36.86682225285598,Beirut +2026-05-31,525.2622798501441,33.212750911013416,Beirut +2026-06-30,479.37592734278377,32.01965011356449,Beirut +2026-07-31,440.326396868069,31.967315329780988,Beirut +2026-08-31,418.1047820015404,32.598500321032624,Beirut +2026-09-30,372.4193770172891,32.63318712651336,Beirut +2026-10-31,288.0436568476624,33.93370737375007,Beirut +2026-11-30,194.95795553492184,38.1171310430872,Beirut +2026-12-31,171.0713263418897,43.651651907341474,Beirut +2027-01-31,534.3687580938333,387.6662688027607,Bekaa +2027-02-28,513.1129436616155,288.31189288636494,Bekaa +2027-03-31,529.3388083991695,348.8339636612855,Bekaa +2027-04-30,514.1163857702049,386.20273971451417,Bekaa +2027-05-31,527.4533419726366,391.5275907615951,Bekaa +2027-06-30,537.8412925117955,392.79358084221167,Bekaa +2027-07-31,544.9990404060245,392.7099704992466,Bekaa +2027-08-31,549.8993674326657,392.2311777151146,Bekaa +2027-09-30,553.6437423931717,391.02808683921813,Bekaa +2027-10-31,556.4268511937059,389.64096270634565,Bekaa +2027-11-30,558.4393492743532,388.9841237505789,Bekaa +2027-12-31,560.5279224022518,388.06921356969,Bekaa +2028-01-31,1035.2858783509728,147.43276385665723,Kesrouan +2028-02-29,532.2620478685765,104.05728779582638,Kesrouan +2028-03-31,598.0729374675591,95.94130629468319,Kesrouan +2028-04-30,599.5655054239448,95.24943244707865,Kesrouan +2028-05-31,584.1546585057617,93.69240736332652,Kesrouan +2028-06-30,543.488983105758,90.07237886720418,Kesrouan +2028-07-31,489.8486616148302,85.81345526702135,Kesrouan +2028-08-31,423.6248651605201,81.69806507617102,Kesrouan +2028-09-30,331.7650732894384,79.66071562831586,Kesrouan +2028-10-31,203.84146263728178,83.98288651957593,Kesrouan +2028-11-30,144.39655026572353,72.34030290054447,Kesrouan +2028-12-31,345.03747006198864,56.55653589160475,Beirut +2029-01-31,1357.421671457303,227.2214667076415,Baabda +2029-02-28,1521.7046204212952,260.503117182213,Baabda +2029-03-31,1510.9284496315458,215.86201653144033,Baabda +2029-04-30,1414.487889115844,216.3829277647762,Baabda +2029-05-31,1471.942902805844,216.7744901078298,Baabda +2029-06-30,1423.8377067490856,220.92079036718675,Baabda +2029-07-31,1450.0872686538596,215.34138376719002,Baabda +2029-08-31,1441.1114206947127,218.35501102068324,Baabda +2029-09-30,1453.9818504484372,215.15759417066386,Baabda +2029-10-31,1450.2634575996226,216.33407384456328,Baabda +2029-11-30,1464.2552205947632,214.38357194279388,Baabda +2029-12-31,1466.6006639626241,214.88537323512736,Baabda +2030-01-31,383.449395197441,33.58863196368149,Tripoli +2030-02-28,512.8105867330412,34.07569179879367,Tripoli +2030-03-31,533.7758477444886,34.840803015922994,Tripoli +2030-04-30,455.2959077505421,32.129471359216026,Tripoli +2030-05-31,337.4370186524866,30.476496271141137,Tripoli +2030-06-30,282.6608974258214,31.295352021800117,Tripoli +2030-07-31,307.06968789398036,41.63081915712863,Tripoli +2030-08-31,804.4257474246251,104.10198208407252,Bekaa +2030-09-30,654.3084472780624,212.3490942073844,Bekaa +2030-10-31,437.20429708120145,186.52484584640425,Bekaa +2030-11-30,416.9769712253535,191.88224296786993,Bekaa +2030-12-31,419.2591506702873,202.8109014685773,Bekaa +2031-01-31,824.2140403682369,38.090241372004535,Beirut +2031-02-28,334.1405292350702,24.03089417592564,Beirut +2031-03-31,409.51096464864764,31.262736330143852,Beirut +2031-04-30,394.55412094528174,33.99521423304207,Beirut +2031-05-31,217.72577052783726,34.940129457909265,Beirut +2031-06-30,169.5513368216412,46.41643222417453,Beirut +2031-07-31,223.1925939564803,49.67375473624341,Beirut +2031-08-31,324.4149426125195,44.481315739387014,Tripoli +2031-09-30,585.5095428619659,41.214037957506335,Tripoli +2031-10-31,666.5674697220413,36.0180658841258,Tripoli +2031-11-30,636.6953105104507,33.96171092117532,Tripoli +2031-12-31,628.0052657799089,34.08495089589136,Tripoli +2032-01-31,654.0718733137148,114.82513039957338,Kesrouan +2032-02-29,124.70592415193202,112.35497037535339,Kesrouan +2032-03-31,396.6535619370734,53.98854619673388,Kesrouan +2032-04-30,461.7427102173829,84.09096733344215,Kesrouan +2032-05-31,433.3016543544648,81.2567089797405,Kesrouan +2032-06-30,435.8360977924131,82.93077810105305,Kesrouan +2032-07-31,455.612371310395,83.94938320770923,Kesrouan +2032-08-31,471.679032637807,84.82840568518552,Kesrouan +2032-09-30,498.2993254492907,86.43931453701,Kesrouan +2032-10-31,542.6024245134751,89.6414827658032,Kesrouan +2032-11-30,594.7738570362344,94.38224490574233,Kesrouan +2032-12-31,634.59932420387,99.22094114223944,Kesrouan +2033-01-31,982.4387669790214,59.9619865529193,Beirut +2033-02-28,849.2117107196608,221.27775292634882,Kesrouan +2033-03-31,1096.7684072435668,133.6488399905998,Kesrouan +2033-04-30,1366.368154592156,243.63855943892878,Baabda +2033-05-31,1078.6721903272783,255.24523795022978,Baabda +2033-06-30,1144.6052174429924,277.08135649249976,Baabda +2033-07-31,1235.9314763667944,268.46755928781135,Baabda +2033-08-31,1310.5146753879067,262.32298227417886,Baabda +2033-09-30,1383.4930291832743,257.44972106242597,Baabda +2033-10-31,1414.4169241238005,252.3403180660455,Baabda +2033-11-30,1417.21982539169,245.54053810252444,Baabda +2033-12-31,1419.3025687382947,237.86152680971287,Baabda +2034-01-31,521.2322456062504,337.8505859852487,Bekaa +2034-02-28,471.75273258897573,255.4470758243694,Bekaa +2034-03-31,527.9669385073444,299.7218155843394,Bekaa +2034-04-30,518.973889094751,345.06624212386373,Bekaa +2034-05-31,519.0778175415163,352.1484419531831,Bekaa +2034-06-30,524.8696692704311,353.6289228470184,Bekaa +2034-07-31,528.9652705607259,353.90053463143005,Bekaa +2034-08-31,531.8926844414298,354.24465280401665,Bekaa +2034-09-30,534.4354767019713,354.0261241890562,Bekaa +2034-10-31,536.553558599381,354.01216592613827,Bekaa +2034-11-30,538.5084785931774,353.92204636829615,Bekaa +2034-12-31,540.3736487440954,353.7338708836711,Bekaa +2035-01-31,320.0089234614911,27.43357755070161,Beirut +2035-02-28,178.03050180909264,34.84637239763589,Beirut +2035-03-31,221.8560626154597,48.261881663384145,Beirut +2035-04-30,240.9367208716771,46.43909264601893,Beirut +2035-05-31,437.47232307549126,43.36202665395207,Tripoli +2035-06-30,644.4985807308841,36.60187632218197,Tripoli +2035-07-31,597.1124630062818,32.953478787959426,Tripoli +2035-08-31,590.3949715586343,33.50446468254509,Tripoli +2035-09-30,617.5735558947435,35.08954552667599,Tripoli +2035-10-31,648.4458464749299,36.299685151302825,Tripoli +2035-11-30,676.2115833516984,36.88060647259543,Tripoli +2035-12-31,689.4924728920591,36.57183646956792,Tripoli +2036-01-31,398.92357801116,286.1198190527979,Kesrouan +2036-02-29,524.6726082681848,96.76414763413045,Kesrouan +2036-03-31,827.243943243535,109.79427308966292,Kesrouan +2036-04-30,882.6897695928817,129.57788302322783,Kesrouan +2036-05-31,892.2775286700336,128.9116979487741,Kesrouan +2036-06-30,899.2500910424293,124.13074923891276,Kesrouan +2036-07-31,905.257212843557,119.84415277334391,Kesrouan +2036-08-31,911.8300393479922,117.0224081241784,Kesrouan +2036-09-30,916.1595516161177,115.4253357050469,Kesrouan +2036-10-31,925.0290960324163,113.81954372267116,Kesrouan +2036-11-30,927.7297961961457,113.1446042763374,Kesrouan +2036-12-31,924.0874064219742,113.32618352449624,Kesrouan +2037-01-31,1792.9880949746141,257.1944345281603,Baabda +2037-02-28,1484.5644512791564,271.68032674617695,Baabda +2037-03-31,1516.390594840632,198.9848754663486,Baabda +2037-04-30,1432.4122354428835,214.04305646400277,Baabda +2037-05-31,1498.14928114548,210.4049100729956,Baabda +2037-06-30,1497.4016296877244,212.24800992929502,Baabda +2037-07-31,1494.6722844257868,213.4329306973531,Baabda +2037-08-31,1504.426444173937,213.26536192506583,Baabda +2037-09-30,1504.0048286329732,215.31092621094754,Baabda +2037-10-31,1504.4031250487626,215.77727490781476,Baabda +2037-11-30,1498.687204421882,217.38571234650422,Baabda +2037-12-31,1493.4104606524547,218.2136705554002,Baabda +2038-01-31,1312.511627385104,222.357864892297,Baabda +2038-02-28,1423.1463378712267,337.5919578219553,Baabda +2038-03-31,1514.6147426969412,360.9051112031256,Baabda +2038-04-30,1555.1528826345707,430.4166687879063,Baabda +2038-05-31,1566.2667489036992,455.61450094072654,Baabda +2038-06-30,1176.000892832651,299.14547159864213,Baabda +2038-07-31,505.08346353246753,68.22040499137029,Baabda +2038-08-31,590.086856821375,79.41129434916661,Kesrouan +2038-09-30,597.9780775694726,94.93107266491421,Kesrouan +2038-10-31,562.0825307472192,89.76928267179673,Kesrouan +2038-11-30,425.5810086886622,80.8224538449939,Kesrouan +2038-12-31,181.64359873157895,88.57346680076276,Kesrouan +2039-01-31,518.4118549944801,331.08100251320235,Bekaa +2039-02-28,487.3270293012064,266.78266468079437,Bekaa +2039-03-31,525.6592807589792,301.08010076252975,Bekaa +2039-04-30,519.1292779566393,337.0206436841175,Bekaa +2039-05-31,519.3861481966015,343.21445751295573,Bekaa +2039-06-30,523.6179936349067,344.8472609966392,Bekaa +2039-07-31,527.0727508185539,345.37227964898835,Bekaa +2039-08-31,529.6467072186033,345.50765043324793,Bekaa +2039-09-30,531.8556185480197,345.558262189564,Bekaa +2039-10-31,533.8021177466144,345.5211909925374,Bekaa +2039-11-30,535.6060392076448,345.3614541632839,Bekaa +2039-12-31,537.3026495093077,345.13255257488316,Bekaa +2040-01-31,977.2292456259925,66.65888959361214,Beirut +2040-02-29,399.2393218449272,59.94033558151031,Kesrouan +2040-03-31,513.703550887486,103.25251213831041,Kesrouan +2040-04-30,655.5838738744126,118.6481454548136,Kesrouan +2040-05-31,755.1481175743704,144.86475675746854,Kesrouan +2040-06-30,817.1041542587025,169.83215574191703,Kesrouan +2040-07-31,884.020543125217,167.53809260573223,Kesrouan +2040-08-31,1018.6892107341008,127.8746790738296,Kesrouan +2040-09-30,1294.7906756498646,164.18960627675008,Kesrouan +2040-10-31,1380.1769632163287,275.7612389833607,Baabda +2040-11-30,1161.563547417895,268.70437984083514,Baabda +2040-12-31,1166.1428046377355,286.23186805113454,Baabda +2041-01-31,454.67787896080904,75.10727616142705,Kesrouan +2041-02-28,252.23426123785885,64.6345933841466,Beirut +2041-03-31,526.5393618164915,25.207095380739442,Beirut +2041-04-30,617.6874165614905,35.93452515843212,Beirut +2041-05-31,578.9925671017759,33.09549802163875,Beirut +2041-06-30,494.3380970191834,29.976087324235856,Beirut +2041-07-31,385.11664067481,28.747255462235056,Beirut +2041-08-31,204.20204540618403,33.991141622664514,Beirut +2041-09-30,171.1905849542789,46.63913787541969,Beirut +2041-10-31,242.24439119666374,48.09304237589362,Beirut +2041-11-30,417.50474636394824,42.20155895247727,Tripoli +2041-12-31,654.6099405353342,37.06777250678503,Tripoli +2042-01-31,530.9954739030796,370.36728188155143,Bekaa +2042-02-28,496.59155939330043,273.5320765484493,Bekaa +2042-03-31,532.24585403165,321.08678183801476,Bekaa +2042-04-30,515.6456597569581,359.3149831068174,Bekaa +2042-05-31,521.5012792170601,365.17230185428855,Bekaa +2042-06-30,528.4109375295714,366.2819315433152,Bekaa +2042-07-31,533.2893129106008,365.8539941759492,Bekaa +2042-08-31,536.6102730149287,365.49302862368097,Bekaa +2042-09-30,539.1553683989443,365.60768826969553,Bekaa +2042-10-31,541.5088007263557,365.4209747477702,Bekaa +2042-11-30,543.6929534784263,364.97709502525095,Bekaa +2042-12-31,545.6660105695806,364.5879692866968,Bekaa +2043-01-31,418.84660367800245,28.530241022927832,Beirut +2043-02-28,461.1374925519743,45.33783443387956,Tripoli +2043-03-31,578.6559512115252,43.726890773419335,Tripoli +2043-04-30,610.2440093838736,43.08947503637641,Tripoli +2043-05-31,704.0472056313818,40.88551405371585,Tripoli +2043-06-30,722.547116909102,37.91233443491269,Tripoli +2043-07-31,692.2933589269088,35.768035453851695,Tripoli +2043-08-31,662.3939220966724,34.732948458188865,Tripoli +2043-09-30,644.0232736239319,34.442435584589035,Tripoli +2043-10-31,644.5023233065293,34.84799099919621,Tripoli +2043-11-30,644.9257381627071,34.96719317217044,Tripoli +2043-12-31,651.7116755610982,35.21304656615986,Tripoli +2044-01-31,1630.1915243226715,247.01320445764378,Baabda +2044-02-29,1422.826491598771,279.07773617612935,Baabda +2044-03-31,1485.4478430766621,199.77581469117155,Baabda +2044-04-30,1421.6966655895446,213.0748368575306,Baabda +2044-05-31,1490.106486083748,210.05207233716465,Baabda +2044-06-30,1483.8133451361898,214.55942517037911,Baabda +2044-07-31,1498.81905824077,212.75837414601213,Baabda +2044-08-31,1505.1280331622122,215.20563008793778,Baabda +2044-09-30,1504.6917352091014,216.88364998940287,Baabda +2044-10-31,1512.5547426946423,217.39432748384132,Baabda +2044-11-30,1515.9059312945667,218.8334209098225,Baabda +2044-12-31,1526.8795949222138,219.26288985715954,Baabda +2045-01-31,318.3424696828165,74.4065087073997,Bekaa +2045-02-28,343.7529749169593,293.24401550109616,Bekaa +2045-03-31,515.6223406317838,241.16963512127637,Bekaa +2045-04-30,510.121834022333,300.2946613021483,Bekaa +2045-05-31,528.6560042617295,314.2331355107391,Bekaa +2045-06-30,517.5522141578,320.6038816348695,Bekaa +2045-07-31,521.7631875396219,322.80584112097694,Bekaa +2045-08-31,524.425670248204,324.176814046882,Bekaa +2045-09-30,527.4238332031258,325.1285169557118,Bekaa +2045-10-31,530.2159385797304,325.9198564798454,Bekaa +2045-11-30,532.8725195344106,326.5557406369173,Bekaa +2045-12-31,535.3932881767316,327.06680102634857,Bekaa +2046-01-31,366.35856365017327,76.2878458500219,Kesrouan +2046-02-28,925.4484804225149,194.70421387316753,Kesrouan +2046-03-31,1023.1472660811204,165.68542037461367,Kesrouan +2046-04-30,1291.567670265791,191.80552473477456,Kesrouan +2046-05-31,1570.28238862588,257.44354252958817,Baabda +2046-06-30,1385.9377947509524,263.58731894459953,Baabda +2046-07-31,1457.8741291195408,247.27961235101742,Baabda +2046-08-31,1443.6507582700433,246.24228019835158,Baabda +2046-09-30,1446.782718304284,244.185698979269,Baabda +2046-10-31,1442.8201943672227,245.1831404354161,Baabda +2046-11-30,1432.0199847262134,244.3650678790605,Baabda +2046-12-31,1437.5644665994962,239.32178388620306,Baabda diff --git a/.history/main_timegan_20250718171958.py b/.history/main_timegan_20250718171958.py new file mode 100644 index 00000000..eb7c46b5 --- /dev/null +++ b/.history/main_timegan_20250718171958.py @@ -0,0 +1,163 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720213959.py b/.history/main_timegan_20250720213959.py new file mode 100644 index 00000000..ed677e27 --- /dev/null +++ b/.history/main_timegan_20250720213959.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy']: + + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214003.py b/.history/main_timegan_20250720214003.py new file mode 100644 index 00000000..aad3750d --- /dev/null +++ b/.history/main_timegan_20250720214003.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy']: + if args.data_name in ['stock', 'energy']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214005.py b/.history/main_timegan_20250720214005.py new file mode 100644 index 00000000..d1d508d9 --- /dev/null +++ b/.history/main_timegan_20250720214005.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy']: + if args.data_name in ['stock', 'energy']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214010.py b/.history/main_timegan_20250720214010.py new file mode 100644 index 00000000..284270cd --- /dev/null +++ b/.history/main_timegan_20250720214010.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in ['stock', 'energy']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214013.py b/.history/main_timegan_20250720214013.py new file mode 100644 index 00000000..63f2ae08 --- /dev/null +++ b/.history/main_timegan_20250720214013.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in ]: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214015.py b/.history/main_timegan_20250720214015.py new file mode 100644 index 00000000..55d7a91f --- /dev/null +++ b/.history/main_timegan_20250720214015.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in []]: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214017.py b/.history/main_timegan_20250720214017.py new file mode 100644 index 00000000..25d2be0b --- /dev/null +++ b/.history/main_timegan_20250720214017.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in ['']]: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214022.py b/.history/main_timegan_20250720214022.py new file mode 100644 index 00000000..864821e7 --- /dev/null +++ b/.history/main_timegan_20250720214022.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in ['tra']]: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214026.py b/.history/main_timegan_20250720214026.py new file mode 100644 index 00000000..03812abb --- /dev/null +++ b/.history/main_timegan_20250720214026.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in ['transaction']]: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720214030.py b/.history/main_timegan_20250720214030.py new file mode 100644 index 00000000..157aac25 --- /dev/null +++ b/.history/main_timegan_20250720214030.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy']: + if args.data_name in ['transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720215121.py b/.history/main_timegan_20250720215121.py new file mode 100644 index 00000000..78fc39fe --- /dev/null +++ b/.history/main_timegan_20250720215121.py @@ -0,0 +1,163 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) +elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250720215124.py b/.history/main_timegan_20250720215124.py new file mode 100644 index 00000000..df952e81 --- /dev/null +++ b/.history/main_timegan_20250720215124.py @@ -0,0 +1,163 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721232343.py b/.history/main_timegan_20250721232343.py new file mode 100644 index 00000000..fa388e13 --- /dev/null +++ b/.history/main_timegan_20250721232343.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy', 'transaction']: + + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721232345.py b/.history/main_timegan_20250721232345.py new file mode 100644 index 00000000..5f1b513f --- /dev/null +++ b/.history/main_timegan_20250721232345.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy', 'transaction']: + + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721232346.py b/.history/main_timegan_20250721232346.py new file mode 100644 index 00000000..ea4a3810 --- /dev/null +++ b/.history/main_timegan_20250721232346.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721232348.py b/.history/main_timegan_20250721232348.py new file mode 100644 index 00000000..295412ca --- /dev/null +++ b/.history/main_timegan_20250721232348.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721232351.py b/.history/main_timegan_20250721232351.py new file mode 100644 index 00000000..cd3d5a12 --- /dev/null +++ b/.history/main_timegan_20250721232351.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721233037.py b/.history/main_timegan_20250721233037.py new file mode 100644 index 00000000..65431bb4 --- /dev/null +++ b/.history/main_timegan_20250721233037.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', ''], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721233038.py b/.history/main_timegan_20250721233038.py new file mode 100644 index 00000000..38698973 --- /dev/null +++ b/.history/main_timegan_20250721233038.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='stock', + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721233418.py b/.history/main_timegan_20250721233418.py new file mode 100644 index 00000000..7e14bb62 --- /dev/null +++ b/.history/main_timegan_20250721233418.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() +parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250721233420.py b/.history/main_timegan_20250721233420.py new file mode 100644 index 00000000..16746aa4 --- /dev/null +++ b/.history/main_timegan_20250721233420.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722014100.py b/.history/main_timegan_20250722014100.py new file mode 100644 index 00000000..94d1c027 --- /dev/null +++ b/.history/main_timegan_20250722014100.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722014104.py b/.history/main_timegan_20250722014104.py new file mode 100644 index 00000000..3f13c96a --- /dev/null +++ b/.history/main_timegan_20250722014104.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=50000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722014118.py b/.history/main_timegan_20250722014118.py new file mode 100644 index 00000000..d2b4596f --- /dev/null +++ b/.history/main_timegan_20250722014118.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=20000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722014142.py b/.history/main_timegan_20250722014142.py new file mode 100644 index 00000000..dc058676 --- /dev/null +++ b/.history/main_timegan_20250722014142.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=20000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722014157.py b/.history/main_timegan_20250722014157.py new file mode 100644 index 00000000..d1621a8f --- /dev/null +++ b/.history/main_timegan_20250722014157.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=20000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722115131.py b/.history/main_timegan_20250722115131.py new file mode 100644 index 00000000..42d96e90 --- /dev/null +++ b/.history/main_timegan_20250722115131.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130555.py b/.history/main_timegan_20250722130555.py new file mode 100644 index 00000000..9a7a689f --- /dev/null +++ b/.history/main_timegan_20250722130555.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130558.py b/.history/main_timegan_20250722130558.py new file mode 100644 index 00000000..10ff6c4e --- /dev/null +++ b/.history/main_timegan_20250722130558.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130610.py b/.history/main_timegan_20250722130610.py new file mode 100644 index 00000000..4e175c5c --- /dev/null +++ b/.history/main_timegan_20250722130610.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + +return ori_data, generated_data, metric_results + + # Calls main function + ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130613.py b/.history/main_timegan_20250722130613.py new file mode 100644 index 00000000..2fa42b8e --- /dev/null +++ b/.history/main_timegan_20250722130613.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + +return ori_data, generated_data, metric_results + + # Calls main function + # ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130615.py b/.history/main_timegan_20250722130615.py new file mode 100644 index 00000000..c2a51266 --- /dev/null +++ b/.history/main_timegan_20250722130615.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function + # ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130622.py b/.history/main_timegan_20250722130622.py new file mode 100644 index 00000000..37b72e3c --- /dev/null +++ b/.history/main_timegan_20250722130622.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() +stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function + # ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130625.py b/.history/main_timegan_20250722130625.py new file mode 100644 index 00000000..b24f2d19 --- /dev/null +++ b/.history/main_timegan_20250722130625.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() +stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + +return ori_data, generated_data, metric_results + +# Calls main function + # ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130628.py b/.history/main_timegan_20250722130628.py new file mode 100644 index 00000000..37b72e3c --- /dev/null +++ b/.history/main_timegan_20250722130628.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() +stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function + # ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130630.py b/.history/main_timegan_20250722130630.py new file mode 100644 index 00000000..c2a51266 --- /dev/null +++ b/.history/main_timegan_20250722130630.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function + # ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/.history/main_timegan_20250722130633.py b/.history/main_timegan_20250722130633.py new file mode 100644 index 00000000..eeb0975b --- /dev/null +++ b/.history/main_timegan_20250722130633.py @@ -0,0 +1,177 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function diff --git a/.history/main_timegan_20250722130636.py b/.history/main_timegan_20250722130636.py new file mode 100644 index 00000000..9674f00b --- /dev/null +++ b/.history/main_timegan_20250722130636.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + # ori_data, generated_data, metrics = main(args) + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function diff --git a/.history/main_timegan_20250722130637.py b/.history/main_timegan_20250722130637.py new file mode 100644 index 00000000..37badad5 --- /dev/null +++ b/.history/main_timegan_20250722130637.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + # ori_data, generated_data, metrics = main(args) + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function diff --git a/.history/main_timegan_20250722130638.py b/.history/main_timegan_20250722130638.py new file mode 100644 index 00000000..7a065eb6 --- /dev/null +++ b/.history/main_timegan_20250722130638.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + # Calls main function diff --git a/.history/main_timegan_20250722130641.py b/.history/main_timegan_20250722130641.py new file mode 100644 index 00000000..4fe00a8e --- /dev/null +++ b/.history/main_timegan_20250722130641.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + +return ori_data, generated_data, metric_results + + # Calls main function diff --git a/.history/main_timegan_20250722130706.py b/.history/main_timegan_20250722130706.py new file mode 100644 index 00000000..8b737701 --- /dev/null +++ b/.history/main_timegan_20250722130706.py @@ -0,0 +1,178 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + +return ori_data, generated_data, metric_results + + # Calls main function diff --git a/.history/main_timegan_20250722130749.py b/.history/main_timegan_20250722130749.py new file mode 100644 index 00000000..86cccfcc --- /dev/null +++ b/.history/main_timegan_20250722130749.py @@ -0,0 +1,165 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130802.py b/.history/main_timegan_20250722130802.py new file mode 100644 index 00000000..0db8a006 --- /dev/null +++ b/.history/main_timegan_20250722130802.py @@ -0,0 +1,180 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + +return ori_data, generated_data, metric_results + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130806.py b/.history/main_timegan_20250722130806.py new file mode 100644 index 00000000..18666de8 --- /dev/null +++ b/.history/main_timegan_20250722130806.py @@ -0,0 +1,180 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + +return ori_data, generated_data, metric_results + + return ori_data, generated_data, metric_results + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130812.py b/.history/main_timegan_20250722130812.py new file mode 100644 index 00000000..a5d3e5a3 --- /dev/null +++ b/.history/main_timegan_20250722130812.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + +return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130823.py b/.history/main_timegan_20250722130823.py new file mode 100644 index 00000000..3818dd47 --- /dev/null +++ b/.history/main_timegan_20250722130823.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130824.py b/.history/main_timegan_20250722130824.py new file mode 100644 index 00000000..73bffb24 --- /dev/null +++ b/.history/main_timegan_20250722130824.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130825.py b/.history/main_timegan_20250722130825.py new file mode 100644 index 00000000..3818dd47 --- /dev/null +++ b/.history/main_timegan_20250722130825.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + +stacked_data = np.asarray(generated_data) + +# Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +num_samples, seq_len, num_features = stacked_data.shape +reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# 2. Save to a CSV file using pandas +# This creates a file named 'synthetic_data.csv' in your project folder. +pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +print("Synthetic data saved to synthetic_data.csv") +# ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722130832.py b/.history/main_timegan_20250722130832.py new file mode 100644 index 00000000..ac7f5614 --- /dev/null +++ b/.history/main_timegan_20250722130832.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722131007.py b/.history/main_timegan_20250722131007.py new file mode 100644 index 00000000..07f56d8f --- /dev/null +++ b/.history/main_timegan_20250722131007.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722131017.py b/.history/main_timegan_20250722131017.py new file mode 100644 index 00000000..55480ce6 --- /dev/null +++ b/.history/main_timegan_20250722131017.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=18, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722131649.py b/.history/main_timegan_20250722131649.py new file mode 100644 index 00000000..52787e79 --- /dev/null +++ b/.history/main_timegan_20250722131649.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=18, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142006.py b/.history/main_timegan_20250722142006.py new file mode 100644 index 00000000..5480637d --- /dev/null +++ b/.history/main_timegan_20250722142006.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=18, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142017.py b/.history/main_timegan_20250722142017.py new file mode 100644 index 00000000..344648e7 --- /dev/null +++ b/.history/main_timegan_20250722142017.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=18, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=332, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142018.py b/.history/main_timegan_20250722142018.py new file mode 100644 index 00000000..52787e79 --- /dev/null +++ b/.history/main_timegan_20250722142018.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=18, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142046.py b/.history/main_timegan_20250722142046.py new file mode 100644 index 00000000..818222eb --- /dev/null +++ b/.history/main_timegan_20250722142046.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=2 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142053.py b/.history/main_timegan_20250722142053.py new file mode 100644 index 00000000..beaaee9e --- /dev/null +++ b/.history/main_timegan_20250722142053.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=8000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142059.py b/.history/main_timegan_20250722142059.py new file mode 100644 index 00000000..2c4cadb3 --- /dev/null +++ b/.history/main_timegan_20250722142059.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=10000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142103.py b/.history/main_timegan_20250722142103.py new file mode 100644 index 00000000..8ab34186 --- /dev/null +++ b/.history/main_timegan_20250722142103.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=10000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142317.py b/.history/main_timegan_20250722142317.py new file mode 100644 index 00000000..959d6cda --- /dev/null +++ b/.history/main_timegan_20250722142317.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=10000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142322.py b/.history/main_timegan_20250722142322.py new file mode 100644 index 00000000..2c4cadb3 --- /dev/null +++ b/.history/main_timegan_20250722142322.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=10000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722142327.py b/.history/main_timegan_20250722142327.py new file mode 100644 index 00000000..a9ea6c7b --- /dev/null +++ b/.history/main_timegan_20250722142327.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=10000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722154118.py b/.history/main_timegan_20250722154118.py new file mode 100644 index 00000000..4f77ff1d --- /dev/null +++ b/.history/main_timegan_20250722154118.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=12, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=12000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722154121.py b/.history/main_timegan_20250722154121.py new file mode 100644 index 00000000..127a0a18 --- /dev/null +++ b/.history/main_timegan_20250722154121.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=1, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=12000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722154123.py b/.history/main_timegan_20250722154123.py new file mode 100644 index 00000000..b4a445ec --- /dev/null +++ b/.history/main_timegan_20250722154123.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=12000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=32, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722154129.py b/.history/main_timegan_20250722154129.py new file mode 100644 index 00000000..e51c07c4 --- /dev/null +++ b/.history/main_timegan_20250722154129.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=12000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250722174053.py b/.history/main_timegan_20250722174053.py new file mode 100644 index 00000000..e51c07c4 --- /dev/null +++ b/.history/main_timegan_20250722174053.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=12000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterati ons of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/metrics/discriminative_metrics_20250718171958.py b/.history/metrics/discriminative_metrics_20250718171958.py new file mode 100644 index 00000000..e0f8047e --- /dev/null +++ b/.history/metrics/discriminative_metrics_20250718171958.py @@ -0,0 +1,129 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use post-hoc RNN to classify original data and synthetic data + +Output: discriminative score (np.abs(classification accuracy - 0.5)) +""" + +# Necessary Packages +import tensorflow as tf +import numpy as np +from sklearn.metrics import accuracy_score +from utils import train_test_divide, extract_time, batch_generator + + +def discriminative_score_metrics (ori_data, generated_data): + """Use post-hoc RNN to classify original data and synthetic data + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - discriminative_score: np.abs(classification accuracy - 0.5) + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN discriminator network + # Network parameters + hidden_dim = int(dim/2) + iterations = 2000 + batch_size = 128 + + # Input place holders + # Feature + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + X_hat = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x_hat") + + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + T_hat = tf.placeholder(tf.int32, [None], name = "myinput_t_hat") + + # discriminator function + def discriminator (x, t): + """Simple discriminator function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat_logit: logits of the discriminator output + - y_hat: discriminator output + - d_vars: discriminator variables + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE) as vs: + d_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'd_cell') + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(d_last_states, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + d_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat_logit, y_hat, d_vars + + y_logit_real, y_pred_real, d_vars = discriminator(X, T) + y_logit_fake, y_pred_fake, _ = discriminator(X_hat, T_hat) + + # Loss for the discriminator + d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_real, + labels = tf.ones_like(y_logit_real))) + d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_fake, + labels = tf.zeros_like(y_logit_fake))) + d_loss = d_loss_real + d_loss_fake + + # optimizer + d_solver = tf.train.AdamOptimizer().minimize(d_loss, var_list = d_vars) + + ## Train the discriminator + # Start session and initialize + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Train/test division for both original and generated data + train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat = \ + train_test_divide(ori_data, generated_data, ori_time, generated_time) + + # Training step + for itt in range(iterations): + + # Batch setting + X_mb, T_mb = batch_generator(train_x, train_t, batch_size) + X_hat_mb, T_hat_mb = batch_generator(train_x_hat, train_t_hat, batch_size) + + # Train discriminator + _, step_d_loss = sess.run([d_solver, d_loss], + feed_dict={X: X_mb, T: T_mb, X_hat: X_hat_mb, T_hat: T_hat_mb}) + + ## Test the performance on the testing set + y_pred_real_curr, y_pred_fake_curr = sess.run([y_pred_real, y_pred_fake], + feed_dict={X: test_x, T: test_t, X_hat: test_x_hat, T_hat: test_t_hat}) + + y_pred_final = np.squeeze(np.concatenate((y_pred_real_curr, y_pred_fake_curr), axis = 0)) + y_label_final = np.concatenate((np.ones([len(y_pred_real_curr),]), np.zeros([len(y_pred_fake_curr),])), axis = 0) + + # Compute the accuracy + acc = accuracy_score(y_label_final, (y_pred_final>0.5)) + discriminative_score = np.abs(0.5-acc) + + return discriminative_score diff --git a/.history/metrics/discriminative_metrics_20250720215721.py b/.history/metrics/discriminative_metrics_20250720215721.py new file mode 100644 index 00000000..46aaf8d0 --- /dev/null +++ b/.history/metrics/discriminative_metrics_20250720215721.py @@ -0,0 +1,131 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use post-hoc RNN to classify original data and synthetic data + +Output: discriminative score (np.abs(classification accuracy - 0.5)) +""" +# Necessary Packages +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # Add this +# Necessary Packages +import tensorflow as tf +import numpy as np +from sklearn.metrics import accuracy_score +from utils import train_test_divide, extract_time, batch_generator + + +def discriminative_score_metrics (ori_data, generated_data): + """Use post-hoc RNN to classify original data and synthetic data + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - discriminative_score: np.abs(classification accuracy - 0.5) + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN discriminator network + # Network parameters + hidden_dim = int(dim/2) + iterations = 2000 + batch_size = 128 + + # Input place holders + # Feature + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + X_hat = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x_hat") + + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + T_hat = tf.placeholder(tf.int32, [None], name = "myinput_t_hat") + + # discriminator function + def discriminator (x, t): + """Simple discriminator function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat_logit: logits of the discriminator output + - y_hat: discriminator output + - d_vars: discriminator variables + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE) as vs: + d_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'd_cell') + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(d_last_states, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + d_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat_logit, y_hat, d_vars + + y_logit_real, y_pred_real, d_vars = discriminator(X, T) + y_logit_fake, y_pred_fake, _ = discriminator(X_hat, T_hat) + + # Loss for the discriminator + d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_real, + labels = tf.ones_like(y_logit_real))) + d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_fake, + labels = tf.zeros_like(y_logit_fake))) + d_loss = d_loss_real + d_loss_fake + + # optimizer + d_solver = tf.train.AdamOptimizer().minimize(d_loss, var_list = d_vars) + + ## Train the discriminator + # Start session and initialize + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Train/test division for both original and generated data + train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat = \ + train_test_divide(ori_data, generated_data, ori_time, generated_time) + + # Training step + for itt in range(iterations): + + # Batch setting + X_mb, T_mb = batch_generator(train_x, train_t, batch_size) + X_hat_mb, T_hat_mb = batch_generator(train_x_hat, train_t_hat, batch_size) + + # Train discriminator + _, step_d_loss = sess.run([d_solver, d_loss], + feed_dict={X: X_mb, T: T_mb, X_hat: X_hat_mb, T_hat: T_hat_mb}) + + ## Test the performance on the testing set + y_pred_real_curr, y_pred_fake_curr = sess.run([y_pred_real, y_pred_fake], + feed_dict={X: test_x, T: test_t, X_hat: test_x_hat, T_hat: test_t_hat}) + + y_pred_final = np.squeeze(np.concatenate((y_pred_real_curr, y_pred_fake_curr), axis = 0)) + y_label_final = np.concatenate((np.ones([len(y_pred_real_curr),]), np.zeros([len(y_pred_fake_curr),])), axis = 0) + + # Compute the accuracy + acc = accuracy_score(y_label_final, (y_pred_final>0.5)) + discriminative_score = np.abs(0.5-acc) + + return discriminative_score diff --git a/.history/metrics/discriminative_metrics_20250720220419.py b/.history/metrics/discriminative_metrics_20250720220419.py new file mode 100644 index 00000000..40f4b66d --- /dev/null +++ b/.history/metrics/discriminative_metrics_20250720220419.py @@ -0,0 +1,131 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use post-hoc RNN to classify original data and synthetic data + +Output: discriminative score (np.abs(classification accuracy - 0.5)) +""" +# Necessary Packages +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # Add this +# Necessary Packages +# import tensorflow as tf +import numpy as np +from sklearn.metrics import accuracy_score +from utils import train_test_divide, extract_time, batch_generator + + +def discriminative_score_metrics (ori_data, generated_data): + """Use post-hoc RNN to classify original data and synthetic data + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - discriminative_score: np.abs(classification accuracy - 0.5) + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN discriminator network + # Network parameters + hidden_dim = int(dim/2) + iterations = 2000 + batch_size = 128 + + # Input place holders + # Feature + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + X_hat = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x_hat") + + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + T_hat = tf.placeholder(tf.int32, [None], name = "myinput_t_hat") + + # discriminator function + def discriminator (x, t): + """Simple discriminator function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat_logit: logits of the discriminator output + - y_hat: discriminator output + - d_vars: discriminator variables + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE) as vs: + d_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'd_cell') + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(d_last_states, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + d_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat_logit, y_hat, d_vars + + y_logit_real, y_pred_real, d_vars = discriminator(X, T) + y_logit_fake, y_pred_fake, _ = discriminator(X_hat, T_hat) + + # Loss for the discriminator + d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_real, + labels = tf.ones_like(y_logit_real))) + d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_fake, + labels = tf.zeros_like(y_logit_fake))) + d_loss = d_loss_real + d_loss_fake + + # optimizer + d_solver = tf.train.AdamOptimizer().minimize(d_loss, var_list = d_vars) + + ## Train the discriminator + # Start session and initialize + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Train/test division for both original and generated data + train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat = \ + train_test_divide(ori_data, generated_data, ori_time, generated_time) + + # Training step + for itt in range(iterations): + + # Batch setting + X_mb, T_mb = batch_generator(train_x, train_t, batch_size) + X_hat_mb, T_hat_mb = batch_generator(train_x_hat, train_t_hat, batch_size) + + # Train discriminator + _, step_d_loss = sess.run([d_solver, d_loss], + feed_dict={X: X_mb, T: T_mb, X_hat: X_hat_mb, T_hat: T_hat_mb}) + + ## Test the performance on the testing set + y_pred_real_curr, y_pred_fake_curr = sess.run([y_pred_real, y_pred_fake], + feed_dict={X: test_x, T: test_t, X_hat: test_x_hat, T_hat: test_t_hat}) + + y_pred_final = np.squeeze(np.concatenate((y_pred_real_curr, y_pred_fake_curr), axis = 0)) + y_label_final = np.concatenate((np.ones([len(y_pred_real_curr),]), np.zeros([len(y_pred_fake_curr),])), axis = 0) + + # Compute the accuracy + acc = accuracy_score(y_label_final, (y_pred_final>0.5)) + discriminative_score = np.abs(0.5-acc) + + return discriminative_score diff --git a/.history/metrics/discriminative_metrics_20250720234927.py b/.history/metrics/discriminative_metrics_20250720234927.py new file mode 100644 index 00000000..4b0c80fa --- /dev/null +++ b/.history/metrics/discriminative_metrics_20250720234927.py @@ -0,0 +1,131 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use post-hoc RNN to classify original data and synthetic data + +Output: discriminative score (np.abs(classification accuracy - 0.5)) +""" +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +# Necessary Packages +# import tensorflow as tf +import numpy as np +from sklearn.metrics import accuracy_score +from utils import train_test_divide, extract_time, batch_generator + + +def discriminative_score_metrics (ori_data, generated_data): + """Use post-hoc RNN to classify original data and synthetic data + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - discriminative_score: np.abs(classification accuracy - 0.5) + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN discriminator network + # Network parameters + hidden_dim = int(dim/2) + iterations = 2000 + batch_size = 128 + + # Input place holders + # Feature + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + X_hat = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x_hat") + + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + T_hat = tf.placeholder(tf.int32, [None], name = "myinput_t_hat") + + # discriminator function + def discriminator (x, t): + """Simple discriminator function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat_logit: logits of the discriminator output + - y_hat: discriminator output + - d_vars: discriminator variables + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE) as vs: + d_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'd_cell') + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(d_last_states, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + d_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat_logit, y_hat, d_vars + + y_logit_real, y_pred_real, d_vars = discriminator(X, T) + y_logit_fake, y_pred_fake, _ = discriminator(X_hat, T_hat) + + # Loss for the discriminator + d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_real, + labels = tf.ones_like(y_logit_real))) + d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_fake, + labels = tf.zeros_like(y_logit_fake))) + d_loss = d_loss_real + d_loss_fake + + # optimizer + d_solver = tf.train.AdamOptimizer().minimize(d_loss, var_list = d_vars) + + ## Train the discriminator + # Start session and initialize + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Train/test division for both original and generated data + train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat = \ + train_test_divide(ori_data, generated_data, ori_time, generated_time) + + # Training step + for itt in range(iterations): + + # Batch setting + X_mb, T_mb = batch_generator(train_x, train_t, batch_size) + X_hat_mb, T_hat_mb = batch_generator(train_x_hat, train_t_hat, batch_size) + + # Train discriminator + _, step_d_loss = sess.run([d_solver, d_loss], + feed_dict={X: X_mb, T: T_mb, X_hat: X_hat_mb, T_hat: T_hat_mb}) + + ## Test the performance on the testing set + y_pred_real_curr, y_pred_fake_curr = sess.run([y_pred_real, y_pred_fake], + feed_dict={X: test_x, T: test_t, X_hat: test_x_hat, T_hat: test_t_hat}) + + y_pred_final = np.squeeze(np.concatenate((y_pred_real_curr, y_pred_fake_curr), axis = 0)) + y_label_final = np.concatenate((np.ones([len(y_pred_real_curr),]), np.zeros([len(y_pred_fake_curr),])), axis = 0) + + # Compute the accuracy + acc = accuracy_score(y_label_final, (y_pred_final>0.5)) + discriminative_score = np.abs(0.5-acc) + + return discriminative_score diff --git a/.history/metrics/discriminative_metrics_20250720234930.py b/.history/metrics/discriminative_metrics_20250720234930.py new file mode 100644 index 00000000..12da5b33 --- /dev/null +++ b/.history/metrics/discriminative_metrics_20250720234930.py @@ -0,0 +1,131 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use post-hoc RNN to classify original data and synthetic data + +Output: discriminative score (np.abs(classification accuracy - 0.5)) +""" +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +# Necessary Packages +import tensorflow as tf +import numpy as np +from sklearn.metrics import accuracy_score +from utils import train_test_divide, extract_time, batch_generator + + +def discriminative_score_metrics (ori_data, generated_data): + """Use post-hoc RNN to classify original data and synthetic data + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - discriminative_score: np.abs(classification accuracy - 0.5) + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN discriminator network + # Network parameters + hidden_dim = int(dim/2) + iterations = 2000 + batch_size = 128 + + # Input place holders + # Feature + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + X_hat = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x_hat") + + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + T_hat = tf.placeholder(tf.int32, [None], name = "myinput_t_hat") + + # discriminator function + def discriminator (x, t): + """Simple discriminator function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat_logit: logits of the discriminator output + - y_hat: discriminator output + - d_vars: discriminator variables + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE) as vs: + d_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'd_cell') + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(d_last_states, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + d_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat_logit, y_hat, d_vars + + y_logit_real, y_pred_real, d_vars = discriminator(X, T) + y_logit_fake, y_pred_fake, _ = discriminator(X_hat, T_hat) + + # Loss for the discriminator + d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_real, + labels = tf.ones_like(y_logit_real))) + d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = y_logit_fake, + labels = tf.zeros_like(y_logit_fake))) + d_loss = d_loss_real + d_loss_fake + + # optimizer + d_solver = tf.train.AdamOptimizer().minimize(d_loss, var_list = d_vars) + + ## Train the discriminator + # Start session and initialize + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Train/test division for both original and generated data + train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat = \ + train_test_divide(ori_data, generated_data, ori_time, generated_time) + + # Training step + for itt in range(iterations): + + # Batch setting + X_mb, T_mb = batch_generator(train_x, train_t, batch_size) + X_hat_mb, T_hat_mb = batch_generator(train_x_hat, train_t_hat, batch_size) + + # Train discriminator + _, step_d_loss = sess.run([d_solver, d_loss], + feed_dict={X: X_mb, T: T_mb, X_hat: X_hat_mb, T_hat: T_hat_mb}) + + ## Test the performance on the testing set + y_pred_real_curr, y_pred_fake_curr = sess.run([y_pred_real, y_pred_fake], + feed_dict={X: test_x, T: test_t, X_hat: test_x_hat, T_hat: test_t_hat}) + + y_pred_final = np.squeeze(np.concatenate((y_pred_real_curr, y_pred_fake_curr), axis = 0)) + y_label_final = np.concatenate((np.ones([len(y_pred_real_curr),]), np.zeros([len(y_pred_fake_curr),])), axis = 0) + + # Compute the accuracy + acc = accuracy_score(y_label_final, (y_pred_final>0.5)) + discriminative_score = np.abs(0.5-acc) + + return discriminative_score diff --git a/.history/metrics/predictive_metrics_20250718171958.py b/.history/metrics/predictive_metrics_20250718171958.py new file mode 100644 index 00000000..4f343068 --- /dev/null +++ b/.history/metrics/predictive_metrics_20250718171958.py @@ -0,0 +1,123 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use Post-hoc RNN to predict one-step ahead (last feature) +""" + +# Necessary Packages +import tensorflow as tf +import numpy as np +from sklearn.metrics import mean_absolute_error +from utils import extract_time + + +def predictive_score_metrics (ori_data, generated_data): + """Report the performance of Post-hoc RNN one-step ahead prediction. + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - predictive_score: MAE of the predictions on the original data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN predictive network + # Network parameters + hidden_dim = int(dim/2) + iterations = 5000 + batch_size = 128 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len-1, dim-1], name = "myinput_x") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + Y = tf.placeholder(tf.float32, [None, max_seq_len-1, 1], name = "myinput_y") + + # Predictor function + def predictor (x, t): + """Simple predictor function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat: prediction + - p_vars: predictor variables + """ + with tf.variable_scope("predictor", reuse = tf.AUTO_REUSE) as vs: + p_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'p_cell') + p_outputs, p_last_states = tf.nn.dynamic_rnn(p_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(p_outputs, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + p_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat, p_vars + + y_pred, p_vars = predictor(X, T) + # Loss for the predictor + p_loss = tf.losses.absolute_difference(Y, y_pred) + # optimizer + p_solver = tf.train.AdamOptimizer().minimize(p_loss, var_list = p_vars) + + ## Training + # Session start + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Training using Synthetic dataset + for itt in range(iterations): + + # Set mini-batch + idx = np.random.permutation(len(generated_data)) + train_idx = idx[:batch_size] + + X_mb = list(generated_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(generated_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(generated_data[i][1:,(dim-1)],[len(generated_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Train predictor + _, step_p_loss = sess.run([p_solver, p_loss], feed_dict={X: X_mb, T: T_mb, Y: Y_mb}) + + ## Test the trained model on the original data + idx = np.random.permutation(len(ori_data)) + train_idx = idx[:no] + + X_mb = list(ori_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(ori_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(ori_data[i][1:,(dim-1)], [len(ori_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Prediction + pred_Y_curr = sess.run(y_pred, feed_dict={X: X_mb, T: T_mb}) + + # Compute the performance in terms of MAE + MAE_temp = 0 + for i in range(no): + MAE_temp = MAE_temp + mean_absolute_error(Y_mb[i], pred_Y_curr[i,:,:]) + + predictive_score = MAE_temp / no + + return predictive_score + \ No newline at end of file diff --git a/.history/metrics/predictive_metrics_20250720215649.py b/.history/metrics/predictive_metrics_20250720215649.py new file mode 100644 index 00000000..4be0cf1d --- /dev/null +++ b/.history/metrics/predictive_metrics_20250720215649.py @@ -0,0 +1,125 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use Post-hoc RNN to predict one-step ahead (last feature) +""" +# Necessary Packages +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # Add this +# Necessary Packages +import tensorflow as tf +import numpy as np +from sklearn.metrics import mean_absolute_error +from utils import extract_time + + +def predictive_score_metrics (ori_data, generated_data): + """Report the performance of Post-hoc RNN one-step ahead prediction. + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - predictive_score: MAE of the predictions on the original data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN predictive network + # Network parameters + hidden_dim = int(dim/2) + iterations = 5000 + batch_size = 128 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len-1, dim-1], name = "myinput_x") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + Y = tf.placeholder(tf.float32, [None, max_seq_len-1, 1], name = "myinput_y") + + # Predictor function + def predictor (x, t): + """Simple predictor function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat: prediction + - p_vars: predictor variables + """ + with tf.variable_scope("predictor", reuse = tf.AUTO_REUSE) as vs: + p_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'p_cell') + p_outputs, p_last_states = tf.nn.dynamic_rnn(p_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(p_outputs, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + p_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat, p_vars + + y_pred, p_vars = predictor(X, T) + # Loss for the predictor + p_loss = tf.losses.absolute_difference(Y, y_pred) + # optimizer + p_solver = tf.train.AdamOptimizer().minimize(p_loss, var_list = p_vars) + + ## Training + # Session start + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Training using Synthetic dataset + for itt in range(iterations): + + # Set mini-batch + idx = np.random.permutation(len(generated_data)) + train_idx = idx[:batch_size] + + X_mb = list(generated_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(generated_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(generated_data[i][1:,(dim-1)],[len(generated_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Train predictor + _, step_p_loss = sess.run([p_solver, p_loss], feed_dict={X: X_mb, T: T_mb, Y: Y_mb}) + + ## Test the trained model on the original data + idx = np.random.permutation(len(ori_data)) + train_idx = idx[:no] + + X_mb = list(ori_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(ori_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(ori_data[i][1:,(dim-1)], [len(ori_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Prediction + pred_Y_curr = sess.run(y_pred, feed_dict={X: X_mb, T: T_mb}) + + # Compute the performance in terms of MAE + MAE_temp = 0 + for i in range(no): + MAE_temp = MAE_temp + mean_absolute_error(Y_mb[i], pred_Y_curr[i,:,:]) + + predictive_score = MAE_temp / no + + return predictive_score + \ No newline at end of file diff --git a/.history/metrics/predictive_metrics_20250720220409.py b/.history/metrics/predictive_metrics_20250720220409.py new file mode 100644 index 00000000..8d628654 --- /dev/null +++ b/.history/metrics/predictive_metrics_20250720220409.py @@ -0,0 +1,125 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use Post-hoc RNN to predict one-step ahead (last feature) +""" +# Necessary Packages +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # Add this +# # Necessary Packages +# import tensorflow as tf +import numpy as np +from sklearn.metrics import mean_absolute_error +from utils import extract_time + + +def predictive_score_metrics (ori_data, generated_data): + """Report the performance of Post-hoc RNN one-step ahead prediction. + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - predictive_score: MAE of the predictions on the original data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN predictive network + # Network parameters + hidden_dim = int(dim/2) + iterations = 5000 + batch_size = 128 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len-1, dim-1], name = "myinput_x") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + Y = tf.placeholder(tf.float32, [None, max_seq_len-1, 1], name = "myinput_y") + + # Predictor function + def predictor (x, t): + """Simple predictor function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat: prediction + - p_vars: predictor variables + """ + with tf.variable_scope("predictor", reuse = tf.AUTO_REUSE) as vs: + p_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'p_cell') + p_outputs, p_last_states = tf.nn.dynamic_rnn(p_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(p_outputs, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + p_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat, p_vars + + y_pred, p_vars = predictor(X, T) + # Loss for the predictor + p_loss = tf.losses.absolute_difference(Y, y_pred) + # optimizer + p_solver = tf.train.AdamOptimizer().minimize(p_loss, var_list = p_vars) + + ## Training + # Session start + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Training using Synthetic dataset + for itt in range(iterations): + + # Set mini-batch + idx = np.random.permutation(len(generated_data)) + train_idx = idx[:batch_size] + + X_mb = list(generated_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(generated_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(generated_data[i][1:,(dim-1)],[len(generated_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Train predictor + _, step_p_loss = sess.run([p_solver, p_loss], feed_dict={X: X_mb, T: T_mb, Y: Y_mb}) + + ## Test the trained model on the original data + idx = np.random.permutation(len(ori_data)) + train_idx = idx[:no] + + X_mb = list(ori_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(ori_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(ori_data[i][1:,(dim-1)], [len(ori_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Prediction + pred_Y_curr = sess.run(y_pred, feed_dict={X: X_mb, T: T_mb}) + + # Compute the performance in terms of MAE + MAE_temp = 0 + for i in range(no): + MAE_temp = MAE_temp + mean_absolute_error(Y_mb[i], pred_Y_curr[i,:,:]) + + predictive_score = MAE_temp / no + + return predictive_score + \ No newline at end of file diff --git a/.history/metrics/predictive_metrics_20250720234918.py b/.history/metrics/predictive_metrics_20250720234918.py new file mode 100644 index 00000000..22003981 --- /dev/null +++ b/.history/metrics/predictive_metrics_20250720234918.py @@ -0,0 +1,125 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use Post-hoc RNN to predict one-step ahead (last feature) +""" +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +# # Necessary Packages +# import tensorflow as tf +import numpy as np +from sklearn.metrics import mean_absolute_error +from utils import extract_time + + +def predictive_score_metrics (ori_data, generated_data): + """Report the performance of Post-hoc RNN one-step ahead prediction. + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - predictive_score: MAE of the predictions on the original data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN predictive network + # Network parameters + hidden_dim = int(dim/2) + iterations = 5000 + batch_size = 128 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len-1, dim-1], name = "myinput_x") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + Y = tf.placeholder(tf.float32, [None, max_seq_len-1, 1], name = "myinput_y") + + # Predictor function + def predictor (x, t): + """Simple predictor function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat: prediction + - p_vars: predictor variables + """ + with tf.variable_scope("predictor", reuse = tf.AUTO_REUSE) as vs: + p_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'p_cell') + p_outputs, p_last_states = tf.nn.dynamic_rnn(p_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(p_outputs, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + p_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat, p_vars + + y_pred, p_vars = predictor(X, T) + # Loss for the predictor + p_loss = tf.losses.absolute_difference(Y, y_pred) + # optimizer + p_solver = tf.train.AdamOptimizer().minimize(p_loss, var_list = p_vars) + + ## Training + # Session start + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Training using Synthetic dataset + for itt in range(iterations): + + # Set mini-batch + idx = np.random.permutation(len(generated_data)) + train_idx = idx[:batch_size] + + X_mb = list(generated_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(generated_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(generated_data[i][1:,(dim-1)],[len(generated_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Train predictor + _, step_p_loss = sess.run([p_solver, p_loss], feed_dict={X: X_mb, T: T_mb, Y: Y_mb}) + + ## Test the trained model on the original data + idx = np.random.permutation(len(ori_data)) + train_idx = idx[:no] + + X_mb = list(ori_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(ori_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(ori_data[i][1:,(dim-1)], [len(ori_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Prediction + pred_Y_curr = sess.run(y_pred, feed_dict={X: X_mb, T: T_mb}) + + # Compute the performance in terms of MAE + MAE_temp = 0 + for i in range(no): + MAE_temp = MAE_temp + mean_absolute_error(Y_mb[i], pred_Y_curr[i,:,:]) + + predictive_score = MAE_temp / no + + return predictive_score + \ No newline at end of file diff --git a/.history/metrics/predictive_metrics_20250720234920.py b/.history/metrics/predictive_metrics_20250720234920.py new file mode 100644 index 00000000..16ad5b58 --- /dev/null +++ b/.history/metrics/predictive_metrics_20250720234920.py @@ -0,0 +1,125 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +predictive_metrics.py + +Note: Use Post-hoc RNN to predict one-step ahead (last feature) +""" +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +# # Necessary Packages +import tensorflow as tf +import numpy as np +from sklearn.metrics import mean_absolute_error +from utils import extract_time + + +def predictive_score_metrics (ori_data, generated_data): + """Report the performance of Post-hoc RNN one-step ahead prediction. + + Args: + - ori_data: original data + - generated_data: generated synthetic data + + Returns: + - predictive_score: MAE of the predictions on the original data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Set maximum sequence length and each sequence length + ori_time, ori_max_seq_len = extract_time(ori_data) + generated_time, generated_max_seq_len = extract_time(ori_data) + max_seq_len = max([ori_max_seq_len, generated_max_seq_len]) + + ## Builde a post-hoc RNN predictive network + # Network parameters + hidden_dim = int(dim/2) + iterations = 5000 + batch_size = 128 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len-1, dim-1], name = "myinput_x") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + Y = tf.placeholder(tf.float32, [None, max_seq_len-1, 1], name = "myinput_y") + + # Predictor function + def predictor (x, t): + """Simple predictor function. + + Args: + - x: time-series data + - t: time information + + Returns: + - y_hat: prediction + - p_vars: predictor variables + """ + with tf.variable_scope("predictor", reuse = tf.AUTO_REUSE) as vs: + p_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh, name = 'p_cell') + p_outputs, p_last_states = tf.nn.dynamic_rnn(p_cell, x, dtype=tf.float32, sequence_length = t) + y_hat_logit = tf.contrib.layers.fully_connected(p_outputs, 1, activation_fn=None) + y_hat = tf.nn.sigmoid(y_hat_logit) + p_vars = [v for v in tf.all_variables() if v.name.startswith(vs.name)] + + return y_hat, p_vars + + y_pred, p_vars = predictor(X, T) + # Loss for the predictor + p_loss = tf.losses.absolute_difference(Y, y_pred) + # optimizer + p_solver = tf.train.AdamOptimizer().minimize(p_loss, var_list = p_vars) + + ## Training + # Session start + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # Training using Synthetic dataset + for itt in range(iterations): + + # Set mini-batch + idx = np.random.permutation(len(generated_data)) + train_idx = idx[:batch_size] + + X_mb = list(generated_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(generated_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(generated_data[i][1:,(dim-1)],[len(generated_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Train predictor + _, step_p_loss = sess.run([p_solver, p_loss], feed_dict={X: X_mb, T: T_mb, Y: Y_mb}) + + ## Test the trained model on the original data + idx = np.random.permutation(len(ori_data)) + train_idx = idx[:no] + + X_mb = list(ori_data[i][:-1,:(dim-1)] for i in train_idx) + T_mb = list(ori_time[i]-1 for i in train_idx) + Y_mb = list(np.reshape(ori_data[i][1:,(dim-1)], [len(ori_data[i][1:,(dim-1)]),1]) for i in train_idx) + + # Prediction + pred_Y_curr = sess.run(y_pred, feed_dict={X: X_mb, T: T_mb}) + + # Compute the performance in terms of MAE + MAE_temp = 0 + for i in range(no): + MAE_temp = MAE_temp + mean_absolute_error(Y_mb[i], pred_Y_curr[i,:,:]) + + predictive_score = MAE_temp / no + + return predictive_score + \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722134015.py b/.history/process_synthetic_data_20250722134015.py new file mode 100644 index 00000000..e69de29b diff --git a/.history/process_synthetic_data_20250722134039.py b/.history/process_synthetic_data_20250722134039.py new file mode 100644 index 00000000..a0350f11 --- /dev/null +++ b/.history/process_synthetic_data_20250722134039.py @@ -0,0 +1,94 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +# TODO: Define the name of your original city ID column from the CSV. +original_city_column_name = 'city_id' + +# TODO: Define the name of your original date column from the CSV. +original_date_column_name = 'date' + + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['city_id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722134104.py b/.history/process_synthetic_data_20250722134104.py new file mode 100644 index 00000000..65934a28 --- /dev/null +++ b/.history/process_synthetic_data_20250722134104.py @@ -0,0 +1,95 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +# TODO: Define the name of your original city ID column from the CSV. +original_city_column_name = 'city_id' + +# TODO: Define the name of your original date column from the CSV. +original_date_column_name = 'date' + + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['city_id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722134106.py b/.history/process_synthetic_data_20250722134106.py new file mode 100644 index 00000000..1e8f7ca2 --- /dev/null +++ b/.history/process_synthetic_data_20250722134106.py @@ -0,0 +1,95 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + id,date,transaction_number,city,transaction_value + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +# TODO: Define the name of your original city ID column from the CSV. +original_city_column_name = 'city_id' + +# TODO: Define the name of your original date column from the CSV. +original_date_column_name = 'date' + + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['city_id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722134114.py b/.history/process_synthetic_data_20250722134114.py new file mode 100644 index 00000000..09dd61bc --- /dev/null +++ b/.history/process_synthetic_data_20250722134114.py @@ -0,0 +1,95 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +# TODO: Define the name of your original city ID column from the CSV. +original_city_column_name = 'city_id' + +# TODO: Define the name of your original date column from the CSV. +original_date_column_name = 'date' + + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['city_id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722134343.py b/.history/process_synthetic_data_20250722134343.py new file mode 100644 index 00000000..3604a6d5 --- /dev/null +++ b/.history/process_synthetic_data_20250722134343.py @@ -0,0 +1,95 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +# TODO: Define the name of your original city ID column from the CSV. +original_city_column_name = 'id' + +# TODO: Define the name of your original date column from the CSV. +original_date_column_name = 'date' + + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['city_id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722134400.py b/.history/process_synthetic_data_20250722134400.py new file mode 100644 index 00000000..618d9a9f --- /dev/null +++ b/.history/process_synthetic_data_20250722134400.py @@ -0,0 +1,95 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +# TODO: Define the name of your original city ID column from the CSV. +original_city_column_name = 'id' + +# TODO: Define the name of your original date column from the CSV. +original_date_column_name = 'date' + + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722135144.py b/.history/process_synthetic_data_20250722135144.py new file mode 100644 index 00000000..417e47ee --- /dev/null +++ b/.history/process_synthetic_data_20250722135144.py @@ -0,0 +1,94 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + + 'feature_1', 'feature_2', 'feature_3', # Replace with your real feature names + 'city_1', 'city_2', 'city_3', 'city_4', 'city_5' # The one-hot encoded city columns +] + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722135350.py b/.history/process_synthetic_data_20250722135350.py new file mode 100644 index 00000000..7323d43c --- /dev/null +++ b/.history/process_synthetic_data_20250722135350.py @@ -0,0 +1,100 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order + 'city_Baalbak', # + 'city_Bekaa', # This is newly added + 'city_Beirut', # + 'city_Kesrouan', # + 'city_Tripoli' # +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722154011.py b/.history/process_synthetic_data_20250722154011.py new file mode 100644 index 00000000..608dae8b --- /dev/null +++ b/.history/process_synthetic_data_20250722154011.py @@ -0,0 +1,119 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order + 'city_Baalbak', # + 'city_Bekaa', # This is newly added + 'city_Beirut', # + 'city_Kesrouan', # + 'city_Tripoli' # +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['city_id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['city_id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['city_id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722154019.py b/.history/process_synthetic_data_20250722154019.py new file mode 100644 index 00000000..1d27ed9d --- /dev/null +++ b/.history/process_synthetic_data_20250722154019.py @@ -0,0 +1,125 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +# Replace the example below with your actual column names: +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order + 'city_Baalbak', # + 'city_Bekaa', # This is newly added + 'city_Beirut', # + 'city_Kesrouan', # + 'city_Tripoli' # +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['city_id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['city_id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['city_id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") + +# --- Step 6: Save the Final, Usable Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722174102.py b/.history/process_synthetic_data_20250722174102.py new file mode 100644 index 00000000..c6296e10 --- /dev/null +++ b/.history/process_synthetic_data_20250722174102.py @@ -0,0 +1,124 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Baalbak', + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['city_id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['city_id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['city_id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") + +# --- Step 6: Save the Final, Usable Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722174114.py b/.history/process_synthetic_data_20250722174114.py new file mode 100644 index 00000000..f44b504a --- /dev/null +++ b/.history/process_synthetic_data_20250722174114.py @@ -0,0 +1,124 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Baalbak', + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['city_id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['city_id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") + +# --- Step 6: Save the Final, Usable Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722174117.py b/.history/process_synthetic_data_20250722174117.py new file mode 100644 index 00000000..9a6e8c0c --- /dev/null +++ b/.history/process_synthetic_data_20250722174117.py @@ -0,0 +1,124 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Baalbak', + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['city_id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") + +# --- Step 6: Save the Final, Usable Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722174430.py b/.history/process_synthetic_data_20250722174430.py new file mode 100644 index 00000000..6d72ce77 --- /dev/null +++ b/.history/process_synthetic_data_20250722174430.py @@ -0,0 +1,123 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['city_id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") + +# --- Step 6: Save the Final, Usable Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722174532.py b/.history/process_synthetic_data_20250722174532.py new file mode 100644 index 00000000..ca685362 --- /dev/null +++ b/.history/process_synthetic_data_20250722174532.py @@ -0,0 +1,123 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city_id' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value +# Then, extract the number 'X' to be the city_id +df_synthetic_denormalized['id'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '').astype(int) + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city_id' column.") + + +# --- Step 5: Add a Date Index --- +# The GAN generates a sequence. We need to give it a realistic time index. +# We create a date range that matches the length of the generated data. +# Customize the start date and frequency ('M' for month, 'D' for day) as needed. +# Create a date range for 6 years (72 months) +date_range_per_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Create a list to hold each city's DataFrame +dfs_by_city = [] + +# Get the list of city IDs from the reconstructed column +city_ids = sorted(df_final['id'].unique()) + +current_row = 0 +for city_id in city_ids: + # Extract the next 72 rows for this city + city_df = df_final.iloc[current_row : current_row + 72].copy() + + # Assign the date range + city_df['date'] = date_range_per_city + + # Update the city_id to be this city's ID + city_df['id'] = city_id + + dfs_by_city.append(city_df) + current_row += 72 + +# Combine all the city DataFrames into one final DataFrame +df_final_structured = pd.concat(dfs_by_city) + +# Set a multi-index of city and date for clarity and easy filtering +df_final_structured = df_final_structured.set_index(['id', 'date']) + +print("-> Reconstructed a structured index with dates from 2017 to 2022 for each city.") + +# --- Step 6: Save the Final, Usable Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722174749.py b/.history/process_synthetic_data_20250722174749.py new file mode 100644 index 00000000..98b5fa3d --- /dev/null +++ b/.history/process_synthetic_data_20250722174749.py @@ -0,0 +1,93 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + +# --- THE REST OF THE SCRIPT SHOULD WORK AUTOMATICALLY --- + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv') + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- + +# Load and process the original data exactly as the GAN did +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# Ensure the column order matches what the model was trained on +df_original = df_original[column_names] + +# Calculate the min and max values for each column +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +# Formula: original_value = normalized_value * (max - min) + min +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + +city_cols = [col for col in column_names if col.startswith('city_')] + +# For each row, find which 'city_X' column has the highest value. +# Then, remove the 'city_' prefix to get the city name. +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') + +# Drop the now-redundant one-hot encoded columns +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Add a Date Index --- +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722175136.py b/.history/process_synthetic_data_20250722175136.py new file mode 100644 index 00000000..de82025c --- /dev/null +++ b/.history/process_synthetic_data_20250722175136.py @@ -0,0 +1,88 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + + + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + # THIS IS THE FIX: Only read the first 360 rows. + df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) + + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_id_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_id_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +df_original = df_original[column_names] +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Add a Date Index --- +date_range = pd.date_range(start='2017-01-01', periods=len(df_final), freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) diff --git a/.history/process_synthetic_data_20250722180039.py b/.history/process_synthetic_data_20250722180039.py new file mode 100644 index 00000000..4c368290 --- /dev/null +++ b/.history/process_synthetic_data_20250722180039.py @@ -0,0 +1,88 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + + + +print("Starting the reverse transformation process...") + +# --- Step 1: Load and Rename the Raw Synthetic Data --- +try: + # THIS IS THE FIX: Only read the first 360 rows. + df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) + + # The raw CSV has headers '0', '1', '2', etc. We replace them. + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max Values from Original Data for Denormalization --- +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_id_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_id_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +df_original = df_original[column_names] +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data for denormalization.") + + +# --- Step 3: Denormalize the Synthetic Data --- +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized to its original scale.") + + +# --- Step 4: Reconstruct the 'city' Column from One-Hot Encoding --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Add a Date Index --- +date_range = pd.date_range(start='2017-01-01', periods=72, freq='M') +df_final.set_index(date_range, inplace=True) +df_final.index.name = 'date' +print("-> Added a date index.") + + +# --- Step 6: Save the Final, Usable Data --- +df_final.to_csv('final_usable_synthetic_data.csv') +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final.head()) diff --git a/.history/process_synthetic_data_20250722180359.py b/.history/process_synthetic_data_20250722180359.py new file mode 100644 index 00000000..49a01860 --- /dev/null +++ b/.history/process_synthetic_data_20250722180359.py @@ -0,0 +1,110 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + + + + +print("Starting the reverse transformation process...") + +# --- Step 1: Load Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max for Denormalization --- +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_id_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_id_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +df_original = df_original[column_names] +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data.") + + +# --- Step 3: Denormalize Synthetic Data --- +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized.") + + +# --- Step 4: Reconstruct 'city' Column --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Create a Structured DataFrame with Correct Dates --- +# THIS IS THE FINAL, CORRECTED LOGIC +# Since the data is 72 months for 5 cities, we structure it that way. + +# Create one 72-month date range (6 years) +date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='M') + +# Get the unique city names from the newly created 'city' column +cities = df_final['city'].unique() + +# Create a new DataFrame by repeating the date range for each city +structured_dfs = [] +for city_name in cities: + temp_df = pd.DataFrame({ + 'date': date_range_single_city, + 'city': city_name + }) + structured_dfs.append(temp_df) + +final_index_df = pd.concat(structured_dfs, ignore_index=True) + +# Combine the new date/city columns with your synthetic data +# This assumes df_final is already ordered by city (which it should be) +df_final.reset_index(drop=True, inplace=True) +final_index_df.reset_index(drop=True, inplace=True) + +df_final_structured = pd.concat([final_index_df, df_final], axis=1) + +print("-> Created a structured final DataFrame.") + + +# --- Step 6: Save the Final Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722181058.py b/.history/process_synthetic_data_20250722181058.py new file mode 100644 index 00000000..5e951e47 --- /dev/null +++ b/.history/process_synthetic_data_20250722181058.py @@ -0,0 +1,100 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + + +print("Starting the reverse transformation process...") + +# --- Step 1: Load Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max for Denormalization --- +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_id_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_id_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +df_original = df_original[column_names] +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data.") + + +# --- Step 3: Denormalize Synthetic Data --- +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized.") + + +# --- Step 4: Reconstruct 'city' Column --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Create a Structured DataFrame with Correct Dates --- +date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='M') +cities = sorted(df_final['city'].unique()) # Sort to ensure consistent order + +structured_dfs = [] +for city_name in cities: + temp_df = pd.DataFrame({ + 'date': date_range_single_city, + 'city': city_name + }) + structured_dfs.append(temp_df) + +final_index_df = pd.concat(structured_dfs, ignore_index=True) + +# THIS IS THE FIX: We only want the data part from df_final, not its flawed 'city' column +df_final_data_only = df_final.drop(columns=['city']) + +# Combine the structured date/city columns with the synthetic data values +df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) + +print("-> Created a structured final DataFrame.") + + +# --- Step 6: Save the Final Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250722182917.py b/.history/process_synthetic_data_20250722182917.py new file mode 100644 index 00000000..3dc68110 --- /dev/null +++ b/.history/process_synthetic_data_20250722182917.py @@ -0,0 +1,30 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + diff --git a/.history/process_synthetic_data_20250722182919.py b/.history/process_synthetic_data_20250722182919.py new file mode 100644 index 00000000..e92fead7 --- /dev/null +++ b/.history/process_synthetic_data_20250722182919.py @@ -0,0 +1,104 @@ +import pandas as pd +import numpy as np + +# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# TODO: Define the column names in the exact order they went into the model. +# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# function right before the `ori_data = df.values` line and run the main script again. +# The console output will give you the exact list you need here. +# +# EXAMPLE: +# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', # Alphabetical order is crucial + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] + + +original_city_column_name = 'city' + +# TODO: Define the name of your original date and id columns from the CSV. +original_date_column_name = 'date' +original_id_column_name = 'id' + + + +print("Starting the reverse transformation process...") + +# --- Step 1: Load Raw Synthetic Data --- +try: + df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) + df_synthetic.columns = column_names + print("-> Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max for Denormalization --- +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_id_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_id_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +df_original = df_original[column_names] +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data.") + + +# --- Step 3: Denormalize Synthetic Data --- +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized.") + + +# --- Step 4: Reconstruct 'city' Column --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Create a Structured DataFrame with Correct Dates --- +# THIS IS THE FIX: Use 'MS' for Month Start frequency to match your original data. +date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='MS') + +cities = sorted(df_final_data_only['city'].unique()) # Using the correct df + +structured_dfs = [] +for city_name in cities: + temp_df = pd.DataFrame({ + 'date': date_range_single_city, + 'city': city_name + }) + structured_dfs.append(temp_df) + +final_index_df = pd.concat(structured_dfs, ignore_index=True) + +df_final_data_only.reset_index(drop=True, inplace=True) +final_index_df.reset_index(drop=True, inplace=True) + +# Drop the flawed city column from the data part before combining +df_final_data_only = df_final_data_only.drop(columns=['city']) +df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) + +print("-> Created a structured final DataFrame.") + + +# --- Step 6: Save the Final Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/requirements_20250718171958.txt b/.history/requirements_20250718171958.txt new file mode 100644 index 00000000..34db7e4c --- /dev/null +++ b/.history/requirements_20250718171958.txt @@ -0,0 +1,8 @@ +numpy>=1.17.2 +tensorflow==1.15.0 +tqdm>=4.36.1 +argparse>=1.1 +pandas>=0.25.1 +scikit-learn>=0.21.3 +matplotlib>=3.1.1 +protobuf==3.20.3 diff --git a/.history/requirements_20250720223149.txt b/.history/requirements_20250720223149.txt new file mode 100644 index 00000000..324265c4 --- /dev/null +++ b/.history/requirements_20250720223149.txt @@ -0,0 +1,7 @@ +numpy>=1.17.2 tensorflow==1.15.0 +tqdm>=4.36.1 +argparse>=1.1 +pandas>=0.25.1 +scikit-learn>=0.21.3 +matplotlib>=3.1.1 +protobuf==3.20.3 diff --git a/.history/requirements_20250720223155.txt b/.history/requirements_20250720223155.txt new file mode 100644 index 00000000..0f7fd5b2 --- /dev/null +++ b/.history/requirements_20250720223155.txt @@ -0,0 +1,6 @@ +numpy>=1.17.2 tensorflow==1.15.0 tqdm>=4.36.1 +argparse>=1.1 +pandas>=0.25.1 +scikit-learn>=0.21.3 +matplotlib>=3.1.1 +protobuf==3.20.3 diff --git a/.history/requirements_20250720223158.txt b/.history/requirements_20250720223158.txt new file mode 100644 index 00000000..51953279 --- /dev/null +++ b/.history/requirements_20250720223158.txt @@ -0,0 +1,5 @@ +numpy>=1.17.2 tensorflow==1.15.0 tqdm>=4.36.1 argparse>=1.1 +pandas>=0.25.1 +scikit-learn>=0.21.3 +matplotlib>=3.1.1 +protobuf==3.20.3 diff --git a/.history/requirements_20250720223201.txt b/.history/requirements_20250720223201.txt new file mode 100644 index 00000000..a6d78841 --- /dev/null +++ b/.history/requirements_20250720223201.txt @@ -0,0 +1,2 @@ +numpy>=1.17.2 tensorflow==1.15.0 tqdm>=4.36.1 argparse>=1.1 pandas>=0.25.1 scikit-learn>=0.21.3 matplotlib>=3.1.1 +protobuf==3.20.3 diff --git a/.history/requirements_20250720223207.txt b/.history/requirements_20250720223207.txt new file mode 100644 index 00000000..a13a7ee3 --- /dev/null +++ b/.history/requirements_20250720223207.txt @@ -0,0 +1 @@ +numpy>=1.17.2 tensorflow==1.15.0 tqdm>=4.36.1 argparse>=1.1 pandas>=0.25.1 scikit-learn>=0.21.3 matplotlib>=3.1.1 protobuf==3.20.3 diff --git a/.history/requirements_20250720223211.txt b/.history/requirements_20250720223211.txt new file mode 100644 index 00000000..082e6774 --- /dev/null +++ b/.history/requirements_20250720223211.txt @@ -0,0 +1 @@ + numpy>=1.17.2 tensorflow==1.15.0 tqdm>=4.36.1 argparse>=1.1 pandas>=0.25.1 scikit-learn>=0.21.3 matplotlib>=3.1.1 protobuf==3.20.3 diff --git a/.history/timegan_20250718171958.py b/.history/timegan_20250718171958.py new file mode 100644 index 00000000..05a2c658 --- /dev/null +++ b/.history/timegan_20250718171958.py @@ -0,0 +1,307 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" + +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250720215623.py b/.history/timegan_20250720215623.py new file mode 100644 index 00000000..a060e2a7 --- /dev/null +++ b/.history/timegan_20250720215623.py @@ -0,0 +1,308 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250720220354.py b/.history/timegan_20250720220354.py new file mode 100644 index 00000000..ca2d27c4 --- /dev/null +++ b/.history/timegan_20250720220354.py @@ -0,0 +1,308 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # This line is crucial +# Necessary Packages +# import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250720220358.py b/.history/timegan_20250720220358.py new file mode 100644 index 00000000..083c5c35 --- /dev/null +++ b/.history/timegan_20250720220358.py @@ -0,0 +1,308 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +# import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250720234909.py b/.history/timegan_20250720234909.py new file mode 100644 index 00000000..2ed1bdd7 --- /dev/null +++ b/.history/timegan_20250720234909.py @@ -0,0 +1,308 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250720234913.py b/.history/timegan_20250720234913.py new file mode 100644 index 00000000..22a8b9b3 --- /dev/null +++ b/.history/timegan_20250720234913.py @@ -0,0 +1,308 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250722141910.py b/.history/timegan_20250722141910.py new file mode 100644 index 00000000..c7f9b2f6 --- /dev/null +++ b/.history/timegan_20250722141910.py @@ -0,0 +1,308 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) + + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250722154054.py b/.history/timegan_20250722154054.py new file mode 100644 index 00000000..0b0fa7eb --- /dev/null +++ b/.history/timegan_20250722154054.py @@ -0,0 +1,309 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/utils_20250718171958.py b/.history/utils_20250718171958.py new file mode 100644 index 00000000..f968e2bb --- /dev/null +++ b/.history/utils_20250718171958.py @@ -0,0 +1,145 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +""" + +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +def random_generator (batch_size, z_dim, T_mb, max_seq_len): + """Random vector generation. + + Args: + - batch_size: size of the random vector + - z_dim: dimension of random vector + - T_mb: time information for the random vector + - max_seq_len: maximum sequence length + + Returns: + - Z_mb: generated random vector + """ + Z_mb = list() + for i in range(batch_size): + temp = np.zeros([max_seq_len, z_dim]) + temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) + temp[:T_mb[i],:] = temp_Z + Z_mb.append(temp_Z) + return Z_mb + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250720215736.py b/.history/utils_20250720215736.py new file mode 100644 index 00000000..cfba0948 --- /dev/null +++ b/.history/utils_20250720215736.py @@ -0,0 +1,147 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +""" +# Necessary Packages +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +def random_generator (batch_size, z_dim, T_mb, max_seq_len): + """Random vector generation. + + Args: + - batch_size: size of the random vector + - z_dim: dimension of random vector + - T_mb: time information for the random vector + - max_seq_len: maximum sequence length + + Returns: + - Z_mb: generated random vector + """ + Z_mb = list() + for i in range(batch_size): + temp = np.zeros([max_seq_len, z_dim]) + temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) + temp[:T_mb[i],:] = temp_Z + Z_mb.append(temp_Z) + return Z_mb + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250720220426.py b/.history/utils_20250720220426.py new file mode 100644 index 00000000..906024cd --- /dev/null +++ b/.history/utils_20250720220426.py @@ -0,0 +1,147 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +""" +# Necessary Packages +import tensorflow.compat.v1 as tf +tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +# import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +def random_generator (batch_size, z_dim, T_mb, max_seq_len): + """Random vector generation. + + Args: + - batch_size: size of the random vector + - z_dim: dimension of random vector + - T_mb: time information for the random vector + - max_seq_len: maximum sequence length + + Returns: + - Z_mb: generated random vector + """ + Z_mb = list() + for i in range(batch_size): + temp = np.zeros([max_seq_len, z_dim]) + temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) + temp[:T_mb[i],:] = temp_Z + Z_mb.append(temp_Z) + return Z_mb + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250720234935.py b/.history/utils_20250720234935.py new file mode 100644 index 00000000..d634f320 --- /dev/null +++ b/.history/utils_20250720234935.py @@ -0,0 +1,147 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +# import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +def random_generator (batch_size, z_dim, T_mb, max_seq_len): + """Random vector generation. + + Args: + - batch_size: size of the random vector + - z_dim: dimension of random vector + - T_mb: time information for the random vector + - max_seq_len: maximum sequence length + + Returns: + - Z_mb: generated random vector + """ + Z_mb = list() + for i in range(batch_size): + temp = np.zeros([max_seq_len, z_dim]) + temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) + temp[:T_mb[i],:] = temp_Z + Z_mb.append(temp_Z) + return Z_mb + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250720234939.py b/.history/utils_20250720234939.py new file mode 100644 index 00000000..3e6d30a2 --- /dev/null +++ b/.history/utils_20250720234939.py @@ -0,0 +1,147 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +def random_generator (batch_size, z_dim, T_mb, max_seq_len): + """Random vector generation. + + Args: + - batch_size: size of the random vector + - z_dim: dimension of random vector + - T_mb: time information for the random vector + - max_seq_len: maximum sequence length + + Returns: + - Z_mb: generated random vector + """ + Z_mb = list() + for i in range(batch_size): + temp = np.zeros([max_seq_len, z_dim]) + temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) + temp[:T_mb[i],:] = temp_Z + Z_mb.append(temp_Z) + return Z_mb + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/__pycache__/data_loading.cpython-312.pyc b/__pycache__/data_loading.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1791c46eaa444f99662af32c1ec70317d6a2e929 GIT binary patch literal 5104 zcmbtYUu+b|8K2$T+q>Pf@BHT=1_D`Z0={D3@h8E_C55^;fdp_8+(ZHq+|BOTUi)tM zJi7<>X-~OCX;UjvI140>G*aDvDiM*IN_|MBsA`oLq`vqt26u&2+VYZ@$^{ym4}+2Wn%&PZ!qyYS{nD8m}uCP4qzP<+0ss7X;3|di769J zPD#VqI&F|CQ|hI{2L^{@(tbn5ugNBki{eo{h6&acoRpr|bTg}uOUDdD?~{gPUBfBq zd6^JwS$)zGZ9>K=Svn=_l8T8mqD;s#>666nuc1Rw26YWxdXX3k zHcbsSADJ~RoCam7*mEzA#QLONJ9a(^n!YG!VB3_YPbH-Z%gUI^L?T1qnQ>jqm~lm^ zbQ4buJn>||RX0rkc+D{Va@{cfdetzZcvvoIEr_TRNb zq$ZQ(tTkbfFI!6Loit~`VmqGLwfkG+X<19f6(b!J#r_8sQH0Ip(Uc*p@YV6mtSI*G zh=GyyBl66MBBwBH13d}4l1>ek(sG!Hy*pzP*a?ri)4dNf^rUzC*d3PWu!$|PcUMdz zSWZ>stJ@`|!?3R;>#CF?I8!mcE9TA-s) zLa%OsU3@lU``{1JvGpj=+3aM*TcQ56Id4Y>y}OY^R&8h!K;zyr*?I39gc|f>y|uh& z-Va~F*T3RHvYdD%E+qD<9nYTXZyn#bDKZ1IY#d*4IK_tu|E8z82e_j3< zn&nTU8Q(E-6IDW9? zICgws8i$uN8LX=g5AReX?SueF(^<=f<5<86fE}qpouEN9*9eXPu$-wh8O>owXB?lV z&Nv+XV3VFMJqajZ3@XVJFGET)Ph_D!F=Qy&G}bNi#F4{N8c;N4o~S0G+LNx)fQ3%i zy+_~;l80fV_3$(Q0#yO6Mmb;GjY#{M++1#P{o}vuygYq1@>1d8Y6}XlomWe2QJp(k z=)KjtuGG8K+EeIVE4H88UkaW*vT&dr-F{InM-$gVI|}kjsIxd&luO&@ zrxruqh1XX2$aQ{gnO|EZ%l!IPKWf=|S42YSj4&r$4{j_6H-4Zj#D1tR1^Wv849&(1jT&0$@}vf zjXwC-7}C@yk`lPzIAooamzeI4XPO+VDW;YuD^( z)1i`QVjQ8)ZjD&lj!IOJ^fL>;A>oA8)-Fy*T~TM7eEeVf#w>q0&Qt!J|P2=OTf8b1LkauNv536q_7Er@t~whC20<7pwQJBs+LYlV_1fS3JL(j)=i*g zmGwZRX{N2JSWUAaRf);>FVOOveT3S0ykgp$`(lE_r63OyN{-xMB^}Um0$E+7*9FH1 zbb#99->{2W-o`Ca=0;qry)O106lh? zNwOA3O-k&jO{&F>aVOf0XOo>EdW6ndf~tV-b^(aLv$nA1E{|H;iyiMhS&(mqBJb=e z4Bcw&DDHmm_z##{t&uaw=8j!&-BfPfRGMDsS!&%{P;Z3W&S-Pm_3$I*@FNS%!tSN; zwgQG__B{2;z^_j(bqxLL)w>jm6^3rMv=w*G9V{wyd!fSx-#+xlp(3}; ztyz5(wX9j~b@R|aZ?8d}&oCy9_}}mC-k%IAjUZp+*>_zCqF{dtne6lEO$OTR6x?0O zx;oG_<=$|SRsA3FHSW#oahMzUN^^tv&259Zf;%@<55+ngA3?9PstA9fDzj(n9MrBs zULGI?z_SKvYD=9T*QIQRCNvM=s+=A;yv@NMLm>t@{Z|R+FLU}PpfX8)`<~LEk?&F! z%DiWu2mJ$e{U0P-<@B5#XbL;P^=*#w`6iq`0ExRb_w#1_oZc?`;XfEsm81)oPN3&a zv-zklr{QMp-Yg-pOO^W_$UX>+++nDiVoUw@+Q8ytKF9Cw;qa9moKORuB)j1YbDb_t zuitSg#V0hyyKqFPvy;cDVAK_CxX8MakHgR~p-xjFM0s(Ta4@7Ci_K`MNEg=@XeMax{Y zcyyWTqO`jI>(S~eiV3Bjl6+xnxoz_@*WE~~Ne|e9-eg8cRYMsab^MS9GqaV0qPK|3 z8BsWQP4^*kXH=j+_%vKpvMIcmJO$%4AcN#GvV6@nHFen Q>S4ln4l|E3VRxDT0CzIc_W%F@ literal 0 HcmV?d00001 diff --git a/__pycache__/data_loading.cpython-37.pyc b/__pycache__/data_loading.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..123f7480c06a66742d816a742ac0b10bd3ee4f43 GIT binary patch literal 3957 zcmb7H&5s;M74NUKPA;f=y)CYvb1z$LD^aXyedUkgbZz9pVU0wC6 zUVXfJ@ArQ5>fD@X;Q2}Kz3y+mU>N_T#=&Eu@(Nyc5d}By8r#-@ z?v{9oyZE}i%q#eod6j$kR=Blk)MosDW1{bcJ+Y>Q425DhL@cDAh4%zo=l6tEz6||{ zZHVmMMD8fILW6ItZ`9bego}54CF-8{mS_tp;y^Un8)2;aafkgVN#a#@-H$^Nu{V4v zMV76yTVdB1kjP1en_R5crolw_(NhpDOuLD6hn{N}|= zYuS-u);foVS@Vw!vldSb<9RoIm9c)x{Y-EiJcBXTQyE6=!pm6~>t8tUk;$0f&$@~H zq@~!(wi?1>=PzFP`YWBDA4c^c>D4@M?eiYb!(x6bN_>t}*VCcrt(>pH$nh5y@){ZB?W*YRD+1$Esng+KwjUO7^ z8JXM8jw`R@TjEZ~=0=6FuduvR&m>%wUbI zZI64)2A|on zj3tA6i^hHHy7Bh20;mGEaQ8t+@sb4SkpQzQ2w&bRxoI|g>Muzv!Y&V8~*8M9Re zE7@Ejxo={QCCpKQjx#EcO3TKwLAt**cUSKiqY40Ke($~G+$58JtbBbR2VSNSos6x^ zj%wnoy+`b}A_1>dVz*D|!qDnuT^je6$oeuq97;Feobp3NAc^W2xwlNU#?*@1m+FDK zxA)`kNJ*i1?lXs+L)>Jno%CZ~M;PrOGWt@mtSeYMj06({c&uWGF%s!{&M_WJ5s)9( zH*yD4i<+62gCy$rVwGDVzv~2HHmq6FhR@|Le6t-6XiOLfQJ;%PR@F$0Q1`!z%7UbP#1W>Zlk6I3%VlMVZ)>^*|p6d=zZ58{TEN|WNxKA zuOPO03--uQyoNJvB-v|pUcGW&0))j`u~Uc3B+X|!B5Uz}uZMJz&nXe%tSz1mQ#7qO z&0TEt9U=3Q>H=7E_nsg1(KR~_OL++n&=I+f8_iumO-0Oe7c!po@)^K!ub*jDuT}Fh zuAlrMw|G1ECRS*nUP)xA?=r6f?bD)ahPl-m88>nxyNu^sD-xq!X}(=kt)OP2g9W;lc-2aOV54M~*WM+QOC2s!?twPcJ< zw5+1_3Ar^gM;5mhjb{J>BLGy*-rIf>|0yc)KOJgx(k6pFJ3!~?0KlJ&GfE;8C_c<5 zMW|t{_SnvM|M2IJ|MR!KD>Yj#VC%Wv3u6@ipytT4B&g~u^bsHV3>R^Ne%+`ZPOdMk zD4vIgJcXi#R}oGd)dh3OoHeyHpa`OedR)BJR=-7&8TVm?!7nnHO(WG$$Bvej1{;t8 z!+~C}j@``Kw)Y((O%JUPf%H=?^MUceY+IU0RiI;%4p0?Hw_h5SHA+4Yl(hCS%RZzJ z2_=E2ytHU=_mn~Sijj~5PZxlQbS34zzicA+Y8$ho+b(nu)S z`t$ISMiLrLv6qPk4|`447Cx{O8vwb96*6Km-;4C;@?mkARKTtlX-f&&_RAoVFCZ zfSxYk>&OotdzT}iEhs~JP_*EyU!-muR@81Szf4VsfG9V2BpE>O z97n8Ey+H+ebAIZ$?Z)U)w7fCv+Vhrc5n{~SON0^DEL!ps`T{yJJqPZt5#sL<5E|^b zYBn=|MmS-CG@L11c9Z&Sw7)^l%^mtZz{?;UR=k9s3VJqlPxYt=C<5}qXEd3xGKa!t zY$5&IgO{@spUqs7jLfA2B7qU003bsXB0-L?0|Jgeq7d1x>{p=$3W5-EF;jW)LRKmy zIuuWjK_Q@Hk3d2Wh{Wz+5j154&D`D}kE0PpO4snaBq}fnToo+hSa55_eh-9P6Vg>y zkit~}9-D&nNsvs^&6Bi)qVBVzdM6Avq7ejw1|S!q)2|RLqRU125+y@D%yhD>E)Mbfc9{5ddaBx3KfL!p91gv z#1p?9evMIzLcy4swJT-??@46G1^7K>#-*vuc-oTW;=}@4EuI9eR$c-ero-X{ZVJZW tD@h!_I2ff09V%LHYA?@GhmOC>Wu*IlB(6~0t63Bd?ZT>DuRK+G;eX98RSN(B literal 0 HcmV?d00001 diff --git a/__pycache__/timegan.cpython-310.pyc b/__pycache__/timegan.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69afbdc15d501eabcf02b5ca4b08fb039e016d08 GIT binary patch literal 9111 zcmcgyTW=gkcJABUn&gn8DDk3Oi?(Hr%$uk?E$d>Dl5AMCAxe(i(4x0F)f_f8(=)2> zp~OKAumQD^Hh>c4VIOv%$VWXTFF~?NfCN||`3V8~EeH@q0rIj&5Mb@i=Bw(S8*f&y z&JI<#Q&p!txlTzD-@bXv{molQMne8z=eTTi54v#*H#@7H!{|(Dl2{l0zLY@5~sVx}IP43dUFE zvNvYT+MeqajZbY#ogf%9?zqdgQ?!j$+cStmjfMQOZPPJBAN@bjFg9xF^G=n5tWUh9 zGA)7JvS)lj%X!E5T`az^<_As*#PVUEe6f%lGp46bUjn6H*cB{WbiGG2#&Qr;{F%wg z3Wxa;)531&DNy7Ci+6`<>Umb)DHg*%YI~$yvSNH?8ul*QL4LUf$a6Vu{BEPtg`^_+ zQc98nX+z$WWGPTKR3>f8E80V~uGH0^NI`;0>+(aTuGJGM@)p}1moOJ=- zE#TQ0o+g=sOnL;Y_qqIBd9E(0BujdqrR#mqr5K`-KC%yxea#X5WIx*d&GrB}fcE}o z`yd%adw}(^9@e|A)DN(I?0~2pWc@5FYJ+S)8x*x6)S}*Dj2jZL5jGIl4xtwH9!4#i zafA$!;b)w~nN4XHysRH3BU>QH$e}F|gB;!hIZlpjfsBGP`bHNpceBHrGLlk%rwQv} zhX6YS*t>18BY+(N>^=4ldv{P`-R!*qX;7-4XpZS_&U?QN)|huvz_RQB$&k#C6@pVi zF6v8=0yZ4OGvsJH94qEPXD?D8(mr76-`LMa$gzUF2`s}BF$N)bZGAmk`-afJDc4W6 z@O0ofHVhsMNMj}-@thCXDfR(&ImX_{j!*I(ljD3XmfMu078?_M7?1bY!w!Px2?8Et z)C3<@pJbEd9hMX0rZ8?`;ifJphS*6QeG+aIPjeej<5^sGU&+- zN~i-b>Zf=e8saF@KK9|JOg`9Dcn@FwmHhbMFmp^$GD5~XD4N?&QE-gutczV@iFK`h zS8Yenv{Ade}%Hv7QoQ!Fl>Y(xOLE|BET5#}U{mNDj z?m+KZNK=lD6|@~_*1*@R^^fY;#LlJ#=Xc)O^;gQ{=Wnsvi3V5rYOdf+{bTkqnSP|< z)P5z_Im1r0PPjErobrt}4yyF(t{gnm;2^uvIA3zM3A@^aoom2^G_-M=oNx57Yt7LY z8Za^X`nGfVL(p?koX0VyKrXa4xfqH0D?x6xc;~Z$u`bo;AoGww$ozr&O*YGJ;!V-m z&0(os_tbB(xsBuO7QZX6)W<($b1aS9Jclv`oq!Vd*CjhGNA?#?Dr2eY<+&*{p&JJN zeVzN{6Jn%3vliWl06=wc5YjalP?7_ETe?+mJ=K=1|Ug!79UOF^jV+VimQY zv^W!w>)0?K>H%B4TV552N&B>MqvU$ls$HDn6}MC^!5%JFVSJy2HEY0-j;9H`HYZ5p zh)ed{e`KRE>xnW z%uI7LuO-?IWWT?@{{FW&QMoc9#XnxU8x;u48B|}V~~GkqJ2iFFS~>|o<-aeXsed2qP^zO zPFYm6#zl~DK~#wHQu)&}cmbsqbw%4qaBFZ0qDHi5=^*(+Xoz)gJ8-d7S5nY0d@Q$I z6E8JrN42h@omtUWx|sSR!qZKXuu2nuAd!?NY0|nXODwS%0HDBtWR1>}*m)fQvHYjXCS~FiOW`YE3702xLoyS$~3R^|TD+J5fPY*mNcU6d| zwdBpe?g^D(Da@{N&w8=wSbn}-aYFt2{d=EVcjxXe%;9=^Vh^}4)nee@ou9wK-K_-N zt%4JFku~hW&0Fxp!qif+YzJqi!&JWP1=L*(lj2VJVeeA4SX{FJ_MAL?QZwbdg;Loi zxnw9m2<3ZW(uv%-jANCn0d9sL_JD5qv6de|Nc>Q~{aO{=qelg=npe(magg%!xX)SF zhpb;8l}GTW|3=gLzSXqa@U|P>VC1g%%>Ryi1~07bo~isL{(rt_|8UpImk|wFYhJS@ zS}t|mB!07+j<>jLyWTCxe|!h2Q=yKJ+bE>tcf3{);GP!=VgNKE7GVgk)&*8L?ePxi zAWmu5%SDIK8=dViuZ{5RNE60y3_XUd!Yc-{9WF{^rJXJcJ9hk@@V$Z4tY$)dwi{#D&ByWXwvf>3xA=+t)@IG=J3`9WIM=UgT`HDkRHH9 zXxLxgisC+am>cHVOe07JZHlL@5jo?$h6-#P?cO3_;*><}1W$jY27XtiIych{>yVau zjSfH44A6W(r~f0)Sp!*ZV%zO*F7^2w!h!!c7MM~VhDO=SKX4_;|)*6Z+Lpk8-8uu8=k3s6HAx_-SQOA za{PW6RT0WWbk2Z|Sar))zuEWu)+`I{vehJz2Y-oy$SbFDM}_9MiR9v%7}pe!NHTT5 zis0+2>zC>GBbu+cgc!(bliMVuwbqWZxt~wnLqBa3(S@xddIcDMjO0fz;fc1}e+ zvD}WbD#Vlv?7VnPbKUe^j_*C5o#5H~JmYpSJ;}2i&rb2|1D=iXY@BEKwzTCDCh;Ro zT8}Vke}v71VD47gzXn7%f53xuror=GiRI#44Rj{WXW*ME0Gy_!GA`u3x-0F0PCA#`QOEjqBQX;`-YLt~bBM zPsAMxFaPr|H~#w{|KiFUg3dSG(J%b`XZ-hztB6UYVfa|w^{N>Q{LGBGhD+G^*l65~ zKU-mRX3237LvrCs{X3+(mc$3X%8c=Ad9tRD8E{(4KEhLPc+jYJ{3fC*{_-9OYbT>6 z8w(g*UW|qKDZ-=n8PFM@d&M=5-H)-?axvn!m^KhC@M+nFr`;I;hWnO}ovZ45_0<|m4 zl!r9Tl#MUD)Lsh{{xbjm$w@Q2Dn-Nymdo%Ws8AGU0`#AmHuneoD1^7#v{%g}r`_?* z1F>IeIEe6vp&`~b_lz;rB+%};5keP{^2xKJ+cBy2Ga2UPJ zJGnC?v|6NGgjNvO`5NyK{?aAX%)}gj<;=uwQS^$!Y8W|=nRp=J$*-&>8;5|BI(E@a zM{NrbhjYj0epgf$;?j>x5|v%Ek!XtPjfTM46Zh~2M;JBD^sQ*ZeN%7L(A$76n3)** z<>^*+y4nAwnT-0)%v^-$-jtb&s#9h%s-SPm^2))>F= z)5@rtRkLz;jAuw5lGA9X)o!IvIjUrp^Ro7%v=X(m%4i3KkI5>hloLvymQ_X+T^W_L zphuCF-)4~%MfsmBlAnFF@s>qQt;LqNtlioVu})$oo2^Wzg@<%ewQMc5wf@*DFy46MeC(dv zGu_idBfvKCdaK-GZl6B)-gC}-kE&rP+CwpTJLRWng7u73cndjB(F{R*2ru46u@?gL zIR>vlh1*-Y9QdICNu4Das@81op@u1%^1G;Jywl@nf_^uCIuP(zLwWH|f~F~! zt;UagMhMDF;NyfJCn*~5b&U`NU5%SdKZ6X_rMS6^3eq6f5&v+2_JOzoKYoG^xG0A4 z0Q25ShNXNUEGl;7M6aV7Z>(?F4U(Q9#(=HY<3HDokFe|*(_B|KhHy-+-!sP4x?Hix zx~5%CyKC4)$JDr$j;SFM9aH0vcZ}J5j9^$iI7SjIMMA?_=!}*z+T+C=x3eR_zp>to zx(p|R>_~uK-BWnQC^HE?R^QaP?SR`yc)Yc)fX`tz*F5Snn~{KS!e2W!X*PES5X*js z!UMF&?eRnRfGh+~FgQyS9zW_BhGKCxfXCYcJ;6-+*%6BMxMF21R4sOxKSUF%%b^#o z)C7=lu}+jNnrOe@>7u+|F@q-jWWeW)(+kjI`dNZ?jU*5*c}62r7WnDl_u$`iFzlrx zFLl0j^rd50Fjj*y(KV_r9YbM>SaC~VXyLy0?wy%nc3YD!>bXbAX*v?1MhkFZDz z=}OcX0=^-A$UthojfIR_j5Dh8P)#h95;AeH5;sE4?{)&Dlb~Y&=@Ar41;`*lW`K-R z?$PNZAq$xjvZ`8Wjqz5etnx6Lrhp1SnmEJs5x0&^y=Hz3^&VUy+ZUzCS%9KNMKSG( zDQ3iEP^YBHts$){YU!6cFCD#fY*>lmSoK%2Osh z<-k~Ea5gUet@z9c2$&-jI~@X5g$$iqU)pRDjV! z1ylgl%qUWj3cwY~oB)#7RoNHfQmhbH0IpEsQmAm*^3=I(Qn+kVxNPOhxGhs431{WD zPQhCP!J+am#5-9(CTn5EQ|FSbg^tH?u`9!%09-CNC z(j4+iBMVgRPBP+LrQAb_8eEMGhiX+aC)0Py=C+O7AkT+T9a;Do{&i~pp?a>KEaEB^ z{tYVr)yg0!z-XNUDuDc!A8k-j3c%HKB^-|W=~_ZVH9ln?4M})xd&)e@xy`B;Y=6qs zYdJet`cNXsG&w+k{y=9Y1Haojt;o2lighq#y#z>W`$SdV;Mrk5fWw9NQ=_T%} z++Hwsu$O23CqEI()FEL<~ZcuOC{ zgq~SvBzAI@FcN9pGs`*+S#_=z!|395*;4{;6?P&kI+MWq@Ts%D5F4Ifgxel2MyiLmV*u}$~3GD|%hq=RC z3hG}3^@8_C1HVx5g(rp_jf4r@l6^6!IX)cpyO6WG){Nuu?`b+~C4w!qn`s8ZI9`Li zz)s`8@9E3csY2|H#8V+eVjME?kCZu*W$6wlN z8Y&J+av#A#3mmkh4o#CO3-Hl#I!?oBhjqP}LqGMe$36a<l{!Xh0kqQ4bXucgNfR@Z*o7Q~Mk`QR^QQb-)}F zVgkYldelBKB`y~LF;-%#(ijHyJnEcJ_qv*gV0qBYP!Q6g)_^PMqx>v0bo?0ZgD{Gh z8H!I;<&NfCEEpnMk9+*k=e;h%OVLxCfTd@?GCV!} z!=5Vxmj`BB=QCGws}@>T(sqX1Z&}i3%BS~*Tkoc2tXn1{XEtT7?A0_rqda`%jwNTt zJ$oTy*&5MreE=LV(LCZINy_geJw9l5(C73LlN2qQJ+S(ufnY>)EQG?qOc9OH)S#F8 z5G|W7G1WKe@s9;r=LG6)KdjjVYAOM;tAZ{lP$;c3D-6?*bdOtSq()_QC0PfFRkj0z zEgfoJS}`ZUVGbcr$zcvbk&u>6RmzyAQ{3dDD zgo2Eu0sYB6qJiL*@}kmSz&2wIVBB4R7uRVRFAa7Pawl}Bu?rf9aq9gx-&u+zQDjio z_h%uVNm2g9J7bt4K;Kh1Ge)>56g>1oXw%Qep4Zi6rkf(lA7 zH(o-ztxeTmh(PZt3rP*4fk6-`fVN%ul1$0GcJ}Wj#Gz zU58Kr)BpicHziugNmz{@mlGnRV#=^LK(N~y#S~Y-&(fZ=qETApjF>(g^m-?qfc8@^ zh!Tq_jK}Q@cu0p?)SMDEeWJ!G8mU-pHI;G(f-J0dMzn$G5L|XLEOb31YC7l~B#I@b z9GsFOFe}Q0VbGFCN))beI80~4BV7W?)W$W6Q0}*W$Yy>4$$x_u%)!joXlenUS}@yu zjea|HHS|I1Gq*uA2B(9sd~^Dn(ez3_y>jK`P~?nz<>ZJ^<>60`M0$F!bu2u$RC%-d zc;w^=U*!?fN5jLn?VI1seLXj7Z{+Qb3p*DZetz)%&KsSPv#yA}QLvM|u{i9R*>u}% zeWh}`GHNd5&4p2O6>qMZKe8~j(%l>F9^ktNqTSE)-OoqNRf5?WCO%2Q%=_+{Fsm)x z@yCx+u7vUaby(6qBOTX3bV38st29tboS&$JeT<}xXk?Mmdm&-a3trMalJ<$KALLFFhvhCQ0mz-KfpI2LwWT<=_~Z*n!1#OsaAOEV+__4bEUf#n8K8fzVATLGch# z)Aq0uNw$SK3`M63)@)%E&OyjerbPCo?5Vx)WWBrT`lb(3_phUiA|oFD zjA!NKs8Dr|KRLSEsv701&I#$>KciK3K%-VkUdgOdaGx@gUA6ttUfqqt>_fZEH)_GI z+N*nSmjR`F4Xws??5f*fv3%`&8vV*`dq_QLxMo!8p3mz`N}2kvRuAK%J>c90Cxx^= z6_W_IA*zGs5ASHcYz=hUIYO|_xC>k=jAz*6lI$-qoEUKIF!&n(*Sf;Tw2qBTG+S0Y zl7)q|PnTq8Ijl4~!9_bzQi+l(lpuE!jSd*mH7J2kK`|WI}RMCiq|NzRgL-)lwtlJl81EJ{&x<(d;I$G4^j`VqsyL_ zZwUPDqtm0&v=Tn8B$`&or`0W_E;cN;M$+npwC*s4?6E_V;>rvkQyF9mF0Qy54%sD# zP!VznmBYh(MFy1G4Tq{yBo7&l>{J?UG-;&bY1BO*{tsMIjKlpG|M|CbpZs!R--jf^ z!|n!i|M*pO{oQ`>$eUoJ?euyWb_(xh37W+d-qrZ$Gk9P8LkuXLI!sXzGxLBa@;~5M z|CA9vSs81_MNQq5xf%zLUx0yd+=pnEOxX`Z1cw=U1i`6_7)zM}e!&ADo%F`vi12Pb z2ITN({oYALorzPQa>NNgLA9J1gU)~loWFAU4`C;YxwlEzd;1Y-n23_#Q`TzSEy2!U zGp>4qMya00;mIa9*U8qyV{Tlg)tnq<(jpSGk<)~AlGHE(>(%L|iLntHjf9v&z_&^? zF)13D5%fh5`c^`;jCsLrJrV%t2raEH(E##;b2ghrLm_#475j)TL{-e-W~EsMbs%_d zp)ufc&5b*1oh}*>PVm~$fw4(3HQ=Y9FFohLSqyQ#Kpf8UQH0;goDUK-3^6c<4`VC< z2Ehl7vP2zmmJ#*Ld770}0Yt(AQgBN&NK%Qm7LxEiI|j=Vg$qR!C{+m*Q+m-CP641m z2mNA^+Z#Abcp+RDH}ITLj)l*)q*?~}_z2{blnV+gh&qO)!DAf=`bpY=5PCFOMI$jb zM)^s{anU4)j74)I>T3D}vMoc%LD97e~`5079dWS7`K#qc@-geaj#k zrle4p!A9$vK1HGqM?&kqM;3GYthgl-O{C-Q{HA#qT!T;H=cG5 z6EFyHrzyfKnqtpRO4N)ahdOi+gWOuNyE}eo;&(E3x3tElt3*M5kjUENIp_gs8e@;5 zsXbPqUo^`Qs9y)vkW8Ow+|56g=BQ%>JmQQrq?%(rJjTE-dEE~0)A<=P~aJ0=4oYR{cp zjS8-Q92e76G+@b!R@VsSI_He7d@;r${*WEtqa#fR&I_k2NYi54YNV*~h;AOhT?Bnp?-iKW$dHH0-{_KxSe2+=Nh2&ujC-6_<{Fq|elq-><;%>iG_# zWCyP;0&M%t$$Mrjt7!HZpXmr!-pVYTJ<4ZR#GnK&0d?@1Tf$YhGIPRPZe?bLw*Z@z z)R+7(`XMNdBq^J>Ec8a~yO*j~j9p>-ZKLU-%>Iad&(hHq;|X=V`)|{E{SI+yc#~QW+ksquypfzbu;#bhIe;f-x=N3%5Q638oasf z#CKaFd3E8f5li>&yp5l~c+Xnu&)wYCtx)e-O}%$*@u8dBdX(b5tBVh;E$+OztzRiV z0FBMezLI)5HJVY!XVigT%6i?pI3U!wE)5GA$HP^(!4Iv@2DjDXuu$K&G%jRxL3UQo z6~|>qG^>HnYIvvg-J0t)OD3W5$a0gA)fcY0W!W%W$Xm+hg7YE1d@pa=8{Yb{34`s^ z>FLu^TQzU1zSi^h(AA;EtwK%9(oVtF8LmKkx5??rXnHN5UJKDa?kcy~A=I@kO$g~H z!j&MhT;IXl9P{>{wagP&&;Cv3{NbyP1?N9@FEPv7CFa)+ODFjq#|2xLG^9Y&KkffX z&uas(4!m*j&Gy&ZuN{25?P}ZG$FCk=+_IFpq!X%Jm%91t_T@6Zx=Sc~cBQ8;+H;!k zIlVGC6diQ(gU;xnn;&$8Jsdgbjg0z)L4PDL#t)v4uoL{?gwQj|mrV+rri8Q?!j9V@ zV}fDNoBgl%zj@~MGYdNw?TgvMmS+|Te#?QM_q^YKqyPOgH_k+Q`yvA;BmJj@w$qWp z=lHfEzU+*!>3Jc|8Ft*UZJ6E2+e*U~_h1I+%uutV{DunNQZc^`jQ70jd5if%!$H34 zAa6Oi)VrL2V~DqOLq{9Y*%8mQCz@8tr&Z23%)13RHsZKtO?#Ps<-+uZnMont&Rgx_ z@>`ay8P{yZWiO9bMy%q<^hh+Vj87{Q(zeF;xG77Amj`Ym$okNyipgi)e5#A7|wM|NhOXvs>CWf(4$FYGA#`(58rS~GWCZY zAUgzZ3#JRcR}?P0r8T}(@nXfxjZsS_Z>bb4)hpT>D4{b&OqDCzs=KzVndT2{#bMXo zOnfeXzG-1l$UN|3XSnrJ*`3^tS3pJ0PR=_b#oJ+mv@YA1`yvN=W=;vYy)Sl!Tf#5g zNikpQdvR)}`&$=p8!eYQe(0Lr{DTqRT0ED{Tg%>H=9_$<1Lo*XX-Wgt> z18oSc--gY+b;~u~eCJ!~ymi-lZ5S2$&qcgG;h10O2=LaxP2>4{*{BU0q&93@(Qc2o zp?F1GBDEnZb$D9#Ow0F2E@|&(m(DfKpIVp_vJbvE8YVBb-nDI-9i88@khAcDU^^5h z@9f(1?!@(prTpclNdK9L(;Yc55($n+Cb-BqFW$qjgWAJdxOHfcpxaUHv*;GooX{>z zJixG~ZY^)z9wshrnzhY^?i3WiR`F`ZT*tg8vbkxgds)9sM7p6{PDKWvkF+{xD};h? z@W#9_FVdpA4p2Rp;HcP$w+S>N9sCT>~K9-wHhV!q+^s=1<{5s{KQ-clcKy`|5J>NoQG zjk9Gp^(FTVm^Bw9&MBR1=d-KAwYReEap+EJUPPPs$B$mnVb&haA4N+y{CeQm3%>yd z#g%^nXN3y%zbw?FbQkU^(Z8RsN9lIlQ>I_e)uXfl_c-*w%F?5>7WdTZf1R#})R88p zIGtp`<#dWUaC!+`#BfOG0{TA|#t61{yg@X^Kv6s15VteI1roCk8=YsV5dysCU_8Mg zo3Y85xoHSO$eod_%$O?&nN&0~w4^=dRgBI?FgkoAn)b$y>g=Q6g-3LHgF*hCdpeCq xb6=aG(SK5kX-XrQ{T8+%tc_wDcx=N8mjA$rX|n$XJ1SsD9~j|({>Ya|{x3K6VpsqG literal 0 HcmV?d00001 diff --git a/__pycache__/timegan.cpython-313.pyc b/__pycache__/timegan.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c130a41054f363a0a5497e503a206514a59aa901 GIT binary patch literal 17148 zcmeHOX;2$io^Rb!3vpvG*wDgYBQ9|m8{-oj4912Si3SX|wQZ>ZVbQ|fk^^KiqwG;* zXJ#jOjx|Y5Rme=Hj5DbUNo6a{)@~Kv%ublpRE^rrMxGv5jjPrlHXpV&j$M_V*$=z_ z*XouUBVUP=$%kp1*YEtl|GR$uKc4Q|Y&Zr_#^B7@m0Aq@50p?ItsJ?#10p}d+!%|w zHE!)u4Xc&jI#v&F-BClAku`RiSW}moHFsH93xT=yg&2#EY8?iu0Lb+DC+HfEX8klr zbkGdVQX&6&nrQW%r&*3-{ZxSHp+nCG*|Qu`fhu>j_Be<`K_7jF;^OEX@& zh3N7#T$mXpP6UHYHPJ>femX#OQ7lV`Le)gKe~h976mgzn2p`Q7ZtoaHvDE}#`UE^w zmlAjn9cF>8Bg{yUod9-&3~`(ddTEaHL+9>kE<{fNv#8pU<8DVa(NI^v3phPaO+vQ; zKXbN)7z>3axfZ8$66JBVjDM1=^?Kt;XYi;PD~9WPYjM9qqq6+6MytAue~flmk3%n}(NjRe8}guH(abW8$4dtSVkS#5zTkvMrWa(z zj5AcoJC@AwD!UYsvcjJZ{_ZyCVc6*-r@KxcJ$>v)*f1)S9+$edoL7o9$uR;O*2_`M zWmICxcPU0abKj{&aOoJnlA=hQ1?C zo!jEZcj*}07o|2h4798gt@J0Lm6?h&r^cNoQOY2@$fM-3?K-!u5F0l$ndA{UNAFIT zatk$U#R!gvzcm?6<sYdB|L_hZR z>q6$a&2Dpp)@_nPDZX9$R+1a#60kt061kfr^2UHJKaWZ zQ1%7mbQh^8q~^e>=76aq>)e~j$^-}Xs`l0L=2N{~PE|sVDpIkletj8PN0yKTnk)C_ zU0SB$DO0asL%s1SQ{P5zk+|OeloPjV_F}u){WA+d(c`R>>ie9=Amc$iFw|p>@37{owU1{ zL*yZMRSO^pRRrfaC3=zD$!$rLNVb)cqAkVF{P3ylOi4a?e54p?OTFXVHBYv~2M#=d zPVJM?c@%ODJmRFdoln-^K&|$6vRt);s|MR2 ziI9b8?+r!=@5y_&eHaih{wN<^=J0R=14ymX6JWp=IFlU%?PLd7;Phk%l5W>(E==dZ zVONJjFZm`r6)NxrDUXk4;4o=M(jIe|JWQIeN}iKllHUa6 zWzC=lX&{VRn@PwN3MC9%qmia8zmKkVQ0vyAwXXpSG@~1=C$-ykWtc-h^Do_grly;k zB6^TJBjBH*Sy`6qN}0l&UqvgrD)8rvfb~;-3glfcqs7 z247DFI8O-h+sI8MH;O}A&IxKtZb3~wx&@02Jr0eihsxY&=Ue~$%BQiJeGZ+dWhO-( zbP54A1%3oQ8i#0-`GH8h8_|*&0Egz0fJfZpZ8-^>n&nQ0Aw1a@^oA#BCd8fWK1NJ{ zA0@z@ls8)9jrL638zQE4`x%%|x0edgthiYz*%Jst4!5sXT?~#jj01@ki(vOQU>R92 zjl4MWL)Yd0@AuEOEoAX|Rg0~B`i@A)4Qs~5eUY}?>6s6#k(oPR_HsI(xh-L_F?2;b8qmBMdSepg%_2 zzDKl7O#7M1aL6--=9z)Bmdu(-Mnh}-Ey#B$of0!F&_3Ox&xu>3Iw>i3v|GDNtHnUl zLIaYXRDPILz86=*=c2TP@4Zcl_a)?gu$OBS_VNrkCE8(2qL#VOq{!=F|IUgdE1+ir zwHe(bI0K6JKZA9uHYvOu;Lp+R(j&=bvRzd(h1LIY?fRs?&!nOR8q@ucD}@!ptq1Rq z(QQEglvyA!(wO*$Xh$$RR*flU7awe#5%{{4z z3Pzs+HzrLpNt7RSHKaX74X9Bc`^9G?I-b(g8<8if> z0DjF;TD1D6;iUP!9&mVyrjbC93NA1_(LVJSY5S(OAv;phjGxl&Hm|9NMbh3Gf6>I$9d!$2- zCxC+E&~Zl42u~yuVPXGcEP+~VTnBH;y!Amb_e%)=2e2&{!_#7x!t0j8xt2HCx1PWH zykOaT6Yws4G5pduFMczYQORdit`3}xo*G>p7!#`e*9XR;F87&i&I}Sr)6DN>l%PSvm;#+i)>MeFbUPI;ToNEPoc9OAT%zpDkT2Y7 zd`K{X?(F&qxG;rlr1 zI4IMDP^M@d$|O1XTLd%U$+=&_+4FApdz;_hELiqG0A`|Ne*TnybzoemI(vO!e65-@ z&R3lkG6G+cnsY#-Mw@`7=N!Mr;Fa>$nf zE+;%=RH%jUf(e83kNCZk0tA{22Zj`mSZ7aqAcMGQ^CgF+V2T7M2v~X~#mAAx!gW`S ztwaI3sKugNGLq?rMFw>i*>G7W3hGdR?!>U@;sx6Xf#ZHK5{*7tVe%yvCf^!`$smpI zaWKjSJ&48YFlx=9z*~xOzkuLAJIwxf55Cv^cDG}4SC3yDkENIJ=_Rpr zC!g+Iv@F%Hv_;dM(e&O3jTEFq5+-Fuj;S=HLx4#K5mZ68j7jx}3MJ!99x}d^K;r#8 z0}2cALk^QGMc~b%+4=bY;E|jJqksQj|2Y5IuNL=xjP%EkkzhIc%FF2a z#eOhsn?Vxx1pHiRhH!@{Hbf*1mGTczh(7tJ3{cxLLet zDwrcD17HCj3xc77l@6C^0RF)aniE1xAsJQ^3Ji;`v4Vtv7LP*{2u4yE3|KewWSgkR z%R+_+EGBGla$2+m85-u&e-`Yr;PeX0@$3njVm#crFvY?WL&xyb5-UW*VD3dlqK-Pl ziF)oF86%ZrHN+1Oerdw+~_w#L7>2f8FABSAb5rf zfUir|z&ubd1V4C^S{dNyJHV%eEyzkQ>bMXK#^GR?@v+DsEb7r_6^+#7B+d97-J)6X zmx_4O>j_roAlQWIbI4L1uY%A5487p~lCxRlPhitgfD~;O{TzTrUI5WBBYBJrqtwI% z#UigY+l2zj`a_^tiW3(XzS^NwG_)h277d-!D?@sD6ak7B4TDm?@q}lDf<=HgOH%>S z98Y^_QF9*Iu3>^WWM+!LN98vszkTtywJp9~B??MHB5RXNPy%Qg<4Mun5pO_>xDta> zCD$!lx; zm8c$eEGO#xp^&H_^h}%)^?eY=ZEaSBGM+fPi25N^YLl`?<2-Pp_UzfUS>d(G^J2P+ z1{_&2%{xYW&wAn~UyS!4Cvs%T8zCK76g=KA%Zll1GewPG)WZ+nCfUPiKOirH%DUGL zN!hyh#a{>DkvtEgN&e!o?*jde@W;)7r|y5j&rpcz3^8rNb#1|_w(y=2+fZV;0Bq>0yVid4)Fe1c=y zo92%3S&m5MjjW=%qkL9HJeJH$#ya_|@<`Q20mxkuc z7OaczsD0OR6>sc`*l!xmYYU_H-OERL<8gJ-;HANN{oMJ5v%Ik-V*gB^uCskcr0a4% z!5}~}DJcb6cSB3V1QZ zbBpKB&D(|CvWOE^$(e1MvkUm9NI9g^HqPbEYXoa)Wb5y&1#?-@###(% zDqwI0g|Yma>-jaS`A)&wdp+MdYhSE?Z^zp^VvTKlW83mjtnv6ut$e;SvNdY$y_vu9 z^H+DRr#>8O>`hR2t)=c>U;SjP(Uqv~UR%9?eRWT)kxW$Yhrwp$T((@Y#4??HrW344 zY44;h^$T@v%OgT&cckhj7=_ivws&kxBSKyK@_8Y%2a2*O0J zm$nKut;;(ETUVq4$!yaXr(+qld`2yJ)V}e?HyefeXfiJ{KX$#^|4RSs2d{Meq~pzl zZ?#`-f2;dy_fq+C*0N5hZd>l!>G()9s(jr`!$wNp`dU$lQ9N)8I`C!#~ceEUhh?3A$iw2U(sSedh6>(VvCs(mc>X*2O9evxLB8rBZ#}r|UMaYClDGE4L>tkq z3;#ubEWMIXuUx2K7!}~ch2utA`ghrvo_+Dz*=Zre&ZpTU+iqC1XT5V3mjXOG8S#c= z7sq1hWqf*>kiJ!xZ%xaGSNg9#BT2Y@Fh*O(OM@2&W40~4ZHr(lkJ)N@TkXR6<*h3_ zt~sN&+NjM1%lW`sQjH@ItFeX-%xDUp%**{NBiB3JfK&>Fv8 z@j}IS8)DYV>()xaTD_{Rff_n<)Lgl$t-5W?o^AQaRvhu(&LZXu7Kena121$%+Afsc z%G-Du5Nd9E!4WOq4%?$`#lF%PJ>Z%hjOMvt=!vvOp1WnjFZ8`IGu!)j-@0kEUg-Rx zcW%oM#`v`2`5Zp2>~(IT<)`1`({?Ov;?vrHqx;Rl-*$f3xk?Vi$dlJea0ZVFq(3@- zRyY4_47wsdX1H;kQle1IN{8PL>7x;hv!TfLG)5_n}Ep+`ngHPM} zApXY%@@zCPAsl0b&LE!_{K$CjP7dOKgT#O1s&>1~fAOleMB+atO?7(CZ0q;NE@*G( zl+HIV&ImaNUl@=0F0|dYZJrxn%w2p=upNr{ZtdLt-qhPu%LOaVQSwyOGa5ZG77d?| zPJJW#&2N2zVF$H`weafH9zn08+Go%!tU0b-oPtPmua-A%k5Csj&)Mdmzg1ZLYQ@VH z^PLO+=$7W?-WB}{743y78H^5{j<$K`Dx!sd#T)Y@)QiP;vapQ&dj(jwea(irZCG!<}=J->eAe4L>pzFv{6b{wFK~j7tWQ=4+@suaBK@U zy=s2hJfF8%zvx?PUCD|zkaOl}L4Q=6cRMHl2RkCQx2>78+27k0p>9~w*M8G{#X|jS zRr8zPprR#C-dY!FyP?mH={NHFjdNum=}Ybyu(UkjG`DoVgU_jo)ZWOk%duOQ{HQkn zkDorL!_r)uKZ@2~_;bOZ8~*w^{jZ9RDBN2%Zq|QLZiH|}Up8*juT&c$ z{I#`gJX`pyHULg=uHCXdG#^m;rZ4tIUPz6)1go{cMw2DpbZIUQFM z4PkIwbCPx#x4xwJnRD5C-E^)$xD!Il7|HrNd7?r^josPB0`Wn1PB5+56O3`doH|4 zSzlH|c3nP`eM_uRm|;rcFj zLT}YIudr2@2M+g~iaFdxE04-b$pY#+?+2hISwB;^T)pd4dchn{G8k1 zAnOBvvBs+)x8|Fl@LI_Y0uPJNuLq%91+g^kgHPrQ5HKB6Q_=4E1v(LXfB0e zJt$61)d?0%`d&SlES2K!)P?gGE>46U#!QskjG1scjG6Eg#^m!KIYDSP>dXmUhK+|{ z#+5qvD(1}Da0%OYi6<+a3Wau!zDNLO7Yy2 zT{|x1pF^~ixq=b(x@$mD3T+yWvfTIWl3S@n1Kjaht!gLuYCPJr;Dn{64xmJGN}mt# z^x)C)1k)Ks36*E+rlKmL_DmPbrn+q0*PB{X|B(`=gz`|muQiQkilq6G(oBoAgy~JC znQ3MPWP3#Uk&4&E8O1PUFe2oJc)Z$~w!lo+o;< zuNy9U0PmIX{sf+7xw6XoBy7)D>Q~xV`l8PI*`7z)=D=4<0x{SC+Y89v_KZQc5BEc|Evd?d&Qwm z6_3_@tqtoFV}OkT_IelWFkpuPdqcb?UO%XaUh&3|a!_fWXwT_wzxQSrto7bW3F{a8 zS&rp?s4<)hO4(k76o`=oo?}P4;aIT%I``liz_S-v2A}N{qwHu|-2|2qg_#E-cU@zB z+sB46zNt1(b?|J#adZScmXOw)fF$p{B~FRAu*-4rCU$(1cFc~^TB5M2#yv4E`7n{} zuTLBR&65l~#;i%2)tnMj>@`u4^QPJB&C{4Ww7g%OW^X)Emk)?3aYP&i<`Yk}=FGOS z>8`Oe+s00aLqZXT$UoGf(-)gXaejGN%!tXd2Km1z_K2dVv6D|UjQ*f`NnBus z0}4C(Kzpk5UjgH(@UXb>Pz6=sC)&V^_Bgd+JC5MlD=uxSY+_TR5nBJLzVfTjh?+_2 zp`Mad{iIFRAMK#q;q-;otL-K zX{-oI=jnvb8A-jm_OwOmQ}v5KXkJ(o;TW5c{H!nQ+$20OAcHiUsPg5)BK;O3W+hx5IEe_Fop5#*Vs<_I|JTRW7dB0rgtT@p*@yesrsnc^p2$j!4YZi;KI^JZ_iVehqJ=UOl+9bH^!=UXG_*<_SN8inTrj-L~hSy-Zb(5eO~(# z;T2vEia>0d6XZ|WBt~B7JpM=+I!r@L{lm2f(l0=BB&RX)8 zv-az~#fg~(H8Su*P`>%+fA`b>{HKk}1wGRIdZc4<6wVqPL4)=eWfHp3h?lZ*?alm| z!ux>i>r18LeF!BF?l(~0zg8{|X}p%hvyTW3QIPmC z5<-n>PqaU_a0e;N`m*sXMPB0~#Ecn_vSIqMv<(l*#~_i^mou;~G?zTw)Dr`?QEwXP z=a%!!JwksR-rtVU348N zoofblr{q#BP(h^PhjIUfVtub@N|tQV!~|8)7Q8#%v+zPYHcMv6YKI=&ESheM?ig2; zjR7vl0i?JK32Li5#S^6NlGg{&C@VtwqQ41lKUNP~NH(Kzq@jEA&NLxES@XQjEP&aqXZ~!;ASVckg^` z-=4iYKMMu)?ZyFJ&b4ce5V9XceV`i=tsR6A zkRVcT7IeuyJ_fc#`LT6w>@OwI@(mX)cA^%JG(P zTYY?saAy*R;)c_4Wpw16&kz>6(4>jrXV7x-{Qm;p+Vr;)@ZaPm@rxUAA`2cw%ZDts zvVOP_a0jG)uT;t-)siyKCqbNal=w7SkviLLt+z|@IZSELZnl}}(HHM(cQIZA5_l)w zzRvHw*wVlHfJVs)kg(-$kl zOB7)j$DgHHhGlng`g0rqb~}hPqArt5${2?IkBHnk9IZ zfw$!}$QGh@Q-W^!mkKeLcs+&Q z@8a}q^>@9;I}2?x1|GE5sn z7Diph7e5T?Vr~dE4%WZ|iX6Zj3h1IdLJl4VUwVj{H0ggv>T2wSbv!Y``B!*aXR%XX zJ2Ba}ri$FXgerb1ZcBIg9kh2N=&w5jed{&pa{eZ3{_J~LlZ@auS@Unchc!vUzR8+@ z+gbDZ|KcNaR^=!E{+G}G`|tna@^gma=OnDvjU*ol*c!3XV9x^+v`Q5t}v(i zaUB+rQo#5<1tn$Cv@-MbyMr1q@P=<4DpzU?P6a90Bo4AMFT{^1=&dM)p9FwT8N#M$ z>v|9Z%4-duaT1`&AhC?nPQC8>tnfjUZKdC%d?$sD#83@s9CwA1OO~8Mmf7l|jBEnt zdw`D9m+rimia{#&p|DaLGBcVgJJl+FenIf_R8Y7qO|cAgIhi6(wtdw5-%D z-Q`y5rmXhJ%5Hgou9dnc;pxxqMdyKQq2{hrv9fXB2E--q1QeOaby?O?I!O8~u6wS< zqA6c*btKNdWQ00|Fz#B}8}SQwt$eG6(H3;x$|cZGPj{L#?eR~obUbe5W@9{ermale zoVL<&gI^&IcU dOFUhULfd_bvX|l<^yR&n7GzNv2JvZF|37{R^ke`4 literal 0 HcmV?d00001 diff --git a/__pycache__/utils.cpython-312.pyc b/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e096e23fcde5b320bf301366b5a14185586c2e61 GIT binary patch literal 6409 zcmd5=U2NOd6~3gXA5xNKIj);Jf3y=PrvL4vO)8|>+}KHzI7a9EAaRl@v`E`@Buc%c z9NVQ^ZD~;(?GR<{7N<`Ru!nZpfIJPwu$Qa_x^4q1S8d}E!O)?5Sl_(3!0J8iTvC5_ zlr~-aFhV-Ky!V`Q4-fA--?{fMem{rc`u$VWqpl!ApOc6DMdupJ5;U$N2@N8NlISQE zqa!qhVva$ELNt<@F-u2Y%)Z~qJyN!eYtSuuB*#nCphsd}LW8X21j2Ij_9{#hK4$eO0WzH6603iEe$aKvT2nAAt(c(tea#xZRYJl3(N zYv&I~Vxkgli^O9B$F+Xl#c@epiE3?$Nsepm6nGtriW=5sO%F@TxFUfCJ=WbG;YC&A z$tVvtiadCZABux%ajc9eDtMEOYm=%zD(gzbVrt_Wy98dI0L>9SOxzLT2V^~oRgFI? zPAIWtjMwDnlH}X-QCS@UbwrCSMn=~TfUcbak5x4sk)zQN|Fo#VECc=h{C;?b(OobK z!tq!*=WF66yN4f_BRbey7~mQo7x*DjkBpWw#}rj*wR%f9zaW9pA93d5gWNpucff!7 zcd+`eBAp_gxO5(OL{!`*`}vk`g(Md))d-!y9=gMAE?UZG!O88pp7kLMeByufq69(t7?Us*k? zdHmCCiJz$aoBW^piCXo36=mOVHBX?dpB$_7RF>7VnkNW6oKazTjey}ZDh^m_h*Qe+DEE7$xXbtF$gSa$dvUVqFdaN`{ zT9jhC?fwbVW%W+vJ3zJ7p_|?uhczE(b6M@&Kz>q^yREiX1z}FU$m;7qp-AZL3BYRY zY!c|%o_Hh~lT}?id$f;_0lY-Dv&U_OF5L4VVFqm@tl4dVz#Czf&G6S=gT<6WU)CUx zcjk#p&!_6|dbrE%EPLCtX~DB;ZYb-iOKn}O2xh7p-q@MOb4^#Kv+Ei%728w7qQCNu zb?JdQ?#j7raBC*GE#q%UHU6C!vc9J4>|E!}$#nOtr{~$!j*PGA&XyfnZ{xLzxw@GH z>CRUV%}u1XXS|Jfz7_YEE@Ecr(u?1NnT?&<%C5KB`Ob9hT=(mn-eObDnaZv^JKD2> zj_VWib!l#{^L79HM5-wh=(zK(xIben)6H|^^HVo>zjNeIHJKls$*^ZK^qG}=b;#em zVtN}_Okb0AzgLNZJ6Fs=$BJ3mMebS$e3e^4U(ZhF)>dE79_H5LzMiL;Ke~OrH1lqQ zuh-4IyW7|6W8PzZy+P)^4ZhwQCQ<-05GLSbft(4AQjp76iqn)tP18Ezu`ay;kwqB1 zk<-|N&h-KSIrIYT8FVSX;UKUi(GvYKEm6ZXdCJS)$N}jzZBSzcNVMl9^r7|SY@yI= z2N`5g20ct4LxN-K-T%ELDVzRE@>edsSZujj@`=)}hH|wLq(Sn`E5(8|m-b@fL>Nk> zFeIlC4-e&PCSb+HNhFIgQAN{DC#0|u8I!`pbbyrU5)%nol?29Qh)pI#rZc@I+A+x( z8j&C=18*RrzS7bSH$Yc6VHyJh!CsBHidSn=+ZHQ>sph+062-?~f9zB5hLm`>>XGz? zU+tXN-|D`8@z>AY48EmZH?muIWvd=f9a&^NuN?WwkvAOap1I(agKu`viF5m}^kpmS zK4I#YoXEFv$pflqp3ktg8M<~EW&_kCGXN8&q|t}bPbp~A7a9@5 zy?UM-jg`vgdLOzbqrO28sRh?uzj2f-Sy*CV6LX(UWwu~rzBP*AaV&6upYi?J9H2TbgR+V zZ$%D}H33)LI^;JEz#}+J2k3yX0Uf4`(7t{Q3kV6c$*Rd%IH@YSW^%BBQO2!O01GgR zn+OYQ()uvqyJ~v!+D-StffHm$0wE@S9Xo#1VyWp9CuQ6Z zd(c(=V3fDyElqAzktA7#U0Dpb!@L?<{P`fYdMt9B47~#+g_f!i_ef@a`vTjZq1!WT z`;rT}tI{Vva@F1q1TQCNlb2tZec^VXVIk0PlY0-ppS+cPf9lp$CeV-#45Xe}sz6*- zs(s0e*y{B7N1jbYYHD`MmTF!IG~XQi>%fO6J~;8=;0J@5Kyx;53Zx)xiIkH_O?>3p zvPx>#LSWZBQy-r^b^GL*g_CD)pFF>C@_Z(+D;p3~&n&XRR6E`d#z#nW=Pv>mR;1s9 zMp+PIiU3rE9e|r31Kc=^&@kr8t1R9Phe3_dH*&Br?a~V~kCln)F>g^a-y+8=25mSA zTv@tuUNuQZ-$W%9Gy+W$zu0L@3^z7-| z{>=;i&2xCZ(?-mj&dl~Fvi{wv1B;JtO7+aFpV>C^-0Y5-^*^thsa;^Ia|oJteZoAt z#3J9OB@SjwHQND{TZCW+LS#u>0rUrGyn&o+IzGf^)lpJ2nP{8MS03U>r;kN2DW@_bVne&-4F+d6&d%fmQ zB@1O(tF?^pU(C6PD6S4*fu#-ke+bU|ATBg9mWaanrlQ)1Qx>Ns1!N7-oGQdi>HK9x zTlois*4kP6S5@ZZd+vn)GJ&aIP)87D6+!2qHlC(tp-Lv{=$F)03KEHzL6hjWj*HaW zRR7yh?3#32hqc0SJuu~fBxSE@b}xy#i3Hv^Rd0Kua9-B7HyV$KQEgvafhSEYr~&fT zKhakyl<^DKCSg}5r8|E%a&2;DnXJ4^fhy{|n~q`Yfbanzf&(8UZBnY@tw2`20DcB~ z9>(-5MEnpThk*!At4_9(hm|!jK^-fr2p-E#)>N3JZd^eKsmX995R)O_8t;Rql_Sod zCmAB2BLZujh>rqaitwHSvSQ^3*oW@AH2J`NXu3Ha%2aGl3IAaIS>j)a((dw!Ed_5VJRL7hs|moGJPBmN8=aC0dYdq+r~Rhm)$h! z@lMIVg(y7hO#;|87B4eFoJnqM8(a8`UhJnvc=?&r#K~ho{a`_YP2% X)P{T8tEsAcZBhC%Smf*1=q4&7zyNsAt{$G94si3+NHcC z*E6%qN}zzEw&A=KXdc@q=dr(||AJ2e`cU{M)KC4+aBo_x0pf@&4#_iT=A1eAqr3C- zj)u$s;;>UYqiO%9kI`k~-iP0c;!{a|R?RuqRzBIHph*n=<$xhJE&kgWxKAr~Hxye?~m z@|%=D5$p;fKUizH>|Pp#+nxxQ9cLrl33-_KVV!*zC8D3S*`LxhS!DOUBnrFiGmrC7 z%0>1t>Ud$-V|!l0f{?RKzvFp)kvW%s0uPIqn9~UR9Bh4>?4&#fyJ^B6@zf86h(LUE zU&t^9vxN5PqfK{_tz5f)3!FakdLY}4k|%Z6k+LW1SFiR6CYF<^CzgG`_`G`acQ z$%$Z=+GD{ic@x1bB}2hD&blWg>-Pdrh5-&PA&j*ikGgE-W7z@ym1_=(jCp<8N%>Jp zu`9b`9}>HEbLGaJcI-vnWj~Ew$65NZ%W?WL>WbywzT;fE?lQ@}C~3)1$W{>TMFBXt zub#yW^OAtkECY`ogXGwD3f58{wW9>mqE zX1_Fc;ERFz+|DZZfq7U}5KBR91#w<#z$s1P%qd8D3a17h%y;I&#Qv43{pVj2#GcxJ z;iV2pbqeQ{f;dw+r?YA{pE=n=HkX~sYT4->8?j=}vmv6NZBUFkjIHsusN>1llCrbb zpgu7}vd$xOt&S(_BaOnjW)Uzswqdf->BVw(@f1SgFNk)qYKnO&OLq!ap&(K?2~T4N zhnNr;5^wkrhPn_yH4FFqxW!ovZ7tKjt{v*%YMFjP`_6c3ZEFA2I9Zu%!fLMDkx@%)K8ko@IcDnW@!EXq-pWF zw-2;BA>x*D6Uityl3rde5=cIW93S_kDiv}wN~C+HFj^%WrE%J{=}dwG)~7%X26?pr z;W4Xu`glJ=4`#DpViMA@9FAi&U_o3g45U)$$M$fd$>h_L2A#mLp{(Bjlm+3eFv*LSPt&My9{Aj-UNr*R`kTzeFI+j2$XC z&4Yivd;M^1>X?fC!_chIhEzsLrYK#8g$z;%eY0p%Jq}Yw>X0t1rAU- z#r_7&%%V7&mtbSfotU!@swLcE}xs)UB%79O~!#HuT2+PYor(2 zQgh0>1(jaZFB$wpeESsO>7tdSMy0|8FB$rQCuM;e;x9VhjVA_Qq*`Xz+_f@Yy`lQ} zD^!-;#=M33bwJCzm0f#g{vzf}nBN`FSC7tTq|EX`Z?=e|lnwz+=Xa#9em86-9u<#m z-d|*0A>&14RQ0mnP_oA`qq0e*II0nW`1NEq#w8XNhC$? zpk9skl(%zo5&j!Oaq@*Vf&5DS!XG(Ld2YxZxOtM>BWii&!N%uQkV0u*(#b1+nn)gP z=O!@nd3E0P&8>%o(mc2B?T5U97UT#VOwLW6I(Irz5QGVe@|b@_%qW$Q^{!xBfQ!=@ zv}z5Wd)_GSbGn-KNzHUoVtw0dt-)6k3Rm8`j`Ed?S2NSw1{JW<*tK4js6ot(taJgs z2)KzN7G-Pzza|*`*$m7V@X=K*vtE_6it^mk@LUuxuI0_c;x|-rK2wTAlFQHw{-$+a zROTW&fXZo9g%zr(Bh@_CQ2lp6a;Y;6VIruJLlJfy-c~E#uD|8Ds*Rxn?YJdV4)Y&1ZsZ7ABC5fm1c zRaBfW9sKvH+#((D75XOjAchG(9X&rabI3mf zSmeeU6*)EIoPN&WH)*ZT>6D1{l~yZA{Z=b4!7h6Hg;SykOGL_dy6HFkGVoMMq>^e8 nn8{PrK2yF%EUB(0w^xg(ew$9E9L*}(x@|g_?f30p*dP24tJ&Mi literal 0 HcmV?d00001 diff --git a/data/transaction_data.csv b/data/transaction_data.csv new file mode 100644 index 00000000..d8a978ac --- /dev/null +++ b/data/transaction_data.csv @@ -0,0 +1,361 @@ +id,date,transaction_number,city,transaction_value +1,11-Jan,469,Beirut,179.672 +2,11-Feb,422,Beirut,502.338 +3,11-Mar,523,Beirut,220.017 +4,11-Apr,540,Beirut,244.857 +5,11-May,592,Beirut,400.56 +6,11-Jun,611,Beirut,340.065 +7,11-Jul,516,Beirut,312.436 +8,11-Aug,559,Beirut,280.342 +9,11-Sep,533,Beirut,373.544 +10,11-Oct,717,Beirut,304.316 +11,11-Nov,925,Beirut,23.992 +12,11-Dec,1117,Beirut,599.198 +13,12-Jan,409,Beirut,208.727 +14,12-Feb,431,Beirut,284.376 +15,12-Mar,542,Beirut,371.756 +16,12-Apr,501,Beirut,239.474 +17,12-May,557,Beirut,394.861 +18,12-Jun,533,Beirut,447.222 +19,12-Jul,469,Beirut,247.481 +20,12-Aug,513,Beirut,286.88 +21,12-Sep,553,Beirut,415.255 +22,12-Oct,507,Beirut,444.624 +23,12-Nov,570,Beirut,307.115 +24,12-Dec,916,Beirut,492.86 +25,13-Jan,364,Beirut,176.052 +26,13-Feb,333,Beirut,174.326 +27,13-Mar,299,Beirut,176.2 +28,13-Apr,560,Beirut,296.167 +29,13-May,515,Beirut,297.959 +30,13-Jun,553,Beirut,324.049 +31,13-Jul,533,Beirut,318.328 +32,13-Aug,400,Beirut,245.108 +33,13-Sep,471,Beirut,319.075 +34,13-Oct,558,Beirut,492.046 +35,13-Nov,547,Beirut,300.705 +36,13-Dec,921,Beirut,582.023 +37,14-Jan,395,Beirut,433.823 +38,14-Feb,452,Beirut,226.236 +39,14-Mar,529,Beirut,260.777 +40,14-Apr,538,Beirut,340.665 +41,14-May,521,Beirut,515.116 +42,14-Jun,490,Beirut,238.155 +43,14-Jul,441,Beirut,237.252 +44,14-Aug,447,Beirut,243.356 +45,14-Sep,530,Beirut,341.588 +46,14-Oct,458,Beirut,284.168 +47,14-Nov,449,Beirut,210.212 +48,14-Dec,673,Beirut,348.164 +49,15-Jan,254,Beirut,266.641 +50,15-Feb,305,Beirut,164.716 +51,15-Mar,416,Beirut,211.102 +52,15-Apr,375,Beirut,233.454 +53,15-May,414,Beirut,218.756 +54,15-Jun,500,Beirut,235.809 +55,15-Jul,395,Beirut,394.021 +56,15-Aug,392,Beirut,20.98 +57,15-Sep,418,Beirut,232.992 +58,15-Oct,404,Beirut,222.747 +59,15-Nov,446,Beirut,244.619 +60,15-Dec,741,Beirut,371.27 +61,16-Jan,303,Beirut,141.757 +62,16-Feb,442,Beirut,500.932 +63,16-Mar,405,Beirut,217.064 +64,16-Apr,470,Beirut,297.91 +65,16-May,400,Beirut,201.682 +66,16-Jun,474,Beirut,270.022 +67,16-Jul,378,Beirut,201.686 +68,16-Aug,476,Beirut,282.233 +69,16-Sep,417,Beirut,286.562 +70,16-Oct,408,Beirut,168.748 +71,16-Nov,507,Beirut,269.303 +72,16-Dec,700,Beirut,515.327 +73,11-Jan,1523,Baabda,168.093 +74,11-Feb,1446,Baabda,228.751 +75,11-Mar,1865,Baabda,214.211 +76,11-Apr,1694,Baabda,229.316 +77,11-May,1759,Baabda,218.475 +78,11-Jun,1770,Baabda,202.401 +79,11-Jul,1845,Baabda,228.702 +80,11-Aug,1656,Baabda,218.573 +81,11-Sep,1769,Baabda,237.509 +82,11-Oct,2131,Baabda,286.039 +83,11-Nov,1863,Baabda,232.493 +84,11-Dec,2457,Baabda,439.213 +85,12-Jan,1415,Baabda,214.832 +86,12-Feb,1490,Baabda,206.183 +87,12-Mar,1721,Baabda,239.016 +88,12-Apr,1416,Baabda,239.95 +89,12-May,1731,Baabda,221.967 +90,12-Jun,1599,Baabda,237.799 +91,12-Jul,1587,Baabda,240.391 +92,12-Aug,1574,Baabda,213.099 +93,12-Sep,1633,Baabda,231.778 +94,12-Oct,1712,Baabda,250.794 +95,12-Nov,1865,Baabda,273.368 +96,12-Dec,2506,Baabda,349.004 +97,13-Jan,1073,Baabda,159.996 +98,13-Feb,908,Baabda,129.8 +99,13-Mar,1292,Baabda,203.646 +100,13-Apr,1714,Baabda,269.798 +101,13-May,204,Baabda,240.185 +102,13-Jun,1517,Baabda,280.453 +103,13-Jul,1600,Baabda,277.169 +104,13-Aug,1384,Baabda,213.521 +105,13-Sep,1494,Baabda,226.951 +106,13-Oct,1456,Baabda,220.468 +107,13-Nov,1632,Baabda,253.519 +108,13-Dec,2039,Baabda,339.551 +109,14-Jan,1232,Baabda,204.443 +110,14-Feb,1358,Baabda,220.955 +111,14-Mar,1390,Baabda,239.542 +112,14-Apr,1667,Baabda,257.938 +113,14-May,1732,Baabda,309.496 +114,14-Jun,1356,Baabda,214.841 +115,14-Jul,129,Baabda,241.81 +116,14-Aug,1492,Baabda,257.405 +117,14-Sep,1574,Baabda,252.685 +118,14-Oct,1611,Baabda,207.616 +119,14-Nov,1330,Baabda,279.407 +120,14-Dec,1795,Baabda,283.836 +121,15-Jan,894,Baabda,152.301 +122,15-Feb,882,Baabda,160.49 +123,15-Mar,1385,Baabda,205.81 +124,15-Apr,1161,Baabda,200.686 +125,15-May,1256,Baabda,226.018 +126,15-Jun,1318,Baabda,233.177 +127,15-Jul,1330,Baabda,225.512 +128,15-Aug,1401,Baabda,247.245 +129,15-Sep,1336,Baabda,269.964 +130,15-Oct,1371,Baabda,210.77 +131,15-Nov,1258,Baabda,205.539 +132,15-Dec,1646,Baabda,321.302 +133,16-Jan,1041,Baabda,226.395 +134,16-Feb,1213,Baabda,201.465 +135,16-Mar,1440,Baabda,301.443 +136,16-Apr,1358,Baabda,220.442 +137,16-May,1166,Baabda,272.838 +138,16-Jun,1276,Baabda,215.574 +139,16-Jul,1140,Baabda,200.455 +140,16-Aug,1340,Baabda,251 +141,16-Sep,1259,Baabda,311.641 +142,16-Oct,1415,Baabda,253.662 +143,16-Nov,1506,Baabda,276.353 +144,16-Dec,1539,Baabda,255.869 +145,11-Jan,731,Kesrouan,80.659 +146,11-Feb,704,Kesrouan,111.395 +147,11-Mar,964,Kesrouan,119.069 +148,11-Apr,886,Kesrouan,109.788 +149,11-May,921,Kesrouan,122.125 +150,11-Jun,913,Kesrouan,120.925 +151,11-Jul,779,Kesrouan,113.032 +152,11-Aug,993,Kesrouan,136.946 +153,11-Sep,1024,Kesrouan,133.319 +154,11-Oct,1111,Kesrouan,143.112 +155,11-Nov,950,Kesrouan,114.677 +156,11-Dec,1272,Kesrouan,182.054 +157,12-Jan,689,Kesrouan,109.852 +158,12-Feb,654,Kesrouan,95.146 +159,12-Mar,823,Kesrouan,131.82 +160,12-Apr,618,Kesrouan,101.247 +161,12-May,793,Kesrouan,126.152 +162,12-Jun,785,Kesrouan,142.168 +163,12-Jul,818,Kesrouan,124.262 +164,12-Aug,807,Kesrouan,116.81 +165,12-Sep,792,Kesrouan,125.813 +166,12-Oct,840,Kesrouan,165.411 +167,12-Nov,777,Kesrouan,104.1 +168,12-Dec,1036,Kesrouan,143.382 +169,13-Jan,654,Kesrouan,106.447 +170,13-Feb,542,Kesrouan,90.707 +171,13-Mar,692,Kesrouan,115.106 +172,13-Apr,825,Kesrouan,125.542 +173,13-May,766,Kesrouan,133.566 +174,13-Jun,820,Kesrouan,153.359 +175,13-Jul,861,Kesrouan,166.566 +176,13-Aug,772,Kesrouan,108.859 +177,13-Sep,736,Kesrouan,115.545 +178,13-Oct,790,Kesrouan,135.102 +179,13-Nov,810,Kesrouan,133.925 +180,13-Dec,849,Kesrouan,146.164 +181,14-Jan,718,Kesrouan,105.085 +182,14-Feb,703,Kesrouan,107.202 +183,14-Mar,738,Kesrouan,127.795 +184,14-Apr,824,Kesrouan,140.109 +185,14-May,741,Kesrouan,162.739 +186,14-Jun,663,Kesrouan,113.379 +187,14-Jul,1141,Kesrouan,105.27 +188,14-Aug,809,Kesrouan,117.323 +189,14-Sep,783,Kesrouan,130.766 +190,14-Oct,849,Kesrouan,126.206 +191,14-Nov,713,Kesrouan,145.347 +192,14-Dec,884,Kesrouan,174.539 +193,15-Jan,481,Kesrouan,82.792 +194,15-Feb,512,Kesrouan,79.493 +195,15-Mar,623,Kesrouan,107.413 +196,15-Apr,625,Kesrouan,125.46 +197,15-May,692,Kesrouan,147.168 +198,15-Jun,753,Kesrouan,157.722 +199,15-Jul,665,Kesrouan,120.439 +200,15-Aug,797,Kesrouan,128.261 +201,15-Sep,683,Kesrouan,141.926 +202,15-Oct,773,Kesrouan,171.997 +203,15-Nov,170,Kesrouan,106.886 +204,15-Dec,826,Kesrouan,145.92 +205,16-Jan,579,Kesrouan,90.79 +206,16-Feb,624,Kesrouan,106.494 +207,16-Mar,692,Kesrouan,115.288 +208,16-Apr,593,Kesrouan,106.945 +209,16-May,543,Kesrouan,101.911 +210,16-Jun,619,Kesrouan,103.639 +211,16-Jul,606,Kesrouan,103.101 +212,16-Aug,91,Kesrouan,107.929 +213,16-Sep,639,Kesrouan,89.194 +214,16-Oct,748,Kesrouan,116.232 +215,16-Nov,662,Kesrouan,114.592 +216,16-Dec,815,Kesrouan,166.404 +217,11-Jan,621,Tripoli,34.869 +218,11-Feb,595,Tripoli,30.049 +219,11-Mar,739,Tripoli,32.345 +220,11-Apr,633,Tripoli,34.863 +221,11-May,721,Tripoli,38.696 +222,11-Jun,666,Tripoli,32.268 +223,11-Jul,686,Tripoli,34.383 +224,11-Aug,573,Tripoli,37.597 +225,11-Sep,683,Tripoli,35.774 +226,11-Oct,755,Tripoli,40.423 +227,11-Nov,603,Tripoli,33.097 +228,11-Dec,968,Tripoli,42.233 +229,12-Jan,633,Tripoli,34.57 +230,12-Feb,627,Tripoli,26.729 +231,12-Mar,630,Tripoli,43.045 +232,12-Apr,546,Tripoli,34.217 +233,12-May,561,Tripoli,37.216 +234,12-Jun,556,Tripoli,37.2 +235,12-Jul,543,Tripoli,33.045 +236,12-Aug,391,Tripoli,23.344 +237,12-Sep,653,Tripoli,50.2 +238,12-Oct,629,Tripoli,35.759 +239,12-Nov,550,Tripoli,29.975 +240,12-Dec,674,Tripoli,52.28 +241,13-Jan,460,Tripoli,23.928 +242,13-Feb,422,Tripoli,32.194 +243,13-Mar,492,Tripoli,37.806 +244,13-Apr,603,Tripoli,26.529 +245,13-May,521,Tripoli,53.196 +246,13-Jun,490,Tripoli,28.844 +247,13-Jul,515,Tripoli,36.804 +248,13-Aug,454,Tripoli,29.439 +249,13-Sep,550,Tripoli,28.541 +250,13-Oct,466,Tripoli,41.914 +251,13-Nov,499,Tripoli,33.148 +252,13-Dec,561,Tripoli,29.285 +253,14-Jan,453,Tripoli,29.553 +254,14-Feb,537,Tripoli,35.601 +255,14-Mar,497,Tripoli,24.077 +256,14-Apr,597,Tripoli,38.162 +257,14-May,590,Tripoli,41.57 +258,14-Jun,548,Tripoli,36.204 +259,14-Jul,607,Tripoli,33.634 +260,14-Aug,545,Tripoli,44.526 +261,14-Sep,590,Tripoli,39.738 +262,14-Oct,445,Tripoli,40.437 +263,14-Nov,468,Tripoli,28.159 +264,14-Dec,556,Tripoli,32.312 +265,15-Jan,400,Tripoli,33.171 +266,15-Feb,415,Tripoli,25.535 +267,15-Mar,509,Tripoli,26.992 +268,15-Apr,471,Tripoli,23.727 +269,15-May,543,Tripoli,36.065 +270,15-Jun,519,Tripoli,27.172 +271,15-Jul,447,Tripoli,33.856 +272,15-Aug,611,Tripoli,32.35 +273,15-Sep,384,Tripoli,34.319 +274,15-Oct,514,Tripoli,36.33 +275,15-Nov,527,Tripoli,36.712 +276,15-Dec,555,Tripoli,32.538 +277,16-Jan,429,Tripoli,28.713 +278,16-Feb,507,Tripoli,34.828 +279,16-Mar,520,Tripoli,39.424 +280,16-Apr,489,Tripoli,39.705 +281,16-May,458,Tripoli,29.661 +282,16-Jun,475,Tripoli,30.813 +283,16-Jul,429,Tripoli,37.235 +284,16-Aug,530,Tripoli,33.724 +285,16-Sep,461,Tripoli,25.447 +286,16-Oct,548,Tripoli,32.385 +287,16-Nov,581,Tripoli,39.532 +288,16-Dec,586,Tripoli,42.618 +289,11-Jan,539,Bekaa,18.988 +290,11-Feb,608,Bekaa,15.206 +291,11-Mar,915,Bekaa,38.896 +292,11-Apr,704,Bekaa,32.465 +293,11-May,799,Bekaa,37.688 +294,11-Jun,924,Bekaa,35.716 +295,11-Jul,762,Bekaa,36.784 +296,11-Aug,731,Bekaa,35.262 +297,11-Sep,753,Bekaa,33.596 +298,11-Oct,839,Bekaa,43.517 +299,11-Nov,752,Bekaa,37.012 +300,11-Dec,1066,Bekaa,42.374 +301,12-Jan,666,Bekaa,33.419 +302,12-Feb,396,Bekaa,22.855 +303,12-Mar,591,Bekaa,32.547 +304,12-Apr,712,Bekaa,36.864 +305,12-May,749,Bekaa,39.682 +306,12-Jun,674,Bekaa,40.714 +307,12-Jul,661,Bekaa,36.105 +308,12-Aug,713,Bekaa,38.884 +309,12-Sep,825,Bekaa,62.986 +310,12-Oct,774,Bekaa,33.443 +311,12-Nov,724,Bekaa,33.998 +312,12-Dec,948,Bekaa,44.042 +313,13-Jan,586,Bekaa,29.673 +314,13-Feb,663,Bekaa,30.755 +315,13-Mar,670,Bekaa,32.377 +316,13-Apr,863,Bekaa,41.144 +317,13-May,775,Bekaa,34.696 +318,13-Jun,722,Bekaa,34.974 +319,13-Jul,746,Bekaa,31.842 +320,13-Aug,709,Bekaa,35.375 +321,13-Sep,892,Bekaa,38.111 +322,13-Oct,757,Bekaa,34.088 +323,13-Nov,842,Bekaa,41.95 +324,13-Dec,742,Bekaa,48.607 +325,14-Jan,593,Bekaa,37.079 +326,14-Feb,634,Bekaa,31.415 +327,14-Mar,691,Bekaa,33.419 +328,14-Apr,727,Bekaa,40.11 +329,14-May,716,Bekaa,55.859 +330,14-Jun,663,Bekaa,42.07 +331,14-Jul,508,Bekaa,37.027 +332,14-Aug,893,Bekaa,48.445 +333,14-Sep,936,Bekaa,42.879 +334,14-Oct,784,Bekaa,38.564 +335,14-Nov,810,Bekaa,40.973 +336,14-Dec,145,Bekaa,47.744 +337,15-Jan,357,Bekaa,22.714 +338,15-Feb,477,Bekaa,21.658 +339,15-Mar,762,Bekaa,38.1 +340,15-Apr,698,Bekaa,28.487 +341,15-May,759,Bekaa,33.424 +342,15-Jun,756,Bekaa,38.146 +343,15-Jul,704,Bekaa,46.859 +344,15-Aug,965,Bekaa,45.48 +345,15-Sep,803,Bekaa,42.696 +346,15-Oct,762,Bekaa,33.738 +347,15-Nov,710,Bekaa,32.772 +348,15-Dec,962,Bekaa,51.427 +349,16-Jan,536,Bekaa,19.919 +350,16-Feb,729,Bekaa,41.907 +351,16-Mar,784,Bekaa,45.019 +352,16-Apr,807,Bekaa,46.032 +353,16-May,602,Bekaa,26.837 +354,16-Jun,636,Bekaa,31.268 +355,16-Jul,689,Bekaa,37.114 +356,16-Aug,911,Bekaa,37.075 +357,16-Sep,800,Bekaa,35.583 +358,16-Oct,903,Bekaa,39.955 +359,16-Nov,1030,Bekaa,64.784 +360,16-Dec,837,Bekaa,38.119 \ No newline at end of file diff --git a/data_loading.py b/data_loading.py index c85a974b..dd8434a2 100755 --- a/data_loading.py +++ b/data_loading.py @@ -22,7 +22,75 @@ ## Necessary Packages import numpy as np +import pandas as pd +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data def MinMaxScaler(data): """Min Max normalizer. @@ -81,14 +149,20 @@ def real_data_loading (data_name, seq_len): """Load and preprocess real-world datasets. Args: - - data_name: stock or energy + - data_name: stock, energy, or transaction - seq_len: sequence length Returns: - data: preprocessed data. """ - assert data_name in ['stock','energy'] + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets if data_name == 'stock': ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) elif data_name == 'energy': diff --git a/final_usable_synthetic_data.csv b/final_usable_synthetic_data.csv new file mode 100644 index 00000000..8c915292 --- /dev/null +++ b/final_usable_synthetic_data.csv @@ -0,0 +1,361 @@ +date,city,transaction_number,transaction_value +2017-01-01,Baabda,343.1675497189053,33.173469365619525 +2017-02-01,Baabda,291.5028043604319,52.39772192771157 +2017-03-01,Baabda,657.2740786139133,92.55489595709969 +2017-04-01,Baabda,515.4489586177547,57.96842636878188 +2017-05-01,Baabda,599.1612352816448,39.93153117924728 +2017-06-01,Baabda,626.2087574975601,37.241763472360034 +2017-07-01,Baabda,669.2142624019567,37.55897456954616 +2017-08-01,Baabda,698.978390728094,37.75919384212537 +2017-09-01,Baabda,718.4043735601983,37.652540182323094 +2017-10-01,Baabda,729.9089071486083,37.51208733725056 +2017-11-01,Baabda,735.6867961914618,37.359329639456064 +2017-12-01,Baabda,733.1251471074766,36.9763302207861 +2018-01-01,Baabda,466.049407168594,30.24550616459809 +2018-02-01,Baabda,1113.2805790179855,62.00027583393853 +2018-03-01,Baabda,662.2225553156832,79.78188448920743 +2018-04-01,Baabda,326.77837913252125,50.71204412639116 +2018-05-01,Baabda,387.43847702706233,76.47379358196179 +2018-06-01,Baabda,377.41960202461604,79.90220053852424 +2018-07-01,Baabda,388.97710745292846,85.06634011455188 +2018-08-01,Baabda,368.7481981996921,85.04000738164049 +2018-09-01,Baabda,333.3493343491337,83.8666604849546 +2018-10-01,Baabda,295.635759434571,81.85686207226047 +2018-11-01,Baabda,259.2472002436589,77.27917839060261 +2018-12-01,Baabda,224.77232074183615,67.15982067005302 +2019-01-01,Baabda,384.05763571240954,80.5344820018006 +2019-02-01,Baabda,627.1623225884153,123.51195612197239 +2019-03-01,Baabda,644.3389454850906,113.68406851250454 +2019-04-01,Baabda,697.8224386619589,116.93242780087915 +2019-05-01,Baabda,707.5287366254146,120.33570292246212 +2019-06-01,Baabda,708.1829676372552,120.9388843662885 +2019-07-01,Baabda,703.0470022901777,119.1146159819058 +2019-08-01,Baabda,692.5870791424555,115.41776482678092 +2019-09-01,Baabda,681.9737103932766,111.73694304839854 +2019-10-01,Baabda,662.7868205668195,106.92652882841233 +2019-11-01,Baabda,621.9187581915359,100.00434429743211 +2019-12-01,Baabda,558.8150462910535,92.78097804600827 +2020-01-01,Baabda,1769.9778762360575,255.54081548032485 +2020-02-01,Baabda,1397.9611069018868,278.4709346341896 +2020-03-01,Baabda,1520.3053289656075,195.8175158732611 +2020-04-01,Baabda,1415.2256083536179,215.2950534730657 +2020-05-01,Baabda,1487.9671722668122,209.43940554010848 +2020-06-01,Baabda,1485.1025185007754,213.19654525227563 +2020-07-01,Baabda,1491.667571963486,212.3366501201196 +2020-08-01,Baabda,1502.4971464287892,213.0361470589437 +2020-09-01,Baabda,1506.7000588784517,214.65664568990516 +2020-10-01,Baabda,1512.6812705404966,215.2365749650801 +2020-11-01,Baabda,1518.9803132419568,216.63784880836704 +2020-12-01,Baabda,1522.7593070271819,217.82007190715788 +2021-01-01,Baabda,490.3534774912931,287.0328321630408 +2021-02-01,Baabda,474.2447841604804,262.05638293330884 +2021-03-01,Baabda,519.0586008550301,289.9687143286853 +2021-04-01,Baabda,521.5794414699599,331.4494519221473 +2021-05-01,Baabda,519.1061027766818,338.6686585416043 +2021-06-01,Baabda,522.9944949269229,340.22759810032017 +2021-07-01,Baabda,526.4149211762851,341.2286944632164 +2021-08-01,Baabda,528.9310835716583,341.5686355995184 +2021-09-01,Baabda,531.1471201893225,341.93182890447173 +2021-10-01,Baabda,533.0887972231433,342.50429172728786 +2021-11-01,Baabda,534.9911052400801,342.3594181854807 +2021-12-01,Baabda,536.7134817356084,342.3408651826495 +2022-01-01,Baabda,1102.3871648488866,195.73152113875014 +2022-02-01,Baabda,1845.6419598925731,266.9640524814568 +2022-03-01,Baabda,1476.1646720789502,232.479067470539 +2022-04-01,Baabda,1546.0644695156311,196.50517787594526 +2022-05-01,Baabda,1544.368075131794,213.0956698260005 +2022-06-01,Baabda,1509.5320370802008,217.37114493246133 +2022-07-01,Baabda,1507.613247335903,217.32554561968686 +2022-08-01,Baabda,1505.14717787609,218.55568280552663 +2022-09-01,Baabda,1503.952576519156,217.76545715773563 +2022-10-01,Baabda,1509.2406919607365,217.49485482375945 +2022-11-01,Baabda,1509.5553562053751,217.55261975471308 +2022-12-01,Baabda,1512.1466580040885,217.8884360676839 +2017-01-01,Beirut,372.1623628321094,78.02055011818068 +2017-02-01,Beirut,586.075823346142,112.45112923149046 +2017-03-01,Beirut,615.0540107867679,108.01779696210416 +2017-04-01,Beirut,668.9468841611441,110.37818795362617 +2017-05-01,Beirut,691.7803381730696,115.08339307219185 +2017-06-01,Beirut,695.3686765182102,116.59951800898976 +2017-07-01,Beirut,686.0208741180081,114.06999185657374 +2017-08-01,Beirut,671.6056242940812,109.99579768608109 +2017-09-01,Beirut,653.8257269924284,105.7526772065087 +2017-10-01,Beirut,624.6611304956234,100.74387116731774 +2017-11-01,Beirut,583.268747666956,95.45748366269167 +2017-12-01,Beirut,540.1032476537227,90.96575990690903 +2018-01-01,Beirut,337.0208730297736,33.469064300032386 +2018-02-01,Beirut,859.4660800973261,170.2407046991949 +2018-03-01,Beirut,416.1600821181601,212.3077241438482 +2018-04-01,Beirut,373.70747079274656,289.56488194154554 +2018-05-01,Beirut,458.5995224562064,294.646594668222 +2018-06-01,Beirut,460.1706125285346,306.76161849536925 +2018-07-01,Beirut,459.95145593545953,320.85314627515805 +2018-08-01,Beirut,465.8427738094088,327.2384076003776 +2018-09-01,Beirut,473.3165534278394,330.82244396718033 +2018-10-01,Beirut,480.66488478954415,332.7227866248979 +2018-11-01,Beirut,487.1892017558076,334.2853810903629 +2018-12-01,Beirut,493.1049903166684,335.2495106821396 +2019-01-01,Beirut,981.3085091341433,54.87886407649671 +2019-02-01,Beirut,835.9468710710097,62.33436911944192 +2019-03-01,Beirut,350.3027701866542,61.61783335343989 +2019-04-01,Beirut,409.59646810762086,78.54003419745268 +2019-05-01,Beirut,413.29816331124874,84.91779426167773 +2019-06-01,Beirut,420.70421670502117,87.68410615848191 +2019-07-01,Beirut,409.1477908658372,87.03461182484907 +2019-08-01,Beirut,376.90780480512245,85.32696977439838 +2019-09-01,Beirut,368.52637862009993,84.08257845223709 +2019-10-01,Beirut,343.8334402933332,82.88117579517241 +2019-11-01,Beirut,325.9495425723062,81.49412127957127 +2019-12-01,Beirut,314.55642258195246,79.69383604518985 +2020-01-01,Beirut,371.8687145891713,28.541118721585857 +2020-02-01,Beirut,375.1960802556614,28.838610726644674 +2020-03-01,Beirut,541.1520325057074,37.44220900107136 +2020-04-01,Beirut,563.5602003736321,36.86682225285598 +2020-05-01,Beirut,525.2622798501441,33.212750911013416 +2020-06-01,Beirut,479.37592734278377,32.01965011356449 +2020-07-01,Beirut,440.326396868069,31.967315329780988 +2020-08-01,Beirut,418.1047820015404,32.598500321032624 +2020-09-01,Beirut,372.4193770172891,32.63318712651336 +2020-10-01,Beirut,288.0436568476624,33.93370737375007 +2020-11-01,Beirut,194.95795553492184,38.1171310430872 +2020-12-01,Beirut,171.0713263418897,43.651651907341474 +2021-01-01,Beirut,534.3687580938333,387.6662688027607 +2021-02-01,Beirut,513.1129436616155,288.31189288636494 +2021-03-01,Beirut,529.3388083991695,348.8339636612855 +2021-04-01,Beirut,514.1163857702049,386.20273971451417 +2021-05-01,Beirut,527.4533419726366,391.5275907615951 +2021-06-01,Beirut,537.8412925117955,392.79358084221167 +2021-07-01,Beirut,544.9990404060245,392.7099704992466 +2021-08-01,Beirut,549.8993674326657,392.2311777151146 +2021-09-01,Beirut,553.6437423931717,391.02808683921813 +2021-10-01,Beirut,556.4268511937059,389.64096270634565 +2021-11-01,Beirut,558.4393492743532,388.9841237505789 +2021-12-01,Beirut,560.5279224022518,388.06921356969 +2022-01-01,Beirut,1035.2858783509728,147.43276385665723 +2022-02-01,Beirut,532.2620478685765,104.05728779582638 +2022-03-01,Beirut,598.0729374675591,95.94130629468319 +2022-04-01,Beirut,599.5655054239448,95.24943244707865 +2022-05-01,Beirut,584.1546585057617,93.69240736332652 +2022-06-01,Beirut,543.488983105758,90.07237886720418 +2022-07-01,Beirut,489.8486616148302,85.81345526702135 +2022-08-01,Beirut,423.6248651605201,81.69806507617102 +2022-09-01,Beirut,331.7650732894384,79.66071562831586 +2022-10-01,Beirut,203.84146263728178,83.98288651957593 +2022-11-01,Beirut,144.39655026572353,72.34030290054447 +2022-12-01,Beirut,345.03747006198864,56.55653589160475 +2017-01-01,Bekaa,1357.421671457303,227.2214667076415 +2017-02-01,Bekaa,1521.7046204212952,260.503117182213 +2017-03-01,Bekaa,1510.9284496315458,215.86201653144033 +2017-04-01,Bekaa,1414.487889115844,216.3829277647762 +2017-05-01,Bekaa,1471.942902805844,216.7744901078298 +2017-06-01,Bekaa,1423.8377067490856,220.92079036718675 +2017-07-01,Bekaa,1450.0872686538596,215.34138376719002 +2017-08-01,Bekaa,1441.1114206947127,218.35501102068324 +2017-09-01,Bekaa,1453.9818504484372,215.15759417066386 +2017-10-01,Bekaa,1450.2634575996226,216.33407384456328 +2017-11-01,Bekaa,1464.2552205947632,214.38357194279388 +2017-12-01,Bekaa,1466.6006639626241,214.88537323512736 +2018-01-01,Bekaa,383.449395197441,33.58863196368149 +2018-02-01,Bekaa,512.8105867330412,34.07569179879367 +2018-03-01,Bekaa,533.7758477444886,34.840803015922994 +2018-04-01,Bekaa,455.2959077505421,32.129471359216026 +2018-05-01,Bekaa,337.4370186524866,30.476496271141137 +2018-06-01,Bekaa,282.6608974258214,31.295352021800117 +2018-07-01,Bekaa,307.06968789398036,41.63081915712863 +2018-08-01,Bekaa,804.4257474246251,104.10198208407252 +2018-09-01,Bekaa,654.3084472780624,212.3490942073844 +2018-10-01,Bekaa,437.20429708120145,186.52484584640425 +2018-11-01,Bekaa,416.9769712253535,191.88224296786993 +2018-12-01,Bekaa,419.2591506702873,202.8109014685773 +2019-01-01,Bekaa,824.2140403682369,38.090241372004535 +2019-02-01,Bekaa,334.1405292350702,24.03089417592564 +2019-03-01,Bekaa,409.51096464864764,31.262736330143852 +2019-04-01,Bekaa,394.55412094528174,33.99521423304207 +2019-05-01,Bekaa,217.72577052783726,34.940129457909265 +2019-06-01,Bekaa,169.5513368216412,46.41643222417453 +2019-07-01,Bekaa,223.1925939564803,49.67375473624341 +2019-08-01,Bekaa,324.4149426125195,44.481315739387014 +2019-09-01,Bekaa,585.5095428619659,41.214037957506335 +2019-10-01,Bekaa,666.5674697220413,36.0180658841258 +2019-11-01,Bekaa,636.6953105104507,33.96171092117532 +2019-12-01,Bekaa,628.0052657799089,34.08495089589136 +2020-01-01,Bekaa,654.0718733137148,114.82513039957338 +2020-02-01,Bekaa,124.70592415193202,112.35497037535339 +2020-03-01,Bekaa,396.6535619370734,53.98854619673388 +2020-04-01,Bekaa,461.7427102173829,84.09096733344215 +2020-05-01,Bekaa,433.3016543544648,81.2567089797405 +2020-06-01,Bekaa,435.8360977924131,82.93077810105305 +2020-07-01,Bekaa,455.612371310395,83.94938320770923 +2020-08-01,Bekaa,471.679032637807,84.82840568518552 +2020-09-01,Bekaa,498.2993254492907,86.43931453701 +2020-10-01,Bekaa,542.6024245134751,89.6414827658032 +2020-11-01,Bekaa,594.7738570362344,94.38224490574233 +2020-12-01,Bekaa,634.59932420387,99.22094114223944 +2021-01-01,Bekaa,982.4387669790214,59.9619865529193 +2021-02-01,Bekaa,849.2117107196608,221.27775292634882 +2021-03-01,Bekaa,1096.7684072435668,133.6488399905998 +2021-04-01,Bekaa,1366.368154592156,243.63855943892878 +2021-05-01,Bekaa,1078.6721903272783,255.24523795022978 +2021-06-01,Bekaa,1144.6052174429924,277.08135649249976 +2021-07-01,Bekaa,1235.9314763667944,268.46755928781135 +2021-08-01,Bekaa,1310.5146753879067,262.32298227417886 +2021-09-01,Bekaa,1383.4930291832743,257.44972106242597 +2021-10-01,Bekaa,1414.4169241238005,252.3403180660455 +2021-11-01,Bekaa,1417.21982539169,245.54053810252444 +2021-12-01,Bekaa,1419.3025687382947,237.86152680971287 +2022-01-01,Bekaa,521.2322456062504,337.8505859852487 +2022-02-01,Bekaa,471.75273258897573,255.4470758243694 +2022-03-01,Bekaa,527.9669385073444,299.7218155843394 +2022-04-01,Bekaa,518.973889094751,345.06624212386373 +2022-05-01,Bekaa,519.0778175415163,352.1484419531831 +2022-06-01,Bekaa,524.8696692704311,353.6289228470184 +2022-07-01,Bekaa,528.9652705607259,353.90053463143005 +2022-08-01,Bekaa,531.8926844414298,354.24465280401665 +2022-09-01,Bekaa,534.4354767019713,354.0261241890562 +2022-10-01,Bekaa,536.553558599381,354.01216592613827 +2022-11-01,Bekaa,538.5084785931774,353.92204636829615 +2022-12-01,Bekaa,540.3736487440954,353.7338708836711 +2017-01-01,Kesrouan,320.0089234614911,27.43357755070161 +2017-02-01,Kesrouan,178.03050180909264,34.84637239763589 +2017-03-01,Kesrouan,221.8560626154597,48.261881663384145 +2017-04-01,Kesrouan,240.9367208716771,46.43909264601893 +2017-05-01,Kesrouan,437.47232307549126,43.36202665395207 +2017-06-01,Kesrouan,644.4985807308841,36.60187632218197 +2017-07-01,Kesrouan,597.1124630062818,32.953478787959426 +2017-08-01,Kesrouan,590.3949715586343,33.50446468254509 +2017-09-01,Kesrouan,617.5735558947435,35.08954552667599 +2017-10-01,Kesrouan,648.4458464749299,36.299685151302825 +2017-11-01,Kesrouan,676.2115833516984,36.88060647259543 +2017-12-01,Kesrouan,689.4924728920591,36.57183646956792 +2018-01-01,Kesrouan,398.92357801116,286.1198190527979 +2018-02-01,Kesrouan,524.6726082681848,96.76414763413045 +2018-03-01,Kesrouan,827.243943243535,109.79427308966292 +2018-04-01,Kesrouan,882.6897695928817,129.57788302322783 +2018-05-01,Kesrouan,892.2775286700336,128.9116979487741 +2018-06-01,Kesrouan,899.2500910424293,124.13074923891276 +2018-07-01,Kesrouan,905.257212843557,119.84415277334391 +2018-08-01,Kesrouan,911.8300393479922,117.0224081241784 +2018-09-01,Kesrouan,916.1595516161177,115.4253357050469 +2018-10-01,Kesrouan,925.0290960324163,113.81954372267116 +2018-11-01,Kesrouan,927.7297961961457,113.1446042763374 +2018-12-01,Kesrouan,924.0874064219742,113.32618352449624 +2019-01-01,Kesrouan,1792.9880949746141,257.1944345281603 +2019-02-01,Kesrouan,1484.5644512791564,271.68032674617695 +2019-03-01,Kesrouan,1516.390594840632,198.9848754663486 +2019-04-01,Kesrouan,1432.4122354428835,214.04305646400277 +2019-05-01,Kesrouan,1498.14928114548,210.4049100729956 +2019-06-01,Kesrouan,1497.4016296877244,212.24800992929502 +2019-07-01,Kesrouan,1494.6722844257868,213.4329306973531 +2019-08-01,Kesrouan,1504.426444173937,213.26536192506583 +2019-09-01,Kesrouan,1504.0048286329732,215.31092621094754 +2019-10-01,Kesrouan,1504.4031250487626,215.77727490781476 +2019-11-01,Kesrouan,1498.687204421882,217.38571234650422 +2019-12-01,Kesrouan,1493.4104606524547,218.2136705554002 +2020-01-01,Kesrouan,1312.511627385104,222.357864892297 +2020-02-01,Kesrouan,1423.1463378712267,337.5919578219553 +2020-03-01,Kesrouan,1514.6147426969412,360.9051112031256 +2020-04-01,Kesrouan,1555.1528826345707,430.4166687879063 +2020-05-01,Kesrouan,1566.2667489036992,455.61450094072654 +2020-06-01,Kesrouan,1176.000892832651,299.14547159864213 +2020-07-01,Kesrouan,505.08346353246753,68.22040499137029 +2020-08-01,Kesrouan,590.086856821375,79.41129434916661 +2020-09-01,Kesrouan,597.9780775694726,94.93107266491421 +2020-10-01,Kesrouan,562.0825307472192,89.76928267179673 +2020-11-01,Kesrouan,425.5810086886622,80.8224538449939 +2020-12-01,Kesrouan,181.64359873157895,88.57346680076276 +2021-01-01,Kesrouan,518.4118549944801,331.08100251320235 +2021-02-01,Kesrouan,487.3270293012064,266.78266468079437 +2021-03-01,Kesrouan,525.6592807589792,301.08010076252975 +2021-04-01,Kesrouan,519.1292779566393,337.0206436841175 +2021-05-01,Kesrouan,519.3861481966015,343.21445751295573 +2021-06-01,Kesrouan,523.6179936349067,344.8472609966392 +2021-07-01,Kesrouan,527.0727508185539,345.37227964898835 +2021-08-01,Kesrouan,529.6467072186033,345.50765043324793 +2021-09-01,Kesrouan,531.8556185480197,345.558262189564 +2021-10-01,Kesrouan,533.8021177466144,345.5211909925374 +2021-11-01,Kesrouan,535.6060392076448,345.3614541632839 +2021-12-01,Kesrouan,537.3026495093077,345.13255257488316 +2022-01-01,Kesrouan,977.2292456259925,66.65888959361214 +2022-02-01,Kesrouan,399.2393218449272,59.94033558151031 +2022-03-01,Kesrouan,513.703550887486,103.25251213831041 +2022-04-01,Kesrouan,655.5838738744126,118.6481454548136 +2022-05-01,Kesrouan,755.1481175743704,144.86475675746854 +2022-06-01,Kesrouan,817.1041542587025,169.83215574191703 +2022-07-01,Kesrouan,884.020543125217,167.53809260573223 +2022-08-01,Kesrouan,1018.6892107341008,127.8746790738296 +2022-09-01,Kesrouan,1294.7906756498646,164.18960627675008 +2022-10-01,Kesrouan,1380.1769632163287,275.7612389833607 +2022-11-01,Kesrouan,1161.563547417895,268.70437984083514 +2022-12-01,Kesrouan,1166.1428046377355,286.23186805113454 +2017-01-01,Tripoli,454.67787896080904,75.10727616142705 +2017-02-01,Tripoli,252.23426123785885,64.6345933841466 +2017-03-01,Tripoli,526.5393618164915,25.207095380739442 +2017-04-01,Tripoli,617.6874165614905,35.93452515843212 +2017-05-01,Tripoli,578.9925671017759,33.09549802163875 +2017-06-01,Tripoli,494.3380970191834,29.976087324235856 +2017-07-01,Tripoli,385.11664067481,28.747255462235056 +2017-08-01,Tripoli,204.20204540618403,33.991141622664514 +2017-09-01,Tripoli,171.1905849542789,46.63913787541969 +2017-10-01,Tripoli,242.24439119666374,48.09304237589362 +2017-11-01,Tripoli,417.50474636394824,42.20155895247727 +2017-12-01,Tripoli,654.6099405353342,37.06777250678503 +2018-01-01,Tripoli,530.9954739030796,370.36728188155143 +2018-02-01,Tripoli,496.59155939330043,273.5320765484493 +2018-03-01,Tripoli,532.24585403165,321.08678183801476 +2018-04-01,Tripoli,515.6456597569581,359.3149831068174 +2018-05-01,Tripoli,521.5012792170601,365.17230185428855 +2018-06-01,Tripoli,528.4109375295714,366.2819315433152 +2018-07-01,Tripoli,533.2893129106008,365.8539941759492 +2018-08-01,Tripoli,536.6102730149287,365.49302862368097 +2018-09-01,Tripoli,539.1553683989443,365.60768826969553 +2018-10-01,Tripoli,541.5088007263557,365.4209747477702 +2018-11-01,Tripoli,543.6929534784263,364.97709502525095 +2018-12-01,Tripoli,545.6660105695806,364.5879692866968 +2019-01-01,Tripoli,418.84660367800245,28.530241022927832 +2019-02-01,Tripoli,461.1374925519743,45.33783443387956 +2019-03-01,Tripoli,578.6559512115252,43.726890773419335 +2019-04-01,Tripoli,610.2440093838736,43.08947503637641 +2019-05-01,Tripoli,704.0472056313818,40.88551405371585 +2019-06-01,Tripoli,722.547116909102,37.91233443491269 +2019-07-01,Tripoli,692.2933589269088,35.768035453851695 +2019-08-01,Tripoli,662.3939220966724,34.732948458188865 +2019-09-01,Tripoli,644.0232736239319,34.442435584589035 +2019-10-01,Tripoli,644.5023233065293,34.84799099919621 +2019-11-01,Tripoli,644.9257381627071,34.96719317217044 +2019-12-01,Tripoli,651.7116755610982,35.21304656615986 +2020-01-01,Tripoli,1630.1915243226715,247.01320445764378 +2020-02-01,Tripoli,1422.826491598771,279.07773617612935 +2020-03-01,Tripoli,1485.4478430766621,199.77581469117155 +2020-04-01,Tripoli,1421.6966655895446,213.0748368575306 +2020-05-01,Tripoli,1490.106486083748,210.05207233716465 +2020-06-01,Tripoli,1483.8133451361898,214.55942517037911 +2020-07-01,Tripoli,1498.81905824077,212.75837414601213 +2020-08-01,Tripoli,1505.1280331622122,215.20563008793778 +2020-09-01,Tripoli,1504.6917352091014,216.88364998940287 +2020-10-01,Tripoli,1512.5547426946423,217.39432748384132 +2020-11-01,Tripoli,1515.9059312945667,218.8334209098225 +2020-12-01,Tripoli,1526.8795949222138,219.26288985715954 +2021-01-01,Tripoli,318.3424696828165,74.4065087073997 +2021-02-01,Tripoli,343.7529749169593,293.24401550109616 +2021-03-01,Tripoli,515.6223406317838,241.16963512127637 +2021-04-01,Tripoli,510.121834022333,300.2946613021483 +2021-05-01,Tripoli,528.6560042617295,314.2331355107391 +2021-06-01,Tripoli,517.5522141578,320.6038816348695 +2021-07-01,Tripoli,521.7631875396219,322.80584112097694 +2021-08-01,Tripoli,524.425670248204,324.176814046882 +2021-09-01,Tripoli,527.4238332031258,325.1285169557118 +2021-10-01,Tripoli,530.2159385797304,325.9198564798454 +2021-11-01,Tripoli,532.8725195344106,326.5557406369173 +2021-12-01,Tripoli,535.3932881767316,327.06680102634857 +2022-01-01,Tripoli,366.35856365017327,76.2878458500219 +2022-02-01,Tripoli,925.4484804225149,194.70421387316753 +2022-03-01,Tripoli,1023.1472660811204,165.68542037461367 +2022-04-01,Tripoli,1291.567670265791,191.80552473477456 +2022-05-01,Tripoli,1570.28238862588,257.44354252958817 +2022-06-01,Tripoli,1385.9377947509524,263.58731894459953 +2022-07-01,Tripoli,1457.8741291195408,247.27961235101742 +2022-08-01,Tripoli,1443.6507582700433,246.24228019835158 +2022-09-01,Tripoli,1446.782718304284,244.185698979269 +2022-10-01,Tripoli,1442.8201943672227,245.1831404354161 +2022-11-01,Tripoli,1432.0199847262134,244.3650678790605 +2022-12-01,Tripoli,1437.5644665994962,239.32178388620306 diff --git a/main_timegan.py b/main_timegan.py index eb7c46b5..e51c07c4 100644 --- a/main_timegan.py +++ b/main_timegan.py @@ -25,7 +25,7 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function - +import pandas as pd import argparse import numpy as np import warnings @@ -61,13 +61,14 @@ def main (args): - metric_results: discriminative and predictive scores """ ## Data loading - if args.data_name in ['stock', 'energy']: + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: ori_data = real_data_loading(args.data_name, args.seq_len) elif args.data_name == 'sine': # Set number of samples and its dimensions no, dim = 10000, 5 ori_data = sine_data_generation(no, args.seq_len, dim) - + print(args.data_name + ' dataset is ready.') ## Synthetic data generation by TimeGAN @@ -109,22 +110,36 @@ def main (args): ## Print discriminative and predictive scores print(metric_results) + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + return ori_data, generated_data, metric_results + if __name__ == '__main__': # Inputs for the main function parser = argparse.ArgumentParser() parser.add_argument( '--data_name', - choices=['sine','stock','energy'], - default='stock', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS type=str) parser.add_argument( '--seq_len', help='sequence length', - default=24, + default=12 , type=int) parser.add_argument( '--module', @@ -139,25 +154,26 @@ def main (args): parser.add_argument( '--num_layer', help='number of layers (should be optimized)', - default=3, + default=3 , type=int) parser.add_argument( '--iteration', help='Training iterations (should be optimized)', - default=50000, + default=12000, type=int) parser.add_argument( '--batch_size', help='the number of samples in mini-batch (should be optimized)', - default=128, + default=64, type=int) parser.add_argument( '--metric_iteration', - help='iterations of the metric computation', + help='iterati ons of the metric computation', default=10, type=int) args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + # Calls main function - ori_data, generated_data, metrics = main(args) \ No newline at end of file diff --git a/metrics/__pycache__/discriminative_metrics.cpython-312.pyc b/metrics/__pycache__/discriminative_metrics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd394e146b0e771996ee0f4a75c33422b009e663 GIT binary patch literal 6703 zcmb_ATWs4_mL&C-EWe{TcH+=+Y)gK~k0fp5rb**ClWE#GZk!aZ;|xKQltft~6_Rpn zFF93!0h-JNNV3>P9BhHQzyS3i{_tQ1JNa~gEK*?igMvKc4B^EV*!k&xrJDlXov%HY z5+&Mkr(Mj@7VqVG-E+^q=iGDdzXpST44&V-r6t-MG3-ClhxHJp&dVfp9$+jsg|RqG zr0_Js5IB~0OgV9kz&K~plwq+I+ef8OyvXC8@&KZibe*sNa8yi*XVsFx)VCo)_e-5GOwrMWL4*r3Ic#k>_bi;uNKqyuc@D zE=7}bv_P_)L{2aXnwEM=|Dpef4!ws+{}`8*K&^L#m?)(|T~Q#%C6VD|nTNqA7G#A> zgR+S1o$-lCFF7w$%LY0(yXkMTcPF5(EpW|81sN&`U$S4#tyiqelD@=ka8D5ka%S({VD)>3z_wt|J820hN z15CjY7(GclT@i#;d_-}TKv)tucRniis3a%p-HF4nX&6x>G>7I?0v5KyF%9EtF3tU& zIFII4f@MCp>WvfDXqr!{DPx>0z6kOy+|LJCLi4i@Enu5ttwmjFm2x*(U+$JWtW))= z&bWhht-2o}%fX{n{Y@l#Y!ZV%SR%y0oe%4ba_+F6I5%qVH&kPTF9nLXs6~FX0v|NtJq}At1z|BCUO66cxwl& z1}tqXh_=_p`?t}i(I&BV7i}7?v3Jp?N!_b9EdrCa&t?bmRVm5#S7DZKCOclmsr%H1 z)hcWDTC+{Z&R3}|Nm`5Al8n5Hw{dsBinX|{dE%JTXHlt`imNWw^T=6*Oha_g_G<^U zR_&lhYHivftzGFaQ~NC$qu8|(pggP$mT~)4QVm!hXvT~Vt<#1-ptkM6cWL3>=c6{O z`{D%b;|{f2?Nozmms+ESdFN`-vY079q($zGIMz_{u zi=0E&Y$~k{d$aE_)v{k%7SekEGN%punkB8$D#xw9+HFaU<5thcJ8aQa zS{rYV#ZlqiuC3Omyk&8!eQGaTJ39&yx)eRMsBNT^7G0%fYt`r?WNy|dTEE&qfko;T z|LdfClRqdC0AXJtTk*OF!@kNvZ_Mze7kB|O3~CV}Rc~2;w@vPDcHCFtwR)=iQ7IGCJhr&qY~d@d6}LyRyIzKfV+?T(qPyl*y~$lp z)#Sknr`1!5-6*Z`W&BP=_1-7$^g1!kr+HZq`m=Tkj(z0*$n%je=9qwyarkN88(2Fw zh{^a3`2G;X;qOkvyyHXc1|IRz0K+EubSA~wQ)^KoV_5-Gc~OXhx0wEC_ig0e^TVXA zA}OZnh!o)GDg_0CPspaJtiUU>;fJDt zpEGL=3HeuqFkGy%kbxpW=B{T^=}DzHA+998LYoE^9Ki|;6%!)02BE}^YD)EIF^D-?LY`;%SgL4N8B9e%*``oH4%Lzou&tfpGCvG_4jB%a-S8)PmgNMfsnRmC zmAOI8SMJXf%O2Y}M4=&EC%5{pszWZq{_8|?*x+7RZ7Rjf3iN$34xQ?76(FHw79dV~o|og$hv&;v5mG`S)@YD8nS*khi_zJX zLd7LIlYot%F+4O}^horA;gS>RIs_HTh9gbS8xCGjj6fzuGh9MU!KIDVhHx$bg9ilQ z0wN2}m*!|eLebV}EA4oSkwjUhV0TGkW`RPRyclj|!zT)y464t911@qvR_wdX3jrf| znx)ehGZ4*qKpI}Sc`&<%X98XCh=SpevVyTco)Twhn@>?dr@&nm;*!w84iSYG;+%vI z9B@Pk6Wk(a1i(4rwt|D}49;*OO$-Nw4#Q6B4jPL<5m2}~w} zMD98YI)(#0tw@U^uu+4!z;cv@w=tUpdn&^0WC8n!pI6LlI8gwHF5ZL4Ffjw4G+dKr za)e(tT$fSL^gp9&p=e!7;^-6#5$I~j{E!CFl*;%R4Q99S<_Atecmr-&ts-;j!$d+< zK^Vi!QnHwW3qivv!!j72;_c165h!&`rQGIi&b;9-wkE7Z37e=$X=ZRnky0s97GVxv zQ4HrKm7X!2m(km6PSxz0Q$@W1T+ZBYruHZyifsA7}Rs}eweSnq8Kl}E<@-K1I(QThl-P?atB!Hz@mFN8T< zn?zHdXxbo}zj0%srUz5^rT`#3@mn$=5B99QQD{AyCt7mhTNk&w zUt60mbibV^x^hvyzH6(t;U1-TzNt5!DAc}{>-olu0p!TN>-UfSVlmhKyru!Y>T}(I z@c2F!ZVLZ!$sFwPN?>h5Z#%x;v*8}gwQc#U?nZA%KdJw;`C;=iyYlYi2EF60b#cT0 zL9XLZZf}Wm^8Vzqb7^j6cEdevXKH%bv^=`}+FJjHe%A9P`rwak(Ut5PS78omaA4#){3V8yDfF&ONvm!1!e# zwA7Lh9L{yZ=x_*3-k#hHw&#QGg90TLlw=M5o=~^2u)SbL}J~w*n@YcTYO3T{p`fy?2Sl$`R{rFbm z1#FJy2VnK3`IV5~I`BNwy)wGiws!gPvGwp5XZ4AzdUzUU7-|KZgnokG9Lt@)`FAgB zu^ZC!_*IFLW>I3JWzj@+uY@Plhq`&`xJ~^Yaygr-Nhv$GhJOJF`c|1=X z)`@z(@i5Y^@j>(b=1)dG9eX&Y_ny#Cj_ExY^~n!6_D>b+uI75TfFOE5`pZL~cYW5i zdPMI(Rp@zJ?;a@}I`j0>v&kou|0e4bOyMG{kHrdS<9b^{zbzTof|aV#V#aNgQc?%{1N4!)Z7p?!zJiBUX%j;L0j|N;VG^^HemC6VrWvg-JQ!D|);41msWI6n9ekIlxd7Dj$W{3kQzlUlaAX u^V=|nAJVb5=U6C5Y+|827TUm?Ub->7;oq_D|G-A_*vLyahvTiL)c*r+qo_3i literal 0 HcmV?d00001 diff --git a/metrics/__pycache__/discriminative_metrics.cpython-37.pyc b/metrics/__pycache__/discriminative_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ccaa1e408bed91db24d354e217592aac3203f90 GIT binary patch literal 4002 zcmbtX-ESPX5nt}^eeHcnvSnNT4C6G3&ymim)1Z!ExOU>eO_0d0WjF3s!Gc=y?)JR5 zdnS2`&fo$CWT44|`|%%0kNt1@%%=iGJ?#=#~VaS-eCw3G1xh?}MO0nZ{PL=1;-jfG?b5Z17L z{$Q)Qim$K#{9};x0U5%vNt{02z&$C4V&mGip`nRZ8V^M)iYCKrH-35J<28A#n6>Uq zF>B;lF>C2mF+uPp5fYDvlt@P5;u4f`XUO9OU;l;d!THzM1EVrbMzWXj*ENN&^u-u7 zwtnOKhqt=}5+|)F8#IGp?Y})iFyxHJk+D`dV3Nm?Xbs0fu$h_D9}9+unUHI}EW!^r zH?hocln_u+XN)r*cjFXP2=Wq4Qi{bml|3fo$dZEK{zwi-as$&?L_8h99q1#FgoOaWt_3i6XE|G{$Rqz4cME8N327bvBzwH;$%4yFt^_OOlf~4J8vYr15S{ znXa)tAVxAYiq{J}L`J=Es`!jY#`n#$4y_8!gC=eRRXPXg&_RxL4?N`@qQ1ZFzYMKHeN|C@*E6Vj z>E*TmpqDJYKBWiL?;={Zw8m?+ilr_5(di%>(CUkFzNi*eO*Qsikaa0Pk)MQdT`k!0 za(*g54Yx9K)cSR`1pS6uIz+Vg(mh1^nYp=T=r5?{+1!dcqgKv1`B_-Ic(8Qn^iQa> z>Ljhdbn|n-d-Bl9&#UtXX5Fbn&=%%#5cRSoqX-0FR` zpsvI|ZM<}0)#<$X7xb+6wPSfts8g2r67XII-nW4Fof+@d`~$G+S?TuAsjKRPj!PHl zqSe8wp~2jFc|l#>M_qJ?U~~~iA52C^y!o2Eq}J3bU3%*8yLk(^-l9vYwE}m~uc>Pg z2Twfz*Z+qWj024C@UGZ^F9!Dqe1!&D8?Pg6Iy?1gMyEWp@tY_#o57lgOpbUu+x&G% zP7t+$e-b2NvsVU3@!w01^Xd=K+tii8I8FiU;T{0hPsxC_>oZc=Bl4I-9?wWKGs9#V zcB()-2~GS7Uf_L*B6z#hed+!={oYW#zTYo=XQ*DkNImKUrd&HJDOVYevO=`*(g!aw z=miA!gMJn8S)?Ue2JV94KB%bz*sf^NRH4BO!0JK$(76j3&P!iAwDcS2q4UH6k1ncG z#{&yjiHjU(D;^9JHXqV5jyt0iLTHw@ta0q?*pkMUdmDHz6HLORF^rjm0BPoMe4L5w z4%TdM7|!sIjn={>>&CFsegw`s7$WZ*Qe`&$PWPIwdo37)S+*r5i>H?MHAp~c^o{db( z4-=MlW$zVe*9Q9f@shBUMuu!2<8uXQ);}&mr|T%^o6|W`s1MQmJEsq5&3f&JSDB#x`J=i*2|C-@cngqXA2$*#7EE zJb-+gi0wy{l4bUtrpoO(O}w5#e+X_Sv5=60hqt!i5MiV*I?wODvBIXZS?0Z&WD!Zk zt=1e@##=M;@t)0wc4bF5j!a_^3_1<&JbrXPeE8Ypt9vIwdYT@rD3ki}Hj zNs<_6nK(wXtkIrElGovyxSqeO;XPKG_u`%sq% zRK1*xbwTt@ZRi_rZ$S367pGEJhY5*TFH4|;9DFLQD*kx(sEQ?dsB& zsdckddwi7Y3*98!A#)}Tflor=ZdP$qCjrb!+GX5e5c~kJ%bqh`1>b3F_Fp0e4z8E6#3uMw;UYfTnU2bL3@-ORMhG!$6^e@EIEUqI$w9r<@a-7fY%AC*fd6`;Xw=F59cxp1rD>sltEGFq}%Y zICsww>TupZq8Q;P6wr*-MaR_s?K5iP>ZBFrtKvbXG)QNzFFH9SKP&}C>B z+!b`yYoLb9W7w-%)1@$^SrmpwQ>n-}guZVlU@kz?8jkr#z}H?7PZLIX+L{LXi60k6 qGERgAgGIE3g5B8OZti8mmM-6f>@iB%Et|2-54m3`qcVuQ?EM>1E$93I literal 0 HcmV?d00001 diff --git a/metrics/__pycache__/predictive_metrics.cpython-312.pyc b/metrics/__pycache__/predictive_metrics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee5148712ae0aec0499e7ffa6fa9b2f500ac91b0 GIT binary patch literal 7398 zcmdT}U2GFsmaZ!Qm*Y79kOV@703DMbNN5@eknS{Ldw}jh5_&ty!d6#YWxI@BWp0&2 zlCftBb&p88nN8U3o@BK95TubN5v&xXk%p1>A&gjculB{3!v>Wy(n{M8%Nw&G%`mIg z?zv@`?U2wv>Ur4;zIE%~bI!fzyZ8Lu%fEU&Gy%`j$zAZE}X;yBdG(7V6G99nlXbe|AMFs(CEKt@rRt}HPZkn9%}MTEfzClpnP!elYo znG1uyR;Ke{$1#}c1uh1|MnvgK7ZXy|n9_CNKn%Aj?UEQ%+Wr3Q=YgX~jvi}M3&6Am z^T4!m1z_5w956KfE~ltWJjQdXz=Pr{fYB2}Vua~@T@Atbod;7W#WaVN z2|(=N(au9}1*4o8Y4^)fA5FJ?-9ytcB=DjiuNE5>R3!S9_SghX_sMwl_Z5M;AS-HH zNcJ-WeSM57GdTuEmSDwIA;xeaf#aFx2%daE;M6!0eDo8%llpw5UKtfQiRDHWITBX| zRzOHb&|D&ntBCWfEC$GLZd%NQx1|Ms&mP(c;s$YpywPxD*A3=I;~b%qm;gWFVvcMR zQP{jHaAu#d-K-Vf)5M*eoUpUdYSu2n*hwmB`J_R0n{5S-OEB&yjY;b(`*tO5s>kF@ zSQEA&Wsa7#t6sBbx`8JrLB84d3ByxK2X9F_i*y9je)&=J4dIG>HDBSa2|I6_1O!38 z@eW#e`(4K!j3+!v*SD5lmE|Zdd25j5okh~=gQk)maZbX?kOff^7O~fWC=wi zN)oOFeJ8ix82_XvSz3fcP4OJF^>FRxwuC$3F{LEEMf`P}X~R1=x0$;uylZn`!kZ|) z>&{CrE5e1@Ol?X^mM6-?O`H3Rxc6-CHMz~5LlWw1CRM^=w)PU2KLw;JRIAw+ZZ>O$ zcetfcH*0E}S(_$JY34gwnW%(4=By)>%yI@^C zub`_bqRUDweFf#Vt#M0~CA>ijc1v}FPSn79Zxbzdz2>SIJ7;^c_U2Em#P>oaZ?ky~ zv#3y;P$2-7vRCL(j7lS*QvM3Mji_LW6|bOt6)GMR5s@mOk*wn@ll4VAC-0?T=QP01 z*^#JMJIobMY)kCGCY7j5?BK1u^(R!e3|MfhiSQ)Ull3KczG$Nn6XKg+G&P?e?2Iubitcp+87y$EJRAK3)h08 z1hE`{=6Z9nR^W3q`EN#E$Ur!Tw5|sw9Xf8r1rp;E1EUq7$MNi>vH7L_n*=MTJ6>TBuHJh=&f~1UbaB zUx3Wd$#05+JXz%1^41Uhx#uoruGe9Rb49dUM9Qt=V;I);!}_fdoAUy;il5=Ce0RPQ-j=WCD+w!a=N)&Q z`T5(6fEt8xN%$q5*N7&fgHXt8@I6eB@b_cK zj}3}(%P?_`^tmSQ4~o%P1Z+KPDKcULaS4*ltRWkwTx`tPoX5MEqFlLPo48NS_Az21 zS2xT&CuoE1V)_X-!~u_K#Ils5ZewEX7>AU67fcMkMQ$`AClY#spG9{`@hBUYL{-sgNM6M;EGI1*G zDX_2s$ycURYCtbFCx9IdaML~SUp&taoPK}sv`$Hq?nIJg46i%h8F>E`%tN=ToD|aC z`~-Lq(a!>b?g&I=PCeAAJN&W)S^TJOk8l%kCegitcqB5xLbD|J;as6R6fqc;MINRT ziC{Rg>KjVvw4!oIRj!F@$miC{ah+6kYD_`cyZ{?kj;r9m6x|bJalX$2xhg2S+d!O+ z$U#xnZN`UAj$z<1+&Uc+d0voMUW_W(eP9QkeY8KF_jg@_V+K+#0o3SHuk4RU1xZyd zz4tB?g~Lunxr7gPa9+&6bLW&x=K5|px}Z`RV6vsC&v4-R!_A3^?B^m%cYA)JPXdGT z-%$KfBc9g~bjg~lF72wDKmIG~*PeTxN3QOb-Rs`+nfP>k=10>%TJ!Erd-pEW578I# z2k|c^A55l3MpNFs8LwXptT#6Ovif%QT4QIrv2*#2`yCJ8{^IO|v#C*kshPxi!0@+fxk>u9nMsJpj}xnEt?Uhg_-DdbpBkX zv{@6@>vyizx1{S^R_og`-gndWZL{2R`LAp4)vR^Ao$h#hrSpp;4~{(QIQO??s=iGN zq`dF`!A;O_J}o6m%4hdYolIG`zxXd3QT86Wsr^q1&NP2{s_wMK@{ru$+iic?YQ^P2 z3b%CIp!{cx?X=ec+t>+f%0@&*_2-Xcz>MAAA^1Ie3yROFbKn-{hy-!D8eA1QZAp;W z2l8;Q0LcR}P4N^yru>8oP`LePt>f#5f zq2ct!;nanZboXCnx-O+I|8?pZyH@rg$a?V%o6<);wjL)5*5(QbIEjTTnhksG&uVU{ z6Gk+)+>*7h<GJU1Gk44$eezSKaJiVeu2P7 zHmdXg!>nymjhr7H%Di})8YB;3ynXoU+BL*uviHu zRJ|~gu08mxL(AhUuRbUf%>QNHYW5MSv^AL+{+!q$}P99SzI1Q{>TX*@^l5`47? z-wElJVEcl~@1{F3isp&mkn`J5E4&#@p2Rt(H5;l6akIGDUHn0ds&RP_XIq^fvB1VA;!Qo#CTUHwFL)TXYTzWj7Qb ze#m^y^AxEdaZft{QCYkmd7*u-%3-jY3-?s*VfA_XW7)g znX;2w%X23IEr({W-a7p0q_+RDw-Of>+J2DaaNUruOP>uGgY8*#FZV2YmX-S* z_u{F>lPgzN?E_lly4{&08oD*KV4WXZg!ZoDc05y)`D&{1*hppE*W0yyQ~SPhduEPJA6s)br`^qq<%@rjaUat5edY1a3{4NMd79Fmri^Fr znx{SOXAAJnW>wu`*er4=P_l!(R{u6X6KrFf7-o2<8EE0+CZPu z%Gs`e^E7CFsKYqEY2O;XD^2hEg=L{H!yL-cuWP3s0~+UMM^a^scIGR$cNHgN8Skl# z`;^wZ?)GN9kghV;i1U54jA979_-9Ao?ylm)b_wE%B$y`x194e zi#?0#a{qm6s^#RYGgH>BwLoX7S8HB(m(5oE%`uI8?A^9n*S5$ncPs^$!PEV=|F>6H z4yTWt$<&=qd(U3~!BY!SQjHaBSfFlQPEi&A?y5~uwa;LG5FG#fW0KOT#>jV2bd)U)GqMC*Z^uj|ko9BWS~?0|nn9KDCe}`FpC2wEkfa pLGDfwjgN^MjanmW(nQTFu^kc~vhsJtf!`4g&+H$PWSt@M{{U39DQW-! literal 0 HcmV?d00001 diff --git a/metrics/__pycache__/predictive_metrics.cpython-37.pyc b/metrics/__pycache__/predictive_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a4e3a41126d39e177c939de37956056f44ac535 GIT binary patch literal 4361 zcmcInTW{RB6(%XoO=FL*@g>eK)I1cKtnFl-?KUyebiJE2*kI$NcCtwZUZ}FjnbAZe z$t1_|1QJld3E~ABv<3PD?8p9t{)zqpzV<0^ea=JML(O`R*Y z?%I0Q{wktu+ZAltvNl+qaTa=P)xPJ4q7ydkXHgU`+PB@%XMugs<(x^mXy5mnE(=_H z*9~pTxV`B$U6(J~*2N!yVez7Et+NgXSYLX8Zc# zW_8hCx%%l1K>E;)L2TfM&sXiHl(AU7awXO@u^jrbSoXZ$=auU}y?$d!o+xIiF;L8s zd!m@7u&)@)`oz zlICPSF_T<_?Bg^q3kTr13uqsIZ%~pJsF4;WYU!s$%_L8Aa|k$~Z5T993vZ3I)E~E~ z*}$}z(X6v`Xb$*G*;x6FQODGx~8!Br4z}-;RN(2kI)guXzvelDk<#a+vvN4bW)Pm^x-)=booz&(D7KATLmCX(@F ztU&<%xx`9l0Q0PG(22KtCv)li&flJZ1^PHZ>jNBQ2!{zcCQq%bapVBU)G2BYhvuF> zMepGlJ;vY@Ek8X^&!r1{pMyrgqM(t>>4juL&Ly+Sg?W^mPcBfCny*Q(tsC=bpUk3k z;df+b{0T}H60(5OkCKldQO&&k>jsM>E^XOlHpFWd_mFYysD9eX&v^E6ghb)8W!vyy z;|;M2Z`)q7Bkns8ukNbuHT)1VivH}6_9LFrKF{FW7TpkFNZ&hQhdCPzq9+_Iek>Vc zQ+N@FfV{tUN5jo_&=1@w6cCFU=`4hIIK4=sF1BD7eCu}Pb=oYHV(b1lb{nczAhvXchQdF1_Y2O} zvFc9Mp!e3zz!wsVSbXa~2oM^19=-he5O)?8gSvGyh&(qCx0VN5T^^85)~Z$%k#$u$ zHiZr?(4)2X_|XGrYX6yIzSGY2lZSPgx_dKJ_W-Bfp(0ZBUFnD?Yrx1zd&(9O+_;55Se?;Xp|- zQJ%1g-X5yG>BSb{oUW;mw9XEKj3E5u!O=sc$WeDP?bTp%(7?3mF?<% z>82jqi}@{2i`I@|qW@$+C-a8)pidjw9?nAt_Am*1K)pT89b?9Tne<|77%sm8Q$RUG zSan`G!OB;Ffx^>Ac`6QdQq2V4gANG(GKKUBF*u|^P#>B@T6vOun7)rGYLFw+SMCr{ zNFgMQRe>|ngafKFAVc)k+`~=yRS?WS)s2qfp3i8+44yt>*j=g4bP0oF;wkw5z3ut3 zmZswVPMx`8>ST6!-y?4rO(>6G*4Q-ME=aPz4w6Xx#0pT;?cT>rxqQcTX99C{;NQ zT#q%Q0Pb7-M|vy=WJr4XAQA#{)70R2PyKrT9;b3}zV|~lx<=jhgBaB6zhqn$+kTjJ zRbf+KwW3fNyc4PmjUd`~hw`EWd=l=B*{mFQ!v>T_c+sd0fEaIgATPr7Of$;ViHYk( zQ2m%^I?+xI?jJ$kWjneysxj?Ruqo%5aPB0*43o>lAC@n(%PgF-l(p?jujvSYr0`RP zA1VAS%djfnb#yZ2pMcOBWM!?FS}}Iu(gPP@WrC6f=u%2(=$Rewi)T^Y|=f4f2*M-h^XDCt$ZGK%mf-&&(BZQNuU>0eP#QB>(^b literal 0 HcmV?d00001 diff --git a/metrics/__pycache__/visualization_metrics.cpython-312.pyc b/metrics/__pycache__/visualization_metrics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e00de6fad83e0f03e24cfbfe7a248a19950c15b GIT binary patch literal 4776 zcmcIoUu+ZU5#P1fj=hc($Ic%D7j6?EN`LVb|t2q6gsE;IzJ&F&^yvwzI) z8sf+kee=yXGvDm&&-)jrlf>XEKRZ478z+YS9SO!|$}!KnfSJcwYy@L*)+FGf zX~cvh-Yl3!VuZ->gkTY^BPBWBHezQj?_(omm}s`r+rZRmUgW$gr|_Ig^>7lW&>DZ4 zqkQaTPEl!vrv<8?)2_(MMU`qo%00gRX6lH{a$~g0wUOj0Zk$s%iQ&4aUS3i|(ggJr zS(aLf zE-NCqD@)X%A~T$-^04_(Sk*WYoJDHK28Wtksm}I}gW%~P9fWNKUb@&tO=?DG z&SbzZa+<<3YFjW&lKnDr;Ec*qgGYRntWeree>Vl$qH=+NleEOb3_rn3kV^0y&ZXEM z`2Jmfpvr-$XLk&lR=wfj#uNT4Y<;EvW1{XDJL{<~S z0#<`7(15+b8{AeF4STF9V&0BL3C&_?2Qqh$A!TX7lPLBQP28{?#UogRs09O2EQ04a z7z>ncw2h=uh&gJBTB9XexiK3t8J2V z<9_MAT%W+Pmsl;^WYv)KRwHmF)Ei+=@pxJ25 z7bsi4r6!#3=8JW0soAnw55o#xhD}f{6}f706x|zJ-8=THELJT>7makPI9#jFvR&#RR z>i?xes*NnYv_fjO)ZD5o}uZXdyUB>lT3?;{@G4WOy=dLx~9rvNmm*@`732680lPAa4-pqNjNE2|6ae72Ieh z6o3wxUILhWOjbFa1kf53xG7!>>sHCnYn(DoYF>o$GFGiqUSvtPhW#0f+jO(YOS)O$ zB;6zhb*lpKPZo6t*bzfo20`j2G~j)O4(k?m5>T;j0i_8}FHyLxOo$vU=?+Gg7y!5u zd=+#%>*jG@)9o5)s|b)oo&-&|si86CimI2WpbomaRp8)MSly!WngG5{Wz%8}XDOjh z%2yNw9CasH^ydvWSL!z7@b$9%!DbFxw;3m?mm$ut(jp|rFUh)@XQv=o864m)`BCI% zmKSxL*X==t3uc!)^Q?c8)^sZ)3$mgr2!KLz7}^iPhXjbC90{P3AHc_T6FmjvhAsa% zg3=1YYI-Tkx}mC~hKXu;^Y!mjOxGx&bVVHv!SCo%nF)!gphi#hQ6l_Z5Y*A!KdwB@ z!Tiw;V7&&^``$~&<4cKE6{AhR*-xf`pji4&hNiKd^6D>bcYk2lt~ZX<8muiGEm z>Qc74>{Qy;y5L`sR%}0v?Rsv-%3QZbu8+iRX=i<`Y28yb-!<12mokeVIjd%w>*r%l zYo7YVu9T-S*7m5XZvMjDg_Ox1Ylux;Qy)8AvpXL;s2IIwvtK)T!@BOSoNt+H`Q+3u zhHnoi&Mwdo@CWq^+#UZSovu5O>_`qL_om%Hj`8c&+vWpvfnT}r*4(LC*qOw?sQ<#3 zw4|C3B`>AxeM`QjiKQQ;s|RMp$6&H;t}W5L-mv>_%bk|{r+z#9>G0y&B>g4+Wqp$S z%)fLp?d@5vU+!7nk#0Ei)QmR_*Zl z{#E@~zGX}5VE^)^bjQh+(`Q!RJHIk?A>HT)3yn0gP&0=AOnh37mDWG6#@?t;>|EW^ zo_2JkcC^pZH@a7Lw5J>$e>k&zXtjGJz5iUQdt?cJ@ZL)IND2hUxme>Pi*vRrZK-}t zI^!o-$v0z1)`*f1duDpB9a|-;*W6X}-Z^i=o_4pyj;~eM&Wm$m;zYW-Gd2Jx<8#+3r%<);r$G$inKaz4$iM_w37x4uq)zGBk@E7L@-IPt+&ODcA0V{D4m4i%hDq3oSSlKb&2#7cCgTpIR|X$%n^gj=g^z zZ3fJ>z$#IT_}-b`Ygbl@n$7&XGw*)T`>3RR_N{bDEjV3Mo5?o6Shuq0@G`zy-J6M} z)D^$9;7h)<>{)f3h#g(?)I9X;NqP1pvLG4!H$KVYB;&f}4DhN307AYhK!wQ1!nU?S=_6%4|@u5lE z+t6%60(VF`4kCK&sR(gFf#di;O)i}HrV+y%zQ*=^jlKCd%>B&ThvVf+FR1(n)Ngat literal 0 HcmV?d00001 diff --git a/metrics/__pycache__/visualization_metrics.cpython-37.pyc b/metrics/__pycache__/visualization_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0784bb77d2d7fe37fd98a1ebe518811935949618 GIT binary patch literal 2848 zcmbUj%Z?nkvB~b~>FJ%Beae!2VhkTN!Olq81c|&56mO)!uwkzSuZ<*)H5%L|XNKB- zj7W~Wv*LVZ_men?KsZAEwXGFfDfUoM=&raau{MbMH!ATvap-FnHPCA?4^y&kD3cOh+3?{ z{NFoK$h;$`*Q9qq*q0*XeZ{5VihRU#E~yqTIXPf2xl~jNnvz4VzbWLYBKIuuM+b*J z@}yw=gepD=!!P)dOP(iupL`;6HO)ulcSVu!lBYBmJSCq{DY@3W$N8|38K_(2BRLK1y+_-g{*A`3%6 zNt!d*5hIa^4lmPr0$qi$s^RTvR64KF z2){y=tMPO9!ke#L!V4|kZ}DBH@-)6^l+GopoEky^0axk4o>QWF2K>2y>{gA+ubOB7 z(#_I+g`PTJ|Fa6pfVrnw{vCJ&=&jOWF2f9e3*C-G_pZadOU%5|AK^<}wN{i68E>Tw zUz`AKSYB~BaN1jB4>9O&slzh7I^}!tz)8Px=8?Fx?G<888<|)5ZKql*F$+%dAF$lj zYplh>*Qjcj?TdEVx-zn+ntqdcdy&VFyz&D&;RySor(VM;2VU5!2dvw)IQ9F^lhld zHcIzz2JK>Z71j%y6;9MF*JG|lQpfm$oI=dclu-LbtDM^eF-a)wiT^+(A4&v4{l*T7 z9c;5j$AftRBAmBH2HNWF*z` z6vpGHMKaBJuGR5ppOOr+Vycc8g=IA_vf1&CoOCV6eHT7Th0>5GCy)27QdUFXIsefO zhQXt>NNB1a1F)q2K{k0O>6F(-^ssDNgMy`1bNgBrwZ;0H62=8@zOf2{SK4`Ol`L{= z@aWHfvh5$gjDpV>ski4El$ZuhCu3?FDLvt7)H+&T+Ie8#&?GJNdE=}PVxz_^hRJyL z;%s)NXF|QX2WN?0xU8Nhy8xRe6z`Kl@hF7qHc9!J&@sv{Y zKZ|RLcZ{2f+_)*v4bCUVmry5)%&dW&Y^v*0W118`3?!YIh8jcpGz}mcanqE1j(ZuW zxmin!Jb_A>LznjP7B5xq!|JjK@?PKPl2eD%l1-qBXda7|frhT1D#?0g~l{K|_P-8LTg5 z#Y0 Successfully loaded and renamed raw synthetic data.") +except FileNotFoundError: + print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") + exit() + + +# --- Step 2: Calculate Min/Max for Denormalization --- +df_original = pd.read_csv('data/transaction_data.csv') +if original_date_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_date_column_name]) +if original_id_column_name in df_original.columns: + df_original = df_original.drop(columns=[original_id_column_name]) +if original_city_column_name in df_original.columns: + df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +df_original = df_original[column_names] +min_vals = df_original.min(axis=0) +max_vals = df_original.max(axis=0) +print("-> Calculated min/max values from original data.") + + +# --- Step 3: Denormalize Synthetic Data --- +df_synthetic_denormalized = df_synthetic.copy() +for col in column_names: + df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +print("-> Synthetic data has been denormalized.") + + +# --- Step 4: Reconstruct 'city' Column --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed 'city' column with text names.") + + +# --- Step 5: Create a Structured DataFrame with Correct Dates --- +# THIS IS THE FIX: Use 'MS' for Month Start frequency to match your original data. +date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='MS') + +cities = sorted(df_final_data_only['city'].unique()) # Using the correct df + +structured_dfs = [] +for city_name in cities: + temp_df = pd.DataFrame({ + 'date': date_range_single_city, + 'city': city_name + }) + structured_dfs.append(temp_df) + +final_index_df = pd.concat(structured_dfs, ignore_index=True) + +df_final_data_only.reset_index(drop=True, inplace=True) +final_index_df.reset_index(drop=True, inplace=True) + +# Drop the flawed city column from the data part before combining +df_final_data_only = df_final_data_only.drop(columns=['city']) +df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) + +print("-> Created a structured final DataFrame.") + + +# --- Step 6: Save the Final Data --- +df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 34db7e4c..082e6774 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1 @@ -numpy>=1.17.2 -tensorflow==1.15.0 -tqdm>=4.36.1 -argparse>=1.1 -pandas>=0.25.1 -scikit-learn>=0.21.3 -matplotlib>=3.1.1 -protobuf==3.20.3 + numpy>=1.17.2 tensorflow==1.15.0 tqdm>=4.36.1 argparse>=1.1 pandas>=0.25.1 scikit-learn>=0.21.3 matplotlib>=3.1.1 protobuf==3.20.3 diff --git a/synthetic_data.csv b/synthetic_data.csv new file mode 100644 index 00000000..f543c686 --- /dev/null +++ b/synthetic_data.csv @@ -0,0 +1,4189 @@ +0,1,2,3,4,5,6 +0.10441720485254888,0.030766636127925642,0.00011318920910954589,0.0120193648239882,0.0,0.0,0.9951906401125887 +0.08302393555297391,0.06368532775742064,5.999206896722376e-05,0.0003210603869766029,0.0,8.940695822239011e-08,0.9999922706062416 +0.23448202012998484,0.1324485540163216,2.4735925108194595e-06,5.900859242677747e-06,0.0,0.004890322196209479,0.9998725844915013 +0.1757552623676003,0.07322433589635119,0.00023519990476370093,3.874301522970238e-07,0.0,1.0281800195574863e-05,0.9999865485609154 +0.2104187309654844,0.04233881830444139,6.72042302638299e-05,5.066394299268773e-07,1.4901159703731684e-07,1.9073484420776557e-06,0.9999907208856325 +0.22161853312528373,0.03773298858950131,6.702541634738512e-05,3.278255134820971e-07,2.086162358522436e-07,1.4603136509657052e-06,0.999991793769131 +0.23942619561157638,0.03827616571724644,3.9488073214888964e-05,2.9802319407463367e-07,5.066394299268773e-07,2.5033948302269232e-06,0.9999896480021337 +0.25175088642985266,0.038619011633935774,2.8759238228202153e-05,2.086162358522436e-07,9.536742210388278e-07,3.5166736900806776e-06,0.9999880982815246 +0.25979477166053766,0.03843638300237525,2.3424623054266208e-05,2.086162358522436e-07,1.5795229285955586e-06,4.112720078229945e-06,0.9999870253980259 +0.2645585536847239,0.03819587826074773,2.086162358522436e-05,2.086162358522436e-07,1.9669530808925826e-06,4.440545591712042e-06,0.9999863101423602 +0.2669510543235867,0.03793430327719572,1.9788740086555676e-05,1.7881391644478022e-07,2.1457669973373625e-06,4.410743272304579e-06,0.9999858333052496 +0.26589033006520774,0.037278473370844396,2.086162358522436e-05,2.086162358522436e-07,2.026557719707509e-06,3.874301522970238e-06,0.9999861313284437 +0.15529996156049442,0.025752931828857406,1.7881391644478022e-06,2.682208746671703e-07,0.9997287584980409,2.115964677929899e-05,3.5166736900806776e-06 +0.42330458758508727,0.08012828229485772,2.086162358522436e-07,4.172324717044872e-07,0.9999666406115512,0.01219758269404483,0.0 +0.23653107880566598,0.11057665942205966,5.3942198127508695e-06,8.940695822239011e-08,0.9825911731413343,0.30814087289723163,0.0 +0.09763079881263824,0.06079885362537706,9.736417750418283e-05,0.0,0.08256735572069668,0.9936745365196923,0.0 +0.1227488517710403,0.10491204259983322,3.749131781458892e-05,0.0,0.0006913840079337427,0.9999331428045373,0.0 +0.11860024928555533,0.11078268287669052,3.150105161368878e-05,0.0,0.00016349552426934405,0.999966044565163,0.0 +0.12338596581901806,0.11962550876476372,2.598762252330806e-05,0.0,8.091329719126304e-05,0.9999773694465379,0.0 +0.11500960587978971,0.11958041785099885,3.1441446974873854e-05,0.0,7.781385597288686e-05,0.9999714089826564,0.0 +0.10035169124187737,0.11757123468293164,4.386901416778608e-05,0.0,9.995697929263214e-05,0.9999493552662949,0.0 +0.08473530411369407,0.11412975190115705,6.288289394974771e-05,0.0,0.0001702904530942457,0.9998783065368275,0.0 +0.0696675777406455,0.10629114506808768,0.00010359286226034267,0.0,0.0005677043823927697,0.99942852993233,0.0 +0.05539226531753055,0.08896324036982191,0.00030547377392649955,0.0,0.012048660503965736,0.9830518573947349,8.940695822239011e-08 +0.12134891747925866,0.1118653714465277,0.00023663041609525915,0.0,0.0011868475680828212,0.9998631669585685,0.0 +0.22201338409458193,0.1854579448382382,1.069903266727935e-05,0.0,4.2498107475042767e-05,0.9999996615814547,2.9802319407463367e-07 +0.22912585734372287,0.1686291396329137,6.7055218666792585e-06,0.0,9.924172362685302e-06,0.9999994827675383,2.682208746671703e-07 +0.2512722313300037,0.17419147488472309,5.155801257491163e-06,0.0,7.033347380161355e-06,0.9999996615814547,5.066394299268773e-07 +0.25529140232936426,0.1800190806080599,5.48362677097326e-06,0.0,6.765126505494185e-06,0.9999997807907323,6.556510269641942e-07 +0.2555623054398572,0.1810519396948734,5.930661562085211e-06,0.0,6.616114908456868e-06,0.9999997807907323,8.344649434089744e-07 +0.2534356117143593,0.17792814966969725,6.407498672604624e-06,0.0,6.198882436752381e-06,0.9999997807907323,7.748603045940476e-07 +0.24910438059729012,0.17159783837241085,7.033347380161355e-06,0.0,5.811452284455357e-06,0.9999996615814547,6.556510269641942e-07 +0.244709610928893,0.16529497501403884,7.68899840712555e-06,0.0,5.543231409788187e-06,0.9999996019768158,5.66244068741804e-07 +0.23676472901317583,0.15705785152606944,8.612870308756914e-06,0.0,5.334615173935943e-06,0.9999994231628994,4.172324717044872e-07 +0.21984213589711632,0.14520463344948584,1.1026858180761447e-05,0.0,5.543231409788187e-06,0.9999991847443441,2.086162358522436e-07 +0.19371223448904912,0.1328356861840715,1.707672902047651e-05,0.0,6.884335783124038e-06,0.9999980522562066,5.960463881492674e-08 +0.695228934259237,0.4115378557931014,0.9999996615814547,3.5762783288956045e-06,2.3841855525970696e-07,6.556510269641942e-07,2.7030703702569276e-05 +0.5411847233548185,0.450802296322877,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 +0.5918448567145372,0.3092705308861442,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,5.960463881492674e-08 +0.5483335852395933,0.34262293571327307,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 +0.5784543156384315,0.3325960039522947,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5772681236028055,0.3390295504943144,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.5799865722416091,0.33755710715235765,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5844708680864551,0.3387548922912364,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 +0.5862112045045349,0.3415297567259572,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 +0.5886878967041393,0.34252279991006757,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5912961959594024,0.3449222742920572,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.592860996698626,0.3469466566445395,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.16536375879556658,0.4654632805980917,5.364417493343406e-07,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.158693492405996,0.4226948022118605,0.0,0.9999999000000099,0.0,6.645917227864331e-06,0.0 +0.1772499382422485,0.47049054495384407,5.960463881492674e-08,0.9999999000000099,0.0,6.616114908456868e-06,8.940695822239011e-08 +0.1782937645838343,0.5415201782252964,8.940695822239011e-08,0.9999999000000099,0.0,9.536742210388277e-06,5.960463881492674e-08 +0.17726960777502354,0.5538820027356613,0.0,0.9999999000000099,0.0,9.953974682092765e-06,5.960463881492674e-08 +0.1788797080442745,0.5565514563561148,5.960463881492674e-08,0.9999999000000099,0.0,9.953974682092765e-06,2.980231940746337e-08 +0.18029603361336868,0.5582656859395615,2.980231940746337e-08,0.9999999000000099,0.0,1.0222195556759936e-05,0.0 +0.18133792280399938,0.5588477849003384,2.980231940746337e-08,0.9999999000000099,0.0,1.0550021070242033e-05,2.980231940746337e-08 +0.18225553631027852,0.5594696997638182,2.980231940746337e-08,0.9999999000000099,0.0,1.1026858180761447e-05,0.0 +0.18305954336362049,0.5604499577516265,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,8.940695822239011e-08 +0.18384724854661702,0.5602018832201138,2.980231940746337e-08,0.9999999000000099,0.0,1.2338160234689835e-05,0.0 +0.18456044792364742,0.5601701139444539,1.1920927762985348e-07,0.9999999000000099,0.0,1.317262517809881e-05,1.1920927762985348e-07 +0.41879385708028444,0.3091232776112518,0.9999997211860935,2.682208746671703e-07,1.1920927762985348e-07,0.0,9.238719016313645e-07 +0.7265598177608998,0.4310984610773038,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 +0.5735671519995653,0.3720480202991463,0.9999999000000099,0.0,3.874301522970238e-07,0.0,2.980231940746337e-08 +0.6025111675012965,0.3104480504458028,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 +0.6018087267626476,0.3388568162337849,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 +0.5873838662857974,0.34617793554100296,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5865893363709743,0.3460998534563605,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5855681895967246,0.34820628160236217,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5850735306497541,0.34685313695690295,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.587263226484777,0.3463897704484984,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5873935222382506,0.3464886843564862,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.5884665250534528,0.3470637201668583,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.11642333864683628,0.10756063459461895,0.0002636909221172359,0.0,0.0018718836819827743,0.9997217847552995,0.0 +0.20500034093007952,0.1665179133130085,1.2695788067579396e-05,0.0,5.531310482025202e-05,0.9999994231628994,1.1920927762985348e-07 +0.21699959038789562,0.15892648694178035,7.241963616013599e-06,0.0,1.1473892971873398e-05,0.9999993039536218,1.7881391644478022e-07 +0.23931547998391067,0.16296830770562987,5.48362677097326e-06,0.0,7.450579851865842e-06,0.999999542372177,3.278255134820971e-07 +0.2487703263656603,0.17102527615479649,5.48362677097326e-06,0.0,6.8247311443091115e-06,0.9999996615814547,4.768371105194139e-07 +0.2502561807528821,0.17362141606218887,5.900859242677747e-06,0.0,6.526707950234478e-06,0.9999996615814547,5.66244068741804e-07 +0.24638545512132848,0.1692899763294253,6.467103311419552e-06,0.0,6.288289394974771e-06,0.9999996615814547,5.066394299268773e-07 +0.24041640757518892,0.16231352088056195,7.241963616013599e-06,0.0,5.871056923270284e-06,0.999999542372177,3.874301522970238e-07 +0.2330541312598047,0.15504780409065314,8.255242475867353e-06,0.0,5.6624406874180405e-06,0.9999994231628994,2.682208746671703e-07 +0.22097769378700766,0.14647096392984457,1.0102986279130082e-05,0.0,5.871056923270284e-06,0.9999990655350666,2.3841855525970696e-07 +0.20383799075236275,0.13741880652935604,1.3500450691580906e-05,0.0,6.675719547271795e-06,0.9999985290933172,1.4901159703731684e-07 +0.18596407770340498,0.12972739336653427,1.8984077462554166e-05,0.0,8.1360331982375e-06,0.9999975158144573,5.960463881492674e-08 +0.10187199711377792,0.031272798771271586,0.00012856720592379698,0.00961002611381123,0.0,0.0,0.995828230933992 +0.318205416189369,0.26547402138932547,0.0,0.999971528191934,0.0,5.066394299268773e-07,0.030761656069189614 +0.1346418559495487,0.3375075756925578,0.0,0.9999999000000099,0.0,0.0007069408186644386,1.3947485482692857e-05 +0.11706313490382883,0.4697990416676008,0.0,0.9999999000000099,0.0,4.9054617744684705e-05,7.450579851865842e-07 +0.15221512317027183,0.47850072375687003,0.0,0.9999999000000099,0.0,0.0009310840629279706,2.2053716361522894e-06 +0.15286567806564588,0.4992459117511357,0.0,0.9999999000000099,0.0,0.0008564590551316823,1.7881391644478022e-06 +0.1527749299939791,0.5233755706844581,0.0,0.9999999000000099,0.0,0.000646829540419585,1.2814997345209249e-06 +0.1552143990929229,0.5343093871155387,0.0,0.9999999000000099,0.0,0.00043508406102955773,9.536742210388278e-07 +0.1583091318541778,0.5404465197591412,0.0,0.9999999000000099,0.0,0.00031170245868265936,7.748603045940476e-07 +0.16135191916751312,0.5437005757354516,0.0,0.9999999000000099,0.0,0.00023710725320577857,6.556510269641942e-07 +0.16405349969184582,0.5463762878436055,0.0,0.9999999000000099,0.0,0.00019001958854198645,6.854533463716575e-07 +0.16650310158040102,0.5480272172943116,0.0,0.9999999000000099,0.0,0.00015911458331644692,5.66244068741804e-07 +0.36865776775740927,0.0679339170339606,1.7285345256328755e-06,1.1920927762985348e-07,0.9990654184726695,0.00033336874489188527,0.0 +0.3084666132799212,0.08070036767531395,1.4603136509657052e-06,8.940695822239011e-08,0.9969370560298662,0.0594072282511717,0.0 +0.10737174748929787,0.07947340606282263,0.00010335444370508297,0.0,0.12397943687421206,0.9972814516329388,0.0 +0.13192400335719295,0.10845017431309456,3.0457970434427562e-05,0.0,0.0004237889819741291,0.9999713493780176,0.0 +0.13345679640217345,0.11937114594322829,2.256035579144977e-05,0.0,8.010863456726154e-05,0.9999849392356673,0.0 +0.13652348517806268,0.12410804627200701,2.0444391113519873e-05,0.0,4.82499551206832e-05,0.9999874426304977,0.0 +0.13173821567943575,0.12299588320533343,2.381205320656323e-05,0.0,4.619359508156822e-05,0.9999854756774167,0.0 +0.11838832497106522,0.12007179854244303,3.334879541695151e-05,0.0,5.528330250084455e-05,0.9999776674697319,0.0 +0.11491775512219464,0.11794096229441008,3.862380595207253e-05,0.0,6.130337102115215e-05,0.9999727202847103,0.0 +0.10469293593926841,0.11588373778266213,5.039572211802056e-05,0.0,7.46846124351032e-05,0.9999591900316993,0.0 +0.09728759526803575,0.11350861189805907,6.276368467211785e-05,0.0,9.661911951899624e-05,0.9999379111756425,0.0 +0.0925699472389037,0.11042588947312612,7.68005771130331e-05,0.0,0.00013509391387403146,0.9999034000897685,0.0 +0.11630174517149951,0.02283442020025254,1.1622904568910714e-06,6.258487075567308e-07,0.9992351724840144,2.6941296744346887e-05,2.565979700982596e-05 +0.117679536337748,0.02334383129673819,2.166628620922587e-05,8.940695822239011e-08,0.9999988271165112,4.768371105194139e-07,5.66244068741804e-07 +0.18639835714522052,0.038076221936381625,3.0130144920945468e-05,2.980231940746337e-08,0.9999998403953712,1.3113020539283883e-06,1.4901159703731684e-07 +0.19567710160398852,0.03709095715841313,7.697939102947789e-05,5.960463881492674e-08,0.9999997807907323,7.152556657791209e-07,5.960463881492674e-08 +0.1798187494203495,0.030833899969543152,7.554887969791964e-05,2.980231940746337e-08,0.9999999000000099,4.4703479111195056e-07,0.0 +0.16081818937589398,0.028790891165571698,5.954503417611181e-05,0.0,0.9999997807907323,4.172324717044872e-07,2.3841855525970696e-07 +0.14464861153957317,0.028701275582167243,4.339217705726667e-05,2.980231940746337e-08,0.9999998403953712,4.4703479111195056e-07,2.3841855525970696e-07 +0.13544711470043086,0.029782086605694327,3.2484528154135074e-05,0.0,0.9999997211860935,6.854533463716575e-07,2.9802319407463367e-07 +0.11652976274007833,0.029841482634202835,2.1606681570410942e-05,1.7881391644478022e-07,0.9999996615814547,8.642672628164378e-07,6.556510269641942e-07 +0.08159157633443581,0.03206843137191965,9.208916696906181e-06,7.152556657791209e-07,0.999998290674762,2.264976274967216e-06,3.725289925932921e-06 +0.043046772478228516,0.039231926196056165,2.1457669973373625e-06,8.821486544609158e-06,0.9999468518714647,1.5258787536621245e-05,7.450579851865843e-05 +0.03315582871299782,0.048708975306753305,5.066394299268773e-07,4.711746698319959e-05,0.9984082773297349,7.483362403214052e-05,0.0007666646667569952 +0.1835895478649413,0.6377831696371881,3.2782551348209707e-06,0.9999998403953712,8.940695822239011e-08,2.980231940746337e-08,0.0 +0.17478796838990293,0.4676534830723108,2.980231940746337e-08,0.9999999000000099,0.0,1.919269369840641e-05,5.960463881492674e-08 +0.18150675296031868,0.5712885855650172,0.0,0.9999999000000099,0.0,1.4096497079730174e-05,0.0 +0.17520347236861497,0.6352770923480359,5.960463881492674e-08,0.9999999000000099,0.0,1.1444090652465934e-05,0.0 +0.18072602152076056,0.6443951128809899,5.960463881492674e-08,0.9999999000000099,0.0,1.069903266727935e-05,8.940695822239011e-08 +0.1850274503154433,0.6465629338110996,8.940695822239011e-08,0.9999999000000099,0.0,1.0490416431427107e-05,2.980231940746337e-08 +0.18799132107909924,0.6464197634543737,2.980231940746337e-08,0.9999999000000099,0.0,1.0818241944909203e-05,8.940695822239011e-08 +0.19002044200110385,0.6455999015656286,2.980231940746337e-08,0.9999999000000099,0.0,1.1533497610688325e-05,2.980231940746337e-08 +0.1915709078232595,0.6435397862286095,0.0,0.9999999000000099,0.0,1.2457369512319688e-05,2.980231940746337e-08 +0.19272333382762155,0.641164541134717,2.980231940746337e-08,0.9999999000000099,0.0,1.370906692743315e-05,2.980231940746337e-08 +0.1935566663661918,0.6400398014879979,5.960463881492674e-08,0.9999999000000099,0.0,1.5050171300769002e-05,0.0 +0.1944214999595245,0.6384731530049899,0.0,0.9999999000000099,0.0,1.662969422936456e-05,8.940695822239011e-08 +0.39100864527990603,0.22641879316267569,3.957748017311135e-05,1.4901159703731684e-07,3.418326036036048e-05,0.9999999000000099,2.980231940746337e-06 +0.18271720408636719,0.15214470026272006,2.6375052675605083e-05,0.0,1.3828276205063004e-05,0.9999989463257889,1.4901159703731684e-07 +0.20996809004867872,0.13824728128926972,1.3500450691580906e-05,0.0,5.960463881492674e-06,0.9999987079072337,2.086162358522436e-07 +0.21058613061032916,0.13706254956759453,1.379847388565554e-05,0.0,5.722045326232967e-06,0.9999987079072337,1.7881391644478022e-07 +0.2042048275386177,0.13439637420260309,1.5705822327733197e-05,0.0,5.990266200900137e-06,0.9999985290933172,1.4901159703731684e-07 +0.1873660385531089,0.12819761035631344,2.1308658376336308e-05,0.0,7.182358977198672e-06,0.999997635023735,1.1920927762985348e-07 +0.16515472530634795,0.12090483305768124,3.28719583064321e-05,0.0,9.775160765647985e-06,0.9999956084660152,1.4901159703731684e-07 +0.13773286342050528,0.11385783551173828,5.8054918205738646e-05,0.0,1.5169380578398855e-05,0.9999902440485219,2.980231940746337e-08 +0.0996956825215066,0.11036917565363205,0.0001199245332956326,0.0,2.4795529747009523e-05,0.9999711705641011,0.0 +0.046725243328067045,0.11777025459180258,0.00021189449098706455,8.940695822239011e-08,3.0368563476205174e-05,0.9998687101899782,2.980231940746337e-08 +0.022110372780837998,0.09783405063861236,0.000497043083077674,0.0,0.0006021558636277974,0.993688126377342,9.238719016313645e-07 +0.10519149899047152,0.07080668209770817,2.333521609604382e-05,1.4901159703731684e-07,0.9788732145859756,0.00047376747162044516,2.264976274967216e-06 +0.5243982076427756,0.36304515593987857,0.9999996615814547,8.642672628164378e-07,2.980231940746337e-08,8.940695822239011e-08,4.053115439415018e-06 +0.5924242734663748,0.4200350641485037,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5879620909447395,0.3435937761672084,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5480281114351321,0.34448575967611933,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5718190073730203,0.3451562523250829,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5518996715317125,0.35225617879557736,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5627690553432131,0.3427022694954555,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5590523481137527,0.3478626608252909,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5643817186121893,0.34238755697109535,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5628420114284152,0.34440210455719145,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5686357021096328,0.3410621582877743,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5696069001915628,0.34192141884670924,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.12109705805277067,0.03147754072603999,0.0001248121136784566,8.58306798934945e-05,2.3841855525970696e-07,1.1920927762985348e-07,0.9998693658410053 +0.1746627688335574,0.032311558717916834,0.00013414023965299261,1.3113020539283883e-06,1.7881391644478022e-07,3.874301522970238e-07,0.9999977542330126 +0.18334403633312163,0.033621698612177967,0.000101298083665968,8.642672628164378e-07,1.4901159703731684e-07,6.258487075567308e-07,0.999997277395902 +0.15084716677041085,0.028978943819805852,0.00011205672097206227,1.9073484420776557e-06,0.0,1.4901159703731684e-07,0.9999985290933172 +0.10204431414181644,0.026148468251519168,4.0024514964223304e-05,1.6868112784624266e-05,0.0,2.980231940746337e-08,0.9999991847443441 +0.07936269044547475,0.027550637717297745,1.573562464714066e-05,9.751318910122014e-05,0.0,0.0,0.9999993039536218 +0.08946985005961923,0.045248597852588154,9.208916696906181e-06,0.0005642771156609115,0.0,8.940695822239011e-08,0.9999959660938481 +0.2954143881675466,0.15222123262659856,0.0,0.9934642513539532,0.0,1.4901159703731685e-06,0.9731881837404467 +0.2332540154360507,0.33757841581286124,0.0,0.9999993039536218,0.0,0.0001549720609188095,0.03261580737112495 +0.14335581659677085,0.2933582066987292,0.0,0.9999999000000099,0.0,0.0048559005172938595,0.0003086030174642832 +0.13498011230863502,0.30253195757453866,0.0,0.9999999000000099,0.0,0.004388153114193722,8.365511057674967e-05 +0.13592511414918731,0.32124567026359496,0.0,0.9999999000000099,0.0,0.0032366212946087444,4.5865769568086125e-05 +0.30360829828912506,0.03918588160797506,2.9504296213388737e-06,8.940695822239011e-08,0.999903578903685,2.9027459102869323e-05,8.940695822239011e-08 +0.10067930817187175,0.015111327168738094,2.5153157579899085e-05,8.940695822239011e-08,0.9999946547917942,5.960463881492674e-08,4.768371105194139e-07 +0.13188859819819784,0.027494788165152766,1.7464159172773534e-05,2.3841855525970696e-07,0.9999997211860935,6.258487075567308e-07,3.278255134820971e-07 +0.12569528817610018,0.03217375277921973,2.1010635182261677e-05,1.1920927762985348e-07,0.9999997807907323,1.0132788598537545e-06,5.364417493343406e-07 +0.05247443914196167,0.033791780466015414,4.500150230526969e-06,2.8312203437090202e-06,0.9999900652346054,5.0067896604538464e-06,1.9073484420776555e-05 +0.032526433466518144,0.05344325303116236,4.172324717044872e-07,5.9723848092556595e-05,0.9968458013278405,0.00011670588279962656,0.002587765196469452 +0.05473813414347011,0.05902093647899877,1.1920927762985348e-07,4.929303629994441e-05,0.6321575605520967,0.0003483295092344319,0.08631449074675526 +0.09665215015011162,0.05012965201473147,1.7881391644478022e-07,1.1980532401800274e-05,0.009380190626540873,8.43703662425288e-05,0.8194669261671684 +0.20476585625754284,0.04453492163849222,2.354383233189606e-06,1.3113020539283883e-06,3.0845400586724586e-05,4.887580382823993e-06,0.9993652894105474 +0.23833021520581427,0.03563758730278126,1.5258787536621245e-05,6.258487075567308e-07,1.847743803262729e-06,6.258487075567308e-07,0.999954779288427 +0.2259607911016359,0.032116383308633235,3.0279156517982785e-05,6.258487075567308e-07,5.066394299268773e-07,3.5762783288956044e-07,0.9999793363996188 +0.2223624288943722,0.032327413553424375,4.005431728363077e-05,6.258487075567308e-07,2.9802319407463367e-07,3.5762783288956044e-07,0.9999845220031957 +0.2331560552023664,0.17058303949296122,7.593630985021666e-05,1.1920927762985348e-07,0.00010681151275634872,0.9999993039536218,1.7881391644478022e-07 +0.013956904410737993,0.16635325548184468,0.00028991696319580364,1.7881391644478022e-07,4.6312804359198076e-05,0.9984548285526494,3.5762783288956044e-07 +0.12656462192011325,0.06640937923247908,7.188319441080164e-05,0.0,0.000719636606732018,0.99984397426487,8.940695822239011e-08 +0.15351665019353336,0.11795532701379849,3.6209818080067994e-05,0.0,3.448128355443512e-05,0.9999889923511068,5.960463881492674e-08 +0.14173981546768738,0.11310207841843813,4.410743272304579e-05,0.0,2.5898215565085667e-05,0.9999892903743008,5.960463881492674e-08 +0.14278927444820425,0.11596867440145252,4.2140479642153204e-05,0.0,2.035498415529748e-05,0.9999907208856325,5.960463881492674e-08 +0.15097820758194413,0.1177128851212161,3.647803895473517e-05,0.0,1.6659496548772024e-05,0.9999926878387133,2.980231940746337e-08 +0.15763106941524105,0.1192180812154713,3.269314438998732e-05,0.0,1.4424322593212271e-05,0.999994058745406,0.0 +0.1686539649893543,0.12197652457055926,2.723931993842152e-05,0.0,1.177191616594803e-05,0.9999958468845705,1.4901159703731684e-07 +0.18699893354595248,0.12745976445876522,2.0116565600037775e-05,0.0,8.761881905794231e-06,0.9999973966051797,5.960463881492674e-08 +0.20860201119512814,0.1355776190525595,1.4513729551434662e-05,0.0,6.526707950234478e-06,0.999998588697956,1.1920927762985348e-07 +0.22509288786909737,0.1438631713144006,1.1742113846540568e-05,0.0,5.334615173935943e-06,0.9999991847443441,2.682208746671703e-07 +0.36912578342816627,0.07663801311134281,1.5795229285955586e-06,8.940695822239011e-08,0.9980774119796733,0.0006611942583739823,0.0 +0.3139593005050355,0.35286742442764435,5.6624406874180405e-06,1.1920927762985348e-07,0.0010950862266272416,0.9999999000000099,8.642672628164378e-07 +0.41646724937621815,0.20281586047514324,9.447335252165889e-06,5.960463881492674e-08,2.74181338548663e-06,0.9999971581866245,2.682208746671703e-07 +0.5281027555247023,0.39115700118996294,0.9999914361412983,1.3113020539283883e-06,1.4901159703731684e-07,1.5169380578398855e-05,0.0 +0.40897399185394545,0.41103172295207785,0.9999999000000099,2.682208746671703e-07,1.5497206091880952e-06,0.0,0.0 +0.43627545235734677,0.44842284910152846,0.9999999000000099,1.7881391644478022e-07,2.6226041078567766e-06,0.0,0.0 +0.47409170864049466,0.43367299430096884,0.9999999000000099,1.1920927762985348e-07,1.2516974151134616e-06,0.0,0.0 +0.5049750208645576,0.42315131418611707,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 +0.5351938009040473,0.41480657451202413,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.547998726345259,0.40605747692784416,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5491593479882774,0.39441385858457734,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5500217675934967,0.38126468651918677,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.178149998180642,0.5524811743743899,1.2218950957059981e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 +0.15766158699336477,0.4113773404847488,0.0,0.9999999000000099,0.0,8.761881905794231e-06,0.0 +0.18093869089331036,0.48719128957989055,0.0,0.9999999000000099,0.0,8.910893502831548e-06,0.0 +0.17721486090879962,0.5648369192109888,0.0,0.9999999000000099,0.0,1.1116265138983837e-05,0.0 +0.17725789546232568,0.576964139839558,0.0,0.9999999000000099,0.0,1.0818241944909203e-05,2.980231940746337e-08 +0.17965617775173137,0.5794992445907108,2.980231940746337e-08,0.9999999000000099,0.0,1.0669230347871886e-05,5.960463881492674e-08 +0.18135207890713295,0.5799643396338136,2.980231940746337e-08,0.9999999000000099,0.0,1.0848044264316667e-05,1.1920927762985348e-07 +0.18256425856787986,0.5805535911519621,0.0,0.9999999000000099,0.0,1.1116265138983837e-05,0.0 +0.18361717461779356,0.5801793931921263,5.960463881492674e-08,0.9999999000000099,0.0,1.1682509207725642e-05,8.940695822239011e-08 +0.1844942271633047,0.5801554917295755,0.0,0.9999999000000099,0.0,1.2338160234689835e-05,0.0 +0.1853037178439658,0.5800011753042784,5.960463881492674e-08,0.9999999000000099,0.0,1.3142822858691347e-05,1.1920927762985348e-07 +0.18607604502861091,0.5796789525946778,5.960463881492674e-08,0.9999999000000099,0.0,1.4096497079730174e-05,2.980231940746337e-08 +0.09482771157825723,0.02093791961311391,8.642672628164378e-07,1.4305113315582417e-06,0.9957977729635576,4.0888782227039746e-05,0.0004227459007948679 +0.03603747486918953,0.03363123535534039,1.7881391644478022e-06,9.208916696906181e-06,0.9939415653015832,1.3321636775136126e-05,0.002487122763830448 +0.05418470501675352,0.05660331248267813,1.1920927762985348e-07,3.3974644124508245e-05,0.9126644413949938,0.000311613051724437,0.043062533602300716 +0.06208559870462827,0.05348205565490449,1.4901159703731684e-07,2.8431412714720055e-05,0.2636598681004133,0.0003127455398619206,0.19320342992892459 +0.14346680044533805,0.04821303485998459,8.344649434089744e-07,3.397464412450824e-06,0.0007199644322455,2.226233259737514e-05,0.9911670885740259 +0.22919195889477603,0.03663727640478293,1.4752148106694368e-05,7.152556657791209e-07,3.0100342601538e-06,7.152556657791209e-07,0.9999476267317693 +0.20957037805643142,0.030389934773009677,3.8892026826739695e-05,8.642672628164378e-07,3.278255134820971e-07,2.086162358522436e-07,0.9999851180495838 +0.20678880809881345,0.03133341669499778,5.0038094285131e-05,8.344649434089744e-07,1.4901159703731684e-07,2.9802319407463367e-07,0.9999886943279127 +0.2180428802876785,0.03404763340366997,5.099176850616983e-05,5.960463881492673e-07,1.4901159703731684e-07,5.960463881492673e-07,0.9999876214444141 +0.23082643746373913,0.03611981868125398,4.276632834970993e-05,4.172324717044872e-07,2.086162358522436e-07,9.536742210388278e-07,0.9999860717238048 +0.2423236369986329,0.03711456059774014,3.4093853402138094e-05,3.5762783288956044e-07,4.172324717044872e-07,1.5795229285955586e-06,0.999984760421751 +0.24782297014163945,0.036585837596350576,3.129243537783654e-05,2.9802319407463367e-07,5.66244068741804e-07,1.7285345256328755e-06,0.9999851180495838 +0.12750458716818222,0.46389988056822334,0.7612339093006507,2.086162358522436e-07,0.002523720012062813,0.8157171387346825,0.0 +0.17957457899303725,0.1396562754868739,0.02945819202526539,0.0,0.00010281800195574862,0.9948302108616749,0.0 +0.3048629164569503,0.1619684397896939,2.405047176182294e-05,0.0,7.808207684755402e-06,0.9999996615814547,7.152556657791209e-07 +0.327821850763098,0.19584494825824303,7.301568254828525e-06,0.0,3.0994412183761904e-06,0.9999999000000099,5.632638368010577e-06 +0.331791937337488,0.19470420476440456,5.871056923270284e-06,0.0,2.2053716361522894e-06,0.9999997807907323,6.7055218666792585e-06 +0.33467912672564365,0.18651753660822887,5.155801257491163e-06,0.0,1.5497206091880952e-06,0.9999999000000099,5.930661562085211e-06 +0.3371665477613072,0.17917737361700836,4.6193595081568225e-06,0.0,1.2516974151134616e-06,0.9999997807907323,5.155801257491163e-06 +0.3398882150509284,0.17434555289144107,4.321336314082188e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.678964146971749e-06 +0.341680973754086,0.17161080238264728,4.172324717044872e-06,0.0,1.0132788598537545e-06,0.9999999000000099,4.440545591712042e-06 +0.34535366295338155,0.1688611209103398,4.053115439415018e-06,0.0,1.0132788598537545e-06,0.9999996615814547,4.291533994674725e-06 +0.34647196529861113,0.16770538684834288,3.933906161785165e-06,0.0,9.536742210388278e-07,0.9999997807907323,4.172324717044872e-06 +0.3449637293672771,0.16801631447776047,3.993510800600092e-06,0.0,9.834765404462913e-07,0.9999998403953712,4.112720078229945e-06 +0.7047569751447678,0.41436943404731624,0.9999997807907323,3.8146968841553113e-06,2.9802319407463367e-07,6.258487075567308e-07,2.9504296213388735e-05 +0.5770453214406445,0.4391743838035058,0.9999999000000099,0.0,5.66244068741804e-07,0.0,1.1920927762985348e-07 +0.5902238487952928,0.314694166129585,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 +0.555450201011546,0.3404790758503589,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.582670509791089,0.334249287786469,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5823609232661384,0.3374053239244631,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.5812307595965991,0.3394343256369148,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5852697491403466,0.3391473888770152,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5850951671358067,0.342650115431286,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5852600931878934,0.34344866865952756,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5828932523486053,0.3462028800848372,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5807082652805196,0.3476206361652218,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5058019161014924,0.354716956554708,0.9999996615814547,7.450579851865842e-07,1.1920927762985348e-07,0.0,3.1590458571911173e-06 +0.5516133904228682,0.5520383118637846,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5894885062927293,0.5919586419045563,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.6062744855629693,0.7109869121287729,0.9999999000000099,1.4901159703731684e-07,5.960463881492674e-08,0.0,0.0 +0.6108765005812419,0.7541344760557106,0.9999999000000099,1.4901159703731684e-07,1.4901159703731684e-07,0.0,0.0 +0.44927573202180177,0.486204385674191,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.17146313189750215,0.09077933429117231,0.8576907253881539,0.0,2.324580913782143e-06,0.6928050421277294,0.0 +0.206661224356677,0.10994207857156713,3.85642013132576e-05,0.0,1.2099741679430129e-05,0.9999965025355975,1.4901159703731684e-07 +0.20992881058777338,0.13651740548657215,2.279877434670948e-05,0.0,6.377696353197161e-06,0.9999990655350666,2.9802319407463367e-07 +0.1950652301230721,0.1276786029120206,2.6047227162122984e-05,0.0,5.155801257491163e-06,0.9999982310701231,1.7881391644478022e-07 +0.13854286074064692,0.11235848067267007,7.355212429761959e-05,0.0,1.0639428028464424e-05,0.9999914361412983,0.0 +0.037533581255312275,0.12563094494575747,0.0002551972610861088,8.940695822239011e-08,1.0758637306094277e-05,0.9999156190407257,8.940695822239011e-08 +0.17698213457328374,0.5408892630604569,1.1026858180761447e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 +0.1641105711392159,0.4307878612734325,2.980231940746337e-08,0.9999999000000099,0.0,1.0162590917945008e-05,0.0 +0.17998313903063323,0.48951715222559516,0.0,0.9999999000000099,0.0,9.268521335721107e-06,2.980231940746337e-08 +0.177279204122832,0.5510600208292536,0.0,0.9999999000000099,0.0,1.0788439625501739e-05,1.1920927762985348e-07 +0.17738556861142926,0.5616660117141258,0.0,0.9999999000000099,0.0,1.0669230347871886e-05,2.980231940746337e-08 +0.17913788556310842,0.5644619463907711,5.960463881492674e-08,0.9999999000000099,0.0,1.0490416431427107e-05,1.4901159703731684e-07 +0.18056842683998095,0.5653609632477643,2.980231940746337e-08,0.9999999000000099,0.0,1.0669230347871886e-05,0.0 +0.18163424729548797,0.5655927657112562,2.980231940746337e-08,0.9999999000000099,0.0,1.0937451222539056e-05,0.0 +0.18254891037185084,0.5656794308647447,0.0,0.9999999000000099,0.0,1.1384486013651007e-05,2.980231940746337e-08 +0.1833549141807927,0.5656159519180698,0.0,0.9999999000000099,0.0,1.20401370406152e-05,8.940695822239011e-08 +0.18410187958908697,0.5653424262032424,2.980231940746337e-08,0.9999999000000099,0.0,1.272559038698686e-05,0.0 +0.184804409734703,0.5649504660592665,2.980231940746337e-08,0.9999999000000099,0.0,1.3589857649803297e-05,8.940695822239011e-08 +0.3669686317291894,0.08810546992700614,1.4603136509657052e-06,2.086162358522436e-07,0.9950912791796843,0.0016730128045767713,0.0 +0.12763532995649163,0.07660093902229888,7.483362403214052e-05,0.0,0.24678585445654638,0.9968136744275192,0.0 +0.17503252624740623,0.150766640875749,1.433491563498988e-05,0.0,0.00026610490998924045,0.9999975158144573,0.0 +0.23378214239106118,0.17712938782519902,4.261731675267262e-06,0.0,1.803040324151534e-05,0.999999542372177,2.3841855525970696e-07 +0.27500957249456337,0.22202146049512422,3.2186504960060438e-06,0.0,1.2069939360022665e-05,0.9999999000000099,1.1622904568910714e-06 +0.3006642460698561,0.2647744416737165,3.5166736900806776e-06,0.0,1.3321636775136126e-05,0.9999999000000099,4.678964146971749e-06 +0.32837289570402367,0.260846197560467,3.3378597736358976e-06,0.0,9.924172362685302e-06,0.9999999000000099,6.079673159122528e-06 +0.3841363191445552,0.19292846318756018,2.65240642726424e-06,0.0,2.8908249825239467e-06,0.9999997807907323,1.6689298868179488e-06 +0.4984640478881427,0.2551124095479906,9.271501567661854e-05,5.960463881492674e-08,1.4901159703731685e-06,0.9999383880127529,8.940695822239011e-08 +0.5338206887024135,0.44616234294880885,0.9999998403953712,4.172324717044872e-07,4.768371105194139e-07,2.3841855525970696e-07,0.0 +0.44329753516268955,0.43407851450162876,0.9999999000000099,3.5762783288956044e-07,3.397464412450824e-06,0.0,0.0 +0.44519370792452817,0.46409174791972246,0.9999999000000099,1.1920927762985348e-07,4.529952549934432e-06,0.0,0.0 +0.15059125422807831,0.10257208345564162,8.755921441912738e-05,0.0,0.05968659519329726,0.96904864157475,0.0 +0.06676366924963109,0.08463916181068686,1.9073484420776555e-05,8.940695822239011e-08,0.9956906038229684,0.00010466574575901135,3.5762783288956044e-07 +0.1803475618287749,0.01712539791767605,3.212690032124551e-05,0.0,0.9999960853031258,1.1920927762985348e-07,1.7881391644478022e-07 +0.21809002756169388,0.03549453615534482,8.821486544609157e-05,0.0,0.9999997807907323,7.152556657791209e-07,8.940695822239011e-08 +0.20206731557009353,0.030633121723651627,0.00014376638882160328,0.0,0.9999997807907323,4.172324717044872e-07,8.940695822239011e-08 +0.16701370476984825,0.02529159187837488,9.873508419692615e-05,0.0,0.9999997211860935,2.9802319407463367e-07,1.7881391644478022e-07 +0.12178742885085304,0.023187398906551963,4.607438580393837e-05,8.940695822239011e-08,0.9999996615814547,3.5762783288956044e-07,5.066394299268773e-07 +0.046874552963223216,0.0321667790357822,6.109475478529991e-06,2.8312203437090202e-06,0.9999827338640312,5.871056923270284e-06,4.1604037892818864e-05 +0.03320521116119218,0.05382460354837001,5.66244068741804e-07,5.2809709990025094e-05,0.9932291706584672,0.0001502632944524303,0.006109058246058286 +0.06262707710006789,0.056314200153244606,1.7881391644478022e-07,2.9742714768648444e-05,0.3169531505251439,0.0003062188319116861,0.26840994058149126 +0.13519865273869494,0.046225905410480495,8.344649434089744e-07,3.844499203562775e-06,0.0007248818149477315,2.601742484271552e-05,0.9879603590057828 +0.2333788573645276,0.037435054772642536,1.2606381109357005e-05,6.258487075567308e-07,3.2782551348209707e-06,1.1026858180761447e-06,0.9999330235952596 +0.18219274281701026,0.6081612109096554,2.354383233189606e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.16794681548376836,0.4423452316957241,2.980231940746337e-08,0.9999999000000099,0.0,1.4513729551434662e-05,5.960463881492674e-08 +0.18271049856383023,0.523775637060122,0.0,0.9999999000000099,0.0,1.2814997345209249e-05,2.980231940746337e-08 +0.1758367121146825,0.5892357825223932,5.960463881492674e-08,0.9999999000000099,0.0,1.1950730082392812e-05,0.0 +0.1782613992617226,0.5992655753063202,2.980231940746337e-08,0.9999999000000099,0.0,1.123547441661369e-05,0.0 +0.18112254142011242,0.6011656521721448,2.980231940746337e-08,0.9999999000000099,0.0,1.1026858180761447e-05,0.0 +0.18314257263378916,0.6004328726694016,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,1.1920927762985348e-07 +0.18451771139334525,0.5998147725031866,0.0,0.9999999000000099,0.0,1.150369529128086e-05,0.0 +0.1855715811175753,0.6000111102030431,5.960463881492674e-08,0.9999999000000099,0.0,1.2129543998837591e-05,2.980231940746337e-08 +0.1865460872572902,0.5996913908885227,2.980231940746337e-08,0.9999999000000099,0.0,1.2934206622839103e-05,2.980231940746337e-08 +0.18745049833475214,0.5989313124584771,8.940695822239011e-08,0.9999999000000099,0.0,1.3947485482692857e-05,0.0 +0.18826749920065458,0.5982649921346471,5.960463881492674e-08,0.9999999000000099,0.0,1.5020368981361538e-05,2.980231940746337e-08 +0.13575428723726812,0.022815793748763424,1.370906692743315e-06,1.1920927762985347e-06,0.858683619461533,5.459784915447289e-05,0.07352399090809895 +0.1532660424645856,0.05159631370614598,2.65240642726424e-06,1.1920927762985347e-06,0.035670068273279426,2.6762482827902106e-05,0.985176762768487 +0.20192793010829205,0.04883781074641325,4.768371105194139e-07,9.536742210388278e-07,0.0019802151130289035,8.41319476872691e-05,0.9968784050652723 +0.21500787138048605,0.0477463304914732,8.046626240015109e-07,7.748603045940476e-07,0.0003052651576906473,3.632902735769785e-05,0.9989846541870753 +0.25384977458856395,0.04397237300119841,3.069638898968727e-06,4.768371105194139e-07,3.576278328895604e-05,9.298323655128571e-06,0.9998663856090645 +0.26151019333710235,0.0388812422685802,8.22544015645989e-06,3.278255134820971e-07,8.165835517644963e-06,3.1590458571911173e-06,0.9999572230786185 +0.248982757319631,0.03520944713943294,1.776218236684817e-05,3.5762783288956044e-07,2.4735925108194595e-06,1.2218950957059981e-06,0.9999776078650932 +0.23660203813526814,0.03343701362037304,2.9236075338721565e-05,3.874301522970238e-07,9.238719016313645e-07,7.152556657791209e-07,0.9999849988403062 +0.22899514435773585,0.03293955325516281,3.94582708954815e-05,4.768371105194139e-07,4.4703479111195056e-07,6.854533463716575e-07,0.9999880982815246 +0.22919350861554014,0.033634006971321975,4.33623747378592e-05,3.874301522970238e-07,3.5762783288956044e-07,7.748603045940476e-07,0.9999886943279127 +0.22936883567813968,0.03383812307732035,4.667043219208764e-05,4.172324717044872e-07,3.278255134820971e-07,8.344649434089744e-07,0.9999891711650233 +0.23217874764434718,0.034259110683296845,4.601478116512344e-05,3.278255134820971e-07,3.5762783288956044e-07,8.940695822239011e-07,0.9999890519557456 +0.6373463868830938,0.3969355820929804,0.9999996615814547,2.324580913782143e-06,1.1920927762985348e-07,2.682208746671703e-07,1.5527008411288415e-05 +0.5514809489021827,0.4518413542927461,0.9999999000000099,0.0,3.278255134820971e-07,0.0,2.980231940746337e-08 +0.5774111151456158,0.3160485326702619,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5510131120453601,0.3388211428538929,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5793401598690467,0.33364510530480673,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5767343044042194,0.341363280953128,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5829478502032174,0.33827924722601027,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5855602621789698,0.3424698113808713,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5853796005006631,0.34534317249106655,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.588635504221384,0.34621763223441654,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5900231599563424,0.3486818670629436,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5945671200506061,0.3494172691700564,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.0941376686057211,0.10137212274722893,1.5497206091880952e-06,0.9999977542330126,0.0,0.0,2.324580913782143e-06 +0.10465961694284034,0.47609901420070166,8.940695822239011e-08,0.9999999000000099,0.0,6.258487075567308e-07,0.0 +0.1758270561622293,0.38692933314373557,0.0,0.9999999000000099,0.0,1.671910118758695e-05,2.980231940746337e-08 +0.17354941367384397,0.4881722032187912,0.0,0.9999999000000099,0.0,2.0384786474704945e-05,2.980231940746337e-08 +0.18122401832783833,0.5120397805290811,0.0,0.9999999000000099,0.0,4.0978189185262135e-05,5.960463881492674e-08 +0.17662617563469984,0.5229487418232946,0.0,0.9999999000000099,0.0,3.260373743176492e-05,8.940695822239011e-08 +0.17836984991288693,0.5267192720464954,0.0,0.9999999000000099,0.0,2.9474493893981274e-05,8.940695822239011e-08 +0.17947232722492928,0.5290668605852169,0.0,0.9999999000000099,0.0,2.6911494424939423e-05,8.940695822239011e-08 +0.1807138025685821,0.5306965111777419,0.0,0.9999999000000099,0.0,2.5302169176936402e-05,2.980231940746337e-08 +0.18186995386324248,0.5320515631718336,0.0,0.9999999000000099,0.0,2.4378297275305036e-05,0.0 +0.18296998738484915,0.5331404208224039,0.0,0.9999999000000099,0.0,2.3901460164785624e-05,8.940695822239011e-08 +0.18401378392411258,0.5340155362168464,0.0,0.9999999000000099,0.0,2.381205320656323e-05,2.980231940746337e-08 +0.11402010917191442,0.10459363458749761,0.0002829432204544572,0.0,0.002808749394875793,0.999494273848943,0.0 +0.3455273210859275,0.3073641657302969,7.301568254828525e-06,2.980231940746337e-08,4.443525823652788e-05,0.9999999000000099,8.31484711468228e-06 +0.385982304795495,0.25767377014516246,1.71661359786989e-05,0.0,4.559754869341896e-06,0.999999542372177,7.748603045940476e-07 +0.49712947008935454,0.30240058893747623,0.12005369654794455,1.1920927762985348e-07,2.086162358522436e-07,0.7432610245355918,0.0 +0.612539291356472,0.41479599468757833,0.9999999000000099,1.4901159703731684e-07,8.940695822239011e-08,0.0,0.0 +0.5362061261908706,0.4253163038956005,0.9999999000000099,0.0,3.278255134820971e-07,0.0,0.0 +0.5659934282068492,0.3973917662416907,0.9999999000000099,0.0,9.238719016313645e-07,0.0,0.0 +0.5601038336521919,0.3956154882230435,0.9999999000000099,0.0,6.258487075567308e-07,0.0,8.940695822239011e-08 +0.5614007115131611,0.3920938967987045,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 +0.5597599148518521,0.3938018678944508,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5552877783545397,0.39240103953317945,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5575836300619031,0.38376516097173097,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.43777379391764853,0.2545709013502989,6.911157870590756e-05,2.086162358522436e-07,3.0487772753835027e-05,0.9999999000000099,5.57303372919565e-06 +0.18548449873156206,0.16272884604528573,3.5673376330733654e-05,0.0,1.981854240596314e-05,0.9999994231628994,2.682208746671703e-07 +0.23840472101178042,0.15425238010626174,1.0758637306094277e-05,0.0,4.768371105194139e-06,0.999999542372177,5.66244068741804e-07 +0.2451580166715197,0.1564984023303034,1.0043381640315155e-05,0.0,4.142522397637409e-06,0.9999996615814547,6.556510269641942e-07 +0.24615600704127513,0.15860307213928446,1.0311602514982325e-05,0.0,4.2319293558597985e-06,0.9999996019768158,7.152556657791209e-07 +0.2484774589435685,0.16146227714634795,1.034140483438979e-05,0.0,4.261731675267262e-06,0.9999996615814547,9.238719016313645e-07 +0.24913927911680467,0.16280260679318265,1.0490416431427107e-05,0.0,4.291533994674725e-06,0.9999997211860935,9.238719016313645e-07 +0.24115708469345964,0.15567168590741032,1.1563299930095787e-05,0.0,4.172324717044872e-06,0.999999542372177,7.152556657791209e-07 +0.22866407035834463,0.14567479488739363,1.3470648372173444e-05,0.0,4.142522397637409e-06,0.9999993039536218,4.768371105194139e-07 +0.21018838881575946,0.13535204527444566,1.7553566130995923e-05,0.0,4.678964146971749e-06,0.9999987079072337,2.9802319407463367e-07 +0.1851658821029284,0.12544146178004895,2.6762482827902106e-05,0.0,6.1690801173449175e-06,0.9999975158144573,1.7881391644478022e-07 +0.15677362679786017,0.11668074129013979,4.610418812334583e-05,0.0,9.506939890980815e-06,0.9999945355825166,8.940695822239011e-08 +0.08856508135428864,0.3079096674391879,0.9999725414707938,3.874301522970238e-07,0.0001451372955143466,9.268521335721107e-06,0.0 +0.6863077878667841,0.5410124658611866,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5602947473293995,0.7645087240817358,0.9999999000000099,1.4901159703731684e-07,5.960463881492674e-08,0.0,0.0 +0.5434399246944468,0.6051813362992647,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.46601653097130386,0.2064712047223353,0.9999497724987666,5.960463881492674e-08,0.0,0.0019003448970169017,5.960463881492674e-08 +0.4644672274397213,0.1249950527930801,6.0170882883668546e-05,5.960463881492674e-08,3.874301522970238e-07,0.999996979372708,5.066394299268773e-07 +0.334505796418644,0.1633710562903082,6.079673159122528e-06,0.0,1.8179414838552655e-06,0.9999997807907323,2.712011066079167e-06 +0.31627917288424245,0.19022390243133994,5.871056923270284e-06,0.0,1.9073484420776557e-06,0.9999997807907323,5.900859242677747e-06 +0.30838292835866,0.1797111034085582,5.602836048603113e-06,0.0,1.4305113315582417e-06,0.9999997807907323,4.321336314082188e-06 +0.2956192791339535,0.17035439607564196,6.0200685203076e-06,0.0,1.4007090121507783e-06,0.9999997807907323,3.0100342601538e-06 +0.2784488797072506,0.1635452210623121,7.659196087718087e-06,0.0,1.7583368450403388e-06,0.9999997807907323,1.996755400300046e-06 +0.261662006367339,0.1586502492156161,9.953974682092765e-06,0.0,2.5331971496343865e-06,0.9999996615814547,1.3113020539283883e-06 +0.15502533315970318,0.027641177172696058,4.339217705726667e-05,0.7074935324801694,0.0,0.0,0.8728468737367359 +0.17629164456591181,0.1477668881163292,0.008607625100541201,2.0563600391149723e-06,0.0,8.493661031127061e-06,0.999860425145183 +0.27392953633127803,0.1501715779047358,1.7881391644478022e-07,8.165835517644963e-06,0.0,0.019940940531769594,0.9990053369967441 +0.17735144495229677,0.06696847080037652,0.00024902818096876394,3.874301522970238e-07,0.0,6.467103311419552e-06,0.9999798728413681 +0.233582705249651,0.0417907833981479,3.865360827147999e-05,4.768371105194139e-07,2.086162358522436e-07,2.5331971496343865e-06,0.99998279346867 +0.24043351410823877,0.03742119669273463,4.598497884571598e-05,2.9802319407463367e-07,3.278255134820971e-07,1.8179414838552655e-06,0.9999869657933871 +0.25082623957549033,0.036519229405825485,3.2484528154135074e-05,2.682208746671703e-07,6.258487075567308e-07,2.1159646779298993e-06,0.9999861909330825 +0.2544066905869998,0.03608036040641943,2.9772517088055905e-05,2.086162358522436e-07,8.046626240015109e-07,2.175569316744826e-06,0.9999861909330825 +0.2562805712116933,0.03589639067035169,2.8282401117682738e-05,2.086162358522436e-07,9.238719016313645e-07,2.175569316744826e-06,0.9999861909330825 +0.25658553837667397,0.03573924302442828,2.8014180243015567e-05,2.3841855525970696e-07,9.834765404462913e-07,2.2053716361522894e-06,0.9999861909330825 +0.2540223002328592,0.035175144666370575,3.030895883739025e-05,2.3841855525970696e-07,8.642672628164378e-07,1.9073484420776557e-06,0.9999869061887483 +0.2507212459937228,0.03468167781235962,3.308057454228434e-05,2.3841855525970696e-07,7.152556657791209e-07,1.5795229285955586e-06,0.9999873830258588 +0.3369945883611374,0.03299626707465689,1.2844799664616713e-05,3.278255134820971e-07,0.0027446744081497465,2.8342005756497666e-05,0.9983255460910598 +0.3179361224042849,0.045639872543149204,1.519918289780632e-06,1.1920927762985348e-07,0.0016677079917222428,6.633996300101346e-05,0.9996394111444572 +0.16223064064307793,0.040286034338728446,2.086162358522436e-07,8.344649434089744e-07,0.019763527324336963,0.0002776086052805213,0.9737479905081965 +0.070224702355338,0.04140123724228504,1.4901159703731684e-07,6.288289394974771e-06,0.24664468086951322,0.0003453492772936855,0.256853405777901 +0.050102204082321744,0.04425069688992944,2.086162358522436e-07,1.5676020008325733e-05,0.405225027808262,0.00025209781986773263,0.09025855949945838 +0.057905763385282305,0.046627700320842604,1.7881391644478022e-07,1.4990566661954075e-05,0.18430895750408655,0.00027716157048940935,0.24160573450641873 +0.06786346435265868,0.0460932254712332,1.7881391644478022e-07,1.1801718485355495e-05,0.05489590215086693,0.0002664327355027225,0.45514963486108934 +0.0793218612638053,0.04531756042658147,2.086162358522436e-07,8.40425407290467e-06,0.015101610104066283,0.0002008676328063031,0.7066767701144885 +0.10235795378261156,0.04467588662336188,3.5762783288956044e-07,4.589557188749359e-06,0.0027226802964270386,0.00011315940679013842,0.9339767356542978 +0.13734921812442438,0.044233143322046094,6.854533463716575e-07,2.264976274967216e-06,0.00048699970143735894,6.237625451982083e-05,0.9897965395091155 +0.17800858616091825,0.04313161968446311,1.4007090121507783e-06,1.0132788598537545e-06,0.00011181830241680256,3.087520290613205e-05,0.9983402684368471 +0.21382975577422683,0.04193431138274247,2.1457669973373625e-06,5.066394299268773e-07,4.643201363682793e-05,1.9311902976036264e-05,0.9995259239121537 +0.35285985468357,0.2762374281410224,0.9999998403953712,5.960463881492674e-08,8.940695822239011e-08,0.0,3.5762783288956044e-07 +0.708193898171664,0.4433244466022489,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.578341841673745,0.3817870616259088,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,0.0 +0.6004846095790171,0.3056907057238696,0.9999999000000099,0.0,4.172324717044872e-07,0.0,0.0 +0.5984557866802364,0.3419452309022929,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.1920927762985348e-07 +0.5897213220352123,0.3417226969610621,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5910774469130858,0.3444719910031786,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5898447036498923,0.34530854219245793,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5926091670744604,0.34458392852604763,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 +0.5938805937521117,0.345032483280228,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5943833589307712,0.3460816740397072,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5950004458181053,0.3473128973842992,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.18333372472957593,0.6318634151330442,3.039836579561264e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 +0.1773194968626985,0.4792903660907192,0.0,0.9999999000000099,0.0,1.946091457307358e-05,5.960463881492674e-08 +0.18155521153651907,0.5686479209879851,0.0,0.9999999000000099,0.0,1.3858078524470467e-05,1.1920927762985348e-07 +0.1761798560546402,0.6254060267331185,8.940695822239011e-08,0.9999999000000099,0.0,1.1473892971873398e-05,2.980231940746337e-08 +0.1807415783330463,0.633083939443901,0.0,0.9999999000000099,0.0,1.0788439625501739e-05,0.0 +0.18441429733466422,0.6343778370724635,0.0,0.9999999000000099,0.0,1.069903266727935e-05,0.0 +0.1868911981505254,0.6344410776005593,5.960463881492674e-08,0.9999999000000099,0.0,1.087784658372413e-05,1.1920927762985348e-07 +0.18863928317242568,0.6341705321179703,0.0,0.9999999000000099,0.0,1.1533497610688325e-05,0.0 +0.19003713130164027,0.6330140828002361,0.0,0.9999999000000099,0.0,1.2367962554097299e-05,1.1920927762985348e-07 +0.19111400841875265,0.6322691439499608,0.0,0.9999999000000099,0.0,1.344084605276598e-05,2.980231940746337e-08 +0.19211322068372594,0.6308995484225465,2.980231940746337e-08,0.9999999000000099,0.0,1.4752148106694368e-05,8.940695822239011e-08 +0.19302523135339641,0.6290391086454907,8.940695822239011e-08,0.9999999000000099,0.0,1.6242264077067537e-05,1.1920927762985348e-07 +0.14624929427495,0.45395895830964117,0.4470079392221644,1.4901159703731684e-07,0.0017921922798872173,0.9706621391474701,0.0 +0.11974793672065796,0.10468691585655512,0.0006306170786619249,0.0,0.0003737508876889981,0.9999849988403062,0.0 +0.27608859537888764,0.24628192182138378,1.4781950426101832e-05,0.0,1.4364717954397344e-05,0.9999999000000099,9.119509738683792e-06 +0.29069969056833084,0.22201949354184697,9.119509738683792e-06,0.0,4.559754869341896e-06,0.9999998403953712,8.374451753497206e-06 +0.29834038017944936,0.20931971069566346,7.539986810088233e-06,0.0,3.2782551348209707e-06,0.9999998403953712,6.973742741346429e-06 +0.2973579168196573,0.1991729139940623,7.122754338383746e-06,0.0,2.74181338548663e-06,0.9999997807907323,5.543231409788187e-06 +0.2932863831398637,0.19145825501978214,7.122754338383746e-06,0.0,2.5331971496343865e-06,0.9999999000000099,4.410743272304579e-06 +0.2871683239817919,0.18625918027549418,7.599591448903159e-06,0.0,2.65240642726424e-06,0.9999999000000099,3.695487606525458e-06 +0.27917402981555794,0.18198820945484492,8.40425407290467e-06,0.0,2.8312203437090202e-06,0.9999998403953712,2.980231940746337e-06 +0.2716295719034253,0.17912775275024134,9.477137571573351e-06,0.0,3.2484528154135075e-06,0.9999998403953712,2.5331971496343865e-06 +0.2674655914195889,0.17946609851625092,1.0371207153797252e-05,0.0,3.635882967710531e-06,0.9999998403953712,2.3841855525970694e-06 +0.2634768783937073,0.17827528712080967,1.096725354194652e-05,0.0,3.8146968841553113e-06,0.9999999000000099,2.264976274967216e-06 +0.1835406720562275,0.6368787287575212,3.2186504960060438e-06,0.9999998403953712,5.960463881492674e-08,0.0,0.0 +0.17831230162835868,0.4838718175059503,2.980231940746337e-08,0.9999999000000099,0.0,2.0325181835890017e-05,1.1920927762985348e-07 +0.18174996971331459,0.5656617878898942,0.0,0.9999999000000099,0.0,1.4275310996174954e-05,0.0 +0.17665612696869826,0.6178444622889177,5.960463881492674e-08,0.9999999000000099,0.0,1.1861323124170421e-05,8.940695822239011e-08 +0.18052810429779206,0.6256697176815597,0.0,0.9999999000000099,0.0,1.1056660500168911e-05,0.0 +0.18383464216424755,0.6272473334192046,5.960463881492674e-08,0.9999999000000099,0.0,1.0788439625501739e-05,1.1920927762985348e-07 +0.18610948323432852,0.628009974848975,2.980231940746337e-08,0.9999999000000099,0.0,1.1056660500168911e-05,1.1920927762985348e-07 +0.18781918286499505,0.62777900685051,0.0,0.9999999000000099,0.0,1.150369529128086e-05,8.940695822239011e-08 +0.1891602873723858,0.6271591185449521,0.0,0.9999999000000099,0.0,1.2397764873504761e-05,2.980231940746337e-08 +0.19028559326337618,0.6259781121135747,0.0,0.9999999000000099,0.0,1.335143909454359e-05,2.980231940746337e-08 +0.1912415623585667,0.6246929763677925,2.980231940746337e-08,0.9999999000000099,0.0,1.4722345787286905e-05,2.980231940746337e-08 +0.1921081840912426,0.6232268809205034,5.960463881492674e-08,0.9999999000000099,0.0,1.609325248003022e-05,2.980231940746337e-08 +0.7127457856836826,0.41657966368217647,0.9999997807907323,4.0829177588224814e-06,2.682208746671703e-07,6.556510269641942e-07,3.182887712717088e-05 +0.5057728290348432,0.4604211448834705,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 +0.5887072086090458,0.3013795315703262,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5343501567619313,0.3490548133252393,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5777157544850503,0.32550805801539806,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5656360387567907,0.3427501916298467,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5773602723836245,0.33003318304132606,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 +0.5772067904233342,0.33652049297292397,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.5826902985331536,0.3347706794165525,0.9999999000000099,0.0,0.0,0.0,8.940695822239011e-08 +0.5853489637132498,0.33663082117038434,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5858293175454747,0.3394652008429031,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5896389484161362,0.34071230882532505,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.18195366858682605,0.6032232045094389,2.2351739555597527e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.18357715009882852,0.5222910641729556,5.960463881492674e-08,0.9999999000000099,0.0,1.8060205560922803e-05,8.940695822239011e-08 +0.18062016367164385,0.6044594644465137,2.980231940746337e-08,0.9999999000000099,0.0,1.1652706888318178e-05,2.980231940746337e-08 +0.17836624383187816,0.6545202730965413,2.980231940746337e-08,0.9999999000000099,0.0,9.894370043277838e-06,1.1920927762985348e-07 +0.1839384436531196,0.6615464686214612,2.980231940746337e-08,0.9999999000000099,0.0,9.506939890980815e-06,8.940695822239011e-08 +0.18825727700407602,0.6621408461390597,2.980231940746337e-08,0.9999999000000099,0.0,9.566544529795742e-06,8.940695822239011e-08 +0.19105079769297098,0.6617074011623272,0.0,0.9999999000000099,0.0,1.0192393237352472e-05,2.980231940746337e-08 +0.1929609775463312,0.6607804893315838,2.980231940746337e-08,0.9999999000000099,0.0,1.0997055861353983e-05,0.0 +0.1943790316501238,0.6596050857368144,8.940695822239011e-08,0.9999999000000099,0.0,1.2129543998837591e-05,8.940695822239011e-08 +0.19557914137030422,0.6574323772258339,0.0,0.9999999000000099,0.0,1.353025301098837e-05,8.940695822239011e-08 +0.19657209514757634,0.6546673177551771,0.0,0.9999999000000099,0.0,1.5139578258991392e-05,8.940695822239011e-08 +0.19741550087111318,0.6514689325170773,5.960463881492674e-08,0.9999999000000099,0.0,1.7046926701069047e-05,8.940695822239011e-08 +0.14782026409490753,0.39451318972507854,2.9802319407463367e-07,0.9999999000000099,0.0,0.0,0.0 +0.1323705315535093,0.37946999066530707,5.960463881492674e-08,0.9999999000000099,0.0,1.7881391644478022e-06,0.0 +0.1380302309932774,0.38316616409416326,2.980231940746337e-08,0.9999999000000099,0.0,6.854533463716575e-07,0.0 +0.1777615249083345,0.4705206452994505,0.0,0.9999999000000099,0.0,4.053115439415018e-06,0.0 +0.17934411763402275,0.5061478613940426,2.980231940746337e-08,0.9999999000000099,0.0,8.67247494757184e-06,0.0 +0.1766432523654273,0.531021892933515,5.960463881492674e-08,0.9999999000000099,0.0,8.821486544609158e-06,5.960463881492674e-08 +0.1783135533258989,0.5425268410707356,2.980231940746337e-08,0.9999999000000099,0.0,9.387730613350962e-06,0.0 +0.17958348988743078,0.5459004043598003,2.980231940746337e-08,0.9999999000000099,0.0,9.834765404462912e-06,2.980231940746337e-08 +0.18081316351141857,0.5464524625796154,8.940695822239011e-08,0.9999999000000099,0.0,1.0251997876167399e-05,0.0 +0.18177759646616684,0.5474238990799983,2.980231940746337e-08,0.9999999000000099,0.0,1.0848044264316667e-05,0.0 +0.18262204527098722,0.5473627447144693,2.980231940746337e-08,0.9999999000000099,0.0,1.1354683694243543e-05,1.1920927762985348e-07 +0.18337357043460661,0.5475779770867164,0.0,0.9999999000000099,0.0,1.2010334721207738e-05,8.940695822239011e-08 +0.18279820679861358,0.6201445459257614,2.682208746671703e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 +0.16356927155771062,0.4285602866869456,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 +0.18219688533982198,0.4986147283653948,0.0,0.9999999000000099,0.0,1.2576578789949543e-05,2.980231940746337e-08 +0.17649060487016385,0.5596727131838884,0.0,0.9999999000000099,0.0,1.272559038698686e-05,5.960463881492674e-08 +0.1770740151332012,0.575659155747069,2.980231940746337e-08,0.9999999000000099,0.0,1.1831520804762957e-05,5.960463881492674e-08 +0.17897734045241256,0.5881935953086739,1.1920927762985348e-07,0.9999999000000099,0.0,1.1205672097206226e-05,1.1920927762985348e-07 +0.1809724867268966,0.5969959496429516,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,1.1920927762985348e-07 +0.18305206298070148,0.5990891455578152,2.980231940746337e-08,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 +0.184704005710583,0.5991080402302058,0.0,0.9999999000000099,0.0,1.1980532401800274e-05,2.980231940746337e-08 +0.1859284341258308,0.5990177987980313,8.940695822239011e-08,0.9999999000000099,0.0,1.2695788067579396e-05,1.1920927762985348e-07 +0.18693488835514396,0.599051654236258,8.940695822239011e-08,0.9999999000000099,0.0,1.3500450691580906e-05,8.940695822239011e-08 +0.1878760456961084,0.5983812807965839,0.0,0.9999999000000099,0.0,1.4662741148471979e-05,0.0 +0.2831676602246333,0.32749396556968446,0.0028762516483336973,1.7881391644478022e-07,0.00016885994176268746,0.9999954892567376,2.3841855525970696e-07 +0.7791748046552361,0.522037625223414,0.9999999000000099,8.940695822239011e-08,2.682208746671703e-07,7.152556657791209e-07,0.0 +0.6280127763488123,0.3891345857907578,0.9999999000000099,0.0,9.536742210388278e-07,0.0,0.0 +0.5984227061023873,0.39499461644084694,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,0.0 +0.5684668421509911,0.3872901200584992,0.9999999000000099,0.0,8.940695822239011e-07,0.0,8.940695822239011e-08 +0.5846990346666459,0.3727042078333662,0.9999999000000099,0.0,6.556510269641942e-07,0.0,8.940695822239011e-08 +0.5933113693945302,0.36633998149320846,0.9999999000000099,0.0,4.768371105194139e-07,0.0,1.4901159703731684e-07 +0.5949624776593849,0.36778250330349305,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 +0.5976475476971156,0.3624913989876877,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,2.980231940746337e-08 +0.5984320640316168,0.36201775067806113,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,1.1920927762985348e-07 +0.601152658437632,0.35841959708752125,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 +0.6025096773851771,0.3579801320416675,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.6978116631218926,0.4125581382998695,0.9999997211860935,3.725289925932921e-06,2.3841855525970696e-07,6.258487075567308e-07,2.732872689664391e-05 +0.5527924299011213,0.4374901651586984,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,1.4901159703731684e-07 +0.5872482061142942,0.3080489634940041,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,1.4901159703731684e-07 +0.540054857708503,0.34469413751421846,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.575534820532809,0.33037346595829054,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5702965855362303,0.3398871421231959,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5759192704915944,0.33325982088104456,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5730339288474268,0.33793833846027577,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5752532481909017,0.33777400845465816,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.4901159703731684e-07 +0.5780731439351087,0.33829909557271703,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5812129974124567,0.33917066449079597,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5852373242135901,0.33976387971782146,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.09664675592975967,0.020926117893450405,8.642672628164378e-07,1.6391275674104854e-06,0.9908481441517273,4.7415490177274224e-05,0.0013836918877691167 +0.27808207272331803,0.053408265104685194,1.4960764342546611e-05,2.980231940746337e-08,0.9999997211860935,1.0550021070242033e-05,1.4901159703731684e-07 +0.3011341392869234,0.04744237660549314,2.6822087466717034e-05,5.960463881492674e-08,0.9999997807907323,2.8312203437090202e-06,0.0 +0.27928626536166534,0.03807744383159931,5.2809709990025094e-05,0.0,0.9999997807907323,9.834765404462913e-07,0.0 +0.27125012873480087,0.03652858733505362,6.62207537233836e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 +0.25388211010835326,0.03340235351944209,0.00010505317591130837,0.0,0.9999999000000099,4.768371105194139e-07,0.0 +0.24752637742924938,0.03354564308545759,0.00011438130188584441,0.0,0.9999998403953712,3.874301522970238e-07,2.980231940746337e-08 +0.238189458837183,0.03266239165700471,0.0001287162175208343,0.0,0.9999999000000099,4.172324717044872e-07,0.0 +0.22783762215624567,0.031701862806613766,0.00013387201877832546,0.0,0.9999997807907323,3.874301522970238e-07,8.940695822239011e-08 +0.2126180529506381,0.03010469674548589,0.0001315772401839508,0.0,0.9999997807907323,3.5762783288956044e-07,2.980231940746337e-08 +0.1935850381771037,0.02860888838278121,0.000115126359871031,0.0,0.9999997211860935,3.278255134820971e-07,5.960463881492674e-08 +0.17696762084228154,0.028433263296980593,9.402631773054693e-05,0.0,0.9999998403953712,3.874301522970238e-07,1.1920927762985348e-07 +0.1829049587174019,0.6224090455896802,2.7716157048940933e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 +0.17626327275499992,0.4744635223529898,0.0,0.9999999000000099,0.0,1.8447635713219826e-05,5.960463881492674e-08 +0.18194162844858192,0.5543415545468009,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,2.980231940746337e-08 +0.17642197012170782,0.6083225606830347,5.960463881492674e-08,0.9999999000000099,0.0,1.1742113846540568e-05,8.940695822239011e-08 +0.17991700767725768,0.6149494646926726,5.960463881492674e-08,0.9999999000000099,0.0,1.1026858180761447e-05,2.980231940746337e-08 +0.1828651130123712,0.616741716756117,2.980231940746337e-08,0.9999999000000099,0.0,1.0788439625501739e-05,2.980231940746337e-08 +0.1849327683372215,0.6176416872874265,5.960463881492674e-08,0.9999999000000099,0.0,1.0907648903131594e-05,2.980231940746337e-08 +0.18649205564680355,0.6180542110338464,2.980231940746337e-08,0.9999999000000099,0.0,1.1473892971873398e-05,0.0 +0.18776586651024565,0.6182790993585454,2.980231940746337e-08,0.9999999000000099,0.0,1.2218950957059982e-05,2.980231940746337e-08 +0.1888842582624424,0.6180437206163677,2.980231940746337e-08,0.9999999000000099,0.0,1.317262517809881e-05,0.0 +0.1899039149205728,0.617180108918365,2.980231940746337e-08,0.9999999000000099,0.0,1.433491563498988e-05,2.980231940746337e-08 +0.19082513450786068,0.6158695815939128,2.980231940746337e-08,0.9999999000000099,0.0,1.5676020008325733e-05,0.0 +0.1188193559597406,0.10985630748775002,0.00025027987838387736,0.0,0.0014586447210788872,0.9998077346444706,0.0 +0.16848880051868853,0.12544789908168358,2.1189449098706455e-05,0.0,6.571411429345673e-05,0.9999956680706541,2.980231940746337e-08 +0.15883624553022715,0.12783572075562163,1.963972848951836e-05,0.0,2.3305413776636355e-05,0.9999948932103495,0.0 +0.1675999760558347,0.1288477182167673,1.689791510403173e-05,0.0,1.6689298868179488e-05,0.9999956084660152,0.0 +0.16653487085606497,0.12765598294933223,1.8239019477367584e-05,0.0,1.591443856358544e-05,0.9999954296520989,8.940695822239011e-08 +0.17914006113264264,0.13030371067676885,1.5407799133658562e-05,0.0,1.2964008942246566e-05,0.9999968005587916,2.980231940746337e-08 +0.1935586333194693,0.13474974033909345,1.272559038698686e-05,0.0,1.0162590917945008e-05,0.9999978734422902,0.0 +0.21054324506841504,0.14108318088023003,1.0251997876167399e-05,0.0,7.86781232357033e-06,0.9999986483025948,8.940695822239011e-08 +0.22626379131333904,0.14874327180222768,8.67247494757184e-06,0.0,6.4373009920120876e-06,0.9999991847443441,2.086162358522436e-07 +0.23496621846179766,0.15456330773567933,8.165835517644963e-06,0.0,5.871056923270284e-06,0.9999994231628994,3.874301522970238e-07 +0.23592475055671341,0.1554785966606935,8.553265669941988e-06,0.0,5.513429090380723e-06,0.9999994231628994,4.172324717044872e-07 +0.23921248315774307,0.15731993314910195,8.58306798934945e-06,0.0,5.2750105351210165e-06,0.999999542372177,4.768371105194139e-07 +0.4531635045817604,0.252702653364779,5.251168679595046e-05,1.7881391644478022e-07,2.7298924577236446e-05,0.9999999000000099,6.735324186086722e-06 +0.3256582021578409,0.20134648677239192,7.033347380161355e-06,0.0,4.589557188749359e-06,0.9999999000000099,4.202127036452335e-06 +0.33189535139616905,0.19453522559649525,4.380940952897116e-06,0.0,2.264976274967216e-06,0.9999997807907323,5.03659197986131e-06 +0.34554165600299536,0.17862865325730007,3.695487606525458e-06,0.0,1.4305113315582417e-06,0.9999997807907323,3.9637084811926284e-06 +0.35352164505448375,0.16806736585600185,3.457069051265751e-06,0.0,1.1026858180761447e-06,0.9999998403953712,3.2186504960060438e-06 +0.3545705079885529,0.16410028931668785,3.4272667318582874e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.069638898968727e-06 +0.35307127235857955,0.16347357627930434,3.6060806483030677e-06,0.0,9.536742210388278e-07,0.9999997807907323,3.129243537783654e-06 +0.3494639396522775,0.16542306539563922,3.725289925932921e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.397464412450824e-06 +0.3444648682928501,0.16839122769333348,3.844499203562775e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.6656852871179947e-06 +0.33888357876328085,0.17096099254541725,3.9637084811926284e-06,0.0,1.0132788598537545e-06,0.9999997807907323,4.023313120007555e-06 +0.3345813453058937,0.17222309109599765,3.993510800600092e-06,0.0,1.0132788598537545e-06,0.9999997807907323,4.053115439415018e-06 +0.32848650215696085,0.1729370653333174,4.112720078229945e-06,0.0,1.0132788598537545e-06,0.9999997807907323,4.053115439415018e-06 +0.346117764697048,0.11238640544874257,1.5795229285955586e-06,1.1920927762985348e-07,0.9607569210599279,0.01483365745027378,0.0 +0.12716716527412272,0.10587289927577037,5.939602257907449e-05,0.0,0.00734263585097201,0.9999142481340328,0.0 +0.1681998372008294,0.1312007009758401,1.3411043733358517e-05,0.0,7.46846124351032e-05,0.9999955488613764,0.0 +0.19210657476583376,0.14424508807573352,7.629393768310623e-06,0.0,1.937150761485119e-05,0.9999978734422902,2.980231940746337e-08 +0.2192130386738605,0.1535907983516906,5.334615173935943e-06,0.0,1.1116265138983837e-05,0.9999989463257889,5.960463881492674e-08 +0.23917257784806759,0.165129691334105,4.559754869341896e-06,0.0,8.67247494757184e-06,0.9999994231628994,2.086162358522436e-07 +0.24904748796385437,0.1748637258707072,4.649161827564286e-06,0.0,7.897614642977793e-06,0.9999996615814547,4.172324717044872e-07 +0.252472639073408,0.17960619923377147,4.917382702231456e-06,0.0,7.569789129495696e-06,0.9999996615814547,5.66244068741804e-07 +0.25160235165507855,0.1784928142718802,5.513429090380723e-06,0.0,7.122754338383746e-06,0.9999996615814547,6.258487075567308e-07 +0.25170582531840435,0.17738819119276944,5.900859242677747e-06,0.0,6.735324186086722e-06,0.9999996615814547,5.960463881492673e-07 +0.2518033981218976,0.17649137970763248,6.228684756159844e-06,0.0,6.526707950234478e-06,0.9999996615814547,6.556510269641942e-07 +0.25043344496643677,0.1739134192168935,6.765126505494185e-06,0.0,6.1690801173449175e-06,0.9999996615814547,7.450579851865842e-07 +0.11165210604205338,0.029820978636403612,8.684395875334826e-05,0.025103953950557364,0.0,0.0,0.9920544228320638 +0.1741401553081884,0.10059735177224868,0.0018669364969611353,1.043081179261218e-06,0.0,7.271765935421062e-06,0.9999581767528395 +0.25311917065525985,0.11966830489970512,1.4901159703731685e-06,1.9073484420776557e-06,0.0,0.0014452932819843435,0.999792475856934 +0.20867672561735098,0.05607843398087592,8.529423814416017e-05,2.086162358522436e-07,1.1920927762985348e-07,7.987021601200183e-06,0.9999852372588615 +0.2534618973627042,0.04191228746650173,2.3365018415451283e-05,2.086162358522436e-07,7.748603045940476e-07,5.3942198127508695e-06,0.9999841643753627 +0.26506519316529376,0.040014475577178264,1.972913544774075e-05,2.086162358522436e-07,1.937150761485119e-06,5.75184764564043e-06,0.9999845220031957 +0.2692900299914433,0.038429439061260104,1.829862411618251e-05,1.4901159703731684e-07,2.5331971496343865e-06,5.096196618676236e-06,0.9999848796310286 +0.2696849107630639,0.03764376043628783,1.874565890729446e-05,1.4901159703731684e-07,2.5629994690418497e-06,4.529952549934432e-06,0.9999852372588615 +0.26887321471054626,0.0372575819428542,1.946091457307358e-05,2.086162358522436e-07,2.354383233189606e-06,4.112720078229945e-06,0.9999853564681391 +0.2666104435810318,0.036798268550293695,2.0980832862854213e-05,1.7881391644478022e-07,2.026557719707509e-06,3.635882967710531e-06,0.9999858333052496 +0.2617815136801087,0.03595709800104503,2.4288890317082647e-05,2.086162358522436e-07,1.6093252480030219e-06,2.8014180243015566e-06,0.9999869061887483 +0.25893601774097175,0.03567889332160353,2.6375052675605083e-05,1.7881391644478022e-07,1.2814997345209249e-06,2.5033948302269232e-06,0.9999871446073035 +0.18245494364936635,0.6127530335330756,2.4437901914119963e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.18204498290261817,0.5087259410940711,5.960463881492674e-08,0.9999999000000099,0.0,1.8805263546109385e-05,0.0 +0.1808987259789901,0.5912790297449436,0.0,0.9999999000000099,0.0,1.2427567192912226e-05,2.980231940746337e-08 +0.17765322326878208,0.6421915291640211,5.960463881492674e-08,0.9999999000000099,0.0,1.0490416431427107e-05,1.1920927762985348e-07 +0.18264690040785753,0.6499199866135644,0.0,0.9999999000000099,0.0,9.924172362685302e-06,2.980231940746337e-08 +0.1866576969546275,0.6512667535620337,0.0,0.9999999000000099,0.0,9.924172362685302e-06,8.940695822239011e-08 +0.18935036658456664,0.6513459085302818,0.0,0.9999999000000099,0.0,1.0401009473204716e-05,2.980231940746337e-08 +0.1912578642289121,0.6505771874267453,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,8.940695822239011e-08 +0.19269362091220227,0.6493127940973414,0.0,0.9999999000000099,0.0,1.2159346318245055e-05,2.980231940746337e-08 +0.19383671878965736,0.6477365492665261,2.980231940746337e-08,0.9999999000000099,0.0,1.344084605276598e-05,8.940695822239011e-08 +0.19481062888292452,0.6458879708137787,2.980231940746337e-08,0.9999999000000099,0.0,1.4930962023139149e-05,8.940695822239011e-08 +0.19567570089483635,0.6438819764942064,0.0,0.9999999000000099,0.0,1.662969422936456e-05,1.4901159703731684e-07 +0.23220279811851305,0.1705147325700603,7.650255391895847e-05,1.1920927762985348e-07,0.00010883807047605623,0.9999993039536218,1.4901159703731684e-07 +0.30902644990595085,0.23171576853599046,5.513429090380723e-06,0.0,9.119509738683792e-06,0.9999998403953712,4.976987341046382e-06 +0.2897906303285766,0.20643755790036536,4.857778063416529e-06,0.0,4.172324717044872e-06,0.9999999000000099,3.069638898968727e-06 +0.3088634610048193,0.2131151556603761,4.321336314082188e-06,0.0,3.844499203562775e-06,0.9999999000000099,4.6193595081568225e-06 +0.31657630203843545,0.21311482783482988,4.321336314082188e-06,0.0,3.397464412450824e-06,0.9999998403953712,5.2750105351210165e-06 +0.3216521441803304,0.20479613539049935,3.993510800600092e-06,0.0,2.712011066079167e-06,0.9999999000000099,5.0067896604538464e-06 +0.3245046734675505,0.19533544775479023,3.8146968841553113e-06,0.0,2.026557719707509e-06,0.9999999000000099,4.380940952897116e-06 +0.32551479338251726,0.18861579891789765,3.6656852871179947e-06,0.0,1.6689298868179488e-06,0.9999997807907323,4.053115439415018e-06 +0.32482486961927065,0.18449282643020035,3.6656852871179947e-06,0.0,1.4901159703731685e-06,0.9999997807907323,3.8146968841553113e-06 +0.3191730081902902,0.1806984245467711,3.844499203562775e-06,0.0,1.4305113315582417e-06,0.9999997807907323,3.5762783288956045e-06 +0.3099952339997675,0.17654111978368903,4.172324717044872e-06,0.0,1.370906692743315e-06,0.9999998403953712,3.069638898968727e-06 +0.29697453974447785,0.17179724571147278,4.768371105194139e-06,0.0,1.4901159703731685e-06,0.9999997807907323,2.413987872004533e-06 +0.27432379125412854,0.3366755246539582,0.0039041038423777014,1.4901159703731684e-07,0.00019392369238436415,0.9999928666526298,1.7881391644478022e-07 +0.22303578256637188,0.1493914127094043,3.445148123502766e-05,0.0,2.4527308872342353e-05,0.999999542372177,4.172324717044872e-07 +0.28606379030950485,0.21567177768828913,8.970498141646475e-06,0.0,5.75184764564043e-06,0.9999998403953712,6.079673159122528e-06 +0.2897189855455595,0.19903713461328723,7.301568254828525e-06,0.0,3.129243537783654e-06,0.9999997807907323,4.589557188749359e-06 +0.2836130261303766,0.18562865254084568,7.3611728936434526e-06,0.0,2.8312203437090202e-06,0.9999997807907323,3.069638898968727e-06 +0.27172243593998147,0.17561921474310593,8.40425407290467e-06,0.0,2.980231940746337e-06,0.9999997807907323,2.1159646779298993e-06 +0.2584232687843127,0.16637465354931538,1.0132788598537546e-05,0.0,3.367662093043361e-06,0.9999996615814547,1.370906692743315e-06 +0.24030914901692008,0.1524627208448647,1.2546776470542079e-05,0.0,3.635882967710531e-06,0.999999542372177,7.152556657791209e-07 +0.21036970614515868,0.13529139754839709,1.8626449629664607e-05,0.0,4.2319293558597985e-06,0.9999988271165112,2.9802319407463367e-07 +0.1607277095251287,0.11855471132155718,4.404782808423086e-05,0.0,7.77840536534794e-06,0.99999537004746,5.960463881492674e-08 +0.08417266606936005,0.11142373083114007,0.00016966460438668895,0.0,1.770257772803324e-05,0.9999664021929959,0.0 +0.016459524630818692,0.1301556825414945,0.0004976689317852308,5.960463881492674e-08,4.285573530793233e-05,0.9987687661852876,5.66244068741804e-07 +0.12060859798885658,0.022105187173872897,1.1026858180761447e-06,1.370906692743315e-06,0.9309982322480771,5.555152337551172e-05,0.025945124415833017 +0.2200554609207586,0.054456949224683845,5.930661562085211e-06,6.854533463716575e-07,0.0012513695895999795,1.1563299930095787e-05,0.9995309903064529 +0.24773618577885007,0.03798422216718656,9.775160765647985e-06,4.768371105194139e-07,1.847743803262729e-05,2.1159646779298993e-06,0.999946732662187 +0.2504366338149321,0.037451535456920114,1.2546776470542079e-05,4.172324717044872e-07,3.904103842377701e-06,1.847743803262729e-06,0.9999745680285136 +0.24401456116619596,0.03690710663163492,1.8328426435589973e-05,4.172324717044872e-07,1.7285345256328755e-06,1.5497206091880952e-06,0.999981541771255 +0.22344905137090496,0.03323006629374832,3.6656852871179946e-05,5.364417493343406e-07,5.66244068741804e-07,6.854533463716575e-07,0.9999891711650233 +0.1857747733516062,0.02853924035537309,6.80982998460538e-05,1.0728834986686813e-06,1.7881391644478022e-07,1.4901159703731684e-07,0.9999948336057106 +0.1434119045675022,0.026220262046138833,6.0379499119520785e-05,3.8146968841553113e-06,2.980231940746337e-08,0.0,0.9999973370005409 +0.10920453071142047,0.026031702752424172,3.033876115679771e-05,1.7791984686255633e-05,0.0,2.980231940746337e-08,0.999998290674762 +0.08942091464626066,0.02712392806542379,1.4960764342546611e-05,6.452202151715819e-05,0.0,0.0,0.9999985290933172 +0.08391347527156501,0.030431449408088628,1.0281800195574863e-05,0.0001573562464714066,0.0,0.0,0.9999979926515679 +0.09144958853342947,0.04202333091969927,7.659196087718087e-06,0.00044524665194750276,0.0,0.0,0.9999935819082956 +0.41125667093481405,0.23260176177810254,3.811716652214565e-05,2.086162358522436e-07,3.09944121837619e-05,0.9999999000000099,3.9637084811926284e-06 +0.1625963151387598,0.1526953875757056,3.9905305686593454e-05,0.0,1.797079860270041e-05,0.9999987079072337,1.1920927762985348e-07 +0.21370255946228142,0.13844868538393126,1.3053415900468956e-05,0.0,5.930661562085211e-06,0.9999988271165112,1.7881391644478022e-07 +0.21366527675697597,0.1383649110557138,1.3470648372173444e-05,0.0,5.6624406874180405e-06,0.9999989463257889,2.086162358522436e-07 +0.2086153030309125,0.13609799740368195,1.4930962023139149e-05,0.0,5.692243006825504e-06,0.9999986483025948,2.086162358522436e-07 +0.1972666680731152,0.13142389056816334,1.8328426435589973e-05,0.0,6.258487075567308e-06,0.9999982310701231,8.940695822239011e-08 +0.18542546033091448,0.12674510476803066,2.3037192901969185e-05,0.0,7.271765935421062e-06,0.9999974562098185,1.7881391644478022e-07 +0.17340317367789362,0.12242639062692448,2.9295679977536493e-05,0.0,8.58306798934945e-06,0.9999964429309587,8.940695822239011e-08 +0.1663783490588913,0.11971262095308803,3.439187659621273e-05,0.0,9.685753807425595e-06,0.9999956084660152,1.4901159703731684e-07 +0.15392610430080095,0.1161775588790321,4.461407215297267e-05,0.0,1.177191616594803e-05,0.9999938203268508,2.980231940746337e-08 +0.1373538076820719,0.11230605838759909,6.341933569908205e-05,0.0,1.528858985602871e-05,0.9999897672114114,8.940695822239011e-08 +0.11020979284783819,0.1092047393134994,0.00010862945424020398,0.0,2.2172925639152747e-05,0.9999777270743708,8.940695822239011e-08 +0.1095009744121986,0.022285670038221874,1.1026858180761447e-06,7.152556657791209e-07,0.9989637329588512,2.9116866061091712e-05,4.3630595612526375e-05 +0.038916647432623165,0.03325095772173852,1.370906692743315e-06,9.030102780461401e-06,0.9148162284608514,1.0639428028464424e-05,0.01765924515561479 +0.1089742183640179,0.05813172458606936,1.4901159703731684e-07,8.910893502831548e-06,0.13639642424373463,0.0001963972848951836,0.7373111106751694 +0.09828528761456731,0.04976695775133533,8.940695822239011e-08,9.387730613350962e-06,0.019436625682756496,0.000191599111470582,0.7609781457954959 +0.16473010181698566,0.04793483018054309,7.152556657791209e-07,2.354383233189606e-06,0.0003073513200491697,2.0474193432927334e-05,0.9952787357687573 +0.24027785657841427,0.0399207770756074,7.390975213050916e-06,5.960463881492673e-07,6.556510269641941e-06,1.7583368450403388e-06,0.9999134732737283 +0.2335003018282524,0.033479273313511554,2.2143123319745282e-05,5.66244068741804e-07,1.1622904568910714e-06,5.364417493343406e-07,0.9999741507960419 +0.2217191755679828,0.031982988113648754,3.591179488599336e-05,6.258487075567308e-07,3.874301522970238e-07,3.278255134820971e-07,0.9999845220031957 +0.2135199308306972,0.03156685828622062,5.057453603446534e-05,6.854533463716575e-07,1.4901159703731684e-07,2.9802319407463367e-07,0.9999886943279127 +0.2105017304333307,0.031798928970613864,6.115435942411484e-05,5.66244068741804e-07,1.7881391644478022e-07,3.5762783288956044e-07,0.9999902440485219 +0.20869421958059184,0.03192037343432293,6.929039262235234e-05,5.66244068741804e-07,1.7881391644478022e-07,3.278255134820971e-07,0.9999910785134654 +0.20581451057535524,0.03167670964652285,7.653235623836593e-05,6.258487075567308e-07,1.1920927762985348e-07,3.278255134820971e-07,0.999991793769131 +0.17621183394656087,0.027256548400026323,2.0563600391149723e-06,2.086162358522436e-07,0.9998071385980825,2.0027158641815386e-05,1.6093252480030219e-06 +0.3557538091989073,0.2861898838983667,6.556510269641942e-07,6.258487075567308e-07,0.8018802794616302,0.9995509578604559,0.0 +0.2103357612999605,0.15766012665909923,4.947185021638919e-06,0.0,5.343555869758182e-05,0.9999984098840395,2.980231940746337e-08 +0.260205209244444,0.20537713166534796,2.9504296213388737e-06,0.0,1.564621768891827e-05,0.9999996615814547,4.768371105194139e-07 +0.27909210323131756,0.23926892872527936,3.069638898968727e-06,0.0,1.4215706357360027e-05,0.9999999000000099,1.698732206225412e-06 +0.289854973542609,0.254017770246878,3.2782551348209707e-06,0.0,1.3232229816913736e-05,0.9999998403953712,3.039836579561264e-06 +0.29458263515206284,0.2516187428997241,3.3378597736358976e-06,0.0,1.0997055861353983e-05,0.9999999000000099,3.635882967710531e-06 +0.29753428696354034,0.24289974566115055,3.397464412450824e-06,0.0,8.67247494757184e-06,0.9999998403953712,3.635882967710531e-06 +0.30046045778937747,0.23418706651492213,3.397464412450824e-06,0.0,6.973742741346429e-06,0.9999999000000099,3.5762783288956045e-06 +0.30175811051072876,0.2253675758452745,3.397464412450824e-06,0.0,5.692243006825504e-06,0.9999998403953712,3.4272667318582874e-06 +0.3023986220234586,0.2182859181984006,3.5166736900806776e-06,0.0,4.768371105194139e-06,0.9999997807907323,3.2782551348209707e-06 +0.30242449043929004,0.21315386887715107,3.695487606525458e-06,0.0,4.202127036452335e-06,0.9999999000000099,3.308057454228434e-06 +0.3335712551932493,0.20853120085006482,4.601478116512344e-05,5.960463881492674e-08,4.8071141204238414e-05,0.9999999000000099,1.2218950957059981e-06 +0.3100697398057337,0.20011776682288002,5.03659197986131e-06,0.0,5.0067896604538464e-06,0.9999999000000099,3.039836579561264e-06 +0.30223911999404623,0.2014917134893623,4.529952549934432e-06,0.0,3.2484528154135075e-06,0.9999999000000099,3.784894564747848e-06 +0.3153575360644411,0.2051641046649572,4.261731675267262e-06,0.0,2.8908249825239467e-06,0.9999997807907323,4.857778063416529e-06 +0.318009078489487,0.19979688521778666,4.142522397637409e-06,0.0,2.413987872004533e-06,0.9999999000000099,4.6193595081568225e-06 +0.3161536157000283,0.19141098853648336,4.0829177588224814e-06,0.0,1.9073484420776557e-06,0.9999999000000099,3.993510800600092e-06 +0.3064134716860731,0.1815198063539577,4.202127036452335e-06,0.0,1.6689298868179488e-06,0.9999999000000099,3.069638898968727e-06 +0.2901685535787593,0.17190235850251617,5.03659197986131e-06,0.0,1.8179414838552655e-06,0.9999997211860935,2.0563600391149723e-06 +0.2603145837676023,0.15798467394984567,7.629393768310623e-06,0.0,2.4437901914119963e-06,0.9999997211860935,9.536742210388278e-07 +0.23416149615271845,0.14619597790122038,1.1563299930095787e-05,0.0,3.5762783288956045e-06,0.9999994231628994,5.364417493343406e-07 +0.20668989419081277,0.13411116597740166,1.770257772803324e-05,0.0,4.7385687857866755e-06,0.9999987079072337,2.086162358522436e-07 +0.16034236549667175,0.11921420691356156,4.0560956713557644e-05,0.0,8.58306798934945e-06,0.9999952508381824,5.960463881492674e-08 +0.1828985810204112,0.622285246742503,2.7716157048940933e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 +0.165433347218339,0.4342467784138009,2.980231940746337e-08,0.9999999000000099,0.0,1.4513729551434662e-05,5.960463881492674e-08 +0.18304073809819463,0.515363275916543,0.0,0.9999999000000099,0.0,1.335143909454359e-05,0.0 +0.175570547573449,0.5875783561654077,2.980231940746337e-08,0.9999999000000099,0.0,1.2397764873504761e-05,0.0 +0.1776924133227203,0.6017835735244255,0.0,0.9999999000000099,0.0,1.1473892971873398e-05,8.940695822239011e-08 +0.18087083100523638,0.604675888911656,0.0,0.9999999000000099,0.0,1.1205672097206226e-05,0.0 +0.1829793751164009,0.6078644989880143,5.960463881492674e-08,0.9999999000000099,0.0,1.1175869777798764e-05,2.980231940746337e-08 +0.18476358055303355,0.6079410909565376,2.980231940746337e-08,0.9999999000000099,0.0,1.1622904568910713e-05,1.1920927762985348e-07 +0.18609926103774999,0.6083314417751048,2.980231940746337e-08,0.9999999000000099,0.0,1.2218950957059982e-05,1.1920927762985348e-07 +0.18722507356822093,0.6084876655490343,0.0,0.9999999000000099,0.0,1.3023613581061492e-05,2.980231940746337e-08 +0.18823933600599937,0.6084165572078294,2.980231940746337e-08,0.9999999000000099,0.0,1.3947485482692857e-05,0.0 +0.18917945026568028,0.6081312893779832,0.0,0.9999999000000099,0.0,1.5109775939583928e-05,2.980231940746337e-08 +0.6826315521911246,0.4081660806433797,0.9999996615814547,3.2782551348209707e-06,2.086162358522436e-07,5.066394299268773e-07,2.396106480360055e-05 +0.5448530316127232,0.44992238275453095,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,5.960463881492674e-08 +0.5871961712594075,0.3112149834099964,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.5510949492226332,0.3414241670977557,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5801916718242727,0.3327546119120149,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5828724503275796,0.3379210233109715,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5881211161369937,0.3374563753027045,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.591861724829008,0.3404734134091062,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5956815480939255,0.34432095283334363,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5980311631908741,0.34706625336426083,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5962290167561648,0.3514605163926069,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.5966964959851188,0.35316315287264677,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.1671208143165052,0.13928472993373012,0.00012940167086720596,8.940695822239011e-08,0.00026348230588138364,0.9999937011175731,2.980231940746337e-08 +0.2063812613401786,0.14311686155729572,1.2636183428764469e-05,0.0,1.8537042671442215e-05,0.9999988271165112,1.1920927762985348e-07 +0.1970496177591746,0.13952645657057533,1.2487171831727152e-05,0.0,9.715556126833059e-06,0.9999983502794008,2.086162358522436e-07 +0.21960783003851395,0.14492285249135844,9.119509738683792e-06,0.0,6.884335783124038e-06,0.9999990655350666,1.4901159703731684e-07 +0.22955861686709667,0.15035173294353857,8.344649434089744e-06,0.0,6.139277797937454e-06,0.9999993039536218,2.682208746671703e-07 +0.23027518390655674,0.15111759302412642,8.821486544609158e-06,0.0,5.7816499650478935e-06,0.9999993039536218,2.9802319407463367e-07 +0.21940627693221432,0.14486595985793008,1.0669230347871886e-05,0.0,5.811452284455357e-06,0.9999990655350666,2.3841855525970696e-07 +0.19490280746606586,0.1337903141746307,1.603364784121529e-05,0.0,7.063149699568818e-06,0.9999981118608455,1.1920927762985348e-07 +0.16195878385826862,0.12244585154344031,2.9832121726870833e-05,0.0,1.1086462819576373e-05,0.9999952508381824,0.0 +0.1318937241976483,0.11458584664290024,5.659460455477294e-05,0.0,1.8447635713219826e-05,0.9999883367000798,5.960463881492674e-08 +0.08232274651186525,0.11328184602704992,0.00013026593813002238,0.0,2.989172636568576e-05,0.999955434939454,0.0 +0.03436398506022257,0.11670428512482203,0.00021573899019062734,8.940695822239011e-08,5.236267519891314e-05,0.999684591460679,1.1920927762985348e-07 +0.18233051895340285,0.6102103589920377,2.4437901914119963e-06,0.9999999000000099,5.960463881492674e-08,2.980231940746337e-08,0.0 +0.18318814038471806,0.5181525944776193,2.980231940746337e-08,0.9999999000000099,0.0,1.8596647310257143e-05,0.0 +0.18075552581992316,0.6002354024812946,8.940695822239011e-08,0.9999999000000099,0.0,1.2069939360022665e-05,2.980231940746337e-08 +0.1781469285414362,0.6503801344711516,2.980231940746337e-08,0.9999999000000099,0.0,1.0102986279130082e-05,0.0 +0.18350204824641464,0.6576922534770101,0.0,0.9999999000000099,0.0,9.655951488018132e-06,8.940695822239011e-08 +0.1877125501554963,0.6585865019624222,2.980231940746337e-08,0.9999999000000099,0.0,9.745358446240521e-06,0.0 +0.1904772818009659,0.6583588122194192,8.940695822239011e-08,0.9999999000000099,0.0,1.0192393237352472e-05,1.1920927762985348e-07 +0.19239142536320356,0.6575545071429577,8.940695822239011e-08,0.9999999000000099,0.0,1.0997055861353983e-05,1.1920927762985348e-07 +0.19385024904402082,0.6560401915380535,2.980231940746337e-08,0.9999999000000099,0.0,1.2189148637652518e-05,2.980231940746337e-08 +0.1950207054534267,0.6538295744730024,2.980231940746337e-08,0.9999999000000099,0.0,1.353025301098837e-05,8.940695822239011e-08 +0.1959424018778728,0.6517674325780612,0.0,0.9999999000000099,0.0,1.5050171300769002e-05,5.960463881492674e-08 +0.19677799939294438,0.6495200990518347,5.960463881492674e-08,0.9999999000000099,0.0,1.689791510403173e-05,5.960463881492674e-08 +0.6917740702342641,0.4109145998251143,0.9999997211860935,3.4868713706732143e-06,1.7881391644478022e-07,5.66244068741804e-07,2.592801788449313e-05 +0.42843088505878246,0.4315069317078796,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5528081655273414,0.386029750042617,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5316830873269222,0.5152187942576322,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5467328428995717,0.6183770297898946,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5694713592293491,0.7232804893208816,0.9999999000000099,1.1920927762985348e-07,8.940695822239011e-08,0.0,0.0 +0.5191945433401651,0.6973531841037637,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.34850013254629936,0.11875826118343029,0.9999975158144573,0.0,2.980231940746337e-08,0.00011721252222955344,2.682208746671703e-07 +0.22157594560659347,0.10279360411791143,5.02765128403907e-05,0.0,5.096196618676236e-06,0.9999926878387133,1.1920927762985348e-07 +0.18778309225258505,0.12424346802491351,3.141164465546639e-05,0.0,7.063149699568818e-06,0.9999978734422902,1.7881391644478022e-07 +0.21428057550496685,0.1329828798543191,1.9311902976036264e-05,0.0,4.529952549934432e-06,0.9999988271165112,2.682208746671703e-07 +0.22866806386954444,0.14062723515009876,1.573562464714066e-05,0.0,3.874301522970238e-06,0.9999993039536218,4.768371105194139e-07 +0.29821339248376066,0.03476113080383161,3.1888481765985805e-05,1.2218950957059981e-06,0.00010469554807841882,7.95721928179272e-06,0.9996966912023584 +0.3404844999172367,0.05008804797268537,2.1457669973373625e-06,1.1920927762985348e-07,0.00020393727170527184,9.98377700150023e-05,0.9999108506696205 +0.2687401175387683,0.046599298707611994,1.6689298868179488e-06,2.086162358522436e-07,0.00025868413245678205,7.271765935421062e-05,0.9998567296575764 +0.2675443887599787,0.04618772863550839,1.996755400300046e-06,2.086162358522436e-07,0.00016891954640150237,5.501508162617738e-05,0.9998681737482289 +0.26633036135524385,0.044595062725060294,2.592801788449313e-06,1.7881391644478022e-07,0.00010263918803930385,3.811716652214565e-05,0.999895234254251 +0.2717579007036214,0.04234987496604533,4.7385687857866755e-06,2.3841855525970696e-07,3.871321291029492e-05,1.814961251914519e-05,0.9999484015920739 +0.27563327549746724,0.03991568087847997,7.718800726533013e-06,2.086162358522436e-07,1.6570089590549635e-05,9.655951488018132e-06,0.9999697400527696 +0.2777197360877434,0.039114087813355396,9.119509738683792e-06,1.1920927762985348e-07,1.0997055861353983e-05,7.838010004162866e-06,0.9999745084238748 +0.27880001066960786,0.039014250033373714,9.715556126833059e-06,1.1920927762985348e-07,8.881091183424084e-06,7.539986810088233e-06,0.9999758197259287 +0.28072577713757624,0.039164096110313386,9.685753807425595e-06,8.940695822239011e-08,8.255242475867353e-06,7.808207684755402e-06,0.9999757005166511 +0.28054434059888744,0.03889027237226213,1.034140483438979e-05,1.4901159703731684e-07,7.241963616013599e-06,7.241963616013599e-06,0.9999767734001498 +0.27725037931247903,0.03798910974805731,1.2546776470542079e-05,1.1920927762985348e-07,5.48362677097326e-06,5.692243006825504e-06,0.9999796344228129 +0.4857851564683033,0.3450981974010816,0.9999996615814547,5.66244068741804e-07,1.1920927762985348e-07,2.980231940746337e-08,2.3841855525970694e-06 +0.6151518821461588,0.4237025379409055,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5817010402438574,0.3505458235140404,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.5451785325778282,0.3399729728116577,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5668939351800785,0.3484553396105135,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5428443550838757,0.357122301994207,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5567775368459942,0.34531867498206803,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5503159165154512,0.3543820976604172,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5556730031737072,0.3474109172226155,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5460683703196432,0.3545888661731076,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5522125959167703,0.3494635223743942,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5537787675628236,0.35135602945033356,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.24328836797660505,0.027405440802649755,4.321336314082188e-06,4.768371105194139e-07,0.10393743667733177,4.0471549755335255e-05,0.9275055196228 +0.24245908855387938,0.04976978897196167,1.7583368450403388e-06,3.278255134820971e-07,0.004409580981847688,4.509090926349208e-05,0.9988099529907087 +0.23121336101528253,0.04693752526433203,8.940695822239011e-07,4.4703479111195056e-07,0.0006572901545316046,5.5998558166623674e-05,0.9992828561950664 +0.24772483109402083,0.04664823412096421,1.370906692743315e-06,4.172324717044872e-07,0.00016063450160622755,3.141164465546639e-05,0.9997042609914879 +0.2646330296883677,0.04284015297156136,4.112720078229945e-06,2.9802319407463367e-07,3.057717971205742e-05,9.834765404462912e-06,0.9999263478757123 +0.2665250003227498,0.03900530933665893,8.642672628164377e-06,2.682208746671703e-07,9.387730613350962e-06,4.2319293558597985e-06,0.9999659849605242 +0.25973206757423656,0.03687113522851913,1.41561017185451e-05,2.682208746671703e-07,3.993510800600092e-06,2.5331971496343865e-06,0.9999773694465379 +0.2570071220291528,0.03651323913902658,1.7583368450403387e-05,2.682208746671703e-07,2.5331971496343865e-06,2.264976274967216e-06,0.9999809457248667 +0.2561443447960648,0.03658434748023145,1.9699333128333287e-05,2.3841855525970696e-07,1.9073484420776557e-06,2.324580913782143e-06,0.9999826146547536 +0.2630126476178934,0.03796476125067073,1.6927717423439194e-05,2.086162358522436e-07,2.1159646779298993e-06,3.308057454228434e-06,0.9999810649341444 +0.26644235848277215,0.038245022290356624,1.618265943825261e-05,2.3841855525970696e-07,2.3841855525970694e-06,3.844499203562775e-06,0.9999810649341444 +0.2726417183763143,0.03889304398824371,1.3947485482692857e-05,1.7881391644478022e-07,2.9504296213388737e-06,4.887580382823993e-06,0.9999795152135352 +0.09707906841829768,0.02118992805118111,9.238719016313645e-07,1.2516974151134616e-06,0.9973308042738775,3.689527142643965e-05,0.00020807979410290925 +0.11296096443662197,0.02666360139390227,1.5795229285955586e-05,1.1920927762985348e-07,0.9999982310701231,8.642672628164378e-07,1.1920927762985347e-06 +0.19038382171796198,0.03909602760599154,2.7030703702569276e-05,5.960463881492674e-08,0.9999997807907323,1.6093252480030219e-06,1.7881391644478022e-07 +0.18678382038296698,0.03502994775172259,7.882713483274062e-05,0.0,0.9999999000000099,7.152556657791209e-07,1.4901159703731684e-07 +0.15107333659500172,0.026477575297590133,5.7071441665292355e-05,1.1920927762985348e-07,0.9999997807907323,3.278255134820971e-07,1.4901159703731684e-07 +0.1116421222640539,0.02595844864400776,2.6404854995012547e-05,1.1920927762985348e-07,0.9999996019768158,5.066394299268773e-07,6.854533463716575e-07 +0.04021933674645778,0.0366799533304348,2.8014180243015566e-06,7.152556657791209e-06,0.9999605013337532,1.20401370406152e-05,8.451937783956612e-05 +0.034202009438052156,0.055935710658985685,3.5762783288956044e-07,6.654857923686571e-05,0.9918862185413281,0.00016877053480446506,0.005112170661878636 +0.05595883726841956,0.05640709399211114,1.1920927762985348e-07,4.2676921391487544e-05,0.5036978813967219,0.0003458559167236124,0.10215782097623449 +0.09278953075024715,0.04870614408612696,2.086162358522436e-07,1.1563299930095787e-05,0.009256481198680493,8.726119122505275e-05,0.7995746528229912 +0.19645312427660958,0.04429438709454232,2.175569316744826e-06,1.4007090121507783e-06,3.963708481192628e-05,6.1690801173449175e-06,0.9991691305442075 +0.23994594811399625,0.03589537739139068,1.4752148106694368e-05,5.66244068741804e-07,2.0563600391149723e-06,8.344649434089744e-07,0.9999532295678178 +0.12373590468847989,0.02225148677444904,1.1622904568910714e-06,1.370906692743315e-06,0.9198316607939334,5.531310482025202e-05,0.032403525449985586 +0.06334251165127727,0.035698652261343194,1.519918289780632e-06,2.980231940746337e-06,0.9952584701915601,2.3752448567748306e-05,0.004817127699744749 +0.14402964710592875,0.0350337028443428,3.2186504960060438e-06,4.4703479111195056e-07,0.9999938203268508,7.033347380161355e-06,2.9206273019314104e-06 +0.22208157180820218,0.04470363258550007,3.543495777547395e-05,8.940695822239011e-08,0.9999997807907323,2.5033948302269232e-06,8.940695822239011e-08 +0.23784551023452086,0.03931891917509095,0.00012475250903964166,0.0,0.9999997807907323,9.536742210388278e-07,8.940695822239011e-08 +0.228699803342886,0.03297409414680424,0.00015395878205895578,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 +0.21096310018619552,0.02958792447537174,0.0001521408405751005,0.0,0.9999997807907323,3.278255134820971e-07,2.980231940746337e-08 +0.18925899266412977,0.027646988625560663,0.0001282989850491298,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 +0.16329711674967745,0.026205122466368476,9.25063994407663e-05,2.980231940746337e-08,0.9999997807907323,3.278255134820971e-07,1.1920927762985348e-07 +0.138914257282227,0.026154041285804713,5.9187406343222255e-05,2.980231940746337e-08,0.9999996615814547,3.874301522970238e-07,3.278255134820971e-07 +0.09499755501353768,0.027385085816462443,2.381205320656323e-05,2.086162358522436e-07,0.9999991847443441,1.0132788598537545e-06,2.0563600391149723e-06 +0.031775236128445,0.04083830117480026,1.937150761485119e-06,1.8060205560922803e-05,0.9997238113130192,3.2395121195912685e-05,0.0005027055237650922 +0.08550050854328883,0.3460956513289046,0.9998672796786467,4.172324717044872e-07,0.00048738713158965593,8.350609897971236e-05,0.0 +0.4770068526070487,0.45580485455337416,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5717668533088439,0.7130701540679608,0.9999999000000099,5.960463881492674e-08,0.0,0.0,0.0 +0.5360456704871419,0.3153636454995875,0.9999996615814547,0.0,0.0,5.48362677097326e-06,1.1920927762985348e-07 +0.49676203725665186,0.13146618006362423,0.024622825306043275,1.1920927762985348e-07,0.0,0.9977973893865207,8.940695822239011e-08 +0.398882567866021,0.12390995023512992,2.309679754078411e-05,0.0,7.748603045940476e-07,0.9999973966051797,4.768371105194139e-07 +0.35514360664804456,0.15822938081892912,5.3942198127508695e-06,0.0,1.4007090121507783e-06,0.9999997807907323,2.264976274967216e-06 +0.3551780581327233,0.16594088074703675,4.7385687857866755e-06,0.0,1.1920927762985347e-06,0.9999997807907323,3.5762783288956045e-06 +0.3549365997167482,0.16457003352208227,4.410743272304579e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.5762783288956045e-06 +0.3556818961949888,0.16295313832353714,4.2319293558597985e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.4272667318582874e-06 +0.3573995232434101,0.16111186143977343,4.202127036452335e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.397464412450824e-06 +0.35796886681028106,0.16039720174903888,4.172324717044872e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.367662093043361e-06 +0.43933027980892625,0.2551006078283271,6.902217174768517e-05,2.086162358522436e-07,3.030895883739025e-05,0.9999999000000099,5.513429090380723e-06 +0.3354085087637299,0.19307330247433957,7.510184490680769e-06,0.0,4.321336314082188e-06,0.9999998403953712,3.397464412450824e-06 +0.32713279126720063,0.19058457013681407,4.589557188749359e-06,0.0,2.175569316744826e-06,0.9999999000000099,4.6193595081568225e-06 +0.3388030528881926,0.18104693290471313,3.844499203562775e-06,0.0,1.4007090121507783e-06,0.9999997807907323,4.2319293558597985e-06 +0.34747725723735123,0.17229485508829492,3.635882967710531e-06,0.0,1.2516974151134616e-06,0.9999998403953712,3.6656852871179947e-06 +0.3500149249885584,0.16783693429933963,3.5762783288956045e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.457069051265751e-06 +0.3488560914848833,0.166758805484827,3.6060806483030677e-06,0.0,1.0728834986686813e-06,0.9999998403953712,3.4272667318582874e-06 +0.34753429888239895,0.16678178307538397,3.6656852871179947e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.5762783288956045e-06 +0.3456223606920179,0.16771316525448474,3.725289925932921e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.7550922453403844e-06 +0.3464425504064157,0.16729646918293134,3.725289925932921e-06,0.0,9.536742210388278e-07,0.9999997807907323,3.725289925932921e-06 +0.3444711565828737,0.1684954762170278,3.933906161785165e-06,0.0,9.536742210388278e-07,0.9999997807907323,3.904103842377701e-06 +0.3452381491518116,0.16811603304845263,3.904103842377701e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.904103842377701e-06 +0.14633697270741097,0.03172773122244185,8.666514483690348e-05,3.9398666256666575e-05,8.344649434089744e-07,1.7881391644478022e-07,0.9998728229100565 +0.24342721699660358,0.04477187990375621,3.5077329942584386e-05,3.278255134820971e-07,1.6391275674104854e-06,8.642672628164377e-06,0.9999920917923252 +0.2596843242537734,0.04455521702003477,1.6480682632327243e-05,2.086162358522436e-07,4.470347911119505e-06,1.370906692743315e-05,0.9999901248392443 +0.27384436129389755,0.04474243520924221,1.1533497610688325e-05,1.1920927762985348e-07,8.85128886401662e-06,1.8864868184924313e-05,0.9999877406536917 +0.2705220579988996,0.04175379871607111,1.406669476032271e-05,1.4901159703731684e-07,8.165835517644963e-06,1.1950730082392812e-05,0.9999890519557456 +0.2675695419200729,0.03997054695398632,1.6570089590549635e-05,1.4901159703731684e-07,6.198882436752381e-06,8.463858711719597e-06,0.999989588397495 +0.26334640382629937,0.03877043723396172,1.963972848951836e-05,2.086162358522436e-07,4.380940952897116e-06,6.258487075567308e-06,0.9999901248392443 +0.25958856939194574,0.03790527581519507,2.247094883322738e-05,2.3841855525970696e-07,3.308057454228434e-06,4.857778063416529e-06,0.9999903632577996 +0.2554629444970207,0.037089288228359704,2.5898215565085667e-05,2.3841855525970696e-07,2.3841855525970694e-06,3.844499203562775e-06,0.9999907208856325 +0.2543057799233992,0.03693041204773811,2.7000901383161812e-05,1.7881391644478022e-07,2.026557719707509e-06,3.5166736900806776e-06,0.9999906016763548 +0.2539120316400293,0.03685694932306502,2.7537343132496152e-05,2.3841855525970696e-07,1.698732206225412e-06,3.2782551348209707e-06,0.9999901844438831 +0.2525129914179192,0.03648504614205265,2.9087063741684248e-05,2.086162358522436e-07,1.519918289780632e-06,2.9504296213388737e-06,0.9999901248392443 +0.35263526438206566,0.10837233064703122,1.4901159703731685e-06,1.1920927762985348e-07,0.973265371747712,0.009758888699251511,0.0 +0.28369629381912437,0.052649468174502015,3.069638898968727e-06,5.960463881492674e-08,0.9996325566109936,9.566544529795742e-05,0.0 +0.3557243048997447,0.04461288451384508,1.370906692743315e-06,0.0,0.9999778462836484,4.6849246108532416e-05,0.0 +0.34695881603711637,0.0594000816243501,1.847743803262729e-06,1.4901159703731684e-07,0.9999886943279127,6.98864390105016e-05,0.0 +0.3582505583614779,0.06022346018713636,1.2516974151134616e-06,1.1920927762985348e-07,0.9999735547496538,0.0002902745910286932,0.0 +0.3460332751130824,0.08145892618691807,1.0132788598537545e-06,2.086162358522436e-07,0.9997437192623834,0.003959446749517361,0.0 +0.18411713837814883,0.07507869599964084,1.5258787536621245e-05,0.0,0.9304205440886828,0.6877461580129512,0.0 +0.10725784301313682,0.09122487901079206,9.405612004995439e-05,0.0,0.005739777706280408,0.9997132016873101,0.0 +0.12940439581335197,0.10774567721429246,3.352760933339629e-05,0.0,0.00017669795176685033,0.9999748064470688,0.0 +0.1222407817789959,0.11648288367184176,3.2961365264654486e-05,0.0,7.283686863184048e-05,0.9999786807485919,0.0 +0.11876502632603009,0.11869531867855825,3.4570690512657506e-05,0.0,5.957483649551928e-05,0.9999767734001498,0.0 +0.11058792471427761,0.11717784402748142,4.273652603030247e-05,0.0,6.642936995923585e-05,0.999968309541438,0.0 +0.0951894521673841,0.02087432145714946,8.046626240015109e-07,1.6391275674104854e-06,0.9931360682126382,4.512071158289954e-05,0.000895410686597237 +0.4346227347670832,0.08520275352926406,2.3841855525970696e-07,3.5762783288956044e-07,0.9999503685451547,0.02755218468756107,0.0 +0.17195135354283717,0.1046730875789696,3.367662093043361e-05,8.940695822239011e-08,0.8051722436633786,0.9450338133869384,0.0 +0.11050310730476574,0.09111201761592919,6.961821813583444e-05,0.0,0.0023745892057478665,0.9998861147445123,0.0 +0.1740849614071287,0.13535258171624853,1.1593102249503251e-05,0.0,5.6058162805438596e-05,0.999996323721681,0.0 +0.2054567038927834,0.14959672090829798,6.198882436752381e-06,0.0,1.5854833924770514e-05,0.999998588697956,0.0 +0.23054432868002886,0.16047069427603436,4.7385687857866755e-06,0.0,9.894370043277838e-06,0.9999991847443441,1.4901159703731684e-07 +0.24764317273068193,0.17367073890573204,4.321336314082188e-06,0.0,8.40425407290467e-06,0.9999996615814547,3.278255134820971e-07 +0.25454241036314773,0.18311142918312243,4.589557188749359e-06,0.0,8.016823920607646e-06,0.9999996615814547,5.066394299268773e-07 +0.25981348751899636,0.19163459536131994,4.947185021638919e-06,0.0,7.927416962385257e-06,0.9999997807907323,8.642672628164378e-07 +0.2644208073506537,0.20047762986564982,5.155801257491163e-06,0.0,8.106230878830036e-06,0.9999999000000099,1.2218950957059981e-06 +0.2690306305773915,0.2099869846938097,5.513429090380723e-06,0.0,8.22544015645989e-06,0.9999997807907323,1.7881391644478022e-06 +0.1829036474152169,0.6219070552714678,2.74181338548663e-06,0.9999999000000099,5.960463881492674e-08,2.980231940746337e-08,0.0 +0.18197387456140407,0.5074505805100304,5.960463881492674e-08,0.9999999000000099,0.0,1.963972848951836e-05,2.980231940746337e-08 +0.18087908624853744,0.5922382472931498,0.0,0.9999999000000099,0.0,1.2814997345209249e-05,2.980231940746337e-08 +0.1774738132880156,0.6444878577082446,1.1920927762985348e-07,0.9999999000000099,0.0,1.0550021070242033e-05,2.980231940746337e-08 +0.18273013829428292,0.6518152951078077,0.0,0.9999999000000099,0.0,1.0043381640315155e-05,8.940695822239011e-08 +0.18678763508023247,0.6535338758303223,0.0,0.9999999000000099,0.0,1.0043381640315155e-05,2.980231940746337e-08 +0.1895467936914158,0.6539226173234808,1.1920927762985348e-07,0.9999999000000099,0.0,1.0401009473204716e-05,1.1920927762985348e-07 +0.19155398010414398,0.6529098748042755,8.940695822239011e-08,0.9999999000000099,0.0,1.1205672097206226e-05,8.940695822239011e-08 +0.1929675638595786,0.6522665022686801,2.980231940746337e-08,0.9999999000000099,0.0,1.2099741679430129e-05,2.980231940746337e-08 +0.19420263170391835,0.6505041121322632,2.980231940746337e-08,0.9999999000000099,0.0,1.353025301098837e-05,2.980231940746337e-08 +0.19518804549362667,0.6488159893832236,5.960463881492674e-08,0.9999999000000099,0.0,1.5020368981361538e-05,1.4901159703731684e-07 +0.19609981774471807,0.6465835570181884,0.0,0.9999999000000099,0.0,1.6778705826401877e-05,1.4901159703731684e-07 +0.0893807709180061,0.3997988700182103,0.998843689216278,3.5762783288956044e-07,0.0015779732079863704,0.001731008118143695,0.0 +0.7322000264818272,0.43930530540573254,0.9999999000000099,0.0,1.1026858180761447e-06,0.0,5.960463881492674e-08 +0.7102108001414902,0.385995864802068,0.9999999000000099,0.0,2.0563600391149723e-06,0.0,1.1920927762985348e-07 +0.6228648423890645,0.3795815109556627,0.9999999000000099,0.0,1.043081179261218e-06,0.0,1.1920927762985348e-07 +0.5892623662704608,0.37262716883000724,0.9999999000000099,0.0,8.344649434089744e-07,0.0,1.1920927762985348e-07 +0.5692964792015854,0.3751599191976918,0.9999999000000099,0.0,3.278255134820971e-07,0.0,1.1920927762985348e-07 +0.5550140142210978,0.38315209739799866,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5555815100439807,0.38031584017916975,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5529062747726377,0.3733145593957617,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5541059374579822,0.3648502528042698,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5583575367696348,0.35822769993369974,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5614632963901727,0.35522669547673985,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.15747219323459882,0.02380049228260665,1.7583368450403388e-06,8.940695822239011e-07,0.6904868389103005,5.2213663601875825e-05,0.2291455039714359 +0.23890504240000432,0.03834214805900149,7.152556657791209e-06,0.0,0.9999966813495139,1.0520218750834569e-05,3.2186504960060438e-06 +0.2316050827407302,0.04138252138382877,7.191299673020911e-05,2.980231940746337e-08,0.9999997807907323,1.5497206091880952e-06,8.940695822239011e-08 +0.22702255844129834,0.034404128784010536,0.00016438959385156794,0.0,0.9999997807907323,6.258487075567308e-07,2.980231940746337e-08 +0.21127867697794575,0.030005216593372793,0.00016292928020060225,0.0,0.9999998403953712,4.172324717044872e-07,1.4901159703731684e-07 +0.1909897625367235,0.027892857785217048,0.000141173587033154,0.0,0.9999996615814547,3.278255134820971e-07,1.4901159703731684e-07 +0.17446690797083358,0.02777665853024732,0.00011360644158125036,0.0,0.9999997807907323,3.874301522970238e-07,1.1920927762985348e-07 +0.15356194972356077,0.02687996625439989,8.302926186919295e-05,5.960463881492674e-08,0.9999997807907323,3.874301522970238e-07,2.086162358522436e-07 +0.1357622444573453,0.0271886289073164,5.632638368010577e-05,2.980231940746337e-08,0.9999997807907323,5.66244068741804e-07,4.172324717044872e-07 +0.11107844113843637,0.02798554300782691,3.212690032124551e-05,8.940695822239011e-08,0.999999542372177,9.834765404462913e-07,1.2218950957059981e-06 +0.0718188583821122,0.031300693745021695,1.1473892971873398e-05,8.940695822239011e-07,0.999996323721681,3.0994412183761904e-06,9.208916696906181e-06 +0.037994772194242764,0.038987874978065114,2.5629994690418497e-06,1.0818241944909203e-05,0.999864299446706,2.1368263015151236e-05,0.00018227098549604596 +0.1323023438398891,0.022680491205146456,1.3113020539283883e-06,1.3113020539283883e-06,0.8716256938966956,5.555152337551172e-05,0.06231214973077538 +0.2308973967933413,0.05217221378386719,7.838010004162866e-06,6.258487075567308e-07,0.00039526816230118665,8.106230878830036e-06,0.9998135162944357 +0.2674537598976015,0.04065167903204047,6.079673159122528e-06,3.5762783288956044e-07,2.1785495486855723e-05,4.529952549934432e-06,0.9999478055456857 +0.2726338207608819,0.042284756891639366,6.139277797937454e-06,3.5762783288956044e-07,1.0311602514982325e-05,5.7816499650478935e-06,0.9999623490775565 +0.24253800510355872,0.036139249795447435,1.856684499084968e-05,3.874301522970238e-07,2.4437901914119963e-06,1.4603136509657052e-06,0.99998279346867 +0.19543877243186397,0.029230773443938755,5.1259989380836994e-05,8.642672628164378e-07,2.086162358522436e-07,2.086162358522436e-07,0.9999935223036568 +0.11306038498410322,0.024028927083669216,2.74181338548663e-05,1.4573334190249588e-05,0.0,0.0,0.9999984694886783 +0.08384287356983147,0.02689304947392585,1.0460614112019642e-05,0.00013282893759906423,0.0,0.0,0.999998588697956 +0.12848410009805805,0.08202630280043786,2.3841855525970694e-06,0.006069957602995694,0.0,5.960463881492674e-08,0.9999128772273401 +0.3267157673700469,0.15790915486492818,0.0,0.999043007128475,0.0,9.030102780461401e-06,0.8317049506086491 +0.2012656629002201,0.49492487302888366,0.0,0.9999994231628994,0.0,0.0015087722223222405,0.007709323588961439 +0.14704534410821476,0.3450049459343465,0.0,0.9999999000000099,0.0,0.008213549031016312,0.0001909434604436178 +0.13589847087297383,0.02432870864451571,1.5497206091880952e-06,3.874301522970238e-07,0.9995861245973567,2.3216006818413966e-05,8.195637837052427e-06 +0.3079054355493841,0.05531877278334364,1.5944240882992903e-05,0.0,0.9999997807907323,7.182358977198672e-06,0.0 +0.3379224538663174,0.048089236012807304,4.589557188749359e-06,0.0,0.9999996019768158,8.493661031127061e-06,0.0 +0.3180797397958653,0.046743482343298975,8.1360331982375e-06,1.1920927762985348e-07,0.9999994827675383,4.023313120007555e-06,0.0 +0.324255317436143,0.04553624986822493,6.079673159122528e-06,8.940695822239011e-08,0.9999994827675383,4.7385687857866755e-06,0.0 +0.32721883057193035,0.047073632470653326,5.602836048603113e-06,8.940695822239011e-08,0.9999994231628994,5.841254603862821e-06,0.0 +0.32733851669863434,0.046788126222228096,5.334615173935943e-06,0.0,0.9999994231628994,5.930661562085211e-06,0.0 +0.3132790326942422,0.043819636098987626,9.179114377498718e-06,1.1920927762985348e-07,0.9999994231628994,3.0100342601538e-06,0.0 +0.28378462790267783,0.037195175879785054,3.0905005225539514e-05,0.0,0.9999997807907323,9.238719016313645e-07,0.0 +0.2562207281483413,0.03257188200392878,7.936357658207495e-05,0.0,0.9999997807907323,3.874301522970238e-07,0.0 +0.23841449617352317,0.031249493355168398,0.00010585783853530989,0.0,0.9999997807907323,3.5762783288956044e-07,5.960463881492674e-08 +0.22616577147501,0.031268000597367986,0.00011271237199902646,0.0,0.9999999000000099,3.278255134820971e-07,2.980231940746337e-08 +0.17495897411575645,0.02712070941460647,2.026557719707509e-06,1.7881391644478022e-07,0.9998032046919206,2.0235774877667628e-05,1.7583368450403388e-06 +0.2182044088750131,0.03381535410302005,6.338953337967459e-05,0.0,0.9999997807907323,6.258487075567308e-07,0.0 +0.30108496545498575,0.05105182527621602,2.0772216627001968e-05,1.1920927762985348e-07,0.9999997807907323,3.069638898968727e-06,0.0 +0.30486962197948725,0.044919311992582894,1.680850814580934e-05,5.960463881492674e-08,0.9999997211860935,2.413987872004533e-06,0.0 +0.30412846802405835,0.043405234806257686,1.4990566661954075e-05,2.980231940746337e-08,0.9999997807907323,2.1159646779298993e-06,0.0 +0.30249378083883854,0.04279014467460337,1.5795229285955586e-05,2.980231940746337e-08,0.9999997211860935,1.9073484420776557e-06,0.0 +0.2862914800525374,0.039237558834986475,2.9623505491018588e-05,0.0,0.9999997211860935,1.0728834986686813e-06,0.0 +0.2699147760756307,0.036200672381877956,5.367397725284153e-05,0.0,0.9999998403953712,6.258487075567308e-07,0.0 +0.25524872540370686,0.03421017526994463,8.049606471955857e-05,0.0,0.9999997807907323,4.768371105194139e-07,0.0 +0.2372996807000128,0.031830787653240857,0.00010454653648138151,0.0,0.9999997807907323,3.5762783288956044e-07,0.0 +0.22850731014259185,0.032182782882901655,0.00010690091971457111,0.0,0.9999999000000099,4.172324717044872e-07,5.960463881492674e-08 +0.22016629575771385,0.032121777528984485,0.00010818241944909204,0.0,0.9999999000000099,3.874301522970238e-07,5.960463881492674e-08 +0.16583737730293224,0.4678204654846205,4.768371105194139e-07,0.9999999000000099,2.980231940746337e-08,0.0,0.0 +0.15650174021072846,0.4162393509628896,8.940695822239011e-08,0.9999999000000099,0.0,6.1690801173449175e-06,0.0 +0.17603209614024815,0.4638985394637161,0.0,0.9999999000000099,0.0,6.079673159122528e-06,0.0 +0.1786921918318189,0.5390912889511151,0.0,0.9999999000000099,0.0,9.477137571573351e-06,2.980231940746337e-08 +0.17710602282744425,0.5557375549318463,0.0,0.9999999000000099,0.0,9.953974682092765e-06,0.0 +0.1787820160314917,0.560413777732254,2.980231940746337e-08,0.9999999000000099,0.0,9.924172362685302e-06,2.980231940746337e-08 +0.1803558766767207,0.5621607302656768,5.960463881492674e-08,0.9999999000000099,0.0,1.0222195556759936e-05,0.0 +0.18149650096141773,0.5620975493422257,2.980231940746337e-08,0.9999999000000099,0.0,1.060962570905696e-05,2.980231940746337e-08 +0.18244126438339095,0.5621635912886256,2.980231940746337e-08,0.9999999000000099,0.0,1.0997055861353983e-05,2.980231940746337e-08 +0.1832560300751144,0.5615698098174747,2.980231940746337e-08,0.9999999000000099,0.0,1.1622904568910713e-05,0.0 +0.18395897745324388,0.5622996090879797,2.980231940746337e-08,0.9999999000000099,0.0,1.2367962554097299e-05,0.0 +0.18468406795690648,0.5617541073790887,8.940695822239011e-08,0.9999999000000099,0.0,1.3232229816913736e-05,2.980231940746337e-08 +0.6367861032222283,0.39748361699927387,0.9999996019768158,2.5331971496343865e-06,1.1920927762985348e-07,2.9802319407463367e-07,1.4781950426101832e-05 +0.5544050335654528,0.44180959455554175,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.5789985060452083,0.32596224540850877,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5238510370037601,0.3540826141227945,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5683129429581874,0.3381974696533924,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5446175932658702,0.3596035539488145,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5588415860898357,0.34045970434081024,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5548374056586355,0.3511083721513342,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5594480037457554,0.3447194396859213,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.561346411681773,0.34532368177222833,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5601265430218504,0.34537652128981267,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.55932867524692,0.34532442683028786,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.32950419186181373,0.1179763674534006,2.026557719707509e-06,1.4901159703731684e-07,0.9203120145781429,0.03383466263025139,0.0 +0.3242731690272525,0.30834308261359794,4.0829177588224814e-06,5.960463881492674e-08,0.00022298095380664094,0.9999999000000099,1.4901159703731685e-06 +0.34506788848401776,0.20713126655846495,1.937150761485119e-06,0.0,4.976987341046382e-06,0.9999999000000099,1.6093252480030219e-06 +0.37346071003321135,0.1737840175331083,5.1259989380836994e-06,0.0,1.5795229285955586e-06,0.9999987079072337,3.278255134820971e-07 +0.3978731036021468,0.2418258785787386,0.00013738869246840614,0.0,1.2218950957059981e-06,0.9998802138852696,8.940695822239011e-08 +0.3915347456769942,0.30288827414094494,0.9993497325998167,2.9802319407463367e-07,1.1920927762985348e-07,0.0003535151128113305,0.0 +0.5430102944149237,0.43094998590719374,0.9999999000000099,1.1920927762985348e-07,2.086162358522436e-07,0.0,0.0 +0.5009512305052272,0.4545339047130461,0.9999999000000099,2.980231940746337e-08,3.278255134820971e-07,0.0,0.0 +0.5536084770927074,0.401052892139425,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 +0.561120152450215,0.402350246837384,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,0.0 +0.5667304396394663,0.39562541239639687,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.573928415751534,0.3942913114349401,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.6797603368477682,0.4079155325191093,0.9999997211860935,3.3378597736358976e-06,1.7881391644478022e-07,4.768371105194139e-07,2.273916970789455e-05 +0.5651589631800282,0.4432670771316624,0.9999999000000099,0.0,4.768371105194139e-07,0.0,8.940695822239011e-08 +0.595969617342113,0.31133729214105454,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 +0.5457878708613418,0.3408572375190716,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5825273394343444,0.32938057178579205,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5800571441410202,0.3350835441969249,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.584586918329828,0.33213025325809953,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5900012254470659,0.3332807719136795,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5913133620970971,0.3371030687708589,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5937210321180545,0.3388807773009805,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5970848798504591,0.3421890437017049,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.597556352590613,0.3453464507465286,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.31284278629914913,0.03094071149296236,8.523463350534524e-06,3.278255134820971e-07,0.010892390115594973,3.367662093043361e-05,0.9943111736668745 +0.29019981621494273,0.04891252516862641,3.308057454228434e-06,2.3841855525970696e-07,0.000296950310575965,2.9504296213388735e-05,0.999903578903685 +0.2758485674743871,0.04292035102109291,5.453824451565797e-06,2.086162358522436e-07,3.600120184421575e-05,1.0669230347871886e-05,0.999962527891473 +0.2687677740939429,0.04044196008943417,8.94069582223901e-06,2.682208746671703e-07,1.1175869777798764e-05,5.841254603862821e-06,0.9999764157723169 +0.24911203979414345,0.03668624162045753,1.892447282373924e-05,2.682208746671703e-07,3.308057454228434e-06,2.2053716361522894e-06,0.9999858333052496 +0.23325276373851048,0.034182220691549754,3.2514330473542534e-05,3.5762783288956044e-07,1.1026858180761447e-06,1.1026858180761447e-06,0.9999900652346054 +0.22683188318266978,0.03376451134103534,4.2051072683930815e-05,4.172324717044872e-07,6.258487075567308e-07,8.344649434089744e-07,0.9999912573273818 +0.2242649197485567,0.0337779521884299,4.887580382823993e-05,4.172324717044872e-07,4.172324717044872e-07,9.238719016313645e-07,0.999991793769131 +0.223784357300075,0.033840239042209515,5.2839512309432554e-05,4.172324717044872e-07,2.9802319407463367e-07,9.238719016313645e-07,0.9999919129784087 +0.22551360725422706,0.03411200642001637,5.340575637817436e-05,3.5762783288956044e-07,3.5762783288956044e-07,9.536742210388278e-07,0.999991793769131 +0.22793254255304657,0.03434208034880998,5.2213663601875825e-05,2.9802319407463367e-07,3.278255134820971e-07,9.536742210388278e-07,0.9999914361412983 +0.23122173546787314,0.03463718294504241,4.944204789698173e-05,3.5762783288956044e-07,3.5762783288956044e-07,1.1622904568910714e-06,0.9999909593041877 +0.42300212381518704,0.25988313551267356,9.989737465381722e-05,1.4901159703731684e-07,3.5077329942584386e-05,0.9999999000000099,4.380940952897116e-06 +0.37602043150298453,0.2126462459200084,2.7984377923608103e-05,0.0,4.798173424601603e-06,0.9999994231628994,8.940695822239011e-07 +0.3888878524142407,0.18723332878721397,2.226233259737514e-05,0.0,1.4305113315582417e-06,0.9999977542330126,5.066394299268773e-07 +0.4786576628486796,0.2610064744502406,0.0006193816042453112,5.960463881492674e-08,9.238719016313645e-07,0.9996437026784519,8.940695822239011e-08 +0.6950119137476188,0.4669104813729904,0.9999999000000099,8.940695822239011e-08,5.960463881492674e-08,0.0,0.0 +0.6331321596837138,0.4144921302085654,0.9999999000000099,1.4901159703731684e-07,1.7583368450403388e-06,0.0,0.0 +0.5525543093452535,0.4415170251567118,0.9999999000000099,8.940695822239011e-08,1.6391275674104854e-06,0.0,0.0 +0.5571340918310258,0.4121155142078432,0.9999999000000099,0.0,1.5497206091880952e-06,0.0,0.0 +0.5442960858119651,0.3985283076080733,0.9999999000000099,0.0,7.152556657791209e-07,0.0,0.0 +0.5510938763390274,0.3927663265986229,0.9999999000000099,0.0,4.172324717044872e-07,0.0,2.980231940746337e-08 +0.5602627992398013,0.38759329908409734,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5644347071413924,0.3837079405127564,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.18253943323333197,0.6148706673522931,2.592801788449313e-06,0.9999999000000099,5.960463881492674e-08,5.960463881492674e-08,0.0 +0.16002494096093353,0.4177673756360899,2.980231940746337e-08,0.9999999000000099,0.0,1.2218950957059982e-05,0.0 +0.18346202372744963,0.5054374932377311,0.0,0.9999999000000099,0.0,1.2248753276467444e-05,0.0 +0.1760341525004928,0.5785249470673791,2.980231940746337e-08,0.9999999000000099,0.0,1.2576578789949543e-05,0.0 +0.17723885177832072,0.5951667426997528,5.960463881492674e-08,0.9999999000000099,0.0,1.1622904568910713e-05,1.1920927762985348e-07 +0.18023824691026136,0.5991370676922065,5.960463881492674e-08,0.9999999000000099,0.0,1.1205672097206226e-05,2.980231940746337e-08 +0.1824325919075765,0.6001505254671489,5.960463881492674e-08,0.9999999000000099,0.0,1.1324881374836081e-05,8.940695822239011e-08 +0.1840078234596353,0.6005324720308042,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,8.940695822239011e-08 +0.18523153661914576,0.6013901232643305,0.0,0.9999999000000099,0.0,1.2129543998837591e-05,2.980231940746337e-08 +0.1863446533602801,0.6013730763359276,0.0,0.9999999000000099,0.0,1.299381126165403e-05,8.940695822239011e-08 +0.18733635544001198,0.6010013221665271,2.980231940746337e-08,0.9999999000000099,0.0,1.3828276205063004e-05,2.980231940746337e-08 +0.18821406363661566,0.6008660196229102,0.0,0.9999999000000099,0.0,1.4960764342546611e-05,0.0 +0.29196208714229893,0.029728442425405663,6.8247311443091115e-06,3.5762783288956044e-07,0.02331509953044378,3.582238792777097e-05,0.9873548950847009 +0.22122210263289901,0.03789952396697523,2.2351739555597528e-05,3.874301522970238e-07,2.7000901383161812e-05,1.8179414838552655e-06,0.9999630643332224 +0.21790379284910086,0.032373458141505475,3.373622556924853e-05,5.66244068741804e-07,1.6689298868179488e-06,6.854533463716575e-07,0.999989588397495 +0.1196708083103218,0.02416667341772156,3.418326036036048e-05,9.357928293943498e-06,0.0,2.980231940746337e-08,0.9999984694886783 +0.08192357420582098,0.026824355120833972,1.1295079055428617e-05,0.00014540551638901378,0.0,0.0,0.9999989463257889 +0.16307845711032798,0.11583748457832434,8.642672628164378e-07,0.04026412561225931,0.0,1.7881391644478022e-07,0.9997163011285285 +0.3190706968175375,0.16953435537296255,0.0,0.9999328447813431,0.0,2.6583668911457325e-05,0.5789272802305935 +0.16240254043860303,0.47428879133686064,0.0,0.9999996615814547,0.0,0.0035418864522993917,0.0022191403077185374 +0.13677644729047897,0.3438904284842047,0.0,0.9999999000000099,0.0,0.0081979326156468,0.00014349816794693613 +0.13560116290484647,0.3582082092148615,0.0,0.9999999000000099,0.0,0.0040385719075441764,5.739926717877445e-05 +0.1389655172767317,0.37037140124654644,0.0,0.9999999000000099,0.0,0.002387106179899001,3.495812066495453e-05 +0.14290341734294437,0.38016229861425466,0.0,0.9999999000000099,0.0,0.0014976857595026642,2.4795529747009523e-05 +0.08361232280384981,0.033919006580266704,0.00035962458828986047,0.0011941491363376498,0.0,0.0,0.9992141916511516 +0.21844223140765706,0.08851185439501517,7.992982065081675e-05,7.748603045940476e-07,5.960463881492674e-08,7.423757764399125e-05,0.9999712897733788 +0.25905582307696534,0.08107870815796096,4.261731675267262e-06,3.278255134820971e-07,6.258487075567308e-07,0.00032222267743349395,0.9999466134529094 +0.26088941096179236,0.04883825778124899,1.3947485482692857e-05,1.4901159703731684e-07,4.470347911119505e-06,2.2619960430264698e-05,0.9999833299104194 +0.2697796225436081,0.0402739643981635,1.603364784121529e-05,8.940695822239011e-08,5.334615173935943e-06,8.85128886401662e-06,0.9999877406536917 +0.26563358305784834,0.03790840505904525,2.0295379516482556e-05,1.1920927762985348e-07,3.904103842377701e-06,5.602836048603113e-06,0.9999892903743008 +0.2567437291039013,0.03612580894805288,2.706050602197674e-05,1.7881391644478022e-07,2.413987872004533e-06,3.397464412450824e-06,0.9999907208856325 +0.24642518161706964,0.03459206222895516,3.629922503829038e-05,1.7881391644478022e-07,1.3113020539283883e-06,2.086162358522436e-06,0.9999919129784087 +0.24043944477039367,0.034141808742398964,4.2021270364523355e-05,2.682208746671703e-07,8.642672628164378e-07,1.6093252480030219e-06,0.999992151396964 +0.2353714406392864,0.033785402769025544,4.7475094816089145e-05,3.278255134820971e-07,6.258487075567308e-07,1.3113020539283883e-06,0.9999923898155193 +0.23180451988214038,0.03357136248967377,5.143880329728178e-05,2.9802319407463367e-07,5.364417493343406e-07,1.1622904568910714e-06,0.9999923898155193 +0.22909325360303207,0.03340923785591247,5.474686075151021e-05,3.5762783288956044e-07,4.172324717044872e-07,1.0728834986686813e-06,0.9999923898155193 +0.08683207630751592,0.033556133502936264,0.00029104945133328724,0.0019322333787828876,0.0,0.0,0.9987724020682553 +0.24818074702188891,0.28070363397560005,0.0,0.986069819071851,0.0,1.1920927762985348e-07,0.5784068125244616 +0.17403107880825397,0.4457784294318763,0.0,0.9999999000000099,0.0,0.0006652473738133973,0.00013819335509240765 +0.15042978524538847,0.43252143256410547,0.0,0.9999999000000099,0.0,0.0006263553469866576,7.003545060753892e-06 +0.16107869147587403,0.4607934950993186,0.0,0.9999999000000099,0.0,0.003633826607671416,7.599591448903159e-06 +0.16457182168279116,0.4646665751138379,0.0,0.9999999000000099,0.0,0.0021459160089344,5.185603576898626e-06 +0.16622769831922773,0.4788619875087918,0.0,0.9999999000000099,0.0,0.001495092957714215,3.7550922453403844e-06 +0.1694543659616875,0.48502659789363095,0.0,0.9999999000000099,0.0,0.0010004042578697304,2.9206273019314104e-06 +0.17227369546176913,0.491238087331578,0.0,0.9999999000000099,0.0,0.0007190405603438687,2.413987872004533e-06 +0.17493745683899342,0.49661764494021493,0.0,0.9999999000000099,0.0,0.0005418955737859064,1.996755400300046e-06 +0.17735993861417693,0.5015809535121342,0.0,0.9999999000000099,0.0,0.00042602415592968886,1.8179414838552655e-06 +0.1796000003740329,0.5058286189166803,0.0,0.9999999000000099,0.0,0.00034606453295946463,1.6391275674104854e-06 +0.11593258380409842,0.10711148379399091,0.00026822087466717035,0.0,0.0019992289928108652,0.9996898366688947,0.0 +0.05242615937969561,0.09310436247185024,0.0003995000916570465,0.0,0.004719852929198789,0.9931785067154745,0.0 +0.09864118694850643,0.06652471422009971,0.00017759202134907422,0.0,0.010535626549968228,0.9965990977277854,0.0 +0.09874629973956348,0.08389613030904407,0.0001698136159837263,0.0,0.003899812308383027,0.998291988679407,0.0 +0.09782198071074738,0.08418017624367255,0.00015264748000502737,0.0,0.0016810594308167863,0.9993424608338813,0.0 +0.10115790366707593,0.09310290215805349,0.00011584161553681011,0.0,0.0005351304472804122,0.9997751905116776,0.0 +0.09773847460342051,0.09975555537422999,0.00010794400089383233,0.0,0.0002814829068034915,0.9998461200318675,0.0 +0.08206588029521633,0.10308116672658106,0.00013929604091048378,0.0,0.00031784173648059685,0.9997159435006956,0.0 +0.053339093921360076,0.09820485113369658,0.00028625127790868566,0.0,0.0015236137773871573,0.9970072702943901,0.0 +0.09311467408748345,0.08000877498210351,0.0001608431178420798,0.0,0.43913783211999974,0.3168109636592509,8.940695822239011e-08 +0.2621689438711327,0.031814575189864726,3.871321291029492e-05,0.0,0.99997474684243,2.65240642726424e-06,8.940695822239011e-08 +0.20245057343598344,0.019756495949223195,0.0001745223824501055,0.0,0.9999991847443441,1.1920927762985348e-07,8.940695822239011e-08 +0.34106621144789806,0.2711395620835457,0.9999996615814547,1.1920927762985348e-07,5.960463881492674e-08,0.0,2.9802319407463367e-07 +0.6652250289641537,0.4926170705905429,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.6046331524598573,0.39550405733965494,0.9999999000000099,0.0,4.172324717044872e-07,0.0,1.1920927762985348e-07 +0.590317487692231,0.31875550741459513,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.4901159703731684e-07 +0.5739749073744569,0.3624039887761395,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5718334913017,0.34672951692365994,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5724120735885109,0.3523027896277837,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5748352408171092,0.34460252517521434,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5776608586072144,0.34302580350724093,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5795619487522468,0.34103953832508593,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5797827839611305,0.34131988877173897,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5837706327196628,0.3405930995357947,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 +0.314080178724635,0.031041502947260286,8.761881905794231e-06,3.5762783288956044e-07,0.0101218213449956,3.3378597736358976e-05,0.9946483571086505 +0.2953580617782362,0.04835617541438818,1.9073484420776557e-06,2.086162358522436e-07,0.0010391472730994329,4.887580382823993e-05,0.9997481300056557 +0.25175398587138087,0.04616823791667018,9.536742210388278e-07,3.5762783288956044e-07,0.0005215703919500165,6.496905630827015e-05,0.9995880319457988 +0.1920000910679469,0.04439640044405793,2.9802319407463367e-07,6.854533463716575e-07,0.0027140972284376893,0.00017449258013069803,0.9941176374046424 +0.08884948491682265,0.04100871085418392,1.4901159703731684e-07,4.291533994674725e-06,0.09166811980047317,0.00044420357076824154,0.4861554315308649 +0.04386490583238165,0.03971356152808123,2.086162358522436e-07,1.582503160536305e-05,0.6148006301245512,0.00017639992857277568,0.020274011253467405 +0.039474964140211136,0.04219120740168041,3.5762783288956044e-07,2.2888181304931868e-05,0.7826736382777411,0.00015529988643229163,0.015232710507139716 +0.04025915264916609,0.04349973797053289,2.682208746671703e-07,2.6166436439752837e-05,0.769673389715095,0.00018334386899471466,0.0172224325600596 +0.04111617803403356,0.043562978498628745,2.086162358522436e-07,2.601742484271552e-05,0.6704322025299914,0.00018814204241931624,0.02345964077956998 +0.04542645811846506,0.04362717270104085,2.086162358522436e-07,2.2619960430264698e-05,0.4288784432686193,0.00019907949364185532,0.05270987222001009 +0.0528712570645374,0.043653130523836084,1.1920927762985348e-07,1.8119810199737728e-05,0.17727787510020016,0.00020757315467298236,0.1332356200496985 +0.06528338789669556,0.04342898725719661,2.086162358522436e-07,1.2159346318245055e-05,0.04015287355391125,0.00017163155746758153,0.4077373335319917 +0.10367372631597382,0.021800607439122804,9.536742210388278e-07,8.642672628164378e-07,0.9985698655055623,3.16500632107261e-05,7.51018449068077e-05 +0.39029386637978913,0.06679981945801343,1.2218950957059981e-06,1.7881391644478022e-07,0.9999985290933172,0.0002446472400158668,0.0 +0.37003266809838625,0.061607271422327255,1.2516974151134616e-06,1.7881391644478022e-07,0.999992151396964,0.00014382599346041822,0.0 +0.325505673871867,0.05041778086752637,2.9206273019314104e-06,1.1920927762985348e-07,0.9999934626990179,1.41561017185451e-05,0.0 +0.32016628979310857,0.04270145296319277,5.364417493343406e-06,1.1920927762985348e-07,0.9999984694886783,4.440545591712042e-06,0.0 +0.30616092680617024,0.041128963224997685,1.2099741679430129e-05,2.980231940746337e-08,0.9999994827675383,2.0563600391149723e-06,0.0 +0.2921804487584245,0.039020419114106905,2.4527308872342353e-05,0.0,0.9999997211860935,1.132488137483608e-06,0.0 +0.28047385810644343,0.037592113011598795,4.1604037892818864e-05,0.0,0.9999997211860935,8.642672628164378e-07,0.0 +0.27332615851224173,0.0370699465211334,5.581974425017889e-05,0.0,0.9999997807907323,8.046626240015109e-07,0.0 +0.2678602337726304,0.03665360807744859,6.794928824901649e-05,0.0,0.9999999000000099,6.556510269641942e-07,0.0 +0.26721435784187103,0.037145644419985184,7.066129931509565e-05,0.0,0.9999999000000099,7.450579851865842e-07,0.0 +0.2601190805327471,0.03574088215215932,8.580087757408705e-05,0.0,0.9999998403953712,6.258487075567308e-07,0.0 +0.18358629941180118,0.6381395458082391,3.2782551348209707e-06,0.9999999000000099,8.940695822239011e-08,5.960463881492674e-08,0.0 +0.16624835132864155,0.43639102570690597,5.960463881492674e-08,0.9999999000000099,0.0,1.600384552180783e-05,8.940695822239011e-08 +0.18354931472971958,0.5281151532222512,0.0,0.9999999000000099,0.0,1.4275310996174954e-05,0.0 +0.1752057969497611,0.598763286964884,0.0,0.9999999000000099,0.0,1.2665985748171932e-05,8.940695822239011e-08 +0.17826429008699407,0.609908223047723,0.0,0.9999999000000099,0.0,1.1742113846540568e-05,0.0 +0.18163755535327286,0.6111845373060798,2.980231940746337e-08,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 +0.18386900424195915,0.6109064816382502,5.960463881492674e-08,0.9999999000000099,0.0,1.141428833305847e-05,1.1920927762985348e-07 +0.18542218207545197,0.6104634403137106,2.980231940746337e-08,0.9999999000000099,0.0,1.1831520804762957e-05,2.980231940746337e-08 +0.1866308450621573,0.6101400851158595,0.0,0.9999999000000099,0.0,1.2487171831727152e-05,0.0 +0.18767389654336106,0.6095618008523477,0.0,0.9999999000000099,0.0,1.3321636775136126e-05,1.1920927762985348e-07 +0.18862724303418155,0.6084691881091571,2.980231940746337e-08,0.9999999000000099,0.0,1.4394520273804807e-05,0.0 +0.18947786091973592,0.6073710321340033,2.980231940746337e-08,0.9999999000000099,0.0,1.555681073069588e-05,2.980231940746337e-08 +0.17998445033281824,0.5737904905290357,1.6093252480030219e-06,0.9999999000000099,0.0,0.0,0.0 +0.1448459923207387,0.3821454047502371,2.980231940746337e-08,0.9999999000000099,0.0,6.139277797937454e-06,0.0 +0.1017985343890953,0.5281236170818079,0.0016187129786163728,0.04375052014582201,0.0,0.00014781950426101832,2.086162358522436e-06 +0.027597248553086998,0.14734354612688447,2.086162358522436e-07,0.0002329349284887337,1.9490716892481042e-05,0.013743190583154695,0.00045803184697330455 +0.11599898337837546,0.04330867528173809,1.5586613050103344e-05,2.1159646779298993e-06,3.904103842377701e-06,6.675719547271795e-06,0.9983227446730355 +0.2233844101336487,0.038193821900503334,1.8388031074404898e-05,6.258487075567308e-07,7.152556657791209e-07,2.1159646779298993e-06,0.9999381495941977 +0.24701079725196362,0.0353954434334227,2.765655241012601e-05,2.682208746671703e-07,9.238719016313645e-07,1.6689298868179488e-06,0.9999740315867642 +0.26227292417393905,0.03556239604340998,1.972913544774075e-05,2.086162358522436e-07,1.5497206091880952e-06,2.354383233189606e-06,0.9999752236795405 +0.2646323740372752,0.03505524992342541,2.0802018946409432e-05,1.7881391644478022e-07,1.6391275674104854e-06,2.264976274967216e-06,0.9999789191671471 +0.26298660038812766,0.03449276089077637,2.3394820734858744e-05,2.086162358522436e-07,1.4305113315582417e-06,1.9669530808925826e-06,0.9999817801898102 +0.25827518104437436,0.033968478435421806,2.7537343132496152e-05,2.086162358522436e-07,1.1026858180761447e-06,1.6093252480030219e-06,0.999984104770724 +0.25259977578070864,0.03355365991017851,3.224610959887537e-05,2.682208746671703e-07,7.748603045940476e-07,1.3113020539283883e-06,0.9999858333052496 +0.18339326976970408,0.6331337093222799,3.0994412183761904e-06,0.9999999000000099,5.960463881492674e-08,8.940695822239011e-08,0.0 +0.17937159537526307,0.48997497550203656,8.940695822239011e-08,0.9999999000000099,0.0,2.0235774877667628e-05,5.960463881492674e-08 +0.1812821924611367,0.577404022117925,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 +0.1766016185210534,0.6322665809502359,0.0,0.9999999000000099,0.0,1.1295079055428617e-05,1.1920927762985348e-07 +0.18143171071254957,0.6396626829005686,0.0,0.9999999000000099,0.0,1.0639428028464424e-05,0.0 +0.18521836399265096,0.6412618159149737,0.0,0.9999999000000099,0.0,1.043081179261218e-05,8.940695822239011e-08 +0.18780294059929442,0.6415449975822531,8.940695822239011e-08,0.9999999000000099,0.0,1.0788439625501739e-05,1.1920927762985348e-07 +0.18968865274597538,0.6405357121324442,5.960463881492674e-08,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 +0.19107663630648003,0.6392754315235292,1.1920927762985348e-07,0.9999999000000099,0.0,1.2397764873504761e-05,2.980231940746337e-08 +0.1921806633392865,0.6378600596289351,5.960463881492674e-08,0.9999999000000099,0.0,1.3560055330395832e-05,8.940695822239011e-08 +0.1931230127731464,0.6364380120141273,0.0,0.9999999000000099,0.0,1.4901159703731685e-05,2.980231940746337e-08 +0.19399169086606696,0.6348611115322197,2.980231940746337e-08,0.9999999000000099,0.0,1.645088031291978e-05,8.940695822239011e-08 +0.7018045186705858,0.41342890255524406,0.9999997211860935,3.8146968841553113e-06,2.682208746671703e-07,6.258487075567308e-07,2.8699633589387225e-05 +0.43685561416724406,0.428442537711212,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5540542006263194,0.3304263650805196,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5337710380333176,0.36994463199002775,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5785911679028302,0.32638823980464554,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5682818889382607,0.35412377113000487,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.579825937723946,0.34408825630018036,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5898265838378813,0.35854512446939674,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5977641343822914,0.3809793888870182,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.6057027578103074,0.4180889128922757,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,5.960463881492674e-08 +0.6026992797601998,0.49044358721918047,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5914930104964427,0.651442348845512,0.9999999000000099,1.1920927762985348e-07,8.940695822239011e-08,0.0,0.0 +0.23493564127902916,0.031813502306258956,2.682208746671703e-06,1.4901159703731684e-07,0.9998926116501431,2.0176170238852703e-05,2.682208746671703e-07 +0.3919492363767451,0.06409940122460438,9.238719016313645e-07,1.1920927762985348e-07,0.9999975158144573,0.00016999242990017107,0.0 +0.3777964413009609,0.07757833598715837,6.854533463716575e-07,2.9802319407463367e-07,0.9999557925672868,0.0018758473904639669,0.0 +0.2709677815325115,0.09200173614833909,1.9669530808925826e-06,1.1920927762985348e-07,0.995810528356264,0.1053731038101475,0.0 +0.11757308244218356,0.10108950732407482,6.392597512900893e-05,0.0,0.021982846445971947,0.9998258544546703,0.0 +0.18820512293989972,0.1461634039628562,8.04662624001511e-06,0.0,8.0138436886669e-05,0.9999977542330126,1.1920927762985348e-07 +0.22367924450901797,0.1656166910841589,4.2319293558597985e-06,0.0,1.636147335469739e-05,0.9999993039536218,5.960463881492674e-08 +0.25022697447694336,0.18220490214088875,3.3378597736358976e-06,0.0,1.069903266727935e-05,0.9999996019768158,3.5762783288956044e-07 +0.25884139536739476,0.1942695974970992,3.4868713706732143e-06,0.0,9.953974682092765e-06,0.9999997807907323,5.960463881492673e-07 +0.26074504851215236,0.1986383199351634,3.933906161785165e-06,0.0,9.626149168610668e-06,0.9999997807907323,7.748603045940476e-07 +0.26036867498273375,0.19781097766350025,4.440545591712042e-06,0.0,9.000300461053937e-06,0.9999997807907323,8.046626240015109e-07 +0.25783982871895295,0.19246715303940004,4.827975744009066e-06,0.0,8.22544015645989e-06,0.9999997211860935,7.450579851865842e-07 +0.11599770187851284,0.1070731580074069,0.00026610490998924045,0.0,0.0019772348810881573,0.9996994926203827,0.0 +0.2179094552903543,0.19078251716207925,1.141428833305847e-05,0.0,5.686282542944011e-05,0.9999997211860935,2.682208746671703e-07 +0.24369642137472047,0.18858313557256634,5.692243006825504e-06,0.0,1.1444090652465934e-05,0.9999997807907323,5.66244068741804e-07 +0.2675999998935519,0.20472627874683455,4.678964146971749e-06,0.0,8.702277266979305e-06,0.9999998403953712,1.3113020539283883e-06 +0.2776858210448676,0.22463080283133208,4.857778063416529e-06,0.0,9.179114377498718e-06,0.9999997807907323,2.5331971496343865e-06 +0.28490257262003876,0.2359925806118267,5.1259989380836994e-06,0.0,8.94069582223901e-06,0.9999999000000099,3.904103842377701e-06 +0.29139345883116524,0.24001419540110083,5.185603576898626e-06,0.0,8.1360331982375e-06,0.9999999000000099,4.917382702231456e-06 +0.2976108193274288,0.2388011514731622,5.096196618676236e-06,0.0,7.092952018976282e-06,0.9999999000000099,5.75184764564043e-06 +0.30159229038897045,0.23133710022779724,4.917382702231456e-06,0.0,5.632638368010577e-06,0.9999999000000099,5.6624406874180405e-06 +0.3062327206007992,0.22357180710778904,4.589557188749359e-06,0.0,4.589557188749359e-06,0.9999999000000099,5.334615173935943e-06 +0.307526171194694,0.21322217580005198,4.380940952897116e-06,0.0,3.6060806483030677e-06,0.9999997807907323,4.678964146971749e-06 +0.307056844221752,0.20405760403953632,4.261731675267262e-06,0.0,2.980231940746337e-06,0.9999999000000099,4.053115439415018e-06 +0.35271069406002575,0.28665953869679395,0.00048503274835646636,2.086162358522436e-07,7.119774106442998e-05,0.9999996615814547,1.1026858180761447e-06 +0.31421416996608453,0.17488798496112665,1.0818241944909203e-05,0.0,5.930661562085211e-06,0.9999997807907323,1.9669530808925826e-06 +0.3303927183014437,0.20195671912549787,5.632638368010577e-06,0.0,2.9206273019314104e-06,0.9999998403953712,6.407498672604624e-06 +0.34860119222151187,0.180738300054119,4.321336314082188e-06,0.0,1.4901159703731685e-06,0.9999997211860935,4.410743272304579e-06 +0.35841056703037083,0.16610062119500743,3.8146968841553113e-06,0.0,1.1622904568910714e-06,0.9999997807907323,3.367662093043361e-06 +0.3634809851495914,0.15777605769316752,3.904103842377701e-06,0.0,8.940695822239011e-07,0.9999997211860935,2.65240642726424e-06 +0.36749404667286273,0.15333822366949812,4.2319293558597985e-06,0.0,8.642672628164378e-07,0.9999997807907323,2.324580913782143e-06 +0.3704485893096117,0.15249454972516932,4.947185021638919e-06,0.0,8.642672628164378e-07,0.9999996615814547,1.9073484420776557e-06 +0.37452787159322576,0.15601244566153286,6.675719547271795e-06,0.0,8.046626240015109e-07,0.999999542372177,1.4305113315582417e-06 +0.3793518841109551,0.1710148155396402,1.2308357915282372e-05,0.0,8.344649434089744e-07,0.9999986483025948,8.046626240015109e-07 +0.3846518397171962,0.19088220593044902,2.3901460164785624e-05,0.0,8.642672628164378e-07,0.9999966217448751,5.066394299268773e-07 +0.39463049171721026,0.21022960540032637,4.887580382823993e-05,0.0,8.046626240015109e-07,0.9999903632577996,2.9802319407463367e-07 +0.4540750384142727,0.33147454256103775,0.9999996615814547,3.5762783288956044e-07,2.980231940746337e-08,0.0,1.8775461226701922e-06 +0.5823618769404548,0.4720369576599544,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5616631507640963,0.3445932566529534,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5682095288995064,0.3240887820165719,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5761791467428043,0.35011860722268595,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5813463926074585,0.3474802672267998,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5882411002869216,0.35001808398928946,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.5893328189605824,0.35568845265973575,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5901355147117393,0.35789725178312154,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5930605530493257,0.35892891877703975,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5924597382300146,0.36045518511321945,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5916404723876109,0.36109483235851697,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.09545442461572212,0.020918071266407105,8.642672628164378e-07,1.4603136509657052e-06,0.9941003520593861,4.389881648719354e-05,0.0007168649910271239 +0.16362863778390443,0.050729125729457314,5.543231409788187e-06,1.1026858180761447e-06,0.008939116299310415,8.22544015645989e-06,0.9949909645725588 +0.2567471861732981,0.04146161674743217,5.0067896604538464e-06,4.4703479111195056e-07,4.6849246108532416e-05,3.635882967710531e-06,0.9998913003480892 +0.25126737355145473,0.03723526000338964,1.0371207153797252e-05,4.4703479111195056e-07,5.21540589630609e-06,1.519918289780632e-06,0.999964792867748 +0.24115660785630147,0.035878092044408776,1.7553566130995923e-05,4.768371105194139e-07,1.698732206225412e-06,1.1026858180761447e-06,0.9999782039114813 +0.2377476692101261,0.035711824887836294,2.378225088715577e-05,3.874301522970238e-07,9.834765404462913e-07,1.1026858180761447e-06,0.99998279346867 +0.23772180079429467,0.03575178980215135,2.846121503412752e-05,3.874301522970238e-07,7.152556657791209e-07,1.2516974151134616e-06,0.9999849988403062 +0.23188024758332437,0.03434607386000925,3.7819143328071015e-05,4.172324717044872e-07,4.768371105194139e-07,9.238719016313645e-07,0.9999880386768858 +0.22260189055474738,0.032675117248662074,5.099176850616983e-05,3.874301522970238e-07,2.682208746671703e-07,6.258487075567308e-07,0.9999906016763548 +0.2157200872808777,0.03197517990518452,6.189941740930142e-05,5.066394299268773e-07,1.7881391644478022e-07,4.4703479111195056e-07,0.9999917341644923 +0.20873811840146708,0.031419038767202964,7.26580547153957e-05,4.768371105194139e-07,1.7881391644478022e-07,3.5762783288956044e-07,0.9999926282340745 +0.20793902873131892,0.03189751505305548,7.578729825317935e-05,5.66244068741804e-07,1.1920927762985348e-07,4.172324717044872e-07,0.9999925090247969 +0.7034359574026655,0.4138351678139635,0.9999996615814547,3.784894564747848e-06,2.682208746671703e-07,6.258487075567308e-07,2.9146668380499176e-05 +0.48620501158608376,0.44455158702867453,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5703236460449572,0.3045013546422251,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5121624469545005,0.36359482997390313,0.9999999000000099,0.0,2.980231940746337e-08,0.0,5.960463881492674e-08 +0.5692796706917594,0.3275834917461218,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5404403209462495,0.3647761642308267,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5608558058506471,0.3359025716206433,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5513003468285208,0.3532829582086248,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5566065907247855,0.34479546541031925,0.9999999000000099,0.0,2.980231940746337e-08,0.0,5.960463881492674e-08 +0.5552207231291701,0.348249733388396,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5555225610503003,0.34720253938451645,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5603541135555934,0.3453855215911722,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.6862041949941688,0.4090703725114347,0.9999997211860935,3.397464412450824e-06,2.3841855525970696e-07,4.4703479111195056e-07,2.4735925108194598e-05 +0.5022844671995079,0.45754951230797347,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5783995389698852,0.30227017397473,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5304191708345124,0.3499490916129738,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5739073157072844,0.32549726957469555,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5639697313075188,0.34557723993105943,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5753529071569621,0.33078092330990533,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5743181705237042,0.33835116022991946,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5740282535315286,0.3380398153679885,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5744261741400326,0.339394539536534,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.575056314444572,0.34102755779148813,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.576756954169233,0.3417261242281361,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.6972918510148278,0.4123636781463231,0.9999997211860935,3.6656852871179947e-06,2.3841855525970696e-07,5.66244068741804e-07,2.7298924577236446e-05 +0.5767946243047295,0.4278260468704057,0.9999999000000099,0.0,6.258487075567308e-07,0.0,1.7881391644478022e-07 +0.5849464535470983,0.3132616877019433,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.55236494538881,0.34128975862381017,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5805754065273208,0.33205834025419034,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5772652625798566,0.3373761772531729,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5750548839330974,0.33777251833853905,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5769037008046639,0.3383649587051826,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5777569412945883,0.3402684926404035,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5793671607731289,0.3403159379376366,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5820496082064894,0.34126409882423875,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5837607383486305,0.34245842689372114,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.3160087466109077,0.04139524697548614,2.8610226631164835e-06,2.980231940746337e-08,0.9998932076965312,3.388523716628585e-05,1.1920927762985348e-07 +0.2882383465647554,0.03797969221418441,2.9385086935758882e-05,0.0,0.9999996615814547,1.1026858180761447e-06,0.0 +0.31140229104659956,0.04439935087397381,1.0788439625501739e-05,0.0,0.9999997807907323,2.5629994690418497e-06,0.0 +0.3142695426810786,0.045526206485582,1.0281800195574863e-05,2.980231940746337e-08,0.9999996615814547,3.2484528154135075e-06,0.0 +0.3241834342345469,0.046274751416865566,6.467103311419552e-06,2.980231940746337e-08,0.999999542372177,4.7385687857866755e-06,0.0 +0.33196467159804,0.047967642537486324,4.678964146971749e-06,2.980231940746337e-08,0.9999994231628994,7.3611728936434526e-06,0.0 +0.3378512859204586,0.04918998479000834,3.6060806483030677e-06,5.960463881492674e-08,0.9999990655350666,1.0907648903131594e-05,0.0 +0.34501510857107137,0.0511633157642493,2.5629994690418497e-06,8.940695822239011e-08,0.9999984694886783,1.9401309934258653e-05,0.0 +0.34766286610117414,0.05330300330202988,2.1457669973373625e-06,5.960463881492674e-08,0.9999973966051797,3.0457970434427562e-05,0.0 +0.3544637560697646,0.056454479684699466,1.519918289780632e-06,1.7881391644478022e-07,0.9999944163732389,7.373093821406438e-05,0.0 +0.3615155815928491,0.0665690898781274,9.536742210388278e-07,1.4901159703731684e-07,0.9999748660517077,0.0004509686972737357,0.0 +0.3345520496229878,0.08784678576872525,8.642672628164378e-07,2.086162358522436e-07,0.9993645741548817,0.015675245148021138,0.0 +0.2628924846540312,0.03425106405625354,2.8908249825239467e-06,0.0,0.9999065591356258,2.1964309403300505e-05,1.1920927762985348e-07 +0.14141130446802141,0.017949104306008514,4.565715333223388e-05,0.0,0.9999988867211501,1.7881391644478022e-07,1.4901159703731684e-07 +0.19008904694723747,0.03527319430700931,4.5329327818751785e-05,5.960463881492674e-08,0.9999999000000099,6.556510269641942e-07,5.960463881492674e-08 +0.1872997879904438,0.03422898053536804,7.593630985021666e-05,2.980231940746337e-08,0.9999997807907323,5.66244068741804e-07,8.940695822239011e-08 +0.1649673283031819,0.029053211207183273,5.942582489848196e-05,0.0,0.9999998403953712,4.172324717044872e-07,1.4901159703731684e-07 +0.15107765793174774,0.02927920221781047,4.512071158289954e-05,1.1920927762985348e-07,0.9999997807907323,4.768371105194139e-07,1.7881391644478022e-07 +0.145920395845093,0.030595839018351004,3.713368998169936e-05,1.4901159703731684e-07,0.9999998403953712,6.258487075567308e-07,2.086162358522436e-07 +0.1404236555041341,0.03077676891753572,3.212690032124551e-05,8.940695822239011e-08,0.9999997807907323,7.152556657791209e-07,2.086162358522436e-07 +0.139803171152048,0.03127160667837628,2.95340985327962e-05,1.4901159703731684e-07,0.9999997807907323,7.748603045940476e-07,2.682208746671703e-07 +0.13662803172499438,0.0310805141872591,2.8163191840052885e-05,1.1920927762985348e-07,0.9999997211860935,8.344649434089744e-07,2.9802319407463367e-07 +0.13855364918135082,0.03145840763507037,2.8014180243015567e-05,1.1920927762985348e-07,0.9999997807907323,8.046626240015109e-07,2.9802319407463367e-07 +0.1422692239225605,0.031737655395795254,3.024935419857532e-05,8.940695822239011e-08,0.9999997211860935,8.046626240015109e-07,2.682208746671703e-07 +0.3382471799710403,0.2917903661228258,0.0006537436785221165,8.940695822239011e-08,8.293985491097056e-05,0.9999994827675383,8.344649434089744e-07 +0.3225923180446561,0.16631940004361806,1.3381241413951053e-05,0.0,5.364417493343406e-06,0.9999996615814547,1.2814997345209249e-06 +0.33912414310958433,0.18688589331287772,5.57303372919565e-06,0.0,2.4735925108194595e-06,0.9999997807907323,4.529952549934432e-06 +0.34839290379035287,0.17618343231045316,4.470347911119505e-06,0.0,1.5497206091880952e-06,0.9999998403953712,3.993510800600092e-06 +0.3542088270040708,0.16729015109058623,4.112720078229945e-06,0.0,1.1920927762985347e-06,0.9999997807907323,3.457069051265751e-06 +0.35587155817465627,0.16294008490633355,3.993510800600092e-06,0.0,1.1026858180761447e-06,0.9999998403953712,3.2484528154135075e-06 +0.35748666523406813,0.1601831614696871,3.993510800600092e-06,0.0,9.536742210388278e-07,0.9999997211860935,3.039836579561264e-06 +0.36036610601840324,0.1574769913880582,4.053115439415018e-06,0.0,9.238719016313645e-07,0.9999996615814547,2.8908249825239467e-06 +0.3634681701509652,0.1552190184327411,4.142522397637409e-06,0.0,9.238719016313645e-07,0.9999997807907323,2.712011066079167e-06 +0.367534399017374,0.15295016762975439,4.500150230526969e-06,0.0,9.238719016313645e-07,0.9999997807907323,2.324580913782143e-06 +0.3725674748266444,0.15254068372021756,5.3942198127508695e-06,0.0,8.046626240015109e-07,0.9999996615814547,1.8775461226701922e-06 +0.3775780796848353,0.16057035324208174,8.434056392312133e-06,0.0,7.748603045940476e-07,0.9999991847443441,1.2218950957059981e-06 +0.4479882716947066,0.25128611917961197,5.316733782291465e-05,1.4901159703731684e-07,2.7805564007163326e-05,0.9999999000000099,6.377696353197161e-06 +0.19674655794282667,0.17057132718026485,2.819299415946035e-05,0.0,1.609325248003022e-05,0.999999542372177,3.874301522970238e-07 +0.25220060347466433,0.16373354193744769,8.85128886401662e-06,0.0,4.321336314082188e-06,0.9999996615814547,8.642672628164378e-07 +0.25674426554570423,0.16767680642117797,8.67247494757184e-06,0.0,4.172324717044872e-06,0.9999997211860935,1.1026858180761447e-06 +0.25311833619023305,0.16682288047794958,9.417532932758424e-06,0.0,4.202127036452335e-06,0.9999997807907323,1.0728834986686813e-06 +0.24702766536643433,0.1613507568559923,1.0311602514982325e-05,0.0,4.261731675267262e-06,0.9999996615814547,8.046626240015109e-07 +0.2374531328579807,0.15260985491046755,1.1563299930095787e-05,0.0,4.172324717044872e-06,0.999999542372177,5.66244068741804e-07 +0.22224122284922646,0.14209201929520315,1.4126299399137637e-05,0.0,4.380940952897116e-06,0.9999991847443441,3.5762783288956044e-07 +0.1936424672523424,0.12937650082280164,2.2113321000337822e-05,0.0,5.57303372919565e-06,0.9999980522562066,1.1920927762985348e-07 +0.15063589810701325,0.11643937228116318,4.9471850216389196e-05,0.0,1.0251997876167399e-05,0.9999936415129344,2.980231940746337e-08 +0.09758895635200765,0.11023372409840317,0.00013470648372173444,0.0,2.0384786474704945e-05,0.9999726010754327,8.940695822239011e-08 +0.027910530566013475,0.1262319683812472,0.00027236339706480776,0.0,2.2083518680930358e-05,0.9997532560045937,1.1920927762985348e-07 +0.689573407144603,0.41008582704197677,0.9999996615814547,3.367662093043361e-06,2.3841855525970696e-07,5.66244068741804e-07,2.5689599329233425e-05 +0.5622217654949081,0.4341092704983276,0.9999999000000099,0.0,5.364417493343406e-07,0.0,8.940695822239011e-08 +0.5799249410389139,0.3133740424573257,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 +0.5495926737557766,0.34232234948972223,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5776225328206254,0.33335912221922337,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5757641792058952,0.3395555018797224,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5809078216312193,0.33663296693759587,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5817934274432555,0.3395551740541762,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.583700478052765,0.3410486876380574,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5856894254441928,0.34217542404037604,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5874040722603754,0.3442229031927049,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5904430150741229,0.34535783523367874,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.08607077598215378,0.03297784923942444,0.0003422796383947168,0.00039234753499925527,0.0,2.980231940746337e-08,0.9997475339592675 +0.27278268336120226,0.09776514766926381,7.271765935421062e-06,5.66244068741804e-07,1.4901159703731684e-07,0.000940114165708432,0.9999423815235535 +0.25115022062215353,0.06027978657643946,1.1205672097206226e-05,2.086162358522436e-07,3.2782551348209707e-06,6.41941960036761e-05,0.9999816609805325 +0.28199297188544853,0.04654148220218977,8.344649434089744e-06,8.940695822239011e-08,1.2278555595874908e-05,3.0040737962723075e-05,0.9999827338640312 +0.2977597713347163,0.04536092280564814,4.947185021638919e-06,1.7881391644478022e-07,3.07559936285022e-05,4.2647119072080084e-05,0.9999730779125432 +0.28750818966628705,0.04279568790656653,1.8775461226701922e-06,1.7881391644478022e-07,0.00016194580366015596,8.699297035038557e-05,0.9998758031419973 +0.14527770876282897,0.029895782465583918,1.4901159703731684e-07,4.4703479111195056e-07,0.2064540477769127,0.000533759540587669,0.5659062296490011 +0.18752136825738713,0.03669509291020516,1.7464159172773534e-05,8.940695822239011e-08,0.9999805880970339,9.745358446240521e-06,1.2516974151134616e-06 +0.3131735920776389,0.04742044209621955,9.980796769559483e-05,0.0,0.9999996615814547,6.3180917143822346e-06,2.980231940746337e-08 +0.3532074391695633,0.041196614496806165,1.856684499084968e-05,2.980231940746337e-08,0.9999985290933172,1.7255542936921292e-05,0.0 +0.35799229143567685,0.05200317501131312,1.2546776470542079e-05,8.940695822239011e-08,0.9999916149552147,6.237625451982083e-05,0.0 +0.3606962263434781,0.05928882955489589,6.526707950234478e-06,8.940695822239011e-08,0.9999144269479493,0.0005311965411186271,0.0 +0.43822211025330804,0.2555674612084504,7.122754338383745e-05,1.4901159703731684e-07,3.060698203146488e-05,0.9999999000000099,5.543231409788187e-06 +0.45931527016645135,0.32944649452290237,0.0005950033069700061,5.960463881492674e-08,1.0550021070242033e-05,0.9999656869373301,5.960463881492674e-08 +0.3929245471791644,0.28632110352381723,0.00836664354581245,0.0,2.65240642726424e-06,0.9924740990939597,0.0 +0.3746533393704728,0.311073571390291,0.9995569779289762,3.874301522970238e-07,4.172324717044872e-07,0.00022557375559509026,0.0 +0.7201376557051966,0.5079116820419339,0.9999999000000099,1.1920927762985348e-07,5.960463881492674e-08,0.0,0.0 +0.7629979848545754,0.6226083039171303,0.9999999000000099,3.278255134820971e-07,1.1920927762985348e-07,0.0,0.0 +0.7485330700564378,0.5578370093344104,0.9999999000000099,2.3841855525970696e-07,2.3841855525970696e-07,0.0,0.0 +0.7150611281098868,0.4983288048844562,0.9999999000000099,1.1920927762985348e-07,8.940695822239011e-08,0.0,0.0 +0.6530489921299412,0.47258436671747783,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.617482185338201,0.4220217763654944,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.6268519758918596,0.37215119593923485,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 +0.6343514919018335,0.35928347700642543,0.9999999000000099,0.0,9.536742210388278e-07,0.0,1.4901159703731684e-07 +0.10741001367124209,0.0221224725208548,1.1026858180761447e-06,8.344649434089744e-07,0.9988670542346935,2.9683110129833516e-05,5.0693745312095194e-05 +0.1474837958751644,0.028439581389325702,2.8073784881830496e-05,2.980231940746337e-08,0.9999994827675383,6.258487075567308e-07,2.9802319407463367e-07 +0.2459758222001266,0.04760083555360138,4.276632834970993e-05,5.960463881492674e-08,0.9999999000000099,2.026557719707509e-06,0.0 +0.257620513428511,0.04193666576621069,8.645652860105124e-05,0.0,0.9999998403953712,1.0728834986686813e-06,2.980231940746337e-08 +0.2539591193093999,0.03680589794482363,8.943676054179758e-05,0.0,0.9999997807907323,6.258487075567308e-07,0.0 +0.24672085045746572,0.03476724027992004,0.00010016559552848438,0.0,0.9999997807907323,5.066394299268773e-07,0.0 +0.23334354161249962,0.03239199518602745,0.00011295079055428617,0.0,0.9999997807907323,4.172324717044872e-07,0.0 +0.22151598333395192,0.031463563436842555,0.000113904464775325,0.0,0.9999999000000099,3.278255134820971e-07,5.960463881492674e-08 +0.22106191515007179,0.03324198722270136,0.0001111328490704309,0.0,0.9999997807907323,4.768371105194139e-07,0.0 +0.2243463694956389,0.03450676798229618,0.00011217593024969213,0.0,0.9999997807907323,5.364417493343406e-07,1.1920927762985348e-07 +0.2211451232341748,0.03351420163534395,0.00011491774363517876,0.0,0.9999997807907323,4.768371105194139e-07,8.940695822239011e-08 +0.20554500817401447,0.03059324621630372,0.0001108944305151712,0.0,0.9999997807907323,4.172324717044872e-07,2.980231940746337e-08 +0.6731059550960296,0.40573537342753313,0.9999996615814547,3.039836579561264e-06,1.1920927762985348e-07,3.874301522970238e-07,2.1964309403300505e-05 +0.5286674499292809,0.4449541269970962,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.5839239954706635,0.30842328066312946,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5414279699101369,0.34410226339170014,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.579870581602881,0.32755643123739836,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5742709040403992,0.34070056671030635,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5826795696970944,0.3331409990217052,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5769439935445304,0.340647101343952,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5782925486325178,0.3410055636775698,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5770292281865558,0.3430546223529849,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5793958306072646,0.3437283038504434,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5794471502064141,0.3448884784584753,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.25199377535730233,0.11783927677044068,7.68899840712555e-06,8.940695822239011e-08,0.5445988825747187,0.37768747605952996,0.0 +0.11533600091456624,0.0892570316638695,6.72042302638299e-05,0.0,0.0024051961877793312,0.9998467160782556,0.0 +0.143351584666992,0.11715051529785658,2.3245809137821427e-05,0.0,9.655951488018132e-05,0.9999877406536917,0.0 +0.1385996937694379,0.12264946100995819,2.273916970789455e-05,0.0,4.398822344541593e-05,0.9999886943279127,0.0 +0.1157217323732142,0.12002217767567601,3.656744591295756e-05,0.0,5.1796431130171335e-05,0.9999774886558155,0.0 +0.0755779743163285,0.11964216826297558,7.003545060753892e-05,0.0,8.517502886653031e-05,0.9999143077386717,0.0 +0.04285341501058516,0.11107775567060056,0.0001288652291178716,0.0,0.00038367506005168345,0.9990697100066642,8.940695822239011e-08 +0.0751399099795699,0.0814047753671489,0.00018563864758908933,0.0,0.047111148891485204,0.9416814100814317,2.980231940746337e-08 +0.2632409334073737,0.06792068480282272,7.3611728936434526e-06,0.0,0.9976501063240091,0.0003614127274543083,0.0 +0.2622777521501657,0.02521747350260937,6.347894033789698e-05,0.0,0.9999977542330126,4.172324717044872e-07,0.0 +0.2600265145194148,0.03104382752840613,0.00011891125443577884,0.0,0.9999997807907323,4.768371105194139e-07,0.0 +0.26979064940289105,0.03620499371862343,0.00012370942786038046,0.0,0.9999997807907323,8.046626240015109e-07,5.960463881492674e-08 +0.35670188067866543,0.27769786114705897,0.9999997807907323,1.1920927762985348e-07,5.960463881492674e-08,0.0,3.5762783288956044e-07 +0.6656716465674373,0.5164187549660448,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.6089150905356993,0.4040122925543388,0.9999999000000099,0.0,3.874301522970238e-07,0.0,2.980231940746337e-08 +0.5902450084441871,0.3244428038041547,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,1.4901159703731684e-07 +0.5670477747682373,0.3713413476308103,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5591174363858448,0.3560088276253486,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5564175843962105,0.3630062341068469,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.5528748631248422,0.35566860431302894,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5544762611159564,0.35245758289023893,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5512521266708995,0.35252067440672286,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.555228888965504,0.34902855747922024,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.554881632305057,0.34994128340450953,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5922549962752197,0.3854696153934362,0.9999996615814547,1.6093252480030219e-06,8.940695822239011e-08,1.4901159703731684e-07,1.0013579320907693e-05 +0.5553012490042584,0.45546686641523315,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 +0.581359386420019,0.32177680725309754,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5584835409886848,0.3359722196480514,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5840098857637813,0.33678501838639185,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5886791944260025,0.34133774036284614,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.5935059785597138,0.3440536856062165,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5971747636547767,0.3490504621861715,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5966561436406075,0.3544988035548674,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5959424972287414,0.3570114373549438,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5972091555348107,0.3586736916881552,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5982469916095968,0.35917240375090553,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.3670026659813547,0.0633902549635106,1.9073484420776557e-06,0.0,0.9993708326419573,0.00022786853418946493,0.0 +0.22247695921930336,0.02478560804896323,9.42945386052141e-05,0.0,0.9999993039536218,2.086162358522436e-07,0.0 +0.281477868545321,0.04144042729621815,3.382563252747093e-05,0.0,0.9999997807907323,1.2218950957059981e-06,0.0 +0.28848269580600194,0.04225909709206796,3.5077329942584386e-05,0.0,0.9999998403953712,1.4007090121507783e-06,0.0 +0.2741788029557184,0.037636488669626475,5.254148911535792e-05,0.0,0.9999998403953712,8.344649434089744e-07,0.0 +0.26623344420284306,0.03638234733912224,6.645917227864332e-05,0.0,0.9999998403953712,6.258487075567308e-07,0.0 +0.2580551504981951,0.03533908724179722,8.305906418860042e-05,0.0,0.9999997807907323,5.960463881492673e-07,0.0 +0.2472430169479989,0.033778905862746136,0.00010132788598537545,0.0,0.9999997807907323,4.768371105194139e-07,2.980231940746337e-08 +0.23016151784897476,0.03130486607015526,0.00011712311527133104,0.0,0.9999997211860935,3.5762783288956044e-07,2.980231940746337e-08 +0.21771159767203058,0.030868768686730785,0.00011515616219043845,0.0,0.9999999000000099,3.278255134820971e-07,0.0 +0.20222333072778667,0.02987790107215436,0.00010752676842212784,0.0,0.9999999000000099,3.278255134820971e-07,8.940695822239011e-08 +0.18856030701810156,0.02969554066149528,9.387730613350961e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 +0.09173029660798754,0.03232601284427239,0.0002716779437184361,0.00027632710554600036,0.0,1.1920927762985348e-07,0.9998059465053062 +0.23598256706214316,0.06265011428713892,3.7908550286293404e-05,5.364417493343406e-07,2.086162358522436e-07,3.540515545606648e-05,0.9999875022351364 +0.2305389642619993,0.0446864664478077,3.8951631465554624e-05,2.682208746671703e-07,1.1026858180761447e-06,7.3611728936434526e-06,0.9999935223036568 +0.2608608603369461,0.04453000425529909,1.761317076981085e-05,1.7881391644478022e-07,3.7550922453403844e-06,1.406669476032271e-05,0.9999900056299666 +0.262028694141982,0.04131680726297516,1.901387978196163e-05,2.086162358522436e-07,4.887580382823993e-06,9.626149168610668e-06,0.9999909593041877 +0.26400613783696847,0.039851963513225994,1.919269369840641e-05,1.1920927762985348e-07,4.708766466379212e-06,7.987021601200183e-06,0.9999907208856325 +0.26009237765188886,0.03842833637533195,2.247094883322738e-05,1.7881391644478022e-07,3.6656852871179947e-06,5.722045326232967e-06,0.9999911381181041 +0.2573002874744684,0.037640362971536216,2.4795529747009523e-05,1.7881391644478022e-07,2.8014180243015566e-06,4.649161827564286e-06,0.9999911977227429 +0.25553160904779915,0.037261664861020616,2.6434657314420008e-05,1.7881391644478022e-07,2.2947785943746796e-06,4.053115439415018e-06,0.9999909593041877 +0.2540306448831274,0.036932200187081064,2.7805564007163326e-05,2.3841855525970696e-07,1.9073484420776557e-06,3.546476009488141e-06,0.99999084009491 +0.24911901353758187,0.03593423961977758,3.2305714237690296e-05,2.086162358522436e-07,1.4603136509657052e-06,2.712011066079167e-06,0.9999913765366594 +0.2455357611077681,0.03538370131840396,3.576278328895604e-05,2.3841855525970696e-07,1.1622904568910714e-06,2.264976274967216e-06,0.999991495745937 +0.29512548445433223,0.02995043992483359,7.063149699568818e-06,4.172324717044872e-07,0.019854901235640245,3.531574849784409e-05,0.9890231693204918 +0.5476515292894568,0.05896371602002419,4.4703479111195056e-07,2.980231940746337e-08,0.9999211026674966,0.0028539595134169145,1.5705822327733197e-05 +0.3227888345584724,0.044210672370969616,8.31484711468228e-06,2.980231940746337e-08,0.9999957276752929,4.291533994674725e-06,0.0 +0.28012013434203853,0.032601475710054686,8.589028453230944e-05,0.0,0.999999542372177,7.748603045940476e-07,0.0 +0.30031326411911075,0.03881984948447206,4.175304948985618e-05,0.0,0.9999996615814547,1.698732206225412e-06,0.0 +0.3094134628644614,0.04105588793051557,3.260373743176492e-05,0.0,0.9999996615814547,2.5629994690418497e-06,0.0 +0.3281656801564706,0.04335388540479248,1.4692543467879441e-05,2.980231940746337e-08,0.9999994231628994,5.57303372919565e-06,0.0 +0.33739876745734254,0.0457191467206869,9.655951488018132e-06,0.0,0.9999988867211501,9.983777001500229e-06,0.0 +0.3511545657966167,0.04891696571466141,5.2750105351210165e-06,1.7881391644478022e-07,0.999997277395902,2.8103587201237956e-05,0.0 +0.36626243589791985,0.05983269213605581,2.592801788449313e-06,1.1920927762985348e-07,0.9999830914918642,0.0002637505267560508,0.0 +0.33249977229648886,0.08850276468668848,2.413987872004533e-06,1.1920927762985348e-07,0.9989743425845603,0.025043842672312508,0.0 +0.10910907387281663,0.0939391851264314,0.0002368390323311114,0.0,0.04140504780613523,0.9996805383452395,0.0 +0.43777981398677057,0.31923216575878227,0.9999996615814547,3.278255134820971e-07,8.940695822239011e-08,0.0,1.132488137483608e-06 +0.6399948596689338,0.4813291727672347,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.6038649677980239,0.3691078721844917,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.5752908587217535,0.32684102648860425,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 +0.575566589808473,0.35362717503214375,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5722295641662162,0.3415791987787899,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.5765326618909525,0.34307682508315995,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5772551297902451,0.33944493526368297,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.580662250494755,0.3384174703972207,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5822508334872428,0.3380588292496686,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5865871906037625,0.33806866401605484,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.588667511915627,0.33946707838921325,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.3276243209703205,0.03205573558258466,1.0579823389649495e-05,3.278255134820971e-07,0.005214034989613346,3.108381914198429e-05,0.9971064524133781 +0.3128204047550369,0.04004716872483197,9.536742210388278e-07,1.1920927762985348e-07,0.03574773311765528,7.417797300517633e-05,0.9922560653251746 +0.07857307791384546,0.03214111923621079,1.4901159703731684e-07,2.324580913782143e-06,0.8167502063346229,0.0002183615942984841,0.07003282800343107 +0.03365638851980082,0.036319464438894965,8.642672628164378e-07,1.6391275674104854e-05,0.9859640804425933,5.2809709990025094e-05,0.0016568003428191111 +0.035471826790294494,0.04531076549707824,6.258487075567308e-07,2.9325482296943957e-05,0.9743173936227955,0.00013816355277300018,0.006955712338104913 +0.040326118467568464,0.047821611157811625,2.9802319407463367e-07,3.281235366761717e-05,0.8389221782995546,0.00024113056632578612,0.026242849586713576 +0.049153774974694996,0.04659563302195893,1.7881391644478022e-07,2.396106480360055e-05,0.38617726278913406,0.00026154515511989855,0.09395529880339895 +0.06292611360289364,0.04505622386160852,2.086162358522436e-07,1.4513729551434662e-05,0.06715797706410952,0.00020223853949904644,0.3555728437571382 +0.09267717599485019,0.04413262008864961,3.5762783288956044e-07,6.1690801173449175e-06,0.004744201424154686,9.787081693410971e-05,0.8856033989312677 +0.16093724965382789,0.04257732629046927,1.5795229285955586e-06,1.4603136509657052e-06,0.0001335739955842508,2.0921228224039285e-05,0.9975513414374927 +0.23714837430925675,0.03717038034756274,1.1980532401800274e-05,3.874301522970238e-07,4.7385687857866755e-06,2.413987872004533e-06,0.9999388648498635 +0.23578837512947298,0.031011372799331485,3.9428468576074036e-05,3.5762783288956044e-07,8.344649434089744e-07,5.066394299268773e-07,0.9999841643753627 +0.2994711995000813,0.03857645391757343,2.9504296213388737e-06,2.980231940746337e-08,0.9999053670428495,2.777576168775586e-05,8.940695822239011e-08 +0.12573522328809802,0.016317456957883978,3.8862224507332235e-05,0.0,0.9999979926515679,1.4901159703731684e-07,2.3841855525970696e-07 +0.16006076335244207,0.03023466467339637,3.156065625250371e-05,0.0,0.9999997807907323,5.66244068741804e-07,1.7881391644478022e-07 +0.13630145787628356,0.02949398755522181,3.5673376330733654e-05,5.960463881492674e-08,0.9999997807907323,5.66244068741804e-07,2.086162358522436e-07 +0.0515916645505523,0.031674176449120336,5.03659197986131e-06,2.324580913782143e-06,0.9999904824670772,3.6656852871179947e-06,1.7374752214551145e-05 +0.03551420569272804,0.05732953547449714,3.5762783288956044e-07,6.294249858856264e-05,0.992967387084792,0.00017195938298106365,0.006576895056116646 +0.07782137393629175,0.058888226737429085,1.1920927762985348e-07,2.476572742760206e-05,0.1321016715985639,0.00020042059801519117,0.5271242329855137 +0.19321337341462214,0.045147091142553046,2.2947785943746796e-06,1.7881391644478022e-06,6.005167360603869e-05,5.0067896604538464e-06,0.9990924789786915 +0.22544983028432003,0.03348666428946244,2.193450708389304e-05,7.152556657791209e-07,1.0132788598537545e-06,3.278255134820971e-07,0.9999656869373301 +0.2078293859872591,0.03057646750880232,3.987550336718599e-05,9.238719016313645e-07,2.086162358522436e-07,2.086162358522436e-07,0.9999851180495838 +0.20640274881461923,0.031497567886681094,5.3256744781137045e-05,8.344649434089744e-07,5.960463881492674e-08,2.3841855525970696e-07,0.9999882174908022 +0.20961606501664987,0.03255021571555663,6.17504058122641e-05,6.258487075567308e-07,1.1920927762985348e-07,3.278255134820971e-07,0.9999890519557456 +0.18328058718876086,0.630848884474496,3.069638898968727e-06,0.9999999000000099,5.960463881492674e-08,5.960463881492674e-08,0.0 +0.16880598663584764,0.4447922705842363,5.960463881492674e-08,0.9999999000000099,0.0,1.645088031291978e-05,5.960463881492674e-08 +0.18304798006253453,0.5337415336648608,0.0,0.9999999000000099,0.0,1.406669476032271e-05,1.1920927762985348e-07 +0.175679743282673,0.5959879158906828,0.0,0.9999999000000099,0.0,1.2516974151134616e-05,2.980231940746337e-08 +0.17857643961166988,0.6054958700096906,0.0,0.9999999000000099,0.0,1.1563299930095787e-05,2.980231940746337e-08 +0.18161070346080266,0.606187999144704,0.0,0.9999999000000099,0.0,1.123547441661369e-05,8.940695822239011e-08 +0.18360170721247498,0.6063811181937432,5.960463881492674e-08,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 +0.18504822253414666,0.6062828301345253,0.0,0.9999999000000099,0.0,1.1712311527133104e-05,0.0 +0.18623012303534892,0.6059073208725047,0.0,0.9999999000000099,0.0,1.2397764873504761e-05,8.940695822239011e-08 +0.1872409582060529,0.6053464411652644,0.0,0.9999999000000099,0.0,1.3202427497506273e-05,2.980231940746337e-08 +0.18814492224867907,0.6047695874132268,0.0,0.9999999000000099,0.0,1.4185904037952563e-05,2.980231940746337e-08 +0.1889993846338213,0.6039721964755582,0.0,0.9999999000000099,0.0,1.5407799133658562e-05,2.980231940746337e-08 +0.43270072339173554,0.3164641856605319,0.9999997211860935,2.682208746671703e-07,0.0,0.0,1.1622904568910714e-06 +0.6475930809706517,0.46854212872111495,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5991187691440456,0.36409005516493465,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,2.980231940746337e-08 +0.5730271339179226,0.32230615610325714,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5786744355915779,0.34770023816830575,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.5770601033925481,0.3379969000237576,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5769906043767429,0.34086790675048456,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5753952860593956,0.33924514049443005,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5737864970923297,0.340360522211921,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5736057758093781,0.3401327132596284,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5730618238211804,0.3412032126796111,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5724475383521507,0.3419997095476083,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.44885405896235575,0.32532387966307363,0.9999996615814547,4.172324717044872e-07,8.940695822239011e-08,2.980231940746337e-08,1.370906692743315e-06 +0.6334647536015467,0.4688093363435973,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.6031600236642946,0.36208158725260464,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.7881391644478022e-07 +0.5690673589470783,0.32837313407997093,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5790100693462943,0.34941238158918564,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.575195670104051,0.3399443625821704,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.579794168448282,0.3406046926392015,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5813542604205685,0.3378812074082684,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5812600254771826,0.33887517446437254,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.582909882044497,0.3384240269081449,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5840210914369987,0.3397907018079658,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5856829881425573,0.3407132624996413,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.2232213020232276,0.03341642021560667,5.030631515979817e-05,5.7816499650478935e-06,1.069903266727935e-05,1.5795229285955586e-06,0.9998287154773334 +0.31730264423963833,0.05562123655320457,3.367662093043361e-06,1.1920927762985348e-07,3.4630295151472434e-05,0.00011450051116347426,0.9999590112177829 +0.2894522845625231,0.04817888139853414,2.74181338548663e-06,1.1920927762985348e-07,9.06288533180961e-05,6.896256710887023e-05,0.9999466134529094 +0.2622830271612281,0.04282256960135562,8.642672628164378e-07,1.1920927762985348e-07,0.000720471071675427,0.00013914702931344647,0.9995014264056007 +0.11561653017519,0.03092744945950211,1.4901159703731684e-07,8.642672628164378e-07,0.5269974539187543,0.00043076272471547557,0.2004458107774099 +0.11926725506288673,0.03141748904643907,1.2010334721207738e-05,2.086162358522436e-07,0.9999643756352763,5.900859242677747e-06,4.053115439415018e-06 +0.21011912821853332,0.03614130615569183,0.00014072655224204203,0.0,0.9999997211860935,1.996755400300046e-06,2.9802319407463367e-07 +0.2436860799688524,0.036357223981353715,0.00034323331261575563,0.0,0.9999998403953712,1.1920927762985347e-06,2.086162358522436e-07 +0.23674505948040078,0.03055655955745075,0.0004614889160245703,0.0,0.9999997807907323,6.258487075567308e-07,1.7881391644478022e-07 +0.217155933371135,0.026716291899874695,0.00045531983590722536,0.0,0.9999997807907323,3.874301522970238e-07,1.1920927762985348e-07 +0.19021394848035914,0.02424675225796358,0.0003690421212226189,0.0,0.9999997807907323,3.5762783288956044e-07,2.086162358522436e-07 +0.15908756851491218,0.022788256402881908,0.0002439021820306802,0.0,0.9999997211860935,3.5762783288956044e-07,5.066394299268773e-07 +0.5802457928417265,0.38278204196097404,0.9999996019768158,1.5497206091880952e-06,8.940695822239011e-08,1.7881391644478022e-07,8.016823920607646e-06 +0.5817970037219418,0.4090807735219462,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.5682499408486624,0.3341255187416141,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5316935181397574,0.3523826002471243,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.568215131736115,0.34143200510854227,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5464963912737575,0.3591383694987446,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5587286948926358,0.3434511720546077,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5508586764107534,0.3548653721201733,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5557494759329508,0.3484539687036839,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5562447905310137,0.35050788515764736,0.9999999000000099,0.0,2.980231940746337e-08,0.0,2.980231940746337e-08 +0.5565269589193688,0.349891155898262,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5484118461381802,0.3544682263721029,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.22709873317731816,0.026734739537429518,3.6060806483030677e-06,5.364417493343406e-07,0.1589380045739577,4.243850283622784e-05,0.8740656693912235 +0.28058856724530895,0.03456795215014764,2.324580913782143e-06,2.980231940746337e-08,0.9999178244123618,2.3305413776636355e-05,0.00011110304675102345 +0.25730246304400267,0.04610186814472415,4.130601469874423e-05,0.0,0.9999997211860935,2.9206273019314104e-06,1.1920927762985348e-07 +0.2482452690498556,0.0362545251784233,0.00018391011306345646,0.0,0.9999999000000099,6.854533463716575e-07,8.940695822239011e-08 +0.23650941251729102,0.03151246904787239,0.0001926421926498432,0.0,0.9999997807907323,4.4703479111195056e-07,8.940695822239011e-08 +0.23126009105678452,0.03151088952478611,0.00019893048204481798,0.0,0.9999998403953712,4.768371105194139e-07,1.1920927762985348e-07 +0.2203374802975017,0.030170887703497625,0.00020116565600037775,0.0,0.9999997807907323,3.874301522970238e-07,5.960463881492674e-08 +0.20317381619565808,0.02834242581835845,0.00018528101975619977,0.0,0.9999997807907323,3.5762783288956044e-07,0.0 +0.18941903113534506,0.02820733189099816,0.00016018746681511562,0.0,0.9999997807907323,3.874301522970238e-07,5.960463881492674e-08 +0.17057397960910206,0.027131676669243265,0.00012800096185505518,0.0,0.9999997807907323,4.172324717044872e-07,1.1920927762985348e-07 +0.14826023578029887,0.026144206519418456,8.925794662535279e-05,0.0,0.9999997211860935,4.4703479111195056e-07,3.5762783288956044e-07 +0.12130817770455636,0.026122659440335844,5.137919865846685e-05,1.4901159703731684e-07,0.9999996615814547,6.258487075567308e-07,8.642672628164378e-07 +0.11021691560288856,0.03146207332072343,0.00015437601453066024,0.00012770293866098053,1.4901159703731684e-07,8.940695822239011e-08,0.999859471470962 +0.26947128771619777,0.06821915506148438,1.0788439625501739e-05,3.278255134820971e-07,1.132488137483608e-06,0.00013759730870425838,0.9999773694465379 +0.2560689747227494,0.04754874109407661,1.6599891909957096e-05,2.086162358522436e-07,4.887580382823993e-06,1.8954275143146702e-05,0.9999898268160502 +0.2674162983783617,0.04242250322569171,1.5228985217213781e-05,1.4901159703731684e-07,7.063149699568818e-06,1.272559038698686e-05,0.9999897672114114 +0.25977301596519553,0.03922358154578904,2.0980832862854213e-05,1.7881391644478022e-07,4.887580382823993e-06,6.884335783124038e-06,0.9999915553505758 +0.24958243965069135,0.03670781850186253,2.9653307810426052e-05,2.3841855525970696e-07,2.712011066079167e-06,3.6656852871179947e-06,0.9999927474433521 +0.23938149212799667,0.0350312888562298,3.9845701047778526e-05,2.682208746671703e-07,1.4603136509657052e-06,2.264976274967216e-06,0.9999935819082956 +0.23304858802784081,0.03437232970602831,4.708766466379212e-05,2.9802319407463367e-07,8.046626240015109e-07,1.7285345256328755e-06,0.999993760722212 +0.23095273970601293,0.03443658351308518,4.976987341046383e-05,2.682208746671703e-07,6.854533463716575e-07,1.4305113315582417e-06,0.9999935223036568 +0.23038414119720163,0.034532815212058574,5.0723547631502654e-05,2.9802319407463367e-07,6.258487075567308e-07,1.4603136509657052e-06,0.9999932242804627 +0.2334052026175172,0.035113722079940055,4.726647858023691e-05,2.682208746671703e-07,5.364417493343406e-07,1.6391275674104854e-06,0.9999926282340745 +0.2336942851446659,0.034907490009052515,4.7445292496681685e-05,2.9802319407463367e-07,5.66244068741804e-07,1.519918289780632e-06,0.9999922706062416 +0.42513209579614747,0.2583796083484718,9.262560871839615e-05,1.4901159703731684e-07,3.412365572154556e-05,0.9999999000000099,4.470347911119505e-06 +0.233026623716242,0.17311820384875878,1.7374752214551145e-05,0.0,1.0937451222539056e-05,0.9999997211860935,8.642672628164378e-07 +0.26344799994331486,0.17315509912386845,8.076428559422574e-06,0.0,3.844499203562775e-06,0.9999997807907323,1.4603136509657052e-06 +0.26972973345593315,0.17765006419954527,7.86781232357033e-06,0.0,3.725289925932921e-06,0.9999997211860935,1.847743803262729e-06 +0.2619789242635966,0.17435932156438183,8.94069582223901e-06,0.0,3.874301522970238e-06,0.9999996615814547,1.5795229285955586e-06 +0.2516798972979281,0.16518098113092541,1.0162590917945008e-05,0.0,3.993510800600092e-06,0.9999997211860935,1.043081179261218e-06 +0.23625025152181836,0.15149763223914922,1.2069939360022665e-05,0.0,4.023313120007555e-06,0.9999994827675383,6.258487075567308e-07 +0.20937177538004803,0.13582587239800648,1.743435685336607e-05,0.0,4.589557188749359e-06,0.9999987079072337,2.086162358522436e-07 +0.16848629712360808,0.12119129298042272,3.540515545606648e-05,0.0,7.4803821712733056e-06,0.9999962045124035,1.4901159703731684e-07 +0.11864495276913503,0.11070165036213224,9.545682906210517e-05,0.0,1.618265943825261e-05,0.9999842835846404,2.980231940746337e-08 +0.04781466722290414,0.11999368665547826,0.00022295115148723347,8.940695822239011e-08,1.8388031074404898e-05,0.9999133540644507,0.0 +0.01805940270349109,0.10277041791109777,0.0005712806607216654,2.980231940746337e-08,0.0002884268472254305,0.9954229789946893,1.3411043733358516e-06 +0.14902234076836546,0.02528226375146913,1.6689298868179488e-06,2.682208746671703e-07,0.9996924592730025,2.1696088528633335e-05,4.589557188749359e-06 +0.22130963205374804,0.036931872361534855,5.5074686264992304e-05,0.0,0.9999998403953712,8.642672628164378e-07,0.0 +0.29216122626048524,0.049590557805152764,2.8550621992349908e-05,0.0,0.9999997807907323,2.5331971496343865e-06,0.0 +0.2603720426451634,0.03613203763343085,7.686018175184803e-05,0.0,0.9999998403953712,5.66244068741804e-07,0.0 +0.23507231472949347,0.030924856657454824,0.0001015365022212277,0.0,0.9999997807907323,2.682208746671703e-07,0.0 +0.20897045730679195,0.028387069697287572,0.00010308622283041579,0.0,0.9999999000000099,2.086162358522436e-07,8.940695822239011e-08 +0.1746061742233455,0.025663107629196272,7.56680889755495e-05,0.0,0.9999998403953712,2.3841855525970696e-07,1.4901159703731684e-07 +0.1434270739495969,0.02544149755995932,4.5865769568086125e-05,8.940695822239011e-08,0.9999998403953712,3.278255134820971e-07,1.4901159703731684e-07 +0.1153189241838388,0.027597069735569822,2.3841855525970695e-05,1.7881391644478022e-07,0.9999996615814547,6.258487075567308e-07,5.960463881492673e-07 +0.05503448843728108,0.03445720672017393,4.529952549934432e-06,2.682208746671703e-06,0.9999915553505758,5.3942198127508695e-06,1.8805263546109385e-05 +0.031671106814026705,0.05150109528613359,5.66244068741804e-07,5.42700236409908e-05,0.9981067374619702,9.405612004995439e-05,0.0016020534820676009 +0.05056670307903713,0.05845761298132301,1.1920927762985348e-07,5.245208215713553e-05,0.7435784788419202,0.0003291666178554329,0.060396307627666596 +0.11066967248458368,0.0223919451198382,1.1026858180761447e-06,7.748603045940476e-07,0.9990396692687015,2.8520819672942444e-05,3.811716652214565e-05 +0.06657168268881751,0.02240610122296993,8.553265669941988e-06,4.4703479111195056e-07,0.9999821378176431,7.748603045940476e-07,6.228684756159844e-06 +0.19463664292483238,0.04027757047917179,1.1354683694243543e-05,1.7881391644478022e-07,0.9999997807907323,2.5033948302269232e-06,2.3841855525970696e-07 +0.24890244006079945,0.04773935674803567,6.580352125167911e-05,2.980231940746337e-08,0.9999999000000099,1.7583368450403388e-06,2.980231940746337e-08 +0.22699415682806406,0.03349766134642162,0.00011172889545858017,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 +0.20229330658075007,0.02887347340089386,0.00010368226921856506,0.0,0.9999997807907323,2.9802319407463367e-07,2.980231940746337e-08 +0.1728999912667206,0.026555538172942993,7.757543741762715e-05,0.0,0.9999998403953712,2.682208746671703e-07,1.4901159703731684e-07 +0.1381158530654937,0.02507787942456931,4.467367679178759e-05,2.980231940746337e-08,0.9999997807907323,3.278255134820971e-07,2.086162358522436e-07 +0.09447830915059836,0.02789083122729503,1.680850814580934e-05,2.682208746671703e-07,0.9999993039536218,9.238719016313645e-07,1.5795229285955586e-06 +0.034902274607166835,0.04133871196992636,1.519918289780632e-06,1.654028727114217e-05,0.9998662663997868,2.6434657314420008e-05,0.00024047491529882194 +0.0372011363490913,0.057799667110082525,2.3841855525970696e-07,7.078050859272551e-05,0.9787811850236453,0.00022542474399805292,0.009298532271364424 +0.06363505124782277,0.05445861815473727,1.1920927762985348e-07,3.1888481765985805e-05,0.2313309378559046,0.000263184282687309,0.21830735407716254 +0.527498841263863,0.3644374012323038,0.9999996019768158,8.940695822239011e-07,0.0,8.940695822239011e-08,4.887580382823993e-06 +0.545603036857901,0.44990754119798443,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5603850483662305,0.3234825133723428,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.545068621612867,0.3356067537686737,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.578507482981569,0.3313811718850131,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5770272016286334,0.34342083329042217,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.1920927762985348e-07 +0.5878213643784306,0.33518657082540154,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5858997106309516,0.34443113201919207,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5893712043518161,0.3457785844210762,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5904781222098942,0.3488414883016247,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.5914812683814223,0.35154438012779154,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.592916905855423,0.35291033977187525,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.1815522611066028,0.5968597530296631,2.1457669973373625e-06,0.9999999000000099,2.980231940746337e-08,5.960463881492674e-08,0.0 +0.12691193818520508,0.3321178852943108,8.940695822239011e-08,0.9999999000000099,0.0,3.367662093043361e-06,0.0 +0.1555758714611483,0.7971640823906582,1.1920927762985348e-07,0.9999996615814547,0.0,1.9073484420776557e-06,1.4901159703731684e-07 +0.25356668232821494,0.6932868956332381,0.32662954640427555,0.0013194082848072184,0.0,7.152556657791209e-07,0.10042061397565405 +0.18105515836919664,0.1638851761537303,5.0067896604538464e-05,7.390975213050916e-06,0.0,8.946656286120503e-05,0.9994416429528693 +0.13844025134467033,0.06601235269369819,0.00041422243744433337,2.1159646779298993e-06,0.0,7.748603045940476e-07,0.9999820782130042 +0.15957328676516672,0.04508584737005682,9.217857392728421e-05,3.0100342601538e-06,0.0,3.5762783288956044e-07,0.9999879790722469 +0.16900745033518014,0.03865444659524868,0.00014272330764234208,1.4305113315582417e-06,0.0,2.086162358522436e-07,0.9999910785134654 +0.1775819063113113,0.03516709803932728,0.00010597704781293974,1.2814997345209249e-06,0.0,2.9802319407463367e-07,0.99999185337377 +0.18780928849396275,0.03433308004745044,0.00010359286226034267,9.536742210388278e-07,0.0,2.682208746671703e-07,0.9999915553505758 +0.19952437280782395,0.034560888999742974,9.053944635987371e-05,7.152556657791209e-07,8.940695822239011e-08,3.278255134820971e-07,0.9999906016763548 +0.21493938564364196,0.0358376502929356,7.113813642561506e-05,4.4703479111195056e-07,0.0,6.854533463716575e-07,0.9999885751186351 +0.17155098914389744,0.4997436403372474,7.748603045940476e-07,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.1673728227546051,0.44594833247177945,2.980231940746337e-08,0.9999999000000099,0.0,9.417532932758424e-06,0.0 +0.17933371662350986,0.49163290849850255,0.0,0.9999999000000099,0.0,8.642672628164377e-06,5.960463881492674e-08 +0.17732116579275214,0.554062306786076,8.940695822239011e-08,0.9999999000000099,0.0,9.953974682092765e-06,5.960463881492674e-08 +0.177677124731336,0.564387559794104,0.0,0.9999999000000099,0.0,1.0102986279130082e-05,5.960463881492674e-08 +0.1794897019788806,0.5669665335638041,2.980231940746337e-08,0.9999999000000099,0.0,1.0132788598537546e-05,5.960463881492674e-08 +0.18095013498510676,0.5682758091907161,5.960463881492674e-08,0.9999999000000099,0.0,1.034140483438979e-05,0.0 +0.18204003571710203,0.5687589048365379,0.0,0.9999999000000099,0.0,1.069903266727935e-05,8.940695822239011e-08 +0.18297129868703416,0.5694904922463858,0.0,0.9999999000000099,0.0,1.123547441661369e-05,2.980231940746337e-08 +0.18381750582887535,0.5696509479500936,2.980231940746337e-08,0.9999999000000099,0.0,1.1861323124170421e-05,0.0 +0.1846043169422003,0.5692815779664838,0.0,0.9999999000000099,0.0,1.2636183428764469e-05,1.1920927762985348e-07 +0.18531560897059798,0.5691799520471592,0.0,0.9999999000000099,0.0,1.3589857649803297e-05,0.0 +0.6323356628156133,0.3964170216835233,0.9999996615814547,2.3841855525970694e-06,1.1920927762985348e-07,2.682208746671703e-07,1.406669476032271e-05 +0.5658563971285162,0.43451079718778823,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 +0.5797106623409551,0.3242445289533433,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.530869185902548,0.3504626154299482,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.575462639307989,0.3348452448271537,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5525802373657297,0.3528400956980195,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.564214050746443,0.3369510173220629,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5593127012021208,0.3462065755728126,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5628880262141799,0.3413962721240056,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5636227130656509,0.34260940545891133,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5651109218363413,0.3421083986173376,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5650720596079493,0.3426889180550281,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.32884681223461315,0.032121032470924925,1.069903266727935e-05,3.278255134820971e-07,0.005093663421526602,3.117322610020669e-05,0.9972151116699377 +0.2612835168730309,0.042832225553807585,9.655951488018132e-06,2.3841855525970696e-07,5.692243006825504e-05,8.016823920607646e-06,0.9999608589615862 +0.24239093064258155,0.03612229227401174,1.946091457307358e-05,3.5762783288956044e-07,5.30481285452848e-06,2.0563600391149723e-06,0.9999858929098884 +0.25958603619454285,0.04044228791498038,1.32620321363212e-05,2.682208746671703e-07,4.261731675267262e-06,5.066394299268773e-06,0.9999833895150582 +0.25664210318456343,0.03978478907857563,1.630186871588246e-05,2.682208746671703e-07,3.4868713706732143e-06,4.470347911119505e-06,0.9999855948866944 +0.261030733574549,0.039841413491102554,1.5795229285955586e-05,2.3841855525970696e-07,3.3378597736358976e-06,5.03659197986131e-06,0.999985058444945 +0.2601839899909048,0.03895515202808903,1.7732380047440704e-05,2.086162358522436e-07,3.0100342601538e-06,4.440545591712042e-06,0.9999860717238048 +0.2592940330398003,0.03819343447031236,1.9580123850703434e-05,2.3841855525970696e-07,2.5033948302269232e-06,3.904103842377701e-06,0.9999867869794706 +0.26186680792677874,0.03838109969435554,1.901387978196163e-05,2.3841855525970696e-07,2.5033948302269232e-06,4.202127036452335e-06,0.9999860717238048 +0.26318335532052306,0.0382548272544205,1.910328674018402e-05,1.7881391644478022e-07,2.413987872004533e-06,4.291533994674725e-06,0.9999859525145273 +0.2623746991048888,0.037669807666050215,2.0384786474704945e-05,2.086162358522436e-07,2.1457669973373625e-06,3.7550922453403844e-06,0.999986369746999 +0.2603732943427036,0.037011086934427784,2.2441146513819917e-05,2.086162358522436e-07,1.847743803262729e-06,3.3378597736358976e-06,0.9999869061887483 +0.11795318126190049,0.1090452074817854,0.00025442240078151477,0.0,0.0015810726492047466,0.9997843696260552,0.0 +0.14816030859333706,0.11331522462811842,3.150105161368878e-05,0.0,9.393691077232455e-05,0.9999892307696621,0.0 +0.15213096141185245,0.12383604047562109,2.2768972027302015e-05,0.0,2.9742714768648444e-05,0.9999932242804627,0.0 +0.1701475381780742,0.12921896574668726,1.600384552180783e-05,0.0,1.722574061751383e-05,0.9999957872799317,2.980231940746337e-08 +0.17260894178629443,0.12966704366370954,1.609325248003022e-05,0.0,1.4871357384324222e-05,0.9999962045124035,8.940695822239011e-08 +0.16863599418895528,0.1278717219610598,1.829862411618251e-05,0.0,1.4752148106694368e-05,0.9999956680706541,2.980231940746337e-08 +0.1470923721729406,0.12165981529059945,2.9355284616351418e-05,0.0,1.9669530808925823e-05,0.9999922110016028,2.980231940746337e-08 +0.09532257914148443,0.11567482350276015,7.987021601200183e-05,0.0,3.784894564747848e-05,0.999966044565163,0.0 +0.023626506327604442,0.1294780969398039,0.00017872450948655782,1.4901159703731684e-07,6.699561402797765e-05,0.9993565275286416,8.940695822239011e-08 +0.09499844908320927,0.12670728562092717,5.245208215713553e-06,2.086162358522436e-07,0.5610210930563685,0.032592472155028904,5.066394299268773e-07 +0.09516033529841253,0.019985198971187206,2.2858378985524404e-05,0.0,0.9997343613340894,7.152556657791209e-07,3.725289925932921e-06 +0.09487342834079807,0.0165002644033788,2.4616715830564745e-05,5.960463881492674e-08,0.9999909593041877,2.682208746671703e-07,2.6226041078567766e-06 +0.24205717443417557,0.17479619380818825,7.188319441080164e-05,8.940695822239011e-08,9.876488651633361e-05,0.9999994827675383,1.7881391644478022e-07 +0.2201307713894292,0.14751797911978978,1.123547441661369e-05,0.0,1.0550021070242033e-05,0.999999244348983,1.7881391644478022e-07 +0.230808615674952,0.15409520265801596,9.000300461053937e-06,0.0,6.467103311419552e-06,0.9999993635582606,3.278255134820971e-07 +0.2509106397524888,0.1667656302166526,7.241963616013599e-06,0.0,5.3942198127508695e-06,0.9999996615814547,6.854533463716575e-07 +0.2568912505997143,0.1760688125785697,7.390975213050916e-06,0.0,5.453824451565797e-06,0.9999997211860935,1.0132788598537545e-06 +0.25691458581814286,0.17780727145011346,7.808207684755402e-06,0.0,5.334615173935943e-06,0.9999997807907323,1.1026858180761447e-06 +0.2556497454537391,0.17623510953746457,8.22544015645989e-06,0.0,5.185603576898626e-06,0.9999997807907323,1.1026858180761447e-06 +0.2528827190294457,0.17221739885242257,8.732079586386767e-06,0.0,4.917382702231456e-06,0.9999997807907323,1.0728834986686813e-06 +0.2490108907119638,0.1667250692558899,9.208916696906181e-06,0.0,4.798173424601603e-06,0.9999996615814547,8.046626240015109e-07 +0.24464681743562472,0.16105505821331223,9.80496308505545e-06,0.0,4.649161827564286e-06,0.9999996019768158,6.556510269641942e-07 +0.23551973699548143,0.15249225494634586,1.1086462819576373e-05,0.0,4.470347911119505e-06,0.999999542372177,5.066394299268773e-07 +0.21680647133883135,0.14047384259679555,1.4245508676767491e-05,0.0,4.857778063416529e-06,0.9999989463257889,2.682208746671703e-07 +0.1868610680025927,0.028015762562722858,2.175569316744826e-06,1.4901159703731684e-07,0.9998327685927729,1.972913544774075e-05,1.132488137483608e-06 +0.3863771557647932,0.24322211738236305,3.278255134820971e-07,9.536742210388278e-07,0.9621657363029575,0.9899497234308698,0.0 +0.18853104113751806,0.1538460254405751,7.95721928179272e-06,0.0,0.00014182923806011817,0.9999971581866245,2.980231940746337e-08 +0.2527081072225834,0.19573906060681767,3.0994412183761904e-06,0.0,1.734494989514368e-05,0.9999997807907323,3.5762783288956044e-07 +0.27411639689264117,0.23036122318137925,3.039836579561264e-06,0.0,1.4007090121507784e-05,0.9999997807907323,1.2516974151134616e-06 +0.2873592972636443,0.2519283890292792,3.2782551348209707e-06,0.0,1.361965996921076e-05,0.9999999000000099,2.7716157048940933e-06 +0.29377940295910293,0.2541273831886012,3.457069051265751e-06,0.0,1.1742113846540568e-05,0.9999998403953712,3.635882967710531e-06 +0.2988501191015474,0.24850544329202662,3.457069051265751e-06,0.0,9.536742210388277e-06,0.9999999000000099,3.904103842377701e-06 +0.3044196665160964,0.24080762262989258,3.397464412450824e-06,0.0,7.450579851865842e-06,0.9999999000000099,4.202127036452335e-06 +0.31172943113943574,0.23341652746972022,3.2782551348209707e-06,0.0,5.930661562085211e-06,0.9999997807907323,4.321336314082188e-06 +0.319682419286842,0.22390940781573904,3.129243537783654e-06,0.0,4.529952549934432e-06,0.9999999000000099,4.321336314082188e-06 +0.32652723787863014,0.21159014102173648,3.069638898968727e-06,0.0,3.367662093043361e-06,0.9999999000000099,3.9637084811926284e-06 +0.2858311235786337,0.02942660450431477,6.407498672604624e-06,3.5762783288956044e-07,0.028029617844468634,3.638863199651277e-05,0.9843105881572285 +0.22761663793575007,0.03923550247474208,1.8864868184924313e-05,4.4703479111195056e-07,3.445148123502766e-05,2.413987872004533e-06,0.9999592496363382 +0.24126347898437933,0.03588634728770876,1.9490716892481042e-05,4.172324717044872e-07,4.0829177588224814e-06,1.7583368450403388e-06,0.9999843431892792 +0.24491071700035685,0.03807961940113324,1.9699333128333287e-05,3.5762783288956044e-07,2.264976274967216e-06,2.5033948302269232e-06,0.9999863101423602 +0.23431354760153417,0.035899549716524246,3.0487772753835027e-05,3.5762783288956044e-07,1.1920927762985347e-06,1.5795229285955586e-06,0.9999899460253279 +0.22606101631182157,0.034248232835627196,4.2080875003338276e-05,4.172324717044872e-07,6.258487075567308e-07,1.0132788598537545e-06,0.999991793769131 +0.22512003778479145,0.034291893237917696,4.726647858023691e-05,3.278255134820971e-07,4.768371105194139e-07,9.536742210388278e-07,0.9999920321876864 +0.22711569069875603,0.0346683561742546,4.8488373675942904e-05,4.172324717044872e-07,4.172324717044872e-07,1.1026858180761447e-06,0.999991793769131 +0.2389449477096798,0.03674730657901946,3.740191085636653e-05,2.9802319407463367e-07,5.66244068741804e-07,1.9073484420776557e-06,0.9999897672114114 +0.2506633996859707,0.03822115063012817,2.792477328479318e-05,2.086162358522436e-07,9.536742210388278e-07,3.0994412183761904e-06,0.9999876214444141 +0.2592771351230072,0.03860864042574663,2.2500751152634845e-05,1.7881391644478022e-07,1.4901159703731685e-06,4.023313120007555e-06,0.9999863101423602 +0.26047909258717555,0.03759804367375293,2.282857666611694e-05,2.086162358522436e-07,1.5497206091880952e-06,3.546476009488141e-06,0.9999866677701931 +0.1684690713812687,0.02666687964936436,1.937150761485119e-06,2.086162358522436e-07,0.9997829391147236,2.0474193432927334e-05,2.1457669973373625e-06 +0.17544758319128248,0.026572376485089158,5.263089607358031e-05,0.0,0.9999996615814547,2.682208746671703e-07,5.960463881492674e-08 +0.23913836478196793,0.04338151215764114,6.073712695241035e-05,0.0,0.9999998403953712,1.2516974151134616e-06,5.960463881492674e-08 +0.24594235419208657,0.03933092951101114,9.405612004995439e-05,0.0,0.9999999000000099,7.152556657791209e-07,0.0 +0.24078822134928243,0.03538188337673862,9.667872415781117e-05,0.0,0.9999999000000099,5.364417493343406e-07,5.960463881492674e-08 +0.23156151174540118,0.033377528184897386,0.00010323523442745311,0.0,0.9999999000000099,3.874301522970238e-07,2.980231940746337e-08 +0.2213528752235308,0.03221428393766005,0.0001044571295231591,0.0,0.9999997807907323,4.172324717044872e-07,5.960463881492674e-08 +0.20640161632636853,0.0306282043404585,9.977816537618736e-05,0.0,0.9999999000000099,3.278255134820971e-07,0.0 +0.20156422256588769,0.0319214463179287,9.319185278713795e-05,0.0,0.9999997807907323,3.874301522970238e-07,0.0 +0.20550391077144353,0.0339640378893868,9.366868989765737e-05,0.0,0.9999999000000099,5.066394299268773e-07,2.980231940746337e-08 +0.20839413999648257,0.03430759906181332,9.709595662951567e-05,0.0,0.9999999000000099,5.66244068741804e-07,8.940695822239011e-08 +0.2036252021705234,0.032852917903996616,9.739397982359029e-05,0.0,0.9999999000000099,4.768371105194139e-07,1.7881391644478022e-07 +0.22120425104178953,0.030628025526524206,2.5331971496343865e-06,1.1920927762985348e-07,0.9998821212337117,1.9699333128333287e-05,4.172324717044872e-07 +0.08209094404834336,0.015608072278211139,1.4871357384324222e-05,8.940695822239011e-08,0.9999898268160502,1.4901159703731684e-07,1.1026858180761447e-06 +0.09428453445044159,0.029064118857175303,7.510184490680769e-06,4.4703479111195056e-07,0.9999986483025948,1.4603136509657052e-06,2.2053716361522894e-06 +0.03197219967709712,0.04663339256441768,8.642672628164378e-07,3.1948086404800733e-05,0.9996512128629426,4.9024815425277245e-05,0.0005501806185811812 +0.05169987678313755,0.06250420211675375,1.4901159703731684e-07,5.2750105351210165e-05,0.7986258661823352,0.0003112852262109549,0.08644743889363196 +0.1477179825244772,0.049981087437654254,8.642672628164378e-07,4.261731675267262e-06,0.0008528827768027867,1.7553566130995923e-05,0.9915634594221452 +0.2269661426450208,0.03578785061223429,1.5467403772473487e-05,8.642672628164378e-07,2.026557719707509e-06,4.768371105194139e-07,0.9999449445230225 +0.21118208765109123,0.031040191645075453,3.492831834554707e-05,9.238719016313645e-07,2.682208746671703e-07,2.086162358522436e-07,0.9999823166315596 +0.21434634923047377,0.032657235855232516,4.3183560821414424e-05,7.152556657791209e-07,1.1920927762985348e-07,2.682208746671703e-07,0.9999854756774167 +0.22486683725379605,0.034906804555637716,4.348158401548906e-05,5.960463881492673e-07,2.086162358522436e-07,6.854533463716575e-07,0.9999849988403062 +0.23397693037017908,0.03592652081828049,3.9428468576074036e-05,4.172324717044872e-07,2.682208746671703e-07,1.0132788598537545e-06,0.9999846412124733 +0.24132290481521793,0.03615397214270443,3.528594617843663e-05,3.5762783288956044e-07,3.278255134820971e-07,1.2516974151134616e-06,0.9999844623985569 +0.340232193455913,0.2897067665557692,0.0006078183043152154,5.960463881492674e-08,8.043646008074363e-05,0.9999996019768158,9.238719016313645e-07 +0.6032356023538665,0.5142618416859271,0.9999999000000099,3.5762783288956044e-07,2.264976274967216e-06,5.453824451565797e-06,0.0 +0.4596412181663921,0.416662663150012,0.9999999000000099,0.0,8.702277266979305e-06,0.0,0.0 +0.48837730286483294,0.4409129916866615,0.9999999000000099,8.940695822239011e-08,3.933906161785165e-06,0.0,0.0 +0.5049634575634717,0.4161159395459033,0.9999999000000099,0.0,1.1026858180761447e-06,0.0,0.0 +0.5208867788099132,0.40654435746860856,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 +0.5433573722614363,0.3976177572523179,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.5564304589994814,0.38974469893457425,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5629316568141537,0.377252995903266,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 +0.5607920884853848,0.3693150877320178,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5622330307727702,0.360763460335945,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5533905029067728,0.3593475818018704,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.2890210151552686,0.32532042259367727,0.002535164102715279,1.4901159703731684e-07,0.00015747545574903646,0.9999964429309587,2.086162358522436e-07 +0.46089178321837276,0.2795116304872635,0.061121189442614327,1.4901159703731684e-07,1.2874601984024175e-05,0.9846903293111183,0.0 +0.6768954992014025,0.41976773731673184,0.9999999000000099,1.1920927762985348e-07,1.7881391644478022e-07,0.0,0.0 +0.7558346986457656,0.3688626288736053,0.9999999000000099,0.0,4.380940952897116e-06,0.0,2.980231940746337e-08 +0.6282812952735143,0.4193585216280965,0.9999999000000099,5.960463881492674e-08,2.2947785943746796e-06,0.0,2.980231940746337e-08 +0.5999667048205852,0.39818602793550917,0.9999999000000099,0.0,1.4007090121507783e-06,0.0,1.1920927762985348e-07 +0.574775457358402,0.38534730666237804,0.9999999000000099,0.0,9.238719016313645e-07,0.0,8.940695822239011e-08 +0.5557011961706847,0.3860152363116167,0.9999999000000099,0.0,3.278255134820971e-07,0.0,2.980231940746337e-08 +0.5518708824882872,0.3866744636827196,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5529417991409222,0.38560515635563225,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5497857332001961,0.3780900239297035,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5521967410812607,0.3683028816546155,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.10533544420759813,0.031579643482522755,0.00017493961492181,0.00015309451479613933,1.7881391644478022e-07,2.980231940746337e-08,0.9998521997050266 +0.25671786068806984,0.06415730713699375,1.7583368450403387e-05,3.5762783288956044e-07,8.344649434089744e-07,7.247924079895091e-05,0.9999832107011417 +0.24907872079771537,0.046237379304597793,2.175569316744826e-05,2.3841855525970696e-07,3.0994412183761904e-06,1.3828276205063004e-05,0.9999913169320206 +0.26442539690830125,0.04266655444368276,1.654028727114217e-05,2.086162358522436e-07,5.632638368010577e-06,1.2338160234689835e-05,0.9999902440485219 +0.2615303993116804,0.040052294724281776,1.9758937767148216e-05,1.7881391644478022e-07,5.066394299268773e-06,8.04662624001511e-06,0.9999911977227429 +0.2557569146050408,0.03797793387716383,2.4795529747009523e-05,1.7881391644478022e-07,3.457069051265751e-06,5.1259989380836994e-06,0.9999920321876864 +0.2504291832343355,0.03680071234072906,2.9623505491018588e-05,2.3841855525970696e-07,2.413987872004533e-06,3.6656852871179947e-06,0.9999923898155193 +0.24744963644910425,0.03631436824176754,3.269314438998732e-05,1.7881391644478022e-07,1.7285345256328755e-06,3.069638898968727e-06,0.9999923898155193 +0.24331086873000682,0.035588026040659006,3.71038876622919e-05,2.3841855525970696e-07,1.3113020539283883e-06,2.413987872004533e-06,0.9999925090247969 +0.24203190206479183,0.03543895482410128,3.859400363266506e-05,2.9802319407463367e-07,1.043081179261218e-06,2.175569316744826e-06,0.9999922706062416 +0.24012297390897183,0.035101532930085576,4.1067596143484524e-05,2.086162358522436e-07,8.642672628164378e-07,1.9073484420776557e-06,0.999992151396964 +0.2382530867954781,0.034750014537582904,4.339217705726667e-05,2.682208746671703e-07,7.152556657791209e-07,1.6689298868179488e-06,0.999992151396964 +0.7099630832378139,0.4158289729836813,0.9999997807907323,3.993510800600092e-06,2.9802319407463367e-07,6.556510269641942e-07,3.0934807544946974e-05 +0.48665699360739684,0.4437732695773307,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.5798867940662592,0.30668449396603953,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5219146609090223,0.360902428565215,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5740038752318165,0.3262363671697838,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5537689327964361,0.3538170456280432,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5672778486970609,0.3330709933664285,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5658156871561363,0.34215110534531185,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5679359435799987,0.33874526614110684,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5690020918610519,0.33952188486007484,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5679612159493824,0.34100782865407087,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5690442919495512,0.34125500911591206,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.4243012070480129,0.31670433277429083,0.9999997807907323,2.086162358522436e-07,2.980231940746337e-08,2.980231940746337e-08,1.2516974151134616e-06 +0.570167243457073,0.4760840534348656,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.565038800216166,0.3420176505456826,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5718488693000515,0.3210201858924483,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5815147757289421,0.34862041467419064,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5904732346290227,0.3467071055772282,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.6014787554491847,0.3515217899674255,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.6049901842820471,0.3594665526728217,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.6094071268782998,0.3633202313754699,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 +0.6098978519187153,0.366213679250951,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 +0.6098480820403298,0.36757105582618854,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 +0.6122630834325943,0.36682587855733423,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 +0.5995647907008814,0.38813644640952005,0.9999996615814547,1.8179414838552655e-06,0.0,1.7881391644478022e-07,9.983777001500229e-06 +0.5413320064320524,0.4642172156969532,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5754446387052676,0.364777982172492,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5620768069988203,0.35451096290239953,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.5747813582182345,0.35134094947520794,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5679323673013122,0.3532098233094979,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.4901159703731684e-07 +0.5679337382081421,0.353038221537219,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5688829421761509,0.35318964713724493,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5713626742126388,0.35306477540646186,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5690355896714143,0.35432958596837905,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5652574300531931,0.35531276458378075,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5568683743246281,0.35690361255256353,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.6287943124510749,0.39486086361799383,0.9999996615814547,2.175569316744826e-06,5.960463881492674e-08,2.9802319407463367e-07,1.433491563498988e-05 +0.5522742867241103,0.44922617070135124,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 +0.5786327123402369,0.31753697985933804,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5527522563705444,0.3383815287964273,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.4901159703731684e-07 +0.579537987685048,0.3341714143180833,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5834472775217697,0.3394508957281595,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5882150530571558,0.33931636804492443,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.5909187793487003,0.34355795377570447,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5916565060370548,0.34769663208729745,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5937047004453867,0.3496820926067481,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 +0.5926733016722361,0.35284712904610177,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5968563556423998,0.3532549142232628,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.3097481727471838,0.2600506543667861,0.9999997807907323,1.1920927762985348e-07,5.960463881492674e-08,0.0,1.4901159703731684e-07 +0.6828418373778835,0.48272901765186743,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5785682201145926,0.4015918671397142,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,0.0 +0.5855889916177504,0.3100742995208027,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 +0.5701523422958797,0.365724414524396,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.560344755626364,0.3529565333715683,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5590489506490007,0.3568855821475221,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5608395337826241,0.35132008784954016,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5638729929690524,0.3479010462165196,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.563427150226151,0.34659481042649065,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5648648738627186,0.34477835887727165,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5650538205866488,0.34453099960149614,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.11940443515283161,0.11031657455462678,0.00024640557686090713,0.0,0.0013829170274645228,0.999824662361894,0.0 +0.10364070534276963,0.09809201954115608,9.882449115514854e-05,0.0,0.000298559635823968,0.9998992873696904,0.0 +0.10367253422307837,0.1055463850317467,7.337331038117481e-05,0.0,0.00012898443839550147,0.9999398185240845,0.0 +0.08868592977156575,0.11193832753172028,8.64863309204587e-05,0.0,0.00011575220857858772,0.999906797554181,0.0 +0.0718215107888046,0.10822975633675291,0.0001260936134129775,0.0,0.00024342534492016081,0.9997043802007656,0.0 +0.06178987025958742,0.09504774211209668,0.0002463459722220922,0.0,0.001670688223662989,0.9975611165982584,0.0 +0.07419067620923872,0.07493281363157805,0.0004413127457857176,0.0,0.14687095603891756,0.7737501681961196,1.1920927762985348e-07 +0.2675089836009836,0.043011963360097,2.1427867653966164e-05,0.0,0.9998795582342426,1.4990566661954075e-05,5.960463881492674e-08 +0.21042126416288726,0.020311206575730382,0.0001745819870889204,0.0,0.9999989463257889,2.086162358522436e-07,5.960463881492674e-08 +0.18901464342288316,0.022935837503320504,0.00017315147575736219,0.0,0.9999996615814547,2.3841855525970696e-07,1.1920927762985348e-07 +0.1719247996735908,0.025880455966332518,0.0001615881758272664,0.0,0.9999997211860935,3.874301522970238e-07,1.7881391644478022e-07 +0.15964359044367638,0.026962190861853464,0.00012850760128498205,5.960463881492674e-08,0.9999997807907323,5.364417493343406e-07,2.9802319407463367e-07 +0.09501045941913101,0.4266527890428478,0.995717783538268,2.3841855525970696e-07,0.002379178762936616,0.010693191412675487,0.0 +0.7125751971903425,0.43299102775788795,0.9999999000000099,0.0,1.2516974151134616e-06,0.0,5.960463881492674e-08 +0.6393667459223168,0.38766840093650146,0.9999999000000099,0.0,8.046626240015109e-07,0.0,0.0 +0.5965182780972478,0.36887884133698146,0.9999999000000099,0.0,8.046626240015109e-07,0.0,1.1920927762985348e-07 +0.5793866514919696,0.36780542128940524,0.9999999000000099,0.0,5.66244068741804e-07,0.0,8.940695822239011e-08 +0.569082140898982,0.3735667466477632,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.5629727840190469,0.3750224708868633,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.5603666305309957,0.37215527885740124,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5621521472698133,0.3621855973577199,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5611611604458188,0.3572255372389403,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5599321126706011,0.35300898545896164,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5607774853474154,0.3499310314056099,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.3131995200981151,0.034866750234355516,2.7894970965385714e-05,9.238719016313645e-07,0.0001812577066361922,1.0818241944909203e-05,0.9996339275176863 +0.24835792182847644,0.03866419195466778,2.1338460695743772e-05,2.3841855525970696e-07,1.1652706888318178e-05,4.321336314082188e-06,0.9999854756774167 +0.25369930266283475,0.03902369736956899,1.770257772803324e-05,2.9802319407463367e-07,5.1259989380836994e-06,4.768371105194139e-06,0.9999887539325515 +0.27405476568994597,0.04405313729485524,9.566544529795742e-06,1.7881391644478022e-07,7.95721928179272e-06,1.344084605276598e-05,0.9999832107011417 +0.2704670429117742,0.04214173554652531,1.1801718485355495e-05,1.7881391644478022e-07,7.4803821712733056e-06,9.983777001500229e-06,0.9999852372588615 +0.27086994050811675,0.040899723761230786,1.2844799664616713e-05,2.086162358522436e-07,6.407498672604624e-06,8.463858711719597e-06,0.9999855948866944 +0.2692357897646999,0.0399757325580809,1.4394520273804807e-05,1.7881391644478022e-07,5.30481285452848e-06,7.063149699568818e-06,0.9999861909330825 +0.2674098610767262,0.039185702794040767,1.6063450160622756e-05,1.7881391644478022e-07,4.261731675267262e-06,5.960463881492674e-06,0.9999865485609154 +0.26485288142061264,0.038401007645707114,1.814961251914519e-05,1.7881391644478022e-07,3.3378597736358976e-06,4.976987341046382e-06,0.9999871446073035 +0.26179587839949897,0.037636816495172684,2.068280966877958e-05,2.086162358522436e-07,2.6226041078567766e-06,4.112720078229945e-06,0.9999877406536917 +0.2585855126273846,0.03695887326561348,2.3394820734858744e-05,2.3841855525970696e-07,2.086162358522436e-06,3.397464412450824e-06,0.9999883367000798 +0.2576310932529582,0.03680670260752797,2.4557111191749817e-05,2.3841855525970696e-07,1.7285345256328755e-06,3.1590458571911173e-06,0.9999882174908022 +0.18294239043431929,0.622941672695302,2.8312203437090202e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.17846184968209394,0.4856819211605018,5.960463881492674e-08,0.9999999000000099,0.0,1.9043682101369094e-05,1.4901159703731684e-07 +0.18123647569859586,0.5750046967475473,0.0,0.9999999000000099,0.0,1.3291834455728662e-05,8.940695822239011e-08 +0.17641797661050804,0.6309084891192612,5.960463881492674e-08,0.9999999000000099,0.0,1.1086462819576373e-05,8.940695822239011e-08 +0.1812247335835756,0.6387236117222931,2.980231940746337e-08,0.9999999000000099,0.0,1.0550021070242033e-05,0.0 +0.18505552410313134,0.6401833890772373,8.940695822239011e-08,0.9999999000000099,0.0,1.0371207153797252e-05,2.980231940746337e-08 +0.1876147985380687,0.6408153771256825,2.980231940746337e-08,0.9999999000000099,0.0,1.0728834986686813e-05,0.0 +0.18948292731454164,0.6405813096856896,1.1920927762985348e-07,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 +0.19093841313525162,0.639687955269949,0.0,0.9999999000000099,0.0,1.2248753276467444e-05,2.980231940746337e-08 +0.19212299584546869,0.6382318137983356,0.0,0.9999999000000099,0.0,1.344084605276598e-05,8.940695822239011e-08 +0.19310590624009658,0.6366713045937383,2.980231940746337e-08,0.9999999000000099,0.0,1.4841555064916758e-05,1.1920927762985348e-07 +0.19397562741430066,0.6350997089252147,2.980231940746337e-08,0.9999999000000099,0.0,1.6391275674104854e-05,5.960463881492674e-08 +0.25938087700723444,0.0339847505034427,2.8014180243015566e-06,5.960463881492674e-08,0.9999048902057389,2.1576879251003478e-05,1.4901159703731684e-07 +0.19817915557994387,0.02472925185733775,7.995962297022422e-05,0.0,0.9999996615814547,2.086162358522436e-07,0.0 +0.27025228737665735,0.04608368872807077,4.500150230526969e-05,0.0,0.9999999000000099,1.4603136509657052e-06,0.0 +0.2802126407507261,0.042759120457003086,4.497169998586222e-05,0.0,0.9999999000000099,1.2814997345209249e-06,0.0 +0.307602286326069,0.045610278837023295,1.4513729551434662e-05,0.0,0.9999997211860935,2.682208746671703e-06,0.0 +0.3385015129902864,0.04827219246991404,4.112720078229945e-06,0.0,0.999999542372177,9.298323655128571e-06,0.0 +0.36425369976442756,0.054735511531993936,1.4305113315582417e-06,1.1920927762985348e-07,0.9999981118608455,6.154178957641186e-05,0.0 +0.36858671902083995,0.07229089735700603,8.642672628164378e-07,2.086162358522436e-07,0.9999787403532306,0.0006890594270199605,0.0 +0.2969075441237531,0.09400853513061569,1.5795229285955586e-06,1.4901159703731684e-07,0.9975367979056219,0.11606498392076905,0.0 +0.1191673874805697,0.11092022059448617,6.502866094708507e-05,0.0,0.0178194028201105,0.9998948766264181,0.0 +0.1881113946359943,0.14427587387475474,8.255242475867353e-06,0.0,6.881355551183292e-05,0.9999976946283737,0.0 +0.2117229998024055,0.15716639158418683,5.03659197986131e-06,0.0,1.7046926701069047e-05,0.9999988867211501,5.960463881492674e-08 +0.18341475724414472,0.6337785123693496,3.1888481765985805e-06,0.9999999000000099,8.940695822239011e-08,2.980231940746337e-08,0.0 +0.17770650982120909,0.48107978693353715,0.0,0.9999999000000099,0.0,1.987814704477807e-05,5.960463881492674e-08 +0.18162584304057497,0.567592501543128,0.0,0.9999999000000099,0.0,1.397728780210032e-05,2.980231940746337e-08 +0.17628484963640773,0.6236985324745302,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,1.1920927762985348e-07 +0.1806640624925191,0.63181245316177,2.980231940746337e-08,0.9999999000000099,0.0,1.0848044264316667e-05,2.980231940746337e-08 +0.18431073426437128,0.6329307555068544,0.0,0.9999999000000099,0.0,1.0639428028464424e-05,2.980231940746337e-08 +0.18674424289883776,0.6330735682357118,0.0,0.9999999000000099,0.0,1.0937451222539056e-05,0.0 +0.18848651646787268,0.6326204537262068,1.4901159703731684e-07,0.9999999000000099,0.0,1.1473892971873398e-05,2.980231940746337e-08 +0.18985486029792467,0.6314965485445145,0.0,0.9999999000000099,0.0,1.2367962554097299e-05,8.940695822239011e-08 +0.19094941019221223,0.6302110551708638,2.980231940746337e-08,0.9999999000000099,0.0,1.3470648372173444e-05,1.1920927762985348e-07 +0.19188648461500973,0.628898918521003,5.960463881492674e-08,0.9999999000000099,0.0,1.4722345787286905e-05,2.980231940746337e-08 +0.19275137781298723,0.627393185984945,5.960463881492674e-08,0.9999999000000099,0.0,1.618265943825261e-05,2.980231940746337e-08 +0.09032723307235534,0.032377570861994276,0.0002820491508722333,0.0003072023084521324,2.980231940746337e-08,0.0,0.9997916413919906 +0.21131825446207497,0.050394386044456035,0.00010025500248670677,6.854533463716575e-07,1.1920927762985348e-07,5.871056923270284e-06,0.9999937011175731 +0.28768727182150733,0.06537103651834719,3.6656852871179947e-06,2.3841855525970696e-07,3.2186504960060438e-06,0.00020897386368513314,0.9999625874961118 +0.2706603109724504,0.04884514211771937,9.953974682092765e-06,2.086162358522436e-07,1.1742113846540568e-05,3.382563252747093e-05,0.9999844623985569 +0.2817566990735687,0.04296183585384948,1.0102986279130082e-05,8.940695822239011e-08,1.3649462288618223e-05,1.9133089059591483e-05,0.9999859525145273 +0.2727220058328234,0.03981587290082067,1.5228985217213781e-05,1.7881391644478022e-07,8.165835517644963e-06,9.745358446240521e-06,0.9999889327464679 +0.2622364759336604,0.037396162741933255,2.2172925639152747e-05,1.1920927762985348e-07,4.2319293558597985e-06,5.245208215713553e-06,0.99999084009491 +0.254209905852282,0.036185592406752363,2.8342005756497666e-05,2.086162358522436e-07,2.4735925108194595e-06,3.546476009488141e-06,0.9999915553505758 +0.24610754846507474,0.035147547715844295,3.5583969372511265e-05,2.9802319407463367e-07,1.4901159703731685e-06,2.354383233189606e-06,0.9999922110016028 +0.24359372257177672,0.03517267107361282,3.7729736369848626e-05,2.682208746671703e-07,1.1622904568910714e-06,2.1457669973373625e-06,0.9999920321876864 +0.24035888909298306,0.034851193422071804,4.118680542111438e-05,2.682208746671703e-07,8.642672628164378e-07,1.847743803262729e-06,0.9999920917923252 +0.23917925356828215,0.0347977876603622,4.240870051682038e-05,2.682208746671703e-07,7.748603045940476e-07,1.6689298868179488e-06,0.9999919129784087 +0.45475426314378253,0.2529482543035339,5.185603576898626e-05,1.4901159703731684e-07,2.7000901383161812e-05,0.9999999000000099,7.003545060753892e-06 +0.27526345847897365,0.19607898589591352,9.655951488018132e-06,0.0,6.526707950234478e-06,0.9999998403953712,2.592801788449313e-06 +0.30189377068223194,0.19906622167993265,5.30481285452848e-06,0.0,2.9504296213388737e-06,0.9999997807907323,4.261731675267262e-06 +0.31254857777255,0.201058745349788,4.947185021638919e-06,0.0,2.6226041078567766e-06,0.9999999000000099,5.21540589630609e-06 +0.32078230379683675,0.20126780864130187,4.768371105194139e-06,0.0,2.324580913782143e-06,0.9999997807907323,5.841254603862821e-06 +0.32959687708443564,0.1953652798794952,4.440545591712042e-06,0.0,1.9669530808925826e-06,0.9999997807907323,5.513429090380723e-06 +0.3366717100004024,0.18608012792261958,3.993510800600092e-06,0.0,1.5497206091880952e-06,0.9999997807907323,4.827975744009066e-06 +0.341549336896105,0.17802691456607314,3.784894564747848e-06,0.0,1.2516974151134616e-06,0.9999998403953712,4.202127036452335e-06 +0.34446442125801435,0.17277726528070195,3.695487606525458e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.874301522970238e-06 +0.3471227586125643,0.16919094321214795,3.6060806483030677e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.635882967710531e-06 +0.34899258612141326,0.16692149636271356,3.695487606525458e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.546476009488141e-06 +0.3509060740325584,0.16502439972912727,3.6656852871179947e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.5166736900806776e-06 +0.14219793676741208,0.12549638746020006,0.0001707672902047651,0.0,0.0004718005185395526,0.9999764157723169,0.0 +0.19954216479428868,0.14262202379645517,1.3500450691580906e-05,0.0,2.65240642726424e-05,0.999998588697956,1.4901159703731684e-07 +0.2191291153340202,0.1531309187150048,8.40425407290467e-06,0.0,9.596346849203206e-06,0.9999991847443441,1.1920927762985348e-07 +0.24450835584581723,0.16459342834515261,6.258487075567308e-06,0.0,6.616114908456868e-06,0.999999542372177,4.172324717044872e-07 +0.25626355408561063,0.17789652940564932,6.139277797937454e-06,0.0,6.3180917143822346e-06,0.9999997807907323,7.748603045940476e-07 +0.264134883869678,0.191731423106741,6.258487075567308e-06,0.0,6.496905630827015e-06,0.9999997807907323,1.370906692743315e-06 +0.26588958500714804,0.19716796275577345,6.645917227864331e-06,0.0,6.556510269641941e-06,0.9999997807907323,1.6689298868179488e-06 +0.2676315903552815,0.20063030716321584,7.033347380161355e-06,0.0,6.526707950234478e-06,0.9999997807907323,2.0563600391149723e-06 +0.26926904915648325,0.20356771346421126,7.2121612966061355e-06,0.0,6.467103311419552e-06,0.9999998403953712,2.354383233189606e-06 +0.27133396266767396,0.20693078633579726,7.4803821712733056e-06,0.0,6.407498672604624e-06,0.9999997807907323,2.8312203437090202e-06 +0.271650910366254,0.20691004391941897,7.718800726533013e-06,0.0,6.139277797937454e-06,0.9999999000000099,2.9504296213388737e-06 +0.2715521454698652,0.20555654164609116,7.95721928179272e-06,0.0,6.0498708397150644e-06,0.9999999000000099,3.0100342601538e-06 +0.5133962631013,0.35876578086431743,0.9999996615814547,6.556510269641942e-07,0.0,5.960463881492674e-08,4.112720078229945e-06 +0.5735315084219911,0.4618228077097686,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5724628567458574,0.3356113433263206,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5669540762666543,0.3298932611377398,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.584496378874418,0.3444728254682053,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5927590727560643,0.3451573252086887,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.6019932031382198,0.34980201715201564,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.6056594848382022,0.35682225221245906,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.6072080731140476,0.36196294420719954,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.6087501048789679,0.36429607861956553,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.6108602881178636,0.36537200206222187,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.6118995547041243,0.36554014676510443,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.35029417274931957,0.109988182764293,1.5795229285955586e-06,1.4901159703731684e-07,0.9690057858394421,0.011441855478510374,0.0 +0.12486669420678939,0.050757557145010304,6.848572999835082e-05,0.0,0.6155331115309478,0.8135992667083106,0.0 +0.11019933223268054,0.0925576090654192,8.732079586386767e-05,0.0,0.005026369784304549,0.9996538950716893,0.0 +0.12635397910548574,0.10543346403223905,3.4987922984362e-05,0.0,0.00021979210563004235,0.999970574517713,0.0 +0.1487771868644144,0.12447327373280567,1.7911193963885486e-05,0.0,4.6938653066754805e-05,0.9999913169320206,0.0 +0.16694021224284325,0.13167980311046265,1.2546776470542079e-05,0.0,2.4259087997675183e-05,0.9999952508381824,2.980231940746337e-08 +0.18529656528659302,0.13732534644636424,9.685753807425595e-06,0.0,1.6212461757660073e-05,0.9999971581866245,2.980231940746337e-08 +0.20499363540754256,0.14416781065379547,7.539986810088233e-06,0.0,1.1473892971873398e-05,0.9999984694886783,0.0 +0.21995782851262055,0.1505976617078397,6.556510269641941e-06,0.0,9.059905099868864e-06,0.9999990655350666,1.1920927762985348e-07 +0.2304788529777458,0.15620517728038108,6.228684756159844e-06,0.0,7.718800726533013e-06,0.9999993039536218,2.3841855525970696e-07 +0.23301467298496503,0.15771415826957888,6.4373009920120876e-06,0.0,7.122754338383746e-06,0.9999994231628994,2.086162358522436e-07 +0.22741499542248328,0.1534854471420681,7.450579851865842e-06,0.0,6.794928824901648e-06,0.9999993039536218,2.9802319407463367e-07 +0.13031688332018065,0.11808329818610934,0.00020220873717963897,0.0,0.0007202922577589822,0.9999432755931358,0.0 +0.03974562883212497,0.11024647949238292,0.0002810954766511945,0.0,0.0006502866094708508,0.9981188968082885,0.0 +0.09349408745378548,0.06917864083059193,0.00017538664971292192,0.0,0.004479586630135819,0.9982910946098248,8.940695822239011e-08 +0.09471559524143937,0.09173956511833943,0.0002149641298860333,0.0,0.0032178458333820426,0.9976420596977691,0.0 +0.0782179534402884,0.07316324113546688,0.0004718005185395526,0.0,0.018478421509167734,0.9855230061153629,0.0 +0.0850924849474958,0.05896705388013104,0.0007270871865838838,0.0,0.28841152883325505,0.7074107416368555,0.0 +0.2734993100053071,0.05019506811236126,1.1026858180761447e-05,0.0,0.9992182447665909,0.00012469290440082675,0.0 +0.264552235592378,0.025774687524196697,8.58306798934945e-05,0.0,0.9999981118608455,3.874301522970238e-07,5.960463881492674e-08 +0.2544812559976107,0.029005676502983038,0.00017023084845543078,0.0,0.9999997807907323,4.172324717044872e-07,1.1920927762985348e-07 +0.24715074895789044,0.030923634762237136,0.00023391840502918,0.0,0.9999997807907323,4.768371105194139e-07,2.980231940746337e-08 +0.22915408014302283,0.028670728201725084,0.0002663731308639076,0.0,0.9999997807907323,4.172324717044872e-07,0.0 +0.2127611935050603,0.02775466441632897,0.00025200841290951026,0.0,0.9999997807907323,3.278255134820971e-07,1.4901159703731684e-07 +0.11297255754003031,0.022575318809458286,1.1920927762985347e-06,7.450579851865842e-07,0.9991297914825896,2.7894970965385714e-05,3.215670264065298e-05 +0.032356441019625766,0.024897277350930804,2.5331971496343865e-06,4.6193595081568225e-06,0.9991524412453393,3.5166736900806776e-06,0.00016561148894727394 +0.07107469439212226,0.03930348157209677,1.0132788598537545e-06,5.0067896604538464e-06,0.9999224139695505,1.564621768891827e-05,4.1961665725708426e-05 +0.042273908851780416,0.04267627000077948,9.536742210388278e-07,1.5616415369510804e-05,0.9997959925306241,2.9057261422276787e-05,0.0001278817525774253 +0.03204044699536212,0.0483922660267935,4.172324717044872e-07,5.349516333639675e-05,0.9966265158616403,7.936357658207495e-05,0.0010196267538875442 +0.03947627544239614,0.053010791531068566,1.1920927762985348e-07,6.318091714382234e-05,0.9380743757589076,0.00021329519999921533,0.008098184252590021 +0.050417453048525726,0.05062344669428864,8.940695822239011e-08,4.1097398462891984e-05,0.4744227650195765,0.00023663041609525915,0.04658892284850823 +0.07521444558785843,0.048134058705670724,5.960463881492674e-08,1.7017124381661583e-05,0.03182452598853739,0.00011852382428348182,0.46648494704771803 +0.15257138013207958,0.04592508076835061,7.152556657791209e-07,2.980231940746337e-06,0.0002748369895756272,1.6510484951734707e-05,0.9930988749180177 +0.2352985441587291,0.03923821448607889,7.629393768310623e-06,6.854533463716575e-07,5.245208215713553e-06,1.5795229285955586e-06,0.9998965455563048 +0.23487716912250692,0.033226460212740026,2.309679754078411e-05,5.66244068741804e-07,1.0132788598537545e-06,4.4703479111195056e-07,0.9999718858197669 +0.22448539732957176,0.03176251053266234,3.641843431592024e-05,5.66244068741804e-07,3.278255134820971e-07,3.5762783288956044e-07,0.9999830914918642 +0.6889280676556466,0.4098063110603504,0.9999996615814547,3.367662093043361e-06,2.086162358522436e-07,5.066394299268773e-07,2.545118077397372e-05 +0.4723105728430678,0.4435838162139446,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5687796473267593,0.3070966600845908,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.516861319520529,0.36416643851720126,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5758024453878394,0.3226938247128099,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5565593838461252,0.35582882159815776,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.57249498364939,0.32983762020185153,0.9999999000000099,0.0,0.0,0.0,8.940695822239011e-08 +0.5719301104308769,0.3398773073568096,0.9999999000000099,0.0,0.0,0.0,1.1920927762985348e-07 +0.5731455683470864,0.33697795862149676,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5787069201229792,0.336235940398815,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5795166492222193,0.3385549187080492,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5800844430683262,0.339896500052424,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.44834020731976837,0.2451834976253286,4.005431728363077e-05,1.1920927762985348e-07,2.65240642726424e-05,0.9999999000000099,6.467103311419552e-06 +0.17532172798384443,0.16616022583977264,3.7193294620514286e-05,0.0,1.892447282373924e-05,0.9999993039536218,2.086162358522436e-07 +0.23646771906827235,0.1511956453064464,1.007318395972262e-05,0.0,4.768371105194139e-06,0.9999994231628994,4.768371105194139e-07 +0.23884359001124345,0.15249651667844658,1.0192393237352472e-05,0.0,4.470347911119505e-06,0.9999994827675383,5.066394299268773e-07 +0.23771411179511895,0.1522540449835418,1.0669230347871886e-05,0.0,4.410743272304579e-06,0.9999994827675383,5.066394299268773e-07 +0.2336361408136899,0.1494131088000988,1.1444090652465934e-05,0.0,4.500150230526969e-06,0.9999994231628994,4.768371105194139e-07 +0.2329843342207756,0.14832156894051401,1.1742113846540568e-05,0.0,4.351138633489652e-06,0.9999994231628994,4.4703479111195056e-07 +0.23115745185848555,0.14691644904481954,1.2338160234689835e-05,0.0,4.351138633489652e-06,0.9999994231628994,4.4703479111195056e-07 +0.23009619115830365,0.14586731788998517,1.272559038698686e-05,0.0,4.351138633489652e-06,0.9999993039536218,3.874301522970238e-07 +0.2255486845876759,0.14301663634712308,1.3738869246840614e-05,0.0,4.410743272304579e-06,0.999999244348983,4.172324717044872e-07 +0.2198623716740167,0.13955637810224744,1.5020368981361538e-05,0.0,4.470347911119505e-06,0.9999990655350666,2.9802319407463367e-07 +0.2174852788358278,0.13780444858098678,1.576542696654812e-05,0.0,4.589557188749359e-06,0.9999989463257889,2.9802319407463367e-07 +0.6355933546756773,0.397211849621467,0.999999542372177,2.413987872004533e-06,1.1920927762985348e-07,3.278255134820971e-07,1.4543531870842124e-05 +0.5558492541083007,0.4316838978981875,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.5746850371122815,0.32673254603513163,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5346575975196701,0.353062063395125,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5695264339211193,0.3388552069083762,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5475295781862514,0.35567948216069856,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5563119649656728,0.34272313112112335,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5530039667854204,0.35060697787956946,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5497078895341226,0.34951972955440774,0.9999999000000099,0.0,2.980231940746337e-08,0.0,5.960463881492674e-08 +0.5500719547043956,0.3498482107517087,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5511783361206706,0.35023179644309504,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5510172247658494,0.35042053455074396,0.9999999000000099,0.0,2.980231940746337e-08,0.0,2.980231940746337e-08 +0.2006431519902117,0.4031723439003078,0.04844808094010401,1.7881391644478022e-07,0.0006368159610986773,0.9995662166479925,0.0 +0.4535182714274488,0.38663476698930604,0.9999999000000099,1.7881391644478022e-07,5.21540589630609e-06,8.940695822239011e-08,0.0 +0.5238824486515555,0.39713752262944485,0.9999999000000099,1.7881391644478022e-07,1.600384552180783e-05,0.0,0.0 +0.4831905364790156,0.4602253138230945,0.9999999000000099,5.960463881492674e-08,1.603364784121529e-05,0.0,0.0 +0.5132603645112177,0.4344709514827627,0.9999999000000099,5.960463881492674e-08,4.172324717044872e-06,0.0,0.0 +0.5322711467522518,0.4084234833017982,0.9999999000000099,0.0,1.4007090121507783e-06,0.0,0.0 +0.5346998572128141,0.4022117852475945,0.9999999000000099,0.0,5.066394299268773e-07,0.0,0.0 +0.5522816777000622,0.39523047202018274,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.5595558881527944,0.3891484140683434,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5588676929242462,0.38258242600565545,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5597652196652368,0.37239447229684397,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5672674774888703,0.36184424155714967,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.1832219064159819,0.6291621922369308,3.0100342601538e-06,0.9999999000000099,0.0,2.980231940746337e-08,0.0 +0.17667722701294786,0.47646734110302813,5.960463881492674e-08,0.9999999000000099,0.0,1.9133089059591483e-05,0.0 +0.18135565518581934,0.5721898673985115,0.0,0.9999999000000099,0.0,1.3560055330395832e-05,2.980231940746337e-08 +0.17595830559001926,0.6302812694423972,5.960463881492674e-08,0.9999999000000099,0.0,1.1354683694243543e-05,8.940695822239011e-08 +0.18086981772627522,0.6388912199833728,5.960463881492674e-08,0.9999999000000099,0.0,1.060962570905696e-05,8.940695822239011e-08 +0.18481984733769918,0.6406219004487747,2.980231940746337e-08,0.9999999000000099,0.0,1.0520218750834569e-05,8.940695822239011e-08 +0.18752852081475987,0.6404253243303392,8.940695822239011e-08,0.9999999000000099,0.0,1.0788439625501739e-05,2.980231940746337e-08 +0.1894284188668968,0.6391750573017446,0.0,0.9999999000000099,0.0,1.150369529128086e-05,2.980231940746337e-08 +0.19079545139476378,0.6379214524130432,2.980231940746337e-08,0.9999999000000099,0.0,1.2457369512319688e-05,2.980231940746337e-08 +0.19188407062689644,0.636637866388025,0.0,0.9999999000000099,0.0,1.353025301098837e-05,0.0 +0.19282686709559213,0.6353740691050688,2.980231940746337e-08,0.9999999000000099,0.0,1.4871357384324222e-05,2.980231940746337e-08 +0.19373729824217614,0.6334537266600241,2.980231940746337e-08,0.9999999000000099,0.0,1.6421077993512318e-05,1.4901159703731684e-07 +0.29666945337020767,0.2562655508079402,0.9999997807907323,5.960463881492674e-08,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.7025886177725736,0.5913842319429542,0.9999999000000099,2.980231940746337e-08,5.960463881492674e-08,0.0,0.0 +0.7700124382653872,0.5873845218606313,0.9999999000000099,1.4901159703731684e-07,4.4703479111195056e-07,0.0,0.0 +0.7120701670351816,0.3921598791404595,0.9999999000000099,0.0,7.748603045940476e-07,0.0,8.940695822239011e-08 +0.6830589174941465,0.3761784433674393,0.9999999000000099,0.0,1.043081179261218e-06,0.0,5.960463881492674e-08 +0.6910362839412649,0.35946375125451774,0.9999999000000099,0.0,2.2351739555597527e-06,0.0,2.682208746671703e-07 +0.6979330777832949,0.35670912259669474,0.9999999000000099,0.0,3.2782551348209707e-06,0.0,4.4703479111195056e-07 +0.7059043645566465,0.3589462041240216,0.9999999000000099,0.0,3.3378597736358976e-06,0.0,4.768371105194139e-07 +0.7233614921270296,0.35798129433224046,0.9999999000000099,0.0,3.844499203562775e-06,0.0,5.066394299268773e-07 +0.741307020156682,0.3529379665247239,0.9999999000000099,0.0,5.871056923270284e-06,0.0,8.642672628164378e-07 +0.7418498992612739,0.35128104680721894,0.9999999000000099,0.0,7.718800726533013e-06,0.0,1.3113020539283883e-06 +0.732744753330407,0.35244697326347074,0.9999999000000099,0.0,8.076428559422574e-06,0.0,1.4007090121507783e-06 +0.21466049551074945,0.026226133103648203,3.2186504960060438e-06,5.066394299268773e-07,0.21757162421795048,4.4077630403638326e-05,0.8096812153804502 +0.22031173109095978,0.04158484935048419,1.8179414838552656e-05,6.258487075567308e-07,5.406140740513855e-05,2.413987872004533e-06,0.9999405933843891 +0.25589475034607817,0.03828534483254027,1.1861323124170421e-05,3.5762783288956044e-07,6.943940421938965e-06,2.8908249825239467e-06,0.9999752236795405 +0.21731767057472634,0.03285753726396592,3.4719702109694823e-05,5.66244068741804e-07,8.642672628164378e-07,5.66244068741804e-07,0.9999906612809936 +0.13953107594865957,0.02533492445511917,4.6879048427939884e-05,4.440545591712042e-06,0.0,8.940695822239011e-08,0.9999977542330126 +0.08314728736533147,0.025169044728737662,1.1205672097206226e-05,0.00010564922229945764,0.0,0.0,0.9999990655350666 +0.1194469332645547,0.072304993855493,3.2186504960060438e-06,0.003688990700894631,0.0,2.980231940746337e-08,0.9999556733580093 +0.32712924479083666,0.150513946984267,0.0,0.9988722994429091,0.0,6.079673159122528e-06,0.8859854050614325 +0.20806202291580783,0.46122422806471425,0.0,0.9999994231628994,0.0,0.0010911821227848639,0.011816411028823373 +0.145295679563228,0.3335686921502177,0.0,0.9999999000000099,0.0,0.009447633275359963,0.0002308189638108038 +0.13834184407615024,0.349052607953383,0.0,0.9999999000000099,0.0,0.005079715936043909,7.65621585577734e-05 +0.14024373888388703,0.36462262266591156,0.0,0.9999999000000099,0.0,0.0030464526944697207,4.4763083750009984e-05 +0.5324981808441919,0.3662916421263039,0.9999996019768158,8.642672628164378e-07,8.940695822239011e-08,1.4901159703731684e-07,5.066394299268773e-06 +0.5530570745239131,0.4598556756185832,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5691072940590761,0.32421326631716396,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5525632500419695,0.3330005108739936,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5770972370862416,0.33582437032671136,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5760811567067976,0.3436132668860466,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5843517780061988,0.3395372628584242,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5842875241991335,0.34629124397070155,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5820584296939159,0.34902220958455277,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5847442149873837,0.3496499359008973,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5781217217205986,0.3533566295495546,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5746569633245934,0.35394954675335627,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.4557014405538691,0.3290088176163916,0.9999997211860935,4.172324717044872e-07,2.980231940746337e-08,0.0,1.519918289780632e-06 +0.6363207101558414,0.5011895298099612,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.6165404915554336,0.373939931328638,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 +0.5787031054257137,0.3317686020759868,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 +0.5734366774321573,0.3588213323932386,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.5741722583533,0.34249573940134415,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5767490267514782,0.3459958433512453,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5779808759450002,0.33968120807553215,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5818900465724324,0.3387129604236441,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5854923724885734,0.33731114858573413,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5894387960189886,0.33788686984952104,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5919287204497328,0.33938503259569397,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.6981662511536466,0.4126346110591032,0.9999997211860935,3.725289925932921e-06,2.9802319407463367e-07,6.258487075567308e-07,2.7567145451903616e-05 +0.5434339046253248,0.4326052664969677,0.9999999000000099,0.0,4.172324717044872e-07,0.0,0.0 +0.5791491865871943,0.30690962070931765,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.5381184220091203,0.3474898933769294,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5786997079609617,0.32779616111864396,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5682119130852973,0.3414319753062199,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5767936706304131,0.33142709726380465,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5776585340260683,0.33628261083566613,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5789907574413878,0.3363559245487273,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5811696648357068,0.3372346758265004,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5800154804943239,0.3401141762151064,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5831587910410687,0.3406311869037997,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.38456082342462794,0.22442248459787775,4.029273583889048e-05,1.4901159703731684e-07,3.5166736900806775e-05,0.9999999000000099,2.7716157048940933e-06 +0.37924695013383236,0.37260109179792245,0.9999966813495139,3.874301522970238e-06,3.5762783288956045e-06,2.4199483358860258e-05,0.0 +0.39978450535072485,0.4302494823195909,0.9999999000000099,3.5762783288956044e-07,6.407498672604624e-06,0.0,0.0 +0.45180863140142713,0.45257022969125715,0.9999999000000099,5.960463881492674e-08,3.0100342601538e-06,0.0,0.0 +0.4725227057738146,0.4281485676032301,0.9999999000000099,0.0,9.238719016313645e-07,0.0,0.0 +0.5105468034532856,0.4138464032895018,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 +0.5287007093210643,0.41133633248915036,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5438641309512957,0.40537294738503843,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5564859509237651,0.3856645225818183,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5623992085223971,0.37428414815215694,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5663137435678588,0.3653033673137747,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5706556439163424,0.3612394928313621,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.18380826710893555,0.6437708138317194,3.457069051265751e-06,0.9999998403953712,5.960463881492674e-08,2.980231940746337e-08,0.0 +0.15904158353146985,0.4146368800883776,0.0,0.9999999000000099,0.0,1.3649462288618223e-05,0.0 +0.18331119417385175,0.495480060492549,0.0,0.9999999000000099,0.0,1.3321636775136126e-05,0.0 +0.17637154459222992,0.5664732455237275,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 +0.17682901024086212,0.5847509502363264,0.0,0.9999999000000099,0.0,1.2427567192912226e-05,0.0 +0.17932721971722962,0.5925511120735222,5.960463881492674e-08,0.9999999000000099,0.0,1.177191616594803e-05,2.980231940746337e-08 +0.18153572081767833,0.5950109361583366,2.980231940746337e-08,0.9999999000000099,0.0,1.1652706888318178e-05,8.940695822239011e-08 +0.18320065736012037,0.5963261126450804,5.960463881492674e-08,0.9999999000000099,0.0,1.1861323124170421e-05,0.0 +0.18459302186201584,0.5959078668527631,8.940695822239011e-08,0.9999999000000099,0.0,1.2338160234689835e-05,1.1920927762985348e-07 +0.18571078776544245,0.5947903393680607,0.0,0.9999999000000099,0.0,1.3023613581061492e-05,0.0 +0.186606377355478,0.594071626561482,0.0,0.9999999000000099,0.0,1.388788084387793e-05,8.940695822239011e-08 +0.1874144971293093,0.5935665368017419,0.0,0.9999999000000099,0.0,1.4871357384324222e-05,2.980231940746337e-08 +0.08641871809601571,0.14621379969000517,4.172324717044872e-07,0.9999996615814547,0.0,0.0,1.4901159703731684e-07 +0.1128400564147001,0.469033032575401,1.4901159703731684e-07,0.9999999000000099,0.0,5.066394299268773e-07,0.0 +0.38745683430020994,0.9053556917547614,5.528330250084455e-05,0.9999712897733788,0.0,0.0,0.00012451409048438197 +0.31601104138973146,0.6795204280643368,0.36721467279887265,0.0012456475442737464,0.0,6.854533463716575e-07,0.5473646570250089 +0.1909095942895039,0.16146397587872377,4.178285180926364e-05,7.95721928179272e-06,0.0,8.177756445407949e-05,0.999469120691363 +0.1529393792089076,0.08375522492881918,0.0005614160929977949,1.1026858180761447e-06,0.0,3.3378597736358976e-06,0.9999638391935269 +0.19237712024845804,0.057102560987231314,7.295607790947034e-05,1.3411043733358516e-06,0.0,2.413987872004533e-06,0.9999727202847103 +0.20042058824662962,0.04424232243733993,0.00012436507888734463,5.960463881492673e-07,5.960463881492674e-08,1.0132788598537545e-06,0.9999849988403062 +0.220706194630067,0.039298504584258875,6.332992874085967e-05,4.768371105194139e-07,1.4901159703731684e-07,1.1026858180761447e-06,0.9999854756774167 +0.2278067469502533,0.03609347342826777,5.879997619092523e-05,3.278255134820971e-07,1.4901159703731684e-07,9.536742210388278e-07,0.9999875022351364 +0.2381729185482585,0.03590729832034372,4.434585127830549e-05,2.682208746671703e-07,2.086162358522436e-07,1.2218950957059981e-06,0.9999864293516377 +0.2472951710121752,0.036403357976401964,3.486871370673214e-05,2.682208746671703e-07,4.768371105194139e-07,1.6391275674104854e-06,0.9999851180495838 +0.09305450319858517,0.4198853968854983,0.9970579342373828,2.9802319407463367e-07,0.0021715162013054108,0.0063569837412089745,0.0 +0.7350741624527776,0.43789046995294134,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,0.0 +0.7272620796856145,0.38481572263803976,0.9999999000000099,0.0,2.8312203437090202e-06,0.0,2.086162358522436e-07 +0.6545674204555313,0.37761336558551634,0.9999999000000099,0.0,1.9073484420776557e-06,0.0,2.3841855525970696e-07 +0.6061784624802401,0.37471473210594064,0.9999999000000099,0.0,1.1920927762985347e-06,0.0,1.1920927762985348e-07 +0.5798698067424989,0.37172812217069157,0.9999999000000099,0.0,5.960463881492673e-07,0.0,8.940695822239011e-08 +0.580890834307459,0.3693854808174855,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.5773347615956618,0.36902517073988,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5778229832409968,0.3651382326454528,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5788494348286313,0.3588410317283335,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.577392697310381,0.3554329275476274,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5752900242567266,0.35250473016424816,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.15104645490020913,0.02351206540658792,1.6093252480030219e-06,1.0132788598537545e-06,0.747348233828409,5.30481285452848e-05,0.17082698425053824 +0.08649703859924733,0.03623092173909628,1.2814997345209249e-06,1.6391275674104854e-06,0.9896310174271264,3.206729568243058e-05,0.013797997048545022 +0.08691781758902177,0.03426635264763581,1.996755400300046e-06,1.4603136509657052e-06,0.999932546758149,1.3381241413951053e-05,3.427266731858287e-05 +0.1108135878993879,0.0333622693958375,1.087784658372413e-05,4.172324717044872e-07,0.9999979330469291,2.712011066079167e-06,2.026557719707509e-06 +0.14045524596586376,0.032033473247764864,2.890824982523947e-05,2.086162358522436e-07,0.9999996615814547,1.2814997345209249e-06,5.960463881492673e-07 +0.1593419909411254,0.03242713212411653,5.459784915447289e-05,0.0,0.9999997807907323,9.238719016313645e-07,2.9802319407463367e-07 +0.16075605153371822,0.030948489899104217,7.340311270058228e-05,2.980231940746337e-08,0.9999998403953712,7.450579851865842e-07,2.086162358522436e-07 +0.15235874056185217,0.029180049891243585,7.069110163450312e-05,8.940695822239011e-08,0.9999997807907323,6.258487075567308e-07,2.682208746671703e-07 +0.13129666447095795,0.027346372599687457,5.099176850616983e-05,5.960463881492674e-08,0.9999997807907323,5.66244068741804e-07,5.066394299268773e-07 +0.0864471495115724,0.02849212288368621,2.0116565600037775e-05,2.682208746671703e-07,0.9999987079072337,1.4305113315582417e-06,3.546476009488141e-06 +0.03375902771809979,0.039505511515528356,2.413987872004533e-06,1.3917683163285393e-05,0.9998036815290312,2.6434657314420008e-05,0.00033718344177604057 +0.034440696238045326,0.05301499365852451,4.768371105194139e-07,5.590915120840128e-05,0.9850970713663915,0.00017797945150137124,0.006625443034431404 +0.15409070252734136,0.02565294503726381,1.7285345256328755e-06,2.086162358522436e-07,0.9997220827784936,2.1308658376336308e-05,3.725289925932921e-06 +0.205922067156848,0.03337791561508836,5.674361615181025e-05,0.0,0.9999997807907323,6.854533463716575e-07,2.980231940746337e-08 +0.2944803833839549,0.051409453144807125,2.6166436439752837e-05,0.0,0.9999997807907323,2.8312203437090202e-06,0.0 +0.3013371825093424,0.04481643437571819,2.0265577197075092e-05,2.980231940746337e-08,0.9999997807907323,2.2351739555597527e-06,0.0 +0.3100759386887901,0.0446664392871666,1.2367962554097299e-05,8.940695822239011e-08,0.9999997807907323,2.65240642726424e-06,0.0 +0.33195635675009416,0.0474934577860569,5.03659197986131e-06,8.940695822239011e-08,0.999999542372177,6.854533463716575e-06,0.0 +0.35325002668825356,0.05176025628157262,2.2053716361522894e-06,1.4901159703731684e-07,0.9999988271165112,2.6494261953234936e-05,0.0 +0.3642043173162332,0.06111270188238814,1.1920927762985347e-06,1.4901159703731684e-07,0.999994058745406,0.00014770029498338845,0.0 +0.3608863651603037,0.07644021509768956,8.344649434089744e-07,2.3841855525970696e-07,0.9999305202004294,0.0016922054982751776,0.0 +0.19916769861350278,0.08647930620620001,1.0192393237352472e-05,8.940695822239011e-08,0.958896064236126,0.7990630066034039,0.0 +0.13192063569476328,0.122031420448388,3.850459667444267e-05,0.0,0.0021221635603666518,0.9999739123774867,0.0 +0.18690153955639352,0.142569273685838,8.04662624001511e-06,0.0,4.285573530793233e-05,0.999997635023735,2.980231940746337e-08 +0.4306256770909334,0.25541245932973855,7.808207684755403e-05,8.940695822239011e-08,3.209709800183805e-05,0.9999999000000099,4.947185021638919e-06 +0.44693306086596923,0.48541322342190035,0.9999993039536218,2.65240642726424e-06,7.063149699568818e-06,6.9975845968724e-05,0.0 +0.3681507408466484,0.4374864100660782,0.9999999000000099,3.874301522970238e-07,3.254413279295e-05,2.980231940746337e-08,0.0 +0.4028151631188489,0.4803361891877691,0.9999999000000099,2.086162358522436e-07,2.115964677929899e-05,2.980231940746337e-08,0.0 +0.45520395038627187,0.44148361675332093,0.9999999000000099,8.940695822239011e-08,3.5762783288956045e-06,0.0,0.0 +0.48480677602667815,0.4208016692871511,0.9999999000000099,2.980231940746337e-08,1.0132788598537545e-06,0.0,0.0 +0.5194668173574879,0.4106529950392399,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 +0.5476888417970847,0.3983433841976893,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.5656208991770184,0.38492816680038927,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5725331306220446,0.373374640877685,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5796161889789901,0.36322581761816186,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5802311300991123,0.35813879960603245,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.4382253289041258,0.2537837624115299,6.675719547271795e-05,1.4901159703731684e-07,3.015994724035293e-05,0.9999999000000099,5.6624406874180405e-06 +0.32503384350384457,0.1932879686024614,7.301568254828525e-06,0.0,4.351138633489652e-06,0.9999997807907323,3.4272667318582874e-06 +0.31909173725714235,0.19019326564393063,4.529952549934432e-06,0.0,2.0563600391149723e-06,0.9999997807907323,4.321336314082188e-06 +0.32762643693521,0.1847839653175559,4.053115439415018e-06,0.0,1.519918289780632e-06,0.9999998403953712,4.261731675267262e-06 +0.33107018469393273,0.18106964227436867,3.904103842377701e-06,0.0,1.2814997345209249e-06,0.9999999000000099,4.142522397637409e-06 +0.33135515450059205,0.1785075366191372,3.844499203562775e-06,0.0,1.2516974151134616e-06,0.9999997807907323,4.053115439415018e-06 +0.33437019585178557,0.1766796409781233,3.784894564747848e-06,0.0,1.1920927762985347e-06,0.9999999000000099,4.053115439415018e-06 +0.340197801575879,0.17437076565617676,3.784894564747848e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.053115439415018e-06 +0.3433237671709949,0.17200371620093938,3.725289925932921e-06,0.0,1.043081179261218e-06,0.9999997807907323,3.993510800600092e-06 +0.34813746808517854,0.16827380654314605,3.725289925932921e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.725289925932921e-06 +0.35296672581164784,0.16431820389794938,3.695487606525458e-06,0.0,9.834765404462913e-07,0.9999997807907323,3.546476009488141e-06 +0.3572267591805358,0.160525739165475,3.725289925932921e-06,0.0,8.642672628164378e-07,0.9999997807907323,3.1590458571911173e-06 +0.2853674292446228,0.19163128730353549,5.6475395277143086e-05,8.940695822239011e-08,6.729363722205229e-05,0.9999997211860935,5.066394299268773e-07 +0.21512916683259894,0.14609980580689175,1.2606381109357005e-05,0.0,9.655951488018132e-06,0.9999990655350666,2.086162358522436e-07 +0.21669158338603156,0.14402267334379223,1.1205672097206226e-05,0.0,6.526707950234478e-06,0.9999989463257889,2.086162358522436e-07 +0.22763192652713432,0.14701163766250955,9.894370043277838e-06,0.0,5.424022132158334e-06,0.999999244348983,2.682208746671703e-07 +0.2297980785274719,0.14845272896131978,1.007318395972262e-05,0.0,5.245208215713553e-06,0.9999993039536218,3.278255134820971e-07 +0.22974070905687793,0.1483073234304151,1.0490416431427107e-05,0.0,5.03659197986131e-06,0.9999993039536218,3.278255134820971e-07 +0.22892403601652175,0.14746803042747655,1.096725354194652e-05,0.0,4.976987341046382e-06,0.9999993039536218,3.5762783288956044e-07 +0.2301647961044373,0.14772725102756035,1.11460674583913e-05,0.0,4.887580382823993e-06,0.9999993039536218,3.5762783288956044e-07 +0.22868281601912574,0.14664182064406397,1.1712311527133104e-05,0.0,4.798173424601603e-06,0.999999244348983,4.172324717044872e-07 +0.2275179624463285,0.14547783133876707,1.2189148637652518e-05,0.0,4.678964146971749e-06,0.9999993039536218,3.5762783288956044e-07 +0.21890458463716062,0.14066347477411598,1.3917683163285393e-05,0.0,4.887580382823993e-06,0.9999990655350666,3.278255134820971e-07 +0.20101171731116507,0.13248771426793235,1.8507240352034754e-05,0.0,5.602836048603113e-06,0.9999983502794008,1.4901159703731684e-07 +0.1716569662023037,0.14187014100506476,0.00012379883481860283,5.960463881492674e-08,0.00024363396115601306,0.9999948932103495,2.980231940746337e-08 +0.1375076174679084,0.11533376572541378,4.33623747378592e-05,0.0,4.0352340477705406e-05,0.9999870253980259,0.0 +0.13639593123824864,0.11585336921615426,4.059075903296511e-05,0.0,2.8491017353534983e-05,0.9999882174908022,2.980231940746337e-08 +0.10898554324652475,0.11429664490649956,6.934999726116726e-05,0.0,3.597139952480829e-05,0.9999745084238748,0.0 +0.0717836320370514,0.11639076469335717,0.00012102721911370875,0.0,5.2273268240690753e-05,0.9999168707381407,0.0 +0.04312971234143004,0.10890477893871862,0.00020679829436838832,5.960463881492674e-08,0.00018706915892064758,0.9993694021306256,8.940695822239011e-08 +0.06091374158607023,0.07957366107531767,0.0004243552260428709,0.0,0.00914254693158576,0.9843791930965045,8.940695822239011e-08 +0.20566704868418703,0.07816803454014272,2.1427867653966164e-05,0.0,0.9762307621333934,0.0032216605302661976,5.960463881492674e-08 +0.25128531454953135,0.023670494552373782,0.00010776518697738755,0.0,0.9999952508381824,4.172324717044872e-07,8.940695822239011e-08 +0.22401040791537633,0.023285359140223543,0.0002495348203986908,0.0,0.9999996615814547,2.086162358522436e-07,0.0 +0.22012263535541768,0.028163015837615248,0.0003110468076556952,0.0,0.9999998403953712,3.874301522970238e-07,1.1920927762985348e-07 +0.2084318697366238,0.027896136040679136,0.00030988451719880415,0.0,0.9999997807907323,4.172324717044872e-07,1.1920927762985348e-07 +0.2910059392331741,0.12052273748241403,3.8146968841553113e-06,8.940695822239011e-08,0.7703750555232244,0.1373606484858437,0.0 +0.07705074548402263,0.03666782378522509,3.597139952480829e-05,1.4901159703731684e-07,0.9998580409596304,2.0563600391149723e-06,7.152556657791209e-07 +0.16106697916317617,0.017213255164059933,2.2917983624339332e-05,0.0,0.9999979926515679,1.1920927762985348e-07,1.7881391644478022e-07 +0.20610660313706494,0.0376991033489523,8.401273840963924e-05,2.980231940746337e-08,0.9999997807907323,8.642672628164378e-07,8.940695822239011e-08 +0.18763464688477807,0.030402779573956575,0.00011110304675102345,0.0,0.9999997807907323,3.874301522970238e-07,0.0 +0.158832609646896,0.02641570567632387,7.611512376666144e-05,5.960463881492674e-08,0.9999996615814547,3.5762783288956044e-07,1.4901159703731684e-07 +0.1199237108180933,0.024987399573815763,3.811716652214565e-05,5.960463881492674e-08,0.9999996615814547,4.4703479111195056e-07,5.066394299268773e-07 +0.04365181922731845,0.03378841280358619,4.589557188749359e-06,4.172324717044872e-06,0.9999758197259287,7.718800726533013e-06,5.528330250084455e-05 +0.035096138714290764,0.056199252595814944,4.4703479111195056e-07,5.787610428929386e-05,0.9883103574449041,0.00018373129914701168,0.009360103863260243 +0.07694613933244615,0.055757164945591575,1.7881391644478022e-07,2.008676328063031e-05,0.10029037783984343,0.00019261239033043577,0.5853890191245197 +0.192069500676785,0.0432384610102047,3.367662093043361e-06,1.4007090121507783e-06,4.6491618275642854e-05,4.678964146971749e-06,0.9993189170015494 +0.22464853524231523,0.03224301337643687,2.9146668380499176e-05,6.854533463716575e-07,8.344649434089744e-07,2.9802319407463367e-07,0.9999736739589313 +0.33552175758879843,0.03281489014063643,1.2308357915282372e-05,3.5762783288956044e-07,0.0031233128762215684,2.899765678346186e-05,0.99814095052465 +0.29174876211865663,0.047342061988353334,4.202127036452335e-06,1.7881391644478022e-07,0.0001496970503836885,2.4974343663454304e-05,0.9999417258725266 +0.26987722514942375,0.041392266743247884,7.987021601200183e-06,2.086162358522436e-07,2.0921228224039285e-05,7.86781232357033e-06,0.9999755217027346 +0.25873085855366335,0.03878381847671151,1.3679264608025687e-05,2.9802319407463367e-07,6.377696353197161e-06,4.112720078229945e-06,0.99998380674753 +0.24593016504223053,0.0366337299284194,2.226233259737514e-05,2.3841855525970696e-07,2.5331971496343865e-06,2.324580913782143e-06,0.9999882174908022 +0.23673063515636572,0.03522679209105961,3.16500632107261e-05,3.278255134820971e-07,1.2218950957059981e-06,1.5497206091880952e-06,0.9999903632577996 +0.23641294239972604,0.03549581765520727,3.486871370673214e-05,3.874301522970238e-07,9.238719016313645e-07,1.5795229285955586e-06,0.9999904824670772 +0.23844629525150954,0.0358583629069915,3.55541670531038e-05,2.682208746671703e-07,8.344649434089744e-07,1.7583368450403388e-06,0.9999903632577996 +0.24194830655049782,0.03617596625662279,3.43322719573978e-05,2.682208746671703e-07,9.238719016313645e-07,1.9669530808925826e-06,0.9999897672114114 +0.2405197322269028,0.03536322712292712,3.764032941162624e-05,2.682208746671703e-07,7.748603045940476e-07,1.6689298868179488e-06,0.9999904228624383 +0.23960462211570413,0.0349097549855536,3.981589872837106e-05,2.682208746671703e-07,6.556510269641942e-07,1.5497206091880952e-06,0.9999906016763548 +0.24032264946896112,0.034950643771862515,3.9964910325408376e-05,2.3841855525970696e-07,6.258487075567308e-07,1.519918289780632e-06,0.9999903632577996 +0.18272575735289212,0.6180849074259004,2.65240642726424e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.18264546989638297,0.5129073857382831,1.1920927762985348e-07,0.9999999000000099,0.0,1.934170529544373e-05,2.980231940746337e-08 +0.18076375126090183,0.597325324909924,0.0,0.9999999000000099,0.0,1.2546776470542079e-05,0.0 +0.17789447306850048,0.6474479435765731,2.980231940746337e-08,0.9999999000000099,0.0,1.0371207153797252e-05,8.940695822239011e-08 +0.18315023183064247,0.6548413037132466,2.980231940746337e-08,0.9999999000000099,0.0,9.864567723870376e-06,0.0 +0.18729418515383514,0.6557846068213004,0.0,0.9999999000000099,0.0,9.894370043277838e-06,2.980231940746337e-08 +0.1900236010472768,0.6556982992956804,0.0,0.9999999000000099,0.0,1.0401009473204716e-05,0.0 +0.1919444501320514,0.6548219918083427,0.0,0.9999999000000099,0.0,1.1175869777798764e-05,2.980231940746337e-08 +0.19337823986206404,0.6535688637567995,1.1920927762985348e-07,0.9999999000000099,0.0,1.2159346318245055e-05,8.940695822239011e-08 +0.19454067944674797,0.6518128513173723,1.1920927762985348e-07,0.9999999000000099,0.0,1.3500450691580906e-05,8.940695822239011e-08 +0.19552820920134575,0.6496288775285313,0.0,0.9999999000000099,0.0,1.5079973620176466e-05,5.960463881492674e-08 +0.19638827442309664,0.6472182272756482,2.980231940746337e-08,0.9999999000000099,0.0,1.6838310465216805e-05,8.940695822239011e-08 +0.16653820871617225,0.1393029391527059,0.00013005732189417014,5.960463881492674e-08,0.0002682506769865778,0.9999937011175731,0.0 +0.12097582220530255,0.11248818037967911,6.210803364515366e-05,0.0,5.632638368010577e-05,0.9999762369584004,0.0 +0.1354223489705277,0.11401414869263497,4.172324717044872e-05,0.0,3.334879541695151e-05,0.9999867273748319,0.0 +0.12789896130032227,0.11520484087878667,4.81605481624608e-05,0.0,3.007054028213054e-05,0.9999848200263898,0.0 +0.1262543499417478,0.1146728694242574,5.146860561668924e-05,0.0,2.971291244924098e-05,0.9999837471428911,0.0 +0.1346730589810873,0.11492687461792424,4.54783394157891e-05,0.0,2.598762252330806e-05,0.9999872042119423,2.980231940746337e-08 +0.14176672696480236,0.11609256265559695,4.0531154394150184e-05,0.0,2.1964309403300505e-05,0.9999900056299666,0.0 +0.14215421676047113,0.11631762979423028,4.136561933755916e-05,0.0,2.041458879411241e-05,0.9999904824670772,5.960463881492674e-08 +0.1386005580367871,0.11545225975920696,4.5746560290456275e-05,0.0,2.0563600391149726e-05,0.9999894691882173,0.0 +0.1428703665674178,0.11562815306590901,4.345178169608159e-05,0.0,1.910328674018402e-05,0.9999907208856325,2.980231940746337e-08 +0.13805586099052974,0.11459240315382441,4.926323398053695e-05,0.0,1.9788740086555676e-05,0.9999894095835785,0.0 +0.1426541805208264,0.11484748123109702,4.622339740097569e-05,0.0,1.8417833393812362e-05,0.9999906612809936,5.960463881492674e-08 +0.22623124717729304,0.03097990154689547,2.65240642726424e-06,5.960463881492674e-08,0.9998870684187333,1.987814704477807e-05,4.172324717044872e-07 +0.17641237377389937,0.02315816282829464,6.33001264214522e-05,0.0,0.9999996019768158,1.7881391644478022e-07,8.940695822239011e-08 +0.22909015416150388,0.040124148123546206,6.44326145589358e-05,0.0,0.9999999000000099,9.238719016313645e-07,1.1920927762985348e-07 +0.23126602171893942,0.037178844207119394,0.00010135768830478292,0.0,0.9999998403953712,6.258487075567308e-07,2.980231940746337e-08 +0.21640586852131255,0.03211376070426357,0.00010088085119426351,0.0,0.9999997807907323,3.874301522970238e-07,2.980231940746337e-08 +0.19973349570400975,0.03020498156030331,9.208916696906182e-05,0.0,0.9999997807907323,3.278255134820971e-07,0.0 +0.180048823349173,0.028880774969877593,7.59959144890316e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 +0.16431647538458397,0.029067873949795507,5.969404577314913e-05,0.0,0.9999997807907323,3.874301522970238e-07,1.1920927762985348e-07 +0.15727490186040044,0.030419588083780355,4.962086181342651e-05,2.980231940746337e-08,0.9999997807907323,5.066394299268773e-07,2.086162358522436e-07 +0.1569547057086803,0.031625121826478586,4.5746560290456275e-05,0.0,0.9999998403953712,6.258487075567308e-07,1.1920927762985348e-07 +0.15191105007496275,0.031081110233706754,4.282593298852486e-05,8.940695822239011e-08,0.9999997807907323,6.258487075567308e-07,2.086162358522436e-07 +0.14232823252088567,0.030179738993245254,3.647803895473517e-05,8.940695822239011e-08,0.9999997807907323,5.960463881492673e-07,2.3841855525970696e-07 +0.14481508731242393,0.12684994933817262,0.00016584990750253365,0.0,0.0004357397120565219,0.9999793960042576,0.0 +0.1688356101442998,0.12340295312675727,2.2351739555597528e-05,0.0,3.540515545606648e-05,0.99999537004746,0.0 +0.16353783010759287,0.12650990483978725,2.1070239821076602e-05,0.0,1.803040324151534e-05,0.99999537004746,0.0 +0.17823413013673897,0.12973660228415052,1.636147335469739e-05,0.0,1.2516974151134616e-05,0.9999968005587916,1.1920927762985348e-07 +0.1861485242766548,0.1317766606582061,1.4990566661954075e-05,0.0,1.0550021070242033e-05,0.9999973966051797,0.0 +0.19422706960827524,0.134057521797113,1.370906692743315e-05,0.0,9.030102780461401e-06,0.9999979330469291,1.1920927762985348e-07 +0.20582631229502027,0.13792771098636117,1.1950730082392812e-05,0.0,7.68899840712555e-06,0.999998588697956,1.7881391644478022e-07 +0.2181366383939063,0.14311474559240656,1.0490416431427107e-05,0.0,6.526707950234478e-06,0.9999989463257889,1.7881391644478022e-07 +0.22721701859487,0.14796468612998245,9.655951488018132e-06,0.0,5.871056923270284e-06,0.9999993039536218,2.682208746671703e-07 +0.22917741536145145,0.14928588268584753,9.80496308505545e-06,0.0,5.48362677097326e-06,0.9999993039536218,3.5762783288956044e-07 +0.2309140860938777,0.1499257087450794,1.007318395972262e-05,0.0,5.30481285452848e-06,0.9999993039536218,3.5762783288956044e-07 +0.23203289507858785,0.15025851127912582,1.0251997876167399e-05,0.0,5.096196618676236e-06,0.9999993635582606,3.5762783288956044e-07 +0.4380809664544858,0.2568696736849578,7.46846124351032e-05,1.1920927762985348e-07,3.096460986435444e-05,0.9999999000000099,5.513429090380723e-06 +0.31474798916467084,0.19656085964651765,7.599591448903159e-06,0.0,4.947185021638919e-06,0.9999999000000099,3.6656852871179947e-06 +0.32750409840181355,0.19768637415361862,4.649161827564286e-06,0.0,2.413987872004533e-06,0.9999997807907323,5.453824451565797e-06 +0.34113654492873013,0.18301567432130716,3.844499203562775e-06,0.0,1.519918289780632e-06,0.9999997807907323,4.380940952897116e-06 +0.34607684610841144,0.17429685589666793,3.635882967710531e-06,0.0,1.2218950957059981e-06,0.9999998403953712,3.8146968841553113e-06 +0.3470706343507104,0.16990706321667925,3.635882967710531e-06,0.0,1.1026858180761447e-06,0.9999998403953712,3.546476009488141e-06 +0.34603101013658105,0.16870343682261352,3.6060806483030677e-06,0.0,1.0728834986686813e-06,0.9999999000000099,3.546476009488141e-06 +0.34356522558697,0.169260352820977,3.6656852871179947e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.635882967710531e-06 +0.34118098019140836,0.1701036989397596,3.784894564747848e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.8146968841553113e-06 +0.33673685787713925,0.17160144445341916,3.844499203562775e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.993510800600092e-06 +0.3309296071392358,0.17261046168232658,4.023313120007555e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.993510800600092e-06 +0.32140195368389607,0.17210024592313658,4.202127036452335e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.784894564747848e-06 +0.31827086208932964,0.03486254810689957,2.6434657314420008e-05,7.450579851865842e-07,0.00022375581411123498,1.2189148637652518e-05,0.9996027542915861 +0.4325957894146128,0.0425033271239933,1.370906692743315e-06,0.0,0.0057499104948789456,0.00010001658393144707,0.9982972338876227 +0.11850801109776923,0.02743047475345113,2.682208746671703e-07,4.768371105194139e-07,0.9532909632112478,0.00014996527125835568,0.02114346411986074 +0.06702172755917546,0.02820628880971477,8.553265669941988e-06,8.642672628164378e-07,0.9999282552241544,4.947185021638919e-06,1.92821006566288e-05 +0.07660916447322244,0.029439091677393076,1.8328426435589973e-05,5.066394299268773e-07,0.9999903632577996,3.6060806483030677e-06,1.707672902047651e-05 +0.06944134831140987,0.030925422901580093,1.4722345787286905e-05,8.642672628164378e-07,0.9999886943279127,5.03659197986131e-06,2.226233259737514e-05 +0.06054720282303914,0.03210622071670077,1.1861323124170421e-05,1.4305113315582417e-06,0.9999777270743708,6.675719547271795e-06,3.6120411121845605e-05 +0.04956835508141306,0.03357794880292032,7.539986810088233e-06,3.129243537783654e-06,0.9999308778282623,1.1175869777798764e-05,8.538364510238256e-05 +0.03750303387486615,0.0367530584272393,3.9637084811926284e-06,9.179114377498718e-06,0.9996043636168341,2.5182959899306546e-05,0.0003261267812758717 +0.0313785672174812,0.04151752590422192,1.7285345256328755e-06,2.4527308872342353e-05,0.9962582187984029,6.53266841411597e-05,0.001645862891596572 +0.03376665711263073,0.04490035771554757,7.152556657791209e-07,3.3468004694581365e-05,0.9657103645686425,0.00013929604091048378,0.007088660484981607 +0.03915444016294474,0.04467481373975611,4.172324717044872e-07,2.8967854464054395e-05,0.7984965241161068,0.00019443033181429102,0.02185460706556163 +0.2776679992560805,0.1889682113800718,5.8770173871517764e-05,2.980231940746337e-08,7.203220600783897e-05,0.9999997807907323,4.172324717044872e-07 +0.24233329295108613,0.16023293134806604,8.67247494757184e-06,0.0,7.987021601200183e-06,0.999999542372177,4.172324717044872e-07 +0.25125229357632717,0.1703108846849634,7.450579851865842e-06,0.0,5.602836048603113e-06,0.9999996615814547,7.748603045940476e-07 +0.26672363280145556,0.18727353212010808,6.884335783124038e-06,0.0,5.424022132158334e-06,0.9999997807907323,1.519918289780632e-06 +0.26751947401846365,0.19314044710666756,7.301568254828525e-06,0.0,5.6624406874180405e-06,0.9999998403953712,1.937150761485119e-06 +0.2679386138805068,0.19538193937770706,7.659196087718087e-06,0.0,5.513429090380723e-06,0.9999998403953712,2.175569316744826e-06 +0.2681440710910391,0.1965464055201621,7.987021601200183e-06,0.0,5.57303372919565e-06,0.9999999000000099,2.324580913782143e-06 +0.26912057398635386,0.19855666157183507,8.285044795274818e-06,0.0,5.57303372919565e-06,0.9999997807907323,2.592801788449313e-06 +0.2687883973010344,0.19820907708588692,8.553265669941988e-06,0.0,5.513429090380723e-06,0.9999999000000099,2.682208746671703e-06 +0.2684385180362173,0.1972522735257938,8.761881905794231e-06,0.0,5.3942198127508695e-06,0.9999998403953712,2.74181338548663e-06 +0.2666534483322355,0.19391274448889004,9.030102780461401e-06,0.0,5.185603576898626e-06,0.9999998403953712,2.5331971496343865e-06 +0.2658401131519865,0.1918779313235738,9.208916696906181e-06,0.0,5.096196618676236e-06,0.9999998403953712,2.4735925108194595e-06 +0.18359148501589642,0.6381464003423871,3.2186504960060438e-06,0.9999998403953712,5.960463881492674e-08,2.980231940746337e-08,0.0 +0.1777399480269267,0.48089295617452066,5.960463881492674e-08,0.9999999000000099,0.0,2.0295379516482556e-05,0.0 +0.18184494971476026,0.5627968310346109,0.0,0.9999999000000099,0.0,1.433491563498988e-05,0.0 +0.17642548679574943,0.6172660588161163,0.0,0.9999999000000099,0.0,1.1861323124170421e-05,8.940695822239011e-08 +0.1803933083936381,0.6245727537993012,1.1920927762985348e-07,0.9999999000000099,0.0,1.1086462819576373e-05,2.980231940746337e-08 +0.1837009489460219,0.6258963941456016,2.980231940746337e-08,0.9999999000000099,0.0,1.0818241944909203e-05,2.980231940746337e-08 +0.18590831755821993,0.6272432803033605,5.960463881492674e-08,0.9999999000000099,0.0,1.1056660500168911e-05,2.980231940746337e-08 +0.1876253485601935,0.6275253294823894,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,2.980231940746337e-08 +0.1890141367834026,0.627206087005027,5.960463881492674e-08,0.9999999000000099,0.0,1.2338160234689835e-05,0.0 +0.19016289710211112,0.6266739367365635,0.0,0.9999999000000099,0.0,1.335143909454359e-05,0.0 +0.19119367002649168,0.6256067751766876,2.980231940746337e-08,0.9999999000000099,0.0,1.4632938829064515e-05,8.940695822239011e-08 +0.19211587309041833,0.6242751478079887,5.960463881492674e-08,0.9999999000000099,0.0,1.5974043202400367e-05,8.940695822239011e-08 +0.09573104977211326,0.020882964130640412,8.344649434089744e-07,1.6093252480030219e-06,0.9918222627638796,4.652142059505032e-05,0.0011633633403897402 +0.09108713268856532,0.0460764467637318,2.9206273019314104e-06,3.069638898968727e-06,0.24735212832760758,1.460313650965705e-05,0.7703674261294561 +0.11870625614628398,0.04894667863007686,1.1920927762985348e-07,6.198882436752381e-06,0.15601389040065564,0.0005750655552864131,0.603285133114785 +0.0502451658228096,0.045180886976134906,5.960463881492674e-08,2.4527308872342353e-05,0.4866761674578715,0.00025838610926270743,0.027177837753483924 +0.04866462945736601,0.04756063222070727,1.4901159703731684e-07,3.0040737962723075e-05,0.4372809688069983,0.00020790098018646448,0.03581946730046904 +0.053192019460382885,0.048580974332120073,8.940695822239011e-08,2.9563900852203663e-05,0.320418653632802,0.00026789304915368823,0.05195885377094201 +0.050158709285566476,0.047492444507095895,8.940695822239011e-08,3.1888481765985805e-05,0.3457184386241858,0.00026136634120345375,0.03130820080480309 +0.046681582925770876,0.046308815471348866,5.960463881492674e-08,3.3050772222876875e-05,0.42435462999648277,0.0002174675247162602,0.020835725369659275 +0.04683190583988819,0.04583185910393786,1.1920927762985348e-07,3.141164465546639e-05,0.40211903007961614,0.00019586084314584927,0.026558187928363945 +0.04892760515010414,0.046012163154352546,5.960463881492674e-08,3.0189749559760392e-05,0.34188535370895606,0.0002083480149775764,0.03375547786758576 +0.05075833201198207,0.04596465825247469,1.1920927762985348e-07,2.7984377923608103e-05,0.2605955936189379,0.00020822880569994657,0.04730224136352586 +0.05296859144945159,0.04611060022518225,5.960463881492674e-08,2.6434657314420008e-05,0.20036716245649358,0.00021994111722707966,0.05969157218063831 +0.6857213973715082,0.40939727418564936,0.9999997211860935,3.397464412450824e-06,2.086162358522436e-07,5.364417493343406e-07,2.431869263649011e-05 +0.4633905291365432,0.4302213191249394,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5670244097474864,0.3365976809878949,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5401079654469957,0.367727190193151,0.9999999000000099,0.0,0.0,0.0,0.0 +0.583469271635691,0.3290135263833281,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5640816092257577,0.3569090067729148,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5674453973535175,0.3459497987631642,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.562735497928206,0.35333043330818026,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5623672008281541,0.3524456321589635,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5556493997343771,0.3548376261580351,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5601106881863408,0.35183107846911205,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.561720192409144,0.3521391450755809,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.23076051472662026,0.17015367743439522,7.736682118177491e-05,0.0,0.00011116265138983837,0.9999994231628994,1.1920927762985348e-07 +0.05019506811887796,0.13727223870787844,0.00013062356596291194,0.0,2.413987872004533e-05,0.9999274207592109,2.980231940746337e-08 +0.0210993289938773,0.10011807082369184,0.0002807974534571199,8.940695822239011e-08,0.00039812918496430315,0.9970056609691421,4.768371105194139e-07 +0.089030116792807,0.09292101858455253,1.2248753276467444e-05,1.1920927762985348e-07,0.9443558106204186,0.001306265461948527,2.7716157048940933e-06 +0.07637006044071586,0.013848513362420519,1.972913544774075e-05,5.960463881492674e-08,0.9998024894362549,2.3841855525970696e-07,5.841254603862821e-06 +0.02990782260770934,0.030643701548097448,3.039836579561264e-06,9.208916696906181e-06,0.9968934254342536,1.8537042671442215e-05,0.0019347367736131146 +0.05915912985556732,0.0527025759129878,7.748603045940476e-07,1.6152857118845148e-05,0.44090889455542703,0.00017490981260240252,0.3874191850434819 +0.1622251868180812,0.04206010698551939,3.933906161785165e-06,1.4603136509657052e-06,0.00019085405348539543,1.1116265138983837e-05,0.9985922768497566 +0.22226259111437754,0.02986970543349915,5.340575637817436e-05,3.874301522970238e-07,6.258487075567308e-07,2.682208746671703e-07,0.9999833299104194 +0.1974469423212309,0.02735891937741053,7.56680889755495e-05,8.046626240015109e-07,1.1920927762985348e-07,1.7881391644478022e-07,0.9999924494201581 +0.20116347073675694,0.03037974237875483,7.456540315747335e-05,7.152556657791209e-07,8.940695822239011e-08,2.086162358522436e-07,0.9999914361412983 +0.20804962514969508,0.03256621956267608,7.385014749169422e-05,5.66244068741804e-07,5.960463881492674e-08,3.278255134820971e-07,0.9999903036531608 +0.2900378107904499,0.32381612056909354,0.0024263558345586304,1.1920927762985348e-07,0.00015464423540532743,0.9999965621402362,2.086162358522436e-07 +0.39754977820657605,0.229593694170738,0.000804990449514993,0.0,1.0251997876167399e-05,0.9999034000897685,2.980231940746337e-08 +0.4381455778894196,0.28935301298908783,0.033214714781937334,2.980231940746337e-08,1.5795229285955586e-06,0.9682502970424629,0.0 +0.4401318132695101,0.40799993269609675,0.9999999000000099,2.9802319407463367e-07,6.854533463716575e-07,1.1920927762985348e-07,0.0 +0.6087918281303089,0.4466031192968474,0.9999999000000099,1.7881391644478022e-07,3.278255134820971e-07,0.0,0.0 +0.6667321920118818,0.4066725670594985,0.9999999000000099,8.940695822239011e-08,1.043081179261218e-06,0.0,0.0 +0.5966259240857077,0.4245707093942328,0.9999999000000099,0.0,8.642672628164378e-07,0.0,0.0 +0.5758470892667743,0.40528282516215347,0.9999999000000099,0.0,8.642672628164378e-07,0.0,0.0 +0.5845756530519659,0.3860526978308516,0.9999999000000099,0.0,1.2516974151134616e-06,0.0,2.980231940746337e-08 +0.5720403790237069,0.3851037024792227,0.9999999000000099,0.0,6.854533463716575e-07,0.0,0.0 +0.5701256394150215,0.38526013486940897,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,2.980231940746337e-08 +0.5647797584299828,0.3884323834707792,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.18261316417891607,0.6163518427747079,2.5629994690418497e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 +0.16634449362066026,0.43697029344705646,0.0,0.9999999000000099,0.0,1.4483927232027197e-05,2.980231940746337e-08 +0.18311816453175464,0.5236908196506211,0.0,0.9999999000000099,0.0,1.317262517809881e-05,1.1920927762985348e-07 +0.17552608250844842,0.5933479665693879,0.0,0.9999999000000099,0.0,1.2129543998837591e-05,2.980231940746337e-08 +0.17824038862444014,0.6031773685376145,8.940695822239011e-08,0.9999999000000099,0.0,1.1354683694243543e-05,2.980231940746337e-08 +0.18129619955265833,0.6048443912424072,0.0,0.9999999000000099,0.0,1.1116265138983837e-05,0.0 +0.18333998321727707,0.6054087876236887,5.960463881492674e-08,0.9999999000000099,0.0,1.1205672097206226e-05,8.940695822239011e-08 +0.18485477565953612,0.6050817965425069,0.0,0.9999999000000099,0.0,1.1563299930095787e-05,8.940695822239011e-08 +0.18604534863655287,0.6046329735674251,5.960463881492674e-08,0.9999999000000099,0.0,1.2248753276467444e-05,0.0 +0.18703940509975328,0.6042782067217827,0.0,0.9999999000000099,0.0,1.3023613581061492e-05,0.0 +0.1879540383737938,0.6036443709293497,8.940695822239011e-08,0.9999999000000099,0.0,1.4096497079730174e-05,2.980231940746337e-08 +0.1888063251894018,0.6028282045285801,0.0,0.9999999000000099,0.0,1.528858985602871e-05,8.940695822239011e-08 +0.5988045334568027,0.38798105710061725,0.9999996615814547,1.8775461226701922e-06,5.960463881492674e-08,1.4901159703731684e-07,9.924172362685302e-06 +0.6466801762313096,0.4137894212491063,0.9999999000000099,0.0,5.960463881492673e-07,0.0,1.1920927762985348e-07 +0.5840660333391574,0.3283673822317511,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.556853175140211,0.33321452135102303,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5796084999798145,0.33477228874196113,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5706737041237085,0.339773893298142,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5725173949958245,0.3375486134904786,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5733107924223969,0.33904418343460424,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5751274823904309,0.3390968739405767,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5775349139928092,0.33899739378846355,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5787356495617597,0.3401137589825931,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5806614160297281,0.3408147692096764,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.19022008775877075,0.24646392460417427,0.9999996615814547,1.7881391644478022e-07,7.152556657791209e-07,8.940695822239011e-08,0.0 +0.7196636795699622,0.4721973537590175,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.591062724565827,0.45053726426992863,0.9999999000000099,0.0,4.172324717044872e-07,0.0,0.0 +0.6123952269300559,0.3238166570108964,0.9999999000000099,0.0,5.364417493343406e-07,0.0,5.960463881492674e-08 +0.6062704920517695,0.3638540505739869,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 +0.6028144359339012,0.36352881782982566,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 +0.614250183080034,0.3761500715565311,0.9999999000000099,0.0,3.278255134820971e-07,0.0,0.0 +0.6282470822074147,0.3835849761306058,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 +0.6491245031088023,0.39136585586522016,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 +0.6784626245217721,0.39357426755841496,0.9999999000000099,0.0,5.960463881492673e-07,0.0,8.940695822239011e-08 +0.7052363156980316,0.39775428169115257,0.9999999000000099,0.0,5.66244068741804e-07,0.0,8.940695822239011e-08 +0.7274408340152885,0.40700459473316297,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 +0.11865171789631676,0.4640832542578434,0.8789749458625762,2.086162358522436e-07,0.002866267871332197,0.5760269185058592,0.0 +0.13021323084292055,0.10452049968837072,0.007512449466955736,0.0,0.0002546608193367745,0.9992706968487481,0.0 +0.28246614335797837,0.21533486243375394,1.8507240352034754e-05,0.0,1.5318392175436174e-05,0.9999999000000099,4.112720078229945e-06 +0.3066691756121489,0.22223111983308574,8.67247494757184e-06,0.0,4.351138633489652e-06,0.9999999000000099,9.953974682092765e-06 +0.31357538698805315,0.20959725972401255,6.8247311443091115e-06,0.0,2.712011066079167e-06,0.9999999000000099,8.493661031127061e-06 +0.31383848189008084,0.1947262286806453,5.930661562085211e-06,0.0,1.9073484420776557e-06,0.9999999000000099,6.288289394974771e-06 +0.31123369930885936,0.18491047617606998,5.602836048603113e-06,0.0,1.5795229285955586e-06,0.9999997807907323,4.947185021638919e-06 +0.3061603605620449,0.17962819334768984,5.632638368010577e-06,0.0,1.4901159703731685e-06,0.9999996615814547,4.142522397637409e-06 +0.29939222334575716,0.1769280731375046,5.960463881492674e-06,0.0,1.6093252480030219e-06,0.9999997807907323,3.5762783288956045e-06 +0.29111531375633243,0.1754213571248079,6.794928824901648e-06,0.0,1.7881391644478022e-06,0.9999997807907323,3.0994412183761904e-06 +0.28443488477482803,0.1768839060957336,7.718800726533013e-06,0.0,2.2053716361522894e-06,0.9999997807907323,2.9504296213388737e-06 +0.2785652875784921,0.17946019765641916,8.761881905794231e-06,0.0,2.7716157048940933e-06,0.9999997807907323,2.980231940746337e-06 +0.10747432708295207,0.022135764356637437,1.1026858180761447e-06,7.748603045940476e-07,0.9988892867649714,2.9474493893981274e-05,4.875659455061007e-05 +0.19201612471739085,0.036195874207974356,3.650784127414263e-05,2.980231940746337e-08,0.9999997211860935,1.2516974151134616e-06,1.4901159703731684e-07 +0.2597146034133181,0.04702696203380219,5.632638368010577e-05,0.0,0.9999997807907323,1.6689298868179488e-06,8.940695822239011e-08 +0.2570191025627522,0.03891053795148229,8.794664457142441e-05,0.0,0.9999999000000099,7.748603045940476e-07,0.0 +0.24248766898104798,0.033729881042426774,0.00010398029241263969,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 +0.22624200581567455,0.031307280058268244,0.0001133382207065832,0.0,0.9999999000000099,3.5762783288956044e-07,5.960463881492674e-08 +0.21845880149890393,0.03181329369000228,0.00011026858180761446,0.0,0.9999997807907323,4.172324717044872e-07,2.980231940746337e-08 +0.21163755654412353,0.03198063373018053,0.00010824202408790696,0.0,0.9999999000000099,3.874301522970238e-07,8.940695822239011e-08 +0.199098080388408,0.03069269656609443,0.00010126828134656053,0.0,0.9999999000000099,3.874301522970238e-07,8.940695822239011e-08 +0.18495845793911864,0.029823958868641868,8.794664457142441e-05,0.0,0.9999999000000099,3.278255134820971e-07,5.960463881492674e-08 +0.1669847369124886,0.028721153731196433,7.003545060753892e-05,2.980231940746337e-08,0.9999997807907323,3.874301522970238e-07,1.7881391644478022e-07 +0.14720660447464792,0.02800244092461784,4.997848964631607e-05,8.940695822239011e-08,0.9999998403953712,4.4703479111195056e-07,1.7881391644478022e-07 +0.3272441923482812,0.30094957346531254,0.0009215473207175824,1.1920927762985348e-07,9.629129400551415e-05,0.9999993039536218,6.854533463716575e-07 +0.4566494524289824,0.2736679315098401,0.002360462906348729,1.1920927762985348e-07,1.0460614112019642e-05,0.9996906711338381,2.980231940746337e-08 +0.41432523725701365,0.31789496535579775,0.9999886943279127,5.066394299268773e-07,8.642672628164378e-07,1.662969422936456e-05,0.0 +0.5225859880230996,0.39383691542557275,0.9999999000000099,1.7881391644478022e-07,2.1457669973373625e-06,0.0,0.0 +0.5441161393893956,0.42734929911925135,0.9999999000000099,1.1920927762985348e-07,1.1384486013651007e-05,5.960463881492674e-08,0.0 +0.5049629211216687,0.45166471592798446,0.9999999000000099,1.1920927762985348e-07,3.844499203562775e-06,0.0,0.0 +0.5308135747689748,0.41538077585736954,0.9999999000000099,0.0,1.7881391644478022e-06,0.0,0.0 +0.532937288262234,0.4021645485666181,0.9999999000000099,0.0,8.344649434089744e-07,0.0,0.0 +0.5423802733196739,0.39959552877259386,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.5537254214057519,0.3955106138505791,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5533634423980459,0.3929500579161116,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5593450665242325,0.3815531133952055,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.18011295794694868,0.02749183773523689,2.1159646779298993e-06,1.4901159703731684e-07,0.9998171521774034,1.9937751683592993e-05,1.4305113315582417e-06 +0.07056999206250754,0.01680162548731157,1.1026858180761447e-05,1.1920927762985348e-07,0.99998279346867,2.086162358522436e-07,2.324580913782143e-06 +0.11599308251854293,0.03035295009093288,8.493661031127061e-06,2.9802319407463367e-07,0.9999993039536218,1.3411043733358516e-06,1.0132788598537545e-06 +0.08598163723589587,0.03439527749426291,7.808207684755402e-06,7.748603045940476e-07,0.999998588697956,2.712011066079167e-06,3.039836579561264e-06 +0.03402706980564363,0.04211303591007087,1.2516974151134616e-06,2.0116565600037775e-05,0.9998180462469856,2.6762482827902106e-05,0.00022026894274056178 +0.036266177891183235,0.05647611617074923,2.3841855525970696e-07,7.41183683663614e-05,0.9844936340030291,0.00019562242459058955,0.005566507021245416 +0.05362331866995975,0.054825991382747484,5.960463881492674e-08,4.643201363682793e-05,0.5218291952917509,0.00030952688936591454,0.06506290381208425 +0.08536070584897396,0.049021005622099045,1.4901159703731684e-07,1.4513729551434662e-05,0.015884904465052644,9.700654967129326e-05,0.6663918424832828 +0.19031956791089677,0.04453232883644494,1.9669530808925826e-06,1.6093252480030219e-06,4.97102687716489e-05,5.7816499650478935e-06,0.9989160492477993 +0.22810408472070304,0.03388988971129891,2.068280966877958e-05,7.152556657791209e-07,1.1920927762985347e-06,3.874301522970238e-07,0.9999623490775565 +0.20249089597817232,0.029361933464744545,4.4196839681268176e-05,1.0132788598537545e-06,2.086162358522436e-07,1.7881391644478022e-07,0.9999867273748319 +0.1893398761670866,0.02923092245555067,6.157159189581933e-05,1.1622904568910714e-06,8.940695822239011e-08,1.7881391644478022e-07,0.9999914361412983 +0.18739435075937605,0.41887369744757647,0.0853662405478486,5.960463881492674e-08,0.0008209942950368009,0.9989137842715243,0.0 +0.35647767780735207,0.2518617808387541,0.9999349309437017,3.5762783288956044e-07,1.4811752745509294e-05,0.0001585781415671126,0.0 +0.6988667845436628,0.4546344279464426,0.9999999000000099,8.940695822239011e-08,1.4901159703731684e-07,0.0,0.0 +0.7928560971885441,0.43588843934224597,0.9999999000000099,8.940695822239011e-08,6.258487075567308e-07,0.0,0.0 +0.8117023706100049,0.361040383515524,0.9999999000000099,2.980231940746337e-08,1.1920927762985347e-06,0.0,0.0 +0.7611198424977806,0.3812019526305714,0.9999999000000099,0.0,1.1622904568910714e-06,0.0,8.940695822239011e-08 +0.6538766026226132,0.39570596807379704,0.9999999000000099,0.0,6.258487075567308e-07,0.0,1.4901159703731684e-07 +0.6472810506552654,0.37270987027461894,0.9999999000000099,0.0,1.3411043733358516e-06,0.0,1.1920927762985348e-07 +0.6316735744214756,0.3631110190723441,0.9999999000000099,0.0,1.847743803262729e-06,0.0,2.9802319407463367e-07 +0.6143451332791573,0.3644682168336474,0.9999999000000099,0.0,1.2516974151134616e-06,0.0,2.086162358522436e-07 +0.59989982840915,0.370450973447308,0.9999999000000099,0.0,5.66244068741804e-07,0.0,1.7881391644478022e-07 +0.5864332914109588,0.3785187303371771,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 +0.16564768552094242,0.026492089028590453,1.937150761485119e-06,1.7881391644478022e-07,0.9997734023725132,2.0533798071742262e-05,2.354383233189606e-06 +0.13268309831069852,0.02068862318638353,3.2514330473542534e-05,5.960463881492674e-08,0.9999991847443441,2.086162358522436e-07,2.086162358522436e-07 +0.24892407654685203,0.04854774474266348,3.52263415396217e-05,0.0,0.9999998403953712,2.1457669973373625e-06,0.0 +0.2655804157147109,0.043863266698955745,7.072090395391057e-05,0.0,0.9999998403953712,1.1920927762985347e-06,0.0 +0.26149308680405253,0.03796067833250431,7.125734570324492e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 +0.24627983569079087,0.03401109575642891,9.399651541113947e-05,0.0,0.9999997807907323,4.768371105194139e-07,0.0 +0.22408637403513942,0.03042113780454425,0.00010791419857442486,0.0,0.9999997807907323,2.9802319407463367e-07,2.980231940746337e-08 +0.20586752890688076,0.029475539917666986,9.995697929263214e-05,0.0,0.9999998403953712,2.9802319407463367e-07,0.0 +0.18450450896452805,0.02836966514101614,8.353590129911983e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 +0.15682470797843057,0.026750415559002764,5.787610428929386e-05,2.980231940746337e-08,0.9999997807907323,3.278255134820971e-07,2.3841855525970696e-07 +0.12441086768588847,0.026258796448979525,3.120302841961415e-05,1.4901159703731684e-07,0.9999997807907323,3.874301522970238e-07,3.5762783288956044e-07 +0.06583455204691079,0.03184053301265997,7.2121612966061355e-06,1.2516974151134616e-06,0.9999965621402362,2.8312203437090202e-06,7.808207684755402e-06 +0.3338858783106832,0.03262737392820516,1.1891125443577885e-05,3.5762783288956044e-07,0.0035699304348618148,2.9623505491018588e-05,0.9979276851269702 +0.2730813026315146,0.04450300335122046,7.2121612966061355e-06,2.086162358522436e-07,7.519125186503009e-05,1.2308357915282372e-05,0.9999578787296454 +0.25435537098785027,0.038233011954436444,1.388788084387793e-05,2.682208746671703e-07,9.000300461053937e-06,3.6656852871179947e-06,0.9999830318872253 +0.259429424990402,0.03975269197736958,1.344084605276598e-05,2.9802319407463367e-07,5.096196618676236e-06,4.708766466379212e-06,0.9999839259568075 +0.25338649748706643,0.03868210315041972,1.8060205560922803e-05,2.682208746671703e-07,3.2186504960060438e-06,3.6060806483030677e-06,0.9999865485609154 +0.25288924573804833,0.03821888565362709,2.0235774877667628e-05,2.682208746671703e-07,2.4735925108194595e-06,3.4868713706732143e-06,0.9999872638165812 +0.25333034991169034,0.03798294066732411,2.1725890848040795e-05,2.9802319407463367e-07,2.1159646779298993e-06,3.3378597736358976e-06,0.9999875618397752 +0.25087970494185163,0.03707498311361606,2.5182959899306546e-05,2.086162358522436e-07,1.6391275674104854e-06,2.8014180243015566e-06,0.9999885751186351 +0.2510150968924533,0.03685203193987189,2.634525035619762e-05,2.086162358522436e-07,1.4603136509657052e-06,2.712011066079167e-06,0.9999885155139963 +0.2500244080916826,0.036447972053008704,2.8342005756497666e-05,2.086162358522436e-07,1.3113020539283883e-06,2.4437901914119963e-06,0.9999888731418292 +0.2526391148462587,0.036797493689911746,2.706050602197674e-05,2.3841855525970696e-07,1.2516974151134616e-06,2.682208746671703e-06,0.9999882174908022 +0.25341698526286777,0.03666141628591283,2.7269122257828982e-05,2.086162358522436e-07,1.3113020539283883e-06,2.682208746671703e-06,0.9999880982815246 +0.21184235810356328,0.1617482900342537,8.82744700849065e-05,0.0,0.00013735889014899867,0.9999988867211501,5.960463881492674e-08 +0.20417588948358045,0.13960087296956467,1.3589857649803297e-05,0.0,1.3679264608025687e-05,0.999998588697956,5.960463881492674e-08 +0.20606872438531176,0.14091926810712577,1.1980532401800274e-05,0.0,8.165835517644963e-06,0.9999987079072337,1.4901159703731684e-07 +0.21494960784022052,0.14216959474036503,1.0669230347871886e-05,0.0,6.616114908456868e-06,0.9999988867211501,2.086162358522436e-07 +0.20769721268747515,0.13874644038685574,1.2367962554097299e-05,0.0,6.645917227864331e-06,0.9999987079072337,1.1920927762985348e-07 +0.19303494691049441,0.13255837557430147,1.6272066396475e-05,0.0,7.4803821712733056e-06,0.9999979926515679,1.7881391644478022e-07 +0.16764575242302032,0.12389141319060795,2.661347123086479e-05,0.0,1.0520218750834569e-05,0.9999958468845705,8.940695822239011e-08 +0.12739157676169277,0.11436662075945389,6.0707324633002886e-05,0.0,1.9401309934258653e-05,0.9999869061887483,0.0 +0.058031529185753175,0.11878785488955619,0.00015667079312503494,2.980231940746337e-08,2.7090308341384204e-05,0.9999261094571571,2.980231940746337e-08 +0.019101977347536665,0.10912382600823067,0.000385642013132576,0.0,0.00021615622266233183,0.9973150686492304,6.556510269641942e-07 +0.0795620083775954,0.08549594877686399,1.5795229285955586e-05,1.4901159703731684e-07,0.9293108249232265,0.001301437486204518,4.380940952897116e-06 +0.07217735051809894,0.01365917920832391,2.1785495486855723e-05,8.940695822239011e-08,0.9996788694153528,2.682208746671703e-07,9.685753807425595e-06 +0.42258983848729276,0.2610772251635769,0.00010439752488434418,1.7881391644478022e-07,3.552436473369634e-05,0.9999999000000099,4.321336314082188e-06 +0.3070844411722819,0.1923229097990683,8.374451753497206e-06,0.0,5.334615173935943e-06,0.9999997807907323,3.2186504960060438e-06 +0.3147362470496506,0.1994482278482327,5.155801257491163e-06,0.0,2.5629994690418497e-06,0.9999997807907323,5.30481285452848e-06 +0.3254733681544001,0.1919074058204102,4.410743272304579e-06,0.0,1.8775461226701922e-06,0.9999999000000099,4.976987341046382e-06 +0.3293171524865163,0.1858029067198167,4.112720078229945e-06,0.0,1.5497206091880952e-06,0.9999997807907323,4.708766466379212e-06 +0.33102956412851997,0.18113440272090603,4.023313120007555e-06,0.0,1.3411043733358516e-06,0.9999999000000099,4.380940952897116e-06 +0.33203488586958246,0.17826294895934328,3.933906161785165e-06,0.0,1.2218950957059981e-06,0.9999997807907323,4.2319293558597985e-06 +0.33195114134367654,0.17669412490680125,3.933906161785165e-06,0.0,1.1920927762985347e-06,0.9999998403953712,4.172324717044872e-06 +0.3322820365291334,0.1758794486221507,3.933906161785165e-06,0.0,1.1622904568910714e-06,0.9999998403953712,4.142522397637409e-06 +0.3307391404968639,0.1755129098591672,4.023313120007555e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.2319293558597985e-06 +0.32670319078999976,0.1750967800317391,4.112720078229945e-06,0.0,1.043081179261218e-06,0.9999997807907323,4.112720078229945e-06 +0.32216140626527023,0.17471939322340832,4.261731675267262e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.023313120007555e-06 +0.08645421266197799,0.3721510767299453,0.9996292187512199,3.874301522970238e-07,0.0009153782406002374,0.0003519653922021424,0.0 +0.09393739699928409,0.16766729948033793,0.9901292526029805,0.0,0.0002295970687150978,0.013034610636922846,0.0 +0.2044614851390099,0.12559089062447526,0.0002055167946338674,0.0,4.962086181342651e-05,0.9999966217448751,8.940695822239011e-08 +0.30202573536575916,0.23266044255087387,1.1533497610688325e-05,0.0,7.68899840712555e-06,0.9999999000000099,1.0490416431427107e-05 +0.31490010021813136,0.220418035946296,7.897614642977793e-06,0.0,3.5166736900806776e-06,0.9999998403953712,1.0907648903131594e-05 +0.31974199412929255,0.20235568281523364,6.258487075567308e-06,0.0,2.264976274967216e-06,0.9999998403953712,7.897614642977793e-06 +0.31975674627887385,0.18861514326680523,5.424022132158334e-06,0.0,1.519918289780632e-06,0.9999997807907323,5.960463881492674e-06 +0.3167847394812064,0.18099859353780856,5.1259989380836994e-06,0.0,1.3113020539283883e-06,0.9999998403953712,4.857778063416529e-06 +0.3119434714188153,0.1771944760972826,5.185603576898626e-06,0.0,1.2814997345209249e-06,0.9999997807907323,4.202127036452335e-06 +0.3063386678568831,0.17568814751477685,5.424022132158334e-06,0.0,1.4305113315582417e-06,0.9999997807907323,3.784894564747848e-06 +0.3009918928021728,0.17623227831683821,5.990266200900137e-06,0.0,1.5497206091880952e-06,0.9999997807907323,3.6656852871179947e-06 +0.2948764264461486,0.1773382425004562,6.586312589049405e-06,0.0,1.7881391644478022e-06,0.9999998403953712,3.5166736900806776e-06 +0.6161654591305223,0.3924135565085802,0.9999996019768158,2.1457669973373625e-06,1.1920927762985348e-07,1.4901159703731684e-07,1.1831520804762957e-05 +0.591831803297332,0.444231629295575,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,8.940695822239011e-08 +0.5993382930507443,0.3221488594457218,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.5493808388482536,0.33723095053620256,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5795556306599008,0.33345001930249024,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5778817534207429,0.33482819789875085,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5816949605700905,0.33260208362606075,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5848413705583636,0.3329382836248588,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5878672599549057,0.33485475176799373,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5928648710005362,0.33558952802633657,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 +0.5943820476285863,0.3392996787443902,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5962533354512322,0.34203144902094573,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.27189651130504083,0.028711557383389236,5.632638368010577e-06,3.278255134820971e-07,0.0446293905451481,3.76701317310337e-05,0.9737724880147495 +0.26952785252408723,0.0483393669045644,4.976987341046382e-06,2.9802319407463367e-07,0.00019779799390733438,1.5795229285955586e-05,0.9999134732737283 +0.2575894594085843,0.03881302475264645,1.0520218750834569e-05,2.682208746671703e-07,1.3738869246840614e-05,3.6656852871179947e-06,0.9999734355403761 +0.25303167103673324,0.03805217146221887,1.4454124912619735e-05,3.278255134820971e-07,4.380940952897116e-06,2.8312203437090202e-06,0.9999821378176431 +0.24592557548458302,0.03714695572217002,2.0503995752334798e-05,3.5762783288956044e-07,2.175569316744826e-06,2.2053716361522894e-06,0.9999859525145273 +0.24275022744127273,0.03657716512053724,2.5421378454566255e-05,3.5762783288956044e-07,1.3411043733358516e-06,1.937150761485119e-06,0.9999876810490529 +0.24113461374238027,0.036155700677402626,2.9593703171611127e-05,3.5762783288956044e-07,1.1026858180761447e-06,1.7881391644478022e-06,0.9999886943279127 +0.23975306748351108,0.03569102286681325,3.34382023751739e-05,2.682208746671703e-07,8.642672628164378e-07,1.6093252480030219e-06,0.9999894095835785 +0.23662221430752378,0.034911692136508465,3.874301522970238e-05,3.278255134820971e-07,6.854533463716575e-07,1.3113020539283883e-06,0.9999903036531608 +0.22980526088716702,0.03363025187870177,4.8011536565423486e-05,3.278255134820971e-07,4.768371105194139e-07,1.0132788598537545e-06,0.9999915553505758 +0.22005930542034646,0.03224256634160113,6.0826533910632736e-05,4.172324717044872e-07,2.3841855525970696e-07,6.258487075567308e-07,0.9999927474433521 +0.2136222422034499,0.03182411193302716,6.964802045524189e-05,4.768371105194139e-07,2.682208746671703e-07,5.066394299268773e-07,0.9999932242804627 +0.3114230632653029,0.0348773896634461,2.8431412714720055e-05,8.642672628164378e-07,0.00016859172088802028,1.0460614112019642e-05,0.9996447159573117 +0.3594958484023962,0.04743340610645598,1.6391275674104854e-06,1.4901159703731684e-07,0.0005392133650392347,0.00010642408260405169,0.9998171521774034 +0.15838930010139737,0.03609696029998653,2.086162358522436e-07,5.066394299268773e-07,0.051139349591875584,0.0003628134364664591,0.9381923929437611 +0.0732651054828824,0.030132949347104584,8.642672628164378e-07,1.519918289780632e-06,0.9940784175523022,4.7415490177274224e-05,0.0007044374238342117 +0.08028987049723996,0.029512315983487105,1.4096497079730174e-05,5.066394299268773e-07,0.9999782635161201,4.112720078229945e-06,1.2606381109357005e-05 +0.09835547208378742,0.028594285244813736,2.9295679977536493e-05,2.682208746671703e-07,0.9999971581866245,2.264976274967216e-06,5.722045326232967e-06 +0.0992274582344929,0.028588265175692452,3.600120184421575e-05,2.086162358522436e-07,0.9999981118608455,1.996755400300046e-06,4.678964146971749e-06 +0.09322473406405664,0.028508990998154758,3.4064051082730634e-05,2.086162358522436e-07,0.9999977542330126,2.0563600391149723e-06,5.871056923270284e-06 +0.08062133192682218,0.0291004180858373,2.5421378454566255e-05,3.874301522970238e-07,0.9999956084660152,2.8908249825239467e-06,1.0669230347871886e-05 +0.058864891526645785,0.03104254602854368,1.397728780210032e-05,1.2516974151134616e-06,0.9999804688877563,5.871056923270284e-06,3.817677116096058e-05 +0.03764680027805844,0.0356633663116422,5.30481285452848e-06,7.2121612966061355e-06,0.999757666747866,2.059340271055719e-05,0.0002874433706849842 +0.030668526886623762,0.042574435465198165,1.7285345256328755e-06,2.6732680508494642e-05,0.9955035644663671,7.489322867095545e-05,0.002327829366597556 +0.09429299830999935,0.03241974114816564,0.00018718836819827742,0.004422544990789934,0.0,0.0,0.9976183370515207 +0.27003055809810206,0.1715777218048026,2.1547076931596017e-05,7.450579851865842e-07,0.0,0.004845588914778876,0.9994835450139562 +0.2189488410859045,0.09230583904593105,6.616114908456868e-06,4.4703479111195056e-07,2.682208746671703e-07,0.0002788901050150422,0.9999238444808821 +0.2394765615364095,0.04060825704832903,4.178285180926364e-05,2.086162358522436e-07,9.238719016313645e-07,3.784894564747848e-06,0.9999890519557456 +0.2557055950058913,0.03749832510306078,2.688169210553196e-05,2.086162358522436e-07,1.4305113315582417e-06,3.5762783288956045e-06,0.9999883367000798 +0.2595536708724312,0.03732118009881865,2.4646518149972206e-05,2.086162358522436e-07,1.7285345256328755e-06,3.725289925932921e-06,0.9999880982815246 +0.25625333188903204,0.03605946897842923,2.7894970965385714e-05,2.086162358522436e-07,1.5497206091880952e-06,2.8908249825239467e-06,0.9999889327464679 +0.2604413628470343,0.03680294751490776,2.4437901914119964e-05,2.086162358522436e-07,1.6093252480030219e-06,3.3378597736358976e-06,0.9999875618397752 +0.27496692537122835,0.03959426283158372,1.5109775939583928e-05,1.4901159703731684e-07,2.8312203437090202e-06,6.586312589049405e-06,0.9999828530733089 +0.3015537261838024,0.043886154882545575,5.513429090380723e-06,8.940695822239011e-08,9.268521335721107e-06,2.300739058256172e-05,0.9999662233790795 +0.2945534586784465,0.04112365841161358,1.1920927762985347e-06,1.7881391644478022e-07,0.0001315772401839508,9.024142316579908e-05,0.9996956779234986 +0.15797799825014183,0.02693754434124306,1.1920927762985348e-07,3.5762783288956044e-07,0.6066472519764186,0.00032716986245513285,0.06592708166794246 +0.08585289120318636,0.35884326690251217,0.9997807933477263,4.172324717044872e-07,0.0006730555814981528,0.00016885994176268746,0.0 +0.5956093072644607,0.4728198646689451,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.7419099807432049,0.6915299295194948,0.9999999000000099,1.1920927762985348e-07,1.4901159703731684e-07,0.0,0.0 +0.6952913403223143,0.7478426693589426,0.9999999000000099,4.4703479111195056e-07,1.4901159703731684e-07,0.0,0.0 +0.7047768234914772,0.754874825348339,0.9999999000000099,5.66244068741804e-07,1.4901159703731684e-07,0.0,0.0 +0.6896074413967683,0.7689379452342365,0.9999999000000099,6.556510269641942e-07,2.086162358522436e-07,0.0,0.0 +0.6962039470384325,0.7641063927295707,0.9999999000000099,5.960463881492673e-07,1.1920927762985348e-07,0.0,0.0 +0.7143816351594755,0.7551983593601245,0.9999999000000099,6.556510269641942e-07,1.4901159703731684e-07,0.0,0.0 +0.7637524604481111,0.7024003266085452,0.9999999000000099,6.258487075567308e-07,1.4901159703731684e-07,0.0,0.0 +0.7571880817099795,0.5694723724343772,0.9999999000000099,1.1920927762985348e-07,2.086162358522436e-07,0.0,0.0 +0.6540940999713896,0.4028796850945108,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.6305111646391142,0.3607996999599622,0.9999999000000099,0.0,7.748603045940476e-07,0.0,2.3841855525970696e-07 +0.15532582997632588,0.023706167932265744,1.7285345256328755e-06,9.536742210388278e-07,0.7094369417287301,5.254148911535792e-05,0.20892007049860267 +0.2379308342835133,0.05342197417298119,5.30481285452848e-06,5.364417493343406e-07,0.0006892084386169979,1.3917683163285393e-05,0.9997400237747769 +0.2594633698356002,0.039690226309655664,7.510184490680769e-06,4.172324717044872e-07,2.2649762749672162e-05,3.695487606525458e-06,0.9999507857776264 +0.2652193605789989,0.04019963740614131,8.255242475867353e-06,2.682208746671703e-07,7.718800726533013e-06,3.904103842377701e-06,0.9999690247971038 +0.25356695054911643,0.03817319869341458,1.4096497079730174e-05,3.278255134820971e-07,3.367662093043361e-06,2.4437901914119963e-06,0.99997927679498 +0.2522285580530629,0.03784921764679342,1.707672902047651e-05,3.278255134820971e-07,2.1457669973373625e-06,2.2947785943746796e-06,0.9999817801898102 +0.25486302374738123,0.03826346992791145,1.788139164447802e-05,2.9802319407463367e-07,1.9073484420776557e-06,2.8312203437090202e-06,0.999982495445476 +0.25893408059001666,0.03860297798449394,1.7553566130995923e-05,2.682208746671703e-07,1.937150761485119e-06,3.367662093043361e-06,0.999982495445476 +0.2594347000014644,0.037998676293542116,1.8984077462554166e-05,2.086162358522436e-07,1.9073484420776557e-06,3.2186504960060438e-06,0.9999836279336135 +0.2628587484250897,0.03814762830081032,1.8268821796775045e-05,2.086162358522436e-07,1.9669530808925826e-06,3.635882967710531e-06,0.9999833299104194 +0.2628337144742851,0.03763875364612755,1.934170529544373e-05,2.086162358522436e-07,1.8775461226701922e-06,3.397464412450824e-06,0.9999840451660852 +0.25892966984630345,0.03647133707375666,2.2917983624339332e-05,2.682208746671703e-07,1.5497206091880952e-06,2.6226041078567766e-06,0.9999855948866944 +0.42972934244283817,0.25761270518660057,8.520483118593778e-05,8.940695822239011e-08,3.2931562945247025e-05,0.9999999000000099,4.827975744009066e-06 +0.3951215743854944,0.25447940822058435,8.10325064688929e-05,0.0,6.377696353197161e-06,0.9999973966051797,3.278255134820971e-07 +0.3833910226663146,0.19587382670863177,4.005431728363077e-05,0.0,1.7583368450403388e-06,0.9999956084660152,2.682208746671703e-07 +0.382190048678785,0.20516467090908247,4.464387447238013e-05,0.0,1.1920927762985347e-06,0.9999928666526298,2.682208746671703e-07 +0.39795038102409486,0.2215498089410973,9.906290971040823e-05,0.0,9.238719016313645e-07,0.9999733163310984,2.086162358522436e-07 +0.39583337305337263,0.23386162515450423,0.0002135634208738825,0.0,7.152556657791209e-07,0.9999186588773051,5.960463881492674e-08 +0.40533584354629576,0.2522281407878033,0.0009971260027349094,0.0,6.258487075567308e-07,0.9993328644870321,8.940695822239011e-08 +0.4078943431208511,0.288977175901521,0.10599188936800466,8.940695822239011e-08,2.682208746671703e-07,0.8084608700053534,0.0 +0.4155598282641952,0.42859905950836535,0.999999542372177,3.874301522970238e-07,3.5762783288956044e-07,7.748603045940476e-07,0.0 +0.7178924679458901,0.5247262715394819,0.9999999000000099,2.086162358522436e-07,0.0,0.0,0.0 +0.743969678847978,0.510901093395487,0.9999999000000099,1.1920927762985348e-07,2.3841855525970696e-07,0.0,0.0 +0.7266275882420067,0.4057838320037272,0.9999999000000099,5.960463881492674e-08,1.7881391644478022e-07,0.0,0.0 +0.12182977795096421,0.11225476859077865,0.000235140300124886,0.0,0.001148491983005416,0.9998688890038947,0.0 +0.03193560242520655,0.16587927934667193,1.9431112253666117e-05,8.344649434089744e-07,0.5471761275524373,0.005924581888926088,2.980231940746337e-06 +0.09259000420186979,0.01409423351046499,6.765126505494185e-06,1.1920927762985348e-07,0.9997152878496687,3.874301522970238e-07,7.808207684755402e-06 +0.047139227388337375,0.028410881752871264,4.649161827564286e-06,2.592801788449313e-06,0.9999382688034752,5.632638368010577e-06,6.073712695241035e-05 +0.03269237279756596,0.051375776520514796,8.940695822239011e-07,4.357099097371145e-05,0.9857114759832957,0.00013133882162869108,0.010593681468173967 +0.09017053246124732,0.05340525507012455,4.768371105194139e-07,1.0639428028464424e-05,0.034087952542895414,0.0001170039059937012,0.8638102144460049 +0.21381434797355303,0.03837606310187288,1.1086462819576373e-05,7.748603045940476e-07,9.685753807425595e-06,1.7583368450403388e-06,0.9998655511441211 +0.21673583983477546,0.029550284142202527,4.810094352364588e-05,6.258487075567308e-07,3.5762783288956044e-07,1.7881391644478022e-07,0.9999851180495838 +0.20805716513725883,0.03007298707447081,5.63859883189207e-05,7.152556657791209e-07,1.4901159703731684e-07,1.7881391644478022e-07,0.9999891711650233 +0.21848034857798934,0.03322023152736207,5.4448837557435575e-05,5.66244068741804e-07,2.086162358522436e-07,4.4703479111195056e-07,0.9999875618397752 +0.22852402924545065,0.03512638806695266,4.783272264897871e-05,4.172324717044872e-07,1.7881391644478022e-07,8.344649434089744e-07,0.9999864293516377 +0.2336444854639581,0.03510984777803032,4.506110694408462e-05,3.278255134820971e-07,2.682208746671703e-07,8.940695822239011e-07,0.9999866081655542 +0.21164482831078582,0.16124057767014385,8.82744700849065e-05,0.0,0.00013637541360855238,0.9999988271165112,1.1920927762985348e-07 +0.24589946865017245,0.168416351051102,8.076428559422574e-06,0.0,1.0579823389649495e-05,0.9999996019768158,5.066394299268773e-07 +0.24300691484398732,0.16699832674981588,7.539986810088233e-06,0.0,6.198882436752381e-06,0.9999996019768158,5.066394299268773e-07 +0.2653754949459816,0.18575474616684642,6.377696353197161e-06,0.0,5.7816499650478935e-06,0.9999998403953712,1.3411043733358516e-06 +0.27322161196531003,0.20399013158166213,6.645917227864331e-06,0.0,6.3180917143822346e-06,0.9999999000000099,2.4735925108194595e-06 +0.27613407372284937,0.21149367090418403,6.943940421938965e-06,0.0,6.377696353197161e-06,0.9999999000000099,3.1888481765985805e-06 +0.2777208089713493,0.21377897258912595,7.122754338383746e-06,0.0,6.228684756159844e-06,0.9999997807907323,3.635882967710531e-06 +0.2779599726085007,0.21276840563945462,7.301568254828525e-06,0.0,5.871056923270284e-06,0.9999999000000099,3.7550922453403844e-06 +0.27679795025633014,0.20932951565972732,7.599591448903159e-06,0.0,5.57303372919565e-06,0.9999997807907323,3.6656852871179947e-06 +0.27488180993849265,0.20518562194171744,7.748603045940476e-06,0.0,5.453824451565797e-06,0.9999999000000099,3.2782551348209707e-06 +0.2735263109093892,0.20273306962356438,8.076428559422574e-06,0.0,5.364417493343406e-06,0.9999999000000099,3.2484528154135075e-06 +0.27218967675035644,0.2009309827937338,8.40425407290467e-06,0.0,5.245208215713553e-06,0.9999999000000099,3.0994412183761904e-06 +0.1286200284904627,0.11697864530467618,0.0002077221662700197,0.0,0.0007783173736453134,0.9999345733158688,0.0 +0.01678150892188202,0.11380973456341277,0.0004363357584446712,8.940695822239011e-08,0.0014100669404447218,0.9854175655092993,1.4901159703731684e-07 +0.26927405594664416,0.06885412334216788,4.112720078229945e-06,0.0,0.9888122285037259,0.005188196378687076,1.1920927762985348e-07 +0.24928617476384754,0.029235601420164736,4.06801659911875e-05,0.0,0.9999895287928562,7.152556657791209e-07,8.940695822239011e-08 +0.22609782217996885,0.023751974101767787,0.00013881920379996439,0.0,0.9999996615814547,2.3841855525970696e-07,2.980231940746337e-08 +0.22387990354564602,0.029705494637171065,0.00021353361855447505,0.0,0.9999997807907323,4.172324717044872e-07,1.7881391644478022e-07 +0.21388474105902985,0.029402256006928192,0.00022104380304515582,0.0,0.9999997807907323,4.172324717044872e-07,5.960463881492674e-08 +0.19005894660162714,0.026616871352406368,0.00018832085633576102,0.0,0.9999997807907323,2.682208746671703e-07,1.7881391644478022e-07 +0.16207012533470444,0.02495816349555844,0.00013071297292113434,0.0,0.9999997211860935,3.5762783288956044e-07,2.682208746671703e-07 +0.12818062304919672,0.024122655387562468,7.206200832724643e-05,8.940695822239011e-08,0.9999996615814547,4.4703479111195056e-07,6.556510269641942e-07 +0.07967889308599511,0.02781018614292774,2.3305413776636355e-05,3.278255134820971e-07,0.9999978734422902,1.698732206225412e-06,6.288289394974771e-06 +0.03280282020433019,0.03921955823226739,2.980231940746337e-06,1.3828276205063004e-05,0.9997121288038114,3.015994724035293e-05,0.0004980861642569353 +0.21432220934934074,0.03324639796641398,5.292891926765494e-05,7.033347380161355e-06,8.22544015645989e-06,1.3113020539283883e-06,0.9998371793360452 +0.2267195582295952,0.0360870957312779,4.994868732690861e-05,3.874301522970238e-07,2.026557719707509e-06,2.086162358522436e-06,0.9999937011175731 +0.2252779304887949,0.03572899102552867,4.3630595612526375e-05,3.5762783288956044e-07,1.132488137483608e-06,1.9669530808925826e-06,0.9999945355825166 +0.20820334552856443,0.03303089737326546,6.750225345790453e-05,4.4703479111195056e-07,5.364417493343406e-07,9.238719016313645e-07,0.9999960853031258 +0.18706128000438496,0.03035596012549352,9.268521335721107e-05,7.152556657791209e-07,2.086162358522436e-07,3.5762783288956044e-07,0.9999970985819856 +0.17172324656729118,0.02949351071806369,0.00010380147849619491,1.1026858180761447e-06,8.940695822239011e-08,2.086162358522436e-07,0.9999975158144573 +0.16308155655185616,0.029594689602552588,0.00010624526868760691,1.519918289780632e-06,0.0,1.1920927762985348e-07,0.9999975158144573 +0.1702354252267919,0.03127741813124089,0.00011074541891813388,1.3113020539283883e-06,0.0,2.086162358522436e-07,0.9999970389773468 +0.1748965382503568,0.03185242413929062,0.00011250375576317421,1.043081179261218e-06,2.980231940746337e-08,2.682208746671703e-07,0.9999965621402362 +0.1942967176356924,0.03452786802654306,9.760259605944253e-05,6.854533463716575e-07,8.940695822239011e-08,5.66244068741804e-07,0.9999948932103495 +0.20673617719747894,0.03528255223623744,8.279084331393324e-05,4.4703479111195056e-07,1.7881391644478022e-07,8.046626240015109e-07,0.9999939395361285 +0.22020694612544897,0.036140888923178474,6.338953337967459e-05,4.172324717044872e-07,2.3841855525970696e-07,1.2218950957059981e-06,0.9999926878387133 +0.7084072827999511,0.4152714311365478,0.9999997211860935,3.9637084811926284e-06,2.3841855525970696e-07,6.854533463716575e-07,3.054737739264995e-05 +0.5114663839128423,0.454099237841096,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,5.960463881492674e-08 +0.5865874290223416,0.301857560821343,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5366575717703808,0.3478223084807848,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5772181153058411,0.32610383624214845,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.569963574385884,0.34073957795030513,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5777338146924165,0.3312549888520452,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5789394378422383,0.33607664698568,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.578843474364154,0.3373789786714769,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5826146006342919,0.3376540541070682,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5808446407077601,0.34119769924997034,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5818508863208165,0.34235429757931635,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.6988189220139102,0.41268315904226444,0.9999996615814547,3.695487606525458e-06,2.3841855525970696e-07,6.258487075567308e-07,2.792477328479318e-05 +0.4594514369774351,0.4211757480376974,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5367760658041894,0.33834516996312053,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5512066483269378,0.3640180825563807,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5848382711168354,0.35305351012860126,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5947349071256419,0.4026344417836244,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.622364938233354,0.43894112102621724,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.6659507751189089,0.4715429245618181,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.7303471564944162,0.49589788905235294,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.7577100991889008,0.5319962500614914,0.9999999000000099,8.940695822239011e-08,1.1920927762985348e-07,0.0,0.0 +0.7243001460729136,0.6653277872853645,0.9999999000000099,2.086162358522436e-07,1.4901159703731684e-07,0.0,0.0 +0.5925093292944658,0.7766062615972118,0.9999999000000099,2.086162358522436e-07,2.086162358522436e-07,0.0,0.0 +0.15426844357805422,0.023650288577798384,1.6689298868179488e-06,1.0132788598537545e-06,0.7216234677622747,5.248188447654299e-05,0.1974989872367193 +0.4066952168773094,0.06383013724187765,2.3841855525970694e-06,8.940695822239011e-08,0.9999975158144573,0.0002389549970090413,2.086162358522436e-07 +0.362694144233944,0.051828294983572075,2.6226041078567766e-06,5.960463881492674e-08,0.999997635023735,3.0428168115020102e-05,0.0 +0.333727002130041,0.05037847160430373,5.900859242677747e-06,8.940695822239011e-08,0.999997635023735,1.3053415900468956e-05,0.0 +0.35438019035779295,0.04872298239827313,2.592801788449313e-06,2.086162358522436e-07,0.9999962045124035,4.059075903296511e-05,0.0 +0.3563680052609699,0.061897337426077025,2.264976274967216e-06,5.960463881492674e-08,0.9999877406536917,0.00014606116741597798,0.0 +0.35659509895755476,0.0681865811231202,1.370906692743315e-06,1.1920927762985348e-07,0.9999065591356258,0.0011645256308466312,0.0 +0.26014482973928904,0.08597394822555839,4.7385687857866755e-06,8.940695822239011e-08,0.9920063814931789,0.14928235110913365,0.0 +0.10811999439745476,0.09040868280770001,0.0001402497151315226,0.0,0.015911219913089435,0.9996894790410618,0.0 +0.16012573241524455,0.12195172903833694,2.2053716361522894e-05,0.0,9.09566788315782e-05,0.9999935819082956,0.0 +0.17756989597538952,0.13397726414293668,1.3142822858691347e-05,0.0,2.0802018946409432e-05,0.9999969197680691,2.980231940746337e-08 +0.19010433553862174,0.1375154256585204,1.060962570905696e-05,0.0,1.3023613581061492e-05,0.9999977542330126,1.4901159703731684e-07 +0.0816965699162033,0.0340275466383841,0.0004212557848244947,0.0006936787865281174,0.0,0.0,0.9995491101166526 +0.19038650392697676,0.05226296185552218,0.00021001694486439437,1.0132788598537545e-06,0.0,2.9206273019314104e-06,0.9999941779546837 +0.24012869595487005,0.06070718168172821,1.8447635713219826e-05,3.278255134820971e-07,4.172324717044872e-07,3.647803895473517e-05,0.9999840451660852 +0.24345612524931845,0.04489350318139957,3.0040737962723075e-05,2.3841855525970696e-07,1.5795229285955586e-06,9.357928293943498e-06,0.9999915553505758 +0.24694761632850432,0.03846466540631633,3.129243537783654e-05,2.086162358522436e-07,2.026557719707509e-06,4.589557188749359e-06,0.9999927474433521 +0.24469318984925806,0.036727279418378354,3.483891138732468e-05,2.9802319407463367e-07,1.6689298868179488e-06,3.308057454228434e-06,0.9999930454665462 +0.2420647740263841,0.035993695252930856,3.7789341008663554e-05,2.3841855525970696e-07,1.3411043733358516e-06,2.6226041078567766e-06,0.999993105071185 +0.23599001764273977,0.03484150766729746,4.4763083750009984e-05,2.682208746671703e-07,9.238719016313645e-07,1.8179414838552655e-06,0.9999934626990179 +0.23271733521451532,0.03445661067372628,4.8518175995350365e-05,2.9802319407463367e-07,7.450579851865842e-07,1.519918289780632e-06,0.9999934030943791 +0.22100326417961522,0.03261569141783119,6.359814961552683e-05,3.278255134820971e-07,4.172324717044872e-07,8.046626240015109e-07,0.9999944163732389 +0.2095061242493662,0.031390845770229034,7.781385597288686e-05,4.768371105194139e-07,2.3841855525970696e-07,5.066394299268773e-07,0.9999950124196271 +0.17756628989438078,0.02810704707618074,0.00010091065351367098,1.0132788598537545e-06,0.0,1.4901159703731684e-07,0.9999968005587916 +0.10279056429437343,0.031676501030266174,0.00018832085633576102,0.00016859172088802028,1.7881391644478022e-07,8.940695822239011e-08,0.9998474313339214 +0.06862694024755504,0.02881565689547163,3.6656852871179946e-05,0.00020965931703150481,0.0,0.0,0.9999981714654843 +0.2610352337252293,0.1859323382059243,0.0,0.9961147504327754,0.0,3.278255134820971e-07,0.900620966494605 +0.21137225627023926,0.4184502660511646,0.0,0.9999996615814547,0.0,0.0002097487239897272,0.007686375803017693 +0.1424497067869329,0.3611762821055886,0.0,0.9999999000000099,0.0,0.003785281994900145,0.00012099741679430128 +0.1389527320804279,0.36757856601142896,0.0,0.9999999000000099,0.0,0.003101229357540638,3.79979572445158e-05 +0.14181214570411932,0.38040244572801357,0.0,0.9999999000000099,0.0,0.002047657761847993,2.0653007349372115e-05 +0.1456696689068557,0.38884937756555643,0.0,0.9999999000000099,0.0,0.001318365203627957,1.3738869246840614e-05 +0.14947423338271137,0.39509391777902575,0.0,0.9999999000000099,0.0,0.0008829235147655098,1.0222195556759936e-05 +0.1527311503823934,0.4019087552336083,0.0,0.9999999000000099,0.0,0.0006302892531484428,8.195637837052427e-06 +0.15569502114604936,0.40784609310795783,0.0,0.9999999000000099,0.0,0.0004735886577040004,6.8247311443091115e-06 +0.15837618707954734,0.4131701587923184,0.0,0.9999999000000099,0.0,0.00036966796993017563,5.990266200900137e-06 +0.11037743091126204,0.031519562000599445,0.000155389293390514,0.0001254677647054208,1.7881391644478022e-07,5.960463881492674e-08,0.9998602463312666 +0.24880471824569425,0.056649833907917356,2.5779006287455814e-05,3.5762783288956044e-07,8.642672628164378e-07,3.147124929428132e-05,0.9999880982815246 +0.2461619973080748,0.044350028030430616,2.4974343663454304e-05,3.278255134820971e-07,2.712011066079167e-06,1.034140483438979e-05,0.9999922706062416 +0.26260372995242875,0.042765408747025814,1.7315147575736217e-05,2.086162358522436e-07,5.096196618676236e-06,1.1891125443577885e-05,0.9999906016763548 +0.2614041566740513,0.04040196537279673,1.9580123850703434e-05,1.7881391644478022e-07,5.03659197986131e-06,8.40425407290467e-06,0.9999911977227429 +0.258604824532291,0.038736075156254594,2.247094883322738e-05,2.3841855525970696e-07,3.874301522970238e-06,6.079673159122528e-06,0.9999915553505758 +0.25428748129745393,0.03754869102788736,2.6315448036790155e-05,2.086162358522436e-07,2.8908249825239467e-06,4.500150230526969e-06,0.99999185337377 +0.25150221585186,0.0369340181287464,2.8967854464054395e-05,2.3841855525970696e-07,2.175569316744826e-06,3.6656852871179947e-06,0.99999185337377 +0.24787023662494437,0.036222845309730606,3.263353975117239e-05,1.7881391644478022e-07,1.6093252480030219e-06,2.9504296213388737e-06,0.9999920321876864 +0.242151290168272,0.03518411516540774,3.853439899385014e-05,2.9802319407463367e-07,1.1622904568910714e-06,2.2053716361522894e-06,0.9999925090247969 +0.24128472804024087,0.0352324545323123,3.957748017311135e-05,2.086162358522436e-07,9.536742210388278e-07,1.9669530808925826e-06,0.9999922110016028 +0.24435231088580173,0.03590387105326972,3.647803895473517e-05,2.682208746671703e-07,9.536742210388278e-07,2.324580913782143e-06,0.9999911977227429 +0.17654523252709822,0.5369359253917613,1.043081179261218e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 +0.12592762708142502,0.32568472618248206,2.980231940746337e-08,0.9999999000000099,0.0,2.4437901914119963e-06,0.0 +0.1409592628420636,0.41804543130391947,2.980231940746337e-08,0.9999999000000099,0.0,6.258487075567308e-07,0.0 +0.19353038071784692,0.5163381694863223,2.980231940746337e-08,0.9999999000000099,0.0,1.0043381640315155e-05,0.0 +0.17676132916672246,0.5523192881592077,2.980231940746337e-08,0.9999999000000099,0.0,1.0818241944909203e-05,0.0 +0.17794537543513655,0.5632465480793641,0.0,0.9999999000000099,0.0,1.0490416431427107e-05,1.1920927762985348e-07 +0.179655224077415,0.5655284522995545,2.980231940746337e-08,0.9999999000000099,0.0,1.060962570905696e-05,0.0 +0.1809729337617324,0.56409668912765,0.0,0.9999999000000099,0.0,1.087784658372413e-05,0.0 +0.18196120857438983,0.565074205301799,0.0,0.9999999000000099,0.0,1.1175869777798764e-05,8.940695822239011e-08 +0.18284732102590648,0.5655650495514403,2.980231940746337e-08,0.9999999000000099,0.0,1.1712311527133104e-05,2.980231940746337e-08 +0.18370985984041543,0.5648768543229815,2.980231940746337e-08,0.9999999000000099,0.0,1.2367962554097299e-05,8.940695822239011e-08 +0.18446108698081098,0.5645466445909824,0.0,0.9999999000000099,0.0,1.3202427497506273e-05,2.980231940746337e-08 +0.3620810508578098,0.2802353500840024,0.9999997211860935,1.1920927762985348e-07,8.940695822239011e-08,0.0,3.5762783288956044e-07 +0.6289048194624839,0.5402251481084832,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.609561920140775,0.43741059295793683,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,5.960463881492674e-08 +0.6074551939712761,0.34179812663901243,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 +0.6105126738295479,0.36750096076394473,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.6125910877927797,0.35858577483712656,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 +0.612633526299858,0.37290656560234403,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,1.4901159703731684e-07 +0.6265627741554214,0.37437111132886935,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 +0.6390091180536792,0.3825538753808129,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,8.940695822239011e-08 +0.6552619933810702,0.3906720876024758,0.9999999000000099,0.0,5.066394299268773e-07,0.0,5.960463881492674e-08 +0.6864870190336163,0.39199826114617875,0.9999999000000099,0.0,6.258487075567308e-07,0.0,1.1920927762985348e-07 +0.7227056026159484,0.3860638737017451,0.9999999000000099,0.0,8.344649434089744e-07,0.0,1.1920927762985348e-07 +0.0987726747948755,0.02135479449860161,9.834765404462913e-07,1.1026858180761447e-06,0.9978224233348231,3.5166736900806775e-05,0.0001502036898136154 +0.041863858698065096,0.026868820185828802,3.5166736900806776e-06,2.8908249825239467e-06,0.9997616006540279,3.6656852871179947e-06,9.053944635987371e-05 +0.05406507849469427,0.04078486561076827,1.0132788598537545e-06,8.761881905794231e-06,0.9998618556565145,2.3692843928933378e-05,0.00010928510526716817 +0.03300076722962106,0.0504483878526133,3.874301522970238e-07,5.269050071239524e-05,0.996805687405918,0.00010323523442745311,0.001543462122112528 +0.046723723409625335,0.05554845928194628,1.7881391644478022e-07,4.988908268809368e-05,0.7803051287451523,0.0002756714545190362,0.04322638675440295 +0.09817028045247796,0.04979446529489446,2.9802319407463367e-07,1.0102986279130082e-05,0.00988578697528849,6.878375319242546e-05,0.8695090139631 +0.2182354926972622,0.041011512272487886,6.0200685203076e-06,1.0132788598537545e-06,1.1324881374836081e-05,1.937150761485119e-06,0.9998064233424167 +0.2170445620923768,0.03117832540931877,3.257393511235746e-05,7.748603045940476e-07,5.66244068741804e-07,2.086162358522436e-07,0.9999785615393142 +0.1997782587922342,0.02974116801706303,4.923343166112949e-05,9.536742210388278e-07,1.1920927762985348e-07,8.940695822239011e-08,0.9999888135371904 +0.20081034301879977,0.03120341896476491,6.276368467211785e-05,9.238719016313645e-07,8.940695822239011e-08,1.7881391644478022e-07,0.9999901248392443 +0.20925763248530788,0.03313666581540128,6.553530037701195e-05,6.854533463716575e-07,1.4901159703731684e-07,4.172324717044872e-07,0.9999895287928562 +0.2206070721058096,0.034850686782591296,5.787610428929386e-05,4.768371105194139e-07,2.3841855525970696e-07,6.258487075567308e-07,0.9999880982815246 +0.3493616580818472,0.04981780051332003,2.4437901914119963e-06,8.940695822239011e-08,0.9998095227836351,6.890296247005531e-05,0.0 +0.24309104680008428,0.027147114272237448,7.90059487491854e-05,0.0,0.999999542372177,1.4901159703731684e-07,5.960463881492674e-08 +0.28473192452205387,0.041833192102898334,3.066658667027981e-05,0.0,0.9999997807907323,1.2516974151134616e-06,0.0 +0.26877948640664084,0.03753244876218885,6.237625451982083e-05,0.0,0.9999999000000099,6.556510269641942e-07,0.0 +0.25869369505764744,0.035387158387800335,7.504224026799276e-05,0.0,0.9999998403953712,5.66244068741804e-07,0.0 +0.25387445091149996,0.035414457315102794,8.484720335304821e-05,0.0,0.9999999000000099,5.066394299268773e-07,0.0 +0.2420870363612068,0.03346079587363435,0.0001018643277347098,0.0,0.9999999000000099,4.768371105194139e-07,0.0 +0.22442623971963463,0.03096953033870633,0.00011137126762569061,0.0,0.9999997807907323,3.5762783288956044e-07,2.980231940746337e-08 +0.19909784196982894,0.02820456027501658,0.00010105966511070829,0.0,0.9999997807907323,2.682208746671703e-07,8.940695822239011e-08 +0.17820188402391685,0.027933508152946904,7.972120441496452e-05,0.0,0.9999997807907323,3.278255134820971e-07,0.0 +0.15239781140650083,0.026921063656965484,5.51640932232147e-05,5.960463881492674e-08,0.9999997807907323,3.5762783288956044e-07,1.1920927762985348e-07 +0.12453958391627559,0.02702987193598433,3.117322610020669e-05,8.940695822239011e-08,0.9999997807907323,4.4703479111195056e-07,3.874301522970238e-07 +0.4480928182416383,0.2532852291627139,5.7518476456404306e-05,1.4901159703731684e-07,2.8222796478867813e-05,0.9999999000000099,6.4373009920120876e-06 +0.3995061516596353,0.2574908732927005,6.726383490264483e-05,0.0,6.109475478529991e-06,0.9999982310701231,3.874301522970238e-07 +0.4252169728103041,0.23218753929930688,0.00013598798345625535,0.0,1.6093252480030219e-06,0.9999664021929959,1.7881391644478022e-07 +0.5037578940182945,0.3180439769677107,0.9997492028891544,7.748603045940476e-07,1.1920927762985348e-07,0.00023624298594296213,0.0 +0.5163118839050123,0.3959423898972581,0.9999999000000099,2.086162358522436e-07,1.0132788598537545e-06,0.0,0.0 +0.5063484310894153,0.44862058751053696,0.9999999000000099,1.4901159703731684e-07,4.112720078229945e-06,0.0,0.0 +0.49682307241289936,0.4420383273798281,0.9999999000000099,8.940695822239011e-08,2.0563600391149723e-06,0.0,0.0 +0.5190788507246609,0.4139145612007908,0.9999999000000099,0.0,1.2218950957059981e-06,0.0,0.0 +0.5274987816592183,0.40507867925383273,0.9999999000000099,0.0,5.364417493343406e-07,0.0,0.0 +0.546706259228003,0.4009894131927501,0.9999999000000099,0.0,3.874301522970238e-07,0.0,0.0 +0.5585503577954752,0.3968425988471467,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5722633003951576,0.3888948559095123,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.3553616404386239,0.2806525229927139,0.0004058777880102436,8.940695822239011e-08,6.69658117085702e-05,0.9999997211860935,1.1622904568910714e-06 +0.018414258956146685,0.17032766339246477,0.0004629194273561285,8.940695822239011e-08,3.2514330473542534e-05,0.99951805609983,1.1920927762985348e-07 +0.11821404098974919,0.09840735791428629,9.030102780461401e-06,5.960463881492674e-08,0.4574907560621426,0.08856101938600926,2.9802319407463367e-07 +0.2210783362297067,0.031452178949692405,3.8415189716220283e-05,0.0,0.999804396784697,3.784894564747848e-06,3.874301522970238e-07 +0.21616944669782076,0.020190626379370413,0.00018283722956478776,0.0,0.9999984098840395,2.3841855525970696e-07,1.7881391644478022e-07 +0.1996429264462773,0.024446487422571717,0.00039672847595215236,0.0,0.9999997211860935,3.278255134820971e-07,2.086162358522436e-07 +0.17863577603554132,0.024215251203205182,0.00033426281447410913,0.0,0.9999997211860935,3.874301522970238e-07,3.5762783288956044e-07 +0.16247069834990088,0.024790704246090655,0.0002584755162209298,0.0,0.9999997211860935,4.4703479111195056e-07,5.066394299268773e-07 +0.14597493409506024,0.02474698423915539,0.0001901387978196163,2.980231940746337e-08,0.9999996615814547,5.66244068741804e-07,8.642672628164378e-07 +0.11991247534255361,0.02436894177973221,0.00011575220857858772,8.940695822239011e-08,0.9999994231628994,8.344649434089744e-07,2.2351739555597527e-06 +0.06918999552440246,0.026820331807312324,3.743171317577399e-05,3.874301522970238e-07,0.9999938203268508,2.74181338548663e-06,2.202391404211543e-05 +0.03287342190606371,0.035286188119568115,7.063149699568818e-06,8.04662624001511e-06,0.9996199800322035,2.5629994690418497e-05,0.0006746947090655632 +0.3681892156448493,0.06636333464439799,1.847743803262729e-06,2.980231940746337e-08,0.9991846873549382,0.0002922415441095858,0.0 +0.2897983491300747,0.08454591034395173,2.0563600391149723e-06,5.960463881492674e-08,0.9941222269618312,0.1672421228536533,0.0 +0.10400968789623641,0.08403879402628954,0.00010368226921856506,0.0,0.04659449588223742,0.9988759949305157,0.0 +0.130245268339486,0.1074417531306348,2.9861924046278297e-05,0.0,0.00032994147816002697,0.9999699784713248,0.0 +0.13534483313000054,0.12041136620367028,2.1368263015151236e-05,0.0,7.385014749169422e-05,0.9999858333052496,0.0 +0.13325229286595755,0.12350675461561583,2.1874902445078112e-05,0.0,5.039572211802056e-05,0.9999860717238048,0.0 +0.12505856155831344,0.12179422376454493,2.7209517619014057e-05,0.0,5.2332872879505675e-05,0.9999818993990878,0.0 +0.12224355339497785,0.11993423102232498,3.120302841961415e-05,0.0,5.471705843210275e-05,0.9999792171903411,0.0 +0.11400032042984981,0.11786493657001208,3.9428468576074036e-05,0.0,6.19888243675238e-05,0.9999721242383222,0.0 +0.10407996177242368,0.11586055157584847,5.099176850616983e-05,0.0,7.554887969791964e-05,0.9999582363574783,0.0 +0.09253677725408757,0.11353513596497958,6.774067201316424e-05,0.0,0.00010511278055012331,0.9999256326200465,0.0 +0.08493611216193403,0.10933414099728463,8.895992343127815e-05,0.0,0.00018033383473456085,0.9998495771009187,0.0 +0.7078694104855202,0.41524434082550205,0.9999996615814547,3.933906161785165e-06,2.9802319407463367e-07,6.258487075567308e-07,3.030895883739025e-05 +0.5412584543004026,0.4447991549207067,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 +0.5887584686035505,0.30584383005627136,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.4901159703731684e-07 +0.541405081726544,0.3445116876965922,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5795087218044646,0.3284998535547417,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5721994638206058,0.33945453161149014,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5691156387093443,0.3366284965892385,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5724236368895967,0.3379911183732153,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5693150758507546,0.34117442363618955,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5713651180030744,0.3401965498341719,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5699003338577798,0.34270256751867934,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.570773065066545,0.34277793759198494,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.18313461541371198,0.6270658372758946,2.8908249825239467e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.18074020742621652,0.4986124633888937,0.0,0.9999999000000099,0.0,1.990794936418553e-05,2.980231940746337e-08 +0.1810228526517297,0.5852069257687801,0.0,0.9999999000000099,0.0,1.3232229816913736e-05,0.0 +0.17705759405356628,0.6381335257391177,1.1920927762985348e-07,0.9999999000000099,0.0,1.0907648903131594e-05,2.980231940746337e-08 +0.18205246328553717,0.6457591055717964,5.960463881492674e-08,0.9999999000000099,0.0,1.0281800195574863e-05,0.0 +0.18602401017372416,0.6468141673887849,8.940695822239011e-08,0.9999999000000099,0.0,1.0281800195574863e-05,2.980231940746337e-08 +0.18864977358990573,0.6469840406263657,2.980231940746337e-08,0.9999999000000099,0.0,1.0579823389649495e-05,2.980231940746337e-08 +0.19051146506474317,0.6466122864569652,0.0,0.9999999000000099,0.0,1.1354683694243543e-05,0.0 +0.19194743036429004,0.6458281277504345,2.980231940746337e-08,0.9999999000000099,0.0,1.2308357915282372e-05,8.940695822239011e-08 +0.19314184784089464,0.6444287895052823,1.1920927762985348e-07,0.9999999000000099,0.0,1.3500450691580906e-05,0.0 +0.19414776562840486,0.6428014038892584,1.4901159703731684e-07,0.9999999000000099,0.0,1.4990566661954075e-05,2.980231940746337e-08 +0.195027977220089,0.6412039994095515,2.980231940746337e-08,0.9999999000000099,0.0,1.6599891909957096e-05,8.940695822239011e-08 +0.14272063969974821,0.03165367245132111,9.018181852698416e-05,4.380940952897115e-05,7.152556657791209e-07,1.1920927762985348e-07,0.9998731805378894 +0.24699378012588094,0.04656228422321281,3.0934807544946974e-05,2.9802319407463367e-07,1.698732206225412e-06,1.1295079055428617e-05,0.9999912573273818 +0.26018252967710787,0.04476687311359594,1.6123054799437684e-05,1.7881391644478022e-07,4.678964146971749e-06,1.4245508676767491e-05,0.9999900056299666 +0.2625455558191304,0.04205834864849882,1.7017124381661583e-05,1.1920927762985348e-07,5.990266200900137e-06,1.0669230347871886e-05,0.9999906016763548 +0.25859576462628553,0.03953716158189867,2.0831821265816896e-05,1.1920927762985348e-07,4.589557188749359e-06,6.8247311443091115e-06,0.9999914361412983 +0.25314974783802835,0.03787824510879406,2.5600192371011033e-05,2.086162358522436e-07,3.129243537783654e-06,4.678964146971749e-06,0.9999920321876864 +0.24751266836095162,0.03668907284108387,3.087520290613205e-05,2.3841855525970696e-07,2.0563600391149723e-06,3.2782551348209707e-06,0.9999923898155193 +0.23680061100932914,0.034770041698224,4.220008428096813e-05,2.682208746671703e-07,1.1026858180761447e-06,1.8775461226701922e-06,0.9999934626990179 +0.22934973238948997,0.03384879230873332,5.105137314498475e-05,2.682208746671703e-07,7.152556657791209e-07,1.3113020539283883e-06,0.9999938799314896 +0.22076365350762808,0.03286027907762512,6.219744060337605e-05,4.172324717044872e-07,4.768371105194139e-07,9.238719016313645e-07,0.9999944163732389 +0.21172028779106833,0.03193563222338282,7.417797300517633e-05,3.874301522970238e-07,2.682208746671703e-07,6.258487075567308e-07,0.9999948932103495 +0.20651039480307912,0.03177982568196663,8.091329719126304e-05,4.4703479111195056e-07,2.3841855525970696e-07,5.960463881492673e-07,0.9999948932103495 +0.15570893883060383,0.2503829896021299,0.9999994231628994,1.1920927762985348e-07,2.1457669973373625e-06,8.940695822239011e-08,0.0 +0.7273793816265276,0.4699445366054726,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.6403427123758286,0.43708223096992543,0.9999999000000099,0.0,7.152556657791209e-07,0.0,5.960463881492674e-08 +0.6081426143394422,0.33303597563762893,0.9999999000000099,0.0,8.344649434089744e-07,0.0,1.1920927762985348e-07 +0.586779713606379,0.3646595477433436,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 +0.5706723332168787,0.3647921084733014,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5595954060322789,0.37947493785082254,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5603874921566662,0.36719593399435885,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5608617663151244,0.36277890199171253,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5567995309599154,0.35721692436777175,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.560732722259191,0.351657599150523,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5571902990110467,0.3513029813164925,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5575825571782973,0.3751659094644907,0.9999996019768158,1.132488137483608e-06,8.940695822239011e-08,1.1920927762985348e-07,6.8247311443091115e-06 +0.5692676305535153,0.45466428987346996,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 +0.5742616653204594,0.3292773663433812,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5616595744854099,0.3333778976823244,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5820149779078764,0.3408349751842518,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5850396156068783,0.3437657653696783,0.9999999000000099,0.0,0.0,0.0,8.940695822239011e-08 +0.5909751057380107,0.34577244514266536,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5930099487059135,0.35103023046204707,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5960665940991585,0.3543942570079493,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.594806790327238,0.35727286332688385,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.4901159703731684e-07 +0.5958375334492962,0.3588639497142457,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5958442091695108,0.3594336807112337,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5837037563082276,0.3836756347952937,0.9999996019768158,1.6391275674104854e-06,8.940695822239011e-08,8.940695822239011e-08,8.255242475867353e-06 +0.5914806127303299,0.4542466103252779,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.5842681526895824,0.3353925048730652,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5348736047523271,0.34436756366555,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.566783010936156,0.3431953191169531,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5530521869430417,0.3520527481429938,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5620261430507634,0.34060293430218097,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5562406778105244,0.3479831218123613,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5599924325711113,0.3433637618430595,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5590342879063865,0.34544312948033773,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5630670785670777,0.3430116474041092,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5617443918949218,0.3444727062589158,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 +0.1767458319590815,0.14454099533467027,0.00011798738253414749,0.0,0.0002234875932365678,0.9999959064892093,0.0 +0.10737964510473029,0.11361292002639814,8.228420388400636e-05,0.0,5.9753650411964056e-05,0.9999644948445539,0.0 +0.11402547358994398,0.1095950901320666,6.812810216546127e-05,0.0,5.102157082557729e-05,0.9999708129362682,0.0 +0.09441825747098964,0.11230668423636912,9.453295716047381e-05,0.0,5.5432314097881866e-05,0.9999495340802114,0.0 +0.06521737575260955,0.11310687659234173,0.0001475810857057586,0.0,9.211896928846927e-05,0.9998310996628861,0.0 +0.060094565150633564,0.09782984851115642,0.0002403259037017846,0.0,0.00048744673622847087,0.999106784092007,2.980231940746337e-08 +0.07890900969178566,0.08151283858810818,0.0003797709562093057,0.0,0.0038887258455634504,0.9958470063952187,5.960463881492674e-08 +0.09207737445450027,0.07126989959450081,0.0004175304948985618,0.0,0.0094980886021168,0.9930837353397587,0.0 +0.09097218513112074,0.07075166701058991,0.00044393534989357436,0.0,0.007568150001928286,0.9951410490530948,0.0 +0.08604538440348052,0.07322415708241689,0.0004949569207191516,0.0,0.00585147679941958,0.995750625694255,0.0 +0.07963851093916145,0.07222753761962063,0.0006659626294791764,0.0,0.010175763543123108,0.9903915130137662,0.0 +0.07907253503472017,0.061890304077994736,0.0010065733379870754,0.0,0.057598138056180456,0.9392694487671469,0.0 +0.4275653064073901,0.2375169992040187,3.743171317577399e-05,1.7881391644478022e-07,2.8878447505832006e-05,0.9999999000000099,4.947185021638919e-06 +0.29888126252844127,0.1969369053503412,6.3180917143822346e-06,0.0,4.678964146971749e-06,0.9999997807907323,3.0100342601538e-06 +0.3121305703987575,0.2008101343764724,4.470347911119505e-06,0.0,2.682208746671703e-06,0.9999997807907323,4.529952549934432e-06 +0.33096355198443395,0.1988384425299625,4.112720078229945e-06,0.0,2.2053716361522894e-06,0.9999999000000099,5.185603576898626e-06 +0.3501771688316303,0.1821334361718153,3.5762783288956045e-06,0.0,1.6093252480030219e-06,0.9999997807907323,4.0829177588224814e-06 +0.36538103221334023,0.1620430946072623,3.3378597736358976e-06,0.0,1.043081179261218e-06,0.9999997211860935,2.65240642726424e-06 +0.37073400615110685,0.15332978961226384,3.874301522970238e-06,0.0,8.642672628164378e-07,0.9999997807907323,1.9669530808925826e-06 +0.3687854409065129,0.1534560620521989,4.529952549934432e-06,0.0,8.642672628164378e-07,0.9999996615814547,1.847743803262729e-06 +0.3685742616500824,0.1542514562342679,5.245208215713553e-06,0.0,8.642672628164378e-07,0.9999996615814547,1.7881391644478022e-06 +0.3690827786769626,0.15629526970094368,5.930661562085211e-06,0.0,8.642672628164378e-07,0.9999996019768158,1.698732206225412e-06 +0.37033024428741507,0.15870583054685963,6.735324186086722e-06,0.0,8.642672628164378e-07,0.999999542372177,1.5497206091880952e-06 +0.37160372732531094,0.16153299805736185,7.599591448903159e-06,0.0,9.238719016313645e-07,0.9999994231628994,1.4603136509657052e-06 +0.33801025150806796,0.03412151336085641,1.7493961492181e-05,4.4703479111195056e-07,0.0009198187861919494,2.148747229278109e-05,0.9991811706812481 +0.30533581970857865,0.0482655763543451,3.457069051265751e-06,1.4901159703731684e-07,0.00015404818901717816,3.817677116096058e-05,0.9999434544070522 +0.2938074171421462,0.046449869863185674,2.8014180243015566e-06,2.086162358522436e-07,8.39531337708243e-05,3.4630295151472434e-05,0.9999474479178528 +0.2918831705926196,0.04591050743270553,2.8908249825239467e-06,1.4901159703731684e-07,6.69658117085702e-05,3.236531887650522e-05,0.9999438120348851 +0.28828018902538594,0.04516389965237683,2.5629994690418497e-06,1.4901159703731684e-07,7.271765935421062e-05,3.427266731858287e-05,0.9999271823406557 +0.28081792591839516,0.04425615071492545,2.74181338548663e-06,1.7881391644478022e-07,7.03036714822061e-05,3.114342378079922e-05,0.9999165727149467 +0.2771648764495523,0.04197287558790554,5.155801257491163e-06,1.7881391644478022e-07,2.9116866061091712e-05,1.4483927232027197e-05,0.9999546004745106 +0.27194809912509177,0.038404703133682556,1.0669230347871886e-05,2.086162358522436e-07,9.566544529795742e-06,5.692243006825504e-06,0.9999762965630392 +0.25524348019496684,0.03474292158485585,2.2858378985524404e-05,2.086162358522436e-07,2.8908249825239467e-06,2.026557719707509e-06,0.9999861313284437 +0.23271667956342282,0.0317064225619383,4.4167037361860715e-05,3.278255134820971e-07,7.450579851865842e-07,7.152556657791209e-07,0.9999913169320206 +0.21614807843266967,0.030604720110421018,6.288289394974771e-05,4.4703479111195056e-07,2.682208746671703e-07,4.4703479111195056e-07,0.999993105071185 +0.20877715944379335,0.030948489899104217,7.280706631243301e-05,5.066394299268773e-07,1.1920927762985348e-07,3.874301522970238e-07,0.9999935223036568 +0.35985118149220996,0.05565366147995683,2.2351739555597527e-06,2.980231940746337e-08,0.9996851875070671,0.00011485813899636382,0.0 +0.2762702107315107,0.03175544738225766,3.3378597736358976e-05,0.0,0.9999991847443441,5.66244068741804e-07,0.0 +0.32287764547918407,0.04568073152713574,6.973742741346429e-06,0.0,0.9999996615814547,3.784894564747848e-06,0.0 +0.3222502469883043,0.04703041910319857,7.718800726533013e-06,0.0,0.9999996019768158,4.678964146971749e-06,0.0 +0.33791255949528515,0.047938674680130446,3.844499203562775e-06,5.960463881492674e-08,0.9999993039536218,9.626149168610668e-06,0.0 +0.3614004850237925,0.05453377961178617,1.5795229285955586e-06,1.7881391644478022e-07,0.9999977542330126,5.85019529968506e-05,0.0 +0.3709493875349938,0.07332852481540074,8.642672628164378e-07,1.7881391644478022e-07,0.9999711705641011,0.0010380445872813567,0.0 +0.22116559742965428,0.09359988568610558,7.033347380161355e-06,0.0,0.9792865727561572,0.7237557045066011,0.0 +0.1366134583893474,0.1301863491312262,3.698467838466204e-05,0.0,0.0022740957847059,0.9999823166315596,0.0 +0.21310549973559106,0.1604432165347976,5.513429090380723e-06,0.0,3.117322610020669e-05,0.9999990655350666,1.4901159703731684e-07 +0.24058258532481586,0.17690595981429671,3.784894564747848e-06,0.0,1.2159346318245055e-05,0.999999542372177,1.4901159703731684e-07 +0.2551862597359848,0.1886126696740475,3.6060806483030677e-06,0.0,9.894370043277838e-06,0.9999997807907323,4.768371105194139e-07 +0.14769384264334418,0.12873828408897844,0.00015959142042696635,0.0,0.00040510292770564956,0.9999830914918642,0.0 +0.1751789450572909,0.1266125738403953,2.0027158641815386e-05,0.0,3.114342378079922e-05,0.999996323721681,1.4901159703731684e-07 +0.19476136564401972,0.137993752932761,1.2367962554097299e-05,0.0,1.2159346318245055e-05,0.9999981118608455,5.960463881492674e-08 +0.2221733331588301,0.14777895805689414,8.255242475867353e-06,0.0,7.420777532458379e-06,0.9999990655350666,1.1920927762985348e-07 +0.2403036057849562,0.15896034238000697,6.973742741346429e-06,0.0,6.1690801173449175e-06,0.999999542372177,3.278255134820971e-07 +0.24773454665111883,0.1666935682011315,6.943940421938965e-06,0.0,5.841254603862821e-06,0.9999996019768158,5.66244068741804e-07 +0.2465751767056407,0.166395813198207,7.450579851865842e-06,0.0,5.6624406874180405e-06,0.9999996019768158,5.364417493343406e-07 +0.24028429388004977,0.16007766124845274,8.22544015645989e-06,0.0,5.334615173935943e-06,0.999999542372177,4.768371105194139e-07 +0.22669592498794275,0.14931344983405143,1.0102986279130082e-05,0.0,5.334615173935943e-06,0.9999991847443441,2.682208746671703e-07 +0.2013132274067489,0.1360699832206423,1.4930962023139149e-05,0.0,6.3180917143822346e-06,0.9999984694886783,1.1920927762985348e-07 +0.17632371186479967,0.12604430315720402,2.3752448567748306e-05,0.0,8.67247494757184e-06,0.9999968005587916,8.940695822239011e-08 +0.14462924003002198,0.11683931944753756,4.535913013815925e-05,0.0,1.4275310996174954e-05,0.999992151396964,2.980231940746337e-08 +0.18319776653484887,0.6285080312606329,2.9206273019314104e-06,0.9999999000000099,1.4901159703731684e-07,0.0,0.0 +0.18083196877684443,0.4990989564994671,2.980231940746337e-08,0.9999999000000099,0.0,2.008676328063031e-05,2.980231940746337e-08 +0.18102321027959836,0.5857241152714076,0.0,0.9999999000000099,0.0,1.3291834455728662e-05,0.0 +0.1771873831675593,0.6372019647460827,2.980231940746337e-08,0.9999999000000099,0.0,1.1056660500168911e-05,8.940695822239011e-08 +0.1820563673897698,0.6448404787866754,0.0,0.9999999000000099,0.0,1.043081179261218e-05,2.980231940746337e-08 +0.18594288825218822,0.6462101935233793,8.940695822239011e-08,0.9999999000000099,0.0,1.0281800195574863e-05,2.980231940746337e-08 +0.1885512173097737,0.6466658114279644,0.0,0.9999999000000099,0.0,1.0639428028464424e-05,8.940695822239011e-08 +0.19045513867543276,0.6460596321907025,0.0,0.9999999000000099,0.0,1.1324881374836081e-05,1.1920927762985348e-07 +0.19188070296446677,0.6452558039513991,2.980231940746337e-08,0.9999999000000099,0.0,1.2278555595874908e-05,8.940695822239011e-08 +0.19308653473054538,0.6435343622059359,2.980231940746337e-08,0.9999999000000099,0.0,1.3560055330395832e-05,0.0 +0.19408598541409774,0.6414194105957328,0.0,0.9999999000000099,0.0,1.4960764342546611e-05,0.0 +0.1949082612910626,0.6396755575038379,2.980231940746337e-08,0.9999999000000099,0.0,1.6570089590549635e-05,5.960463881492674e-08 +0.21304959057879405,0.0332511663379952,5.352496565580421e-05,7.2121612966061355e-06,7.95721928179272e-06,1.3113020539283883e-06,0.9998386694520156 +0.24402618407192667,0.03971508144652275,3.1918284085393266e-05,2.682208746671703e-07,3.695487606525458e-06,4.857778063416529e-06,0.9999916745598535 +0.24233210085819068,0.038427442305660475,2.777576168775586e-05,2.3841855525970696e-07,2.682208746671703e-06,4.112720078229945e-06,0.9999927474433521 +0.253043681372655,0.040538251393052324,2.1308658376336308e-05,2.3841855525970696e-07,3.367662093043361e-06,6.526707950234478e-06,0.9999909593041877 +0.24601316451007682,0.03796893357580429,2.8491017353534983e-05,2.3841855525970696e-07,2.4437901914119963e-06,3.9637084811926284e-06,0.9999923898155193 +0.24040120839077184,0.036289870732769056,3.501772530376946e-05,2.682208746671703e-07,1.4901159703731685e-06,2.65240642726424e-06,0.9999929858619074 +0.23897415398561853,0.03601959347108132,3.758072477281131e-05,2.682208746671703e-07,1.2814997345209249e-06,2.3841855525970694e-06,0.9999928666526298 +0.24051651357608506,0.036268621676910265,3.704428302347697e-05,2.086162358522436e-07,1.1026858180761447e-06,2.3841855525970694e-06,0.9999923898155193 +0.2404521107574079,0.03598412870744604,3.811716652214565e-05,2.682208746671703e-07,9.536742210388278e-07,2.2351739555597527e-06,0.9999922706062416 +0.24433967470110984,0.036491274827430614,3.474950442910229e-05,2.682208746671703e-07,1.043081179261218e-06,2.5629994690418497e-06,0.9999913765366594 +0.24488893150269234,0.036190479987623106,3.5077329942584386e-05,2.086162358522436e-07,1.0728834986686813e-06,2.413987872004533e-06,0.9999911381181041 +0.24685862659385835,0.03624376654004318,3.3587213972211215e-05,2.3841855525970696e-07,1.043081179261218e-06,2.4735925108194595e-06,0.9999906016763548 +0.3539713322969731,0.05217793582976465,2.3841855525970694e-06,2.980231940746337e-08,0.9997677995364647,8.398293609023177e-05,0.0 +0.10015255212369104,0.016029030081865254,3.102421450316937e-05,5.960463881492674e-08,0.9999928666526298,1.4901159703731684e-07,4.768371105194139e-07 +0.09945380687301807,0.02268433570473381,1.1175869777798764e-05,2.086162358522436e-07,0.9999987079072337,5.364417493343406e-07,1.2218950957059981e-06 +0.03488087653969336,0.041792511932846096,1.4603136509657052e-06,1.7106531339883975e-05,0.9998828364893774,2.6136634120345377e-05,0.00022646782517731415 +0.04403507709320834,0.06168743966953643,2.086162358522436e-07,6.213783596456113e-05,0.9290559554876539,0.0002858936500757961,0.03621473546277022 +0.13278275727675884,0.05166473983833641,7.152556657791209e-07,5.692243006825504e-06,0.0022045669735282877,2.61962387591603e-05,0.9828796595931986 +0.2178783714681052,0.034286737436145506,2.0325181835890017e-05,1.0132788598537545e-06,1.5795229285955586e-06,2.9802319407463367e-07,0.9999504281497935 +0.19343698023948777,0.029142528767363902,4.2557712113857695e-05,1.3411043733358516e-06,1.4901159703731684e-07,1.1920927762985348e-07,0.9999872638165812 +0.18491968511769383,0.02969655394045629,5.948542953729689e-05,1.4603136509657052e-06,2.980231940746337e-08,1.1920927762985348e-07,0.999991495745937 +0.16052153705885913,0.028080582613904996,6.920098566412995e-05,2.413987872004533e-06,5.960463881492674e-08,5.960463881492674e-08,0.9999949528149883 +0.13087001442367338,0.02700334786906382,4.6849246108532416e-05,7.271765935421062e-06,0.0,8.940695822239011e-08,0.9999968005587916 +0.09280577301594777,0.026382774110091108,1.4275310996174954e-05,5.736946485936699e-05,0.0,0.0,0.9999981118608455 +0.08890739082921954,0.032584667200230906,0.0003020763095140487,0.00032687183926105823,8.940695822239011e-08,8.940695822239011e-08,0.999782164254419 +0.20566329359156635,0.048652470103515914,0.00011807678949236988,7.450579851865842e-07,1.7881391644478022e-07,4.291533994674725e-06,0.9999945355825166 +0.24440070985735732,0.05257841943794192,2.0921228224039285e-05,3.278255134820971e-07,1.0132788598537545e-06,2.1785495486855723e-05,0.9999889327464679 +0.24863561986847346,0.04313856362557825,2.625584339797523e-05,2.086162358522436e-07,2.74181338548663e-06,9.208916696906181e-06,0.9999922110016028 +0.24874794482154805,0.038612335913722075,2.917647069990664e-05,2.086162358522436e-07,2.592801788449313e-06,5.155801257491163e-06,0.9999930454665462 +0.24465802310884205,0.0368574857648679,3.418326036036048e-05,2.086162358522436e-07,2.026557719707509e-06,3.457069051265751e-06,0.9999934626990179 +0.23952355979881296,0.0357417762218308,3.987550336718599e-05,2.9802319407463367e-07,1.370906692743315e-06,2.4735925108194595e-06,0.9999937011175731 +0.23970201610526307,0.03589835762362894,3.975629408955614e-05,2.086162358522436e-07,1.1920927762985347e-06,2.4437901914119963e-06,0.9999931646758239 +0.2390688657661627,0.035728603595337693,4.082917758822482e-05,2.682208746671703e-07,1.0132788598537545e-06,2.2947785943746796e-06,0.9999929262572685 +0.24051615594821643,0.03587093948703696,3.957748017311135e-05,2.9802319407463367e-07,9.536742210388278e-07,2.2351739555597527e-06,0.9999922706062416 +0.24384510516110652,0.036302536719781654,3.629922503829038e-05,2.9802319407463367e-07,1.0132788598537545e-06,2.5033948302269232e-06,0.9999916745598535 +0.2513831853762485,0.03744748234107608,2.9355284616351418e-05,2.682208746671703e-07,1.2814997345209249e-06,3.367662093043361e-06,0.9999900056299666 +0.19887760280739297,0.025549978013431954,2.8014180243015566e-06,6.258487075567308e-07,0.3241642985428902,4.610418812334583e-05,0.6847253949178108 +0.2474662661449959,0.05306419729277817,3.2782551348209707e-06,4.172324717044872e-07,0.0011323689282059781,2.4467704233527428e-05,0.9996440603062848 +0.278006881463937,0.04613214730426486,1.2814997345209249e-06,2.682208746671703e-07,0.0002025067603737136,3.1918284085393266e-05,0.9997997476228694 +0.27381253241358877,0.04629519581002002,1.698732206225412e-06,2.682208746671703e-07,0.00010049342104196648,2.548098309338118e-05,0.9998443318927029 +0.2755438089256631,0.044293910257384196,2.8312203437090202e-06,2.086162358522436e-07,4.509090926349208e-05,1.4901159703731685e-05,0.9999095989722053 +0.2807490825536824,0.04324099420760722,3.2782551348209707e-06,2.3841855525970696e-07,3.156065625250371e-05,1.3113020539283883e-05,0.9999254538061301 +0.28045246003896995,0.04216393827670034,4.291533994674725e-06,1.7881391644478022e-07,2.2143123319745282e-05,1.0490416431427107e-05,0.9999407721983056 +0.27919274567401664,0.04073113202351246,5.722045326232967e-06,2.3841855525970696e-07,1.4007090121507784e-05,7.68899840712555e-06,0.9999556733580093 +0.2776612043265764,0.0395680963925318,7.629393768310623e-06,2.086162358522436e-07,9.179114377498718e-06,5.930661562085211e-06,0.999965090890942 +0.2744413316136207,0.03850156068142598,1.007318395972262e-05,2.086162358522436e-07,6.079673159122528e-06,4.589557188749359e-06,0.9999718858197669 +0.27732196449085134,0.03889906405736499,9.924172362685302e-06,2.086162358522436e-07,5.3942198127508695e-06,5.185603576898626e-06,0.9999723626568774 +0.27989590166840284,0.039298504584258875,9.655951488018132e-06,2.3841855525970696e-07,5.424022132158334e-06,5.841254603862821e-06,0.9999722434475998 +0.11153659224048344,0.46105051032754607,0.9408726943419907,2.086162358522436e-07,0.0030656751904875345,0.310101150258577,0.0 +0.15172749757138454,0.13855591413986384,0.16591934690675303,8.940695822239011e-08,0.00015315411943495427,0.9513496401250456,0.0 +0.3226748108730218,0.15900865194458916,6.735324186086722e-05,0.0,6.556510269641941e-06,0.999997635023735,2.086162358522436e-07 +0.3525106310698455,0.1699456870264871,8.493661031127061e-06,0.0,1.996755400300046e-06,0.9999997211860935,1.847743803262729e-06 +0.358861327156466,0.17082935568745333,6.0200685203076e-06,0.0,1.4007090121507783e-06,0.9999997807907323,2.9504296213388737e-06 +0.36394643782062314,0.165390878887466,5.453824451565797e-06,0.0,1.1920927762985347e-06,0.9999997211860935,2.8014180243015566e-06 +0.3639777898637737,0.1626337170322405,5.1259989380836994e-06,0.0,1.043081179261218e-06,0.9999997211860935,2.8014180243015566e-06 +0.35972163079679603,0.16349905726494146,4.887580382823993e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.0994412183761904e-06 +0.35411381720030277,0.16657909748085997,4.678964146971749e-06,0.0,1.1920927762985347e-06,0.9999997807907323,3.6060806483030677e-06 +0.34838610886084875,0.17010718581147835,4.589557188749359e-06,0.0,1.2218950957059981e-06,0.9999998403953712,4.172324717044872e-06 +0.3431785702563281,0.17242234942344764,4.351138633489652e-06,0.0,1.1920927762985347e-06,0.9999997807907323,4.529952549934432e-06 +0.33831897376566933,0.1733720898331361,4.380940952897116e-06,0.0,1.1026858180761447e-06,0.9999998403953712,4.649161827564286e-06 +0.19987833499080795,0.03296315669448983,5.778669733107147e-05,9.80496308505545e-06,5.334615173935943e-06,9.238719016313645e-07,0.9998489214498917 +0.2661220133194401,0.04603955148862215,1.609325248003022e-05,2.3841855525970696e-07,6.765126505494185e-06,1.591443856358544e-05,0.9999873830258588 +0.2517697512999233,0.04005104302674171,2.1278856056928847e-05,2.3841855525970696e-07,4.857778063416529e-06,6.3180917143822346e-06,0.9999916745598535 +0.26123106478563074,0.04111918806325619,1.6838310465216805e-05,2.086162358522436e-07,5.21540589630609e-06,8.40425407290467e-06,0.9999899460253279 +0.25534671543971355,0.03914645313546289,2.1636483889818406e-05,1.4901159703731684e-07,3.8146968841553113e-06,5.692243006825504e-06,0.9999911381181041 +0.2556439936055185,0.0385951697760297,2.2590158110857234e-05,1.7881391644478022e-07,3.1590458571911173e-06,5.03659197986131e-06,0.9999907804902712 +0.2559426426781532,0.03834035991965854,2.3245809137821427e-05,2.086162358522436e-07,2.74181338548663e-06,4.7385687857866755e-06,0.9999906016763548 +0.2580419778717003,0.03839522599516489,2.2500751152634845e-05,2.3841855525970696e-07,2.682208746671703e-06,4.827975744009066e-06,0.999989886420689 +0.25843322275998976,0.038055658333937634,2.2977588263154257e-05,2.086162358522436e-07,2.5331971496343865e-06,4.470347911119505e-06,0.9999896480021337 +0.2576228678119795,0.03752630948377803,2.4110076400637865e-05,2.3841855525970696e-07,2.175569316744826e-06,3.933906161785165e-06,0.9999895287928562 +0.254471719254447,0.03668314217892974,2.7179715299606593e-05,1.7881391644478022e-07,1.7285345256328755e-06,3.2484528154135075e-06,0.9999899460253279 +0.2523936033144391,0.036251783364764104,2.92062730193141e-05,2.3841855525970696e-07,1.519918289780632e-06,2.8610226631164835e-06,0.9999900056299666 +0.3230840563640327,0.034810632461309096,2.4735925108194598e-05,7.152556657791209e-07,0.0002806484418600825,1.3589857649803297e-05,0.9995614482768873 +0.27878731488027125,0.04428806900219721,8.642672628164377e-06,1.7881391644478022e-07,3.689527142643965e-05,1.4960764342546611e-05,0.9999748660517077 +0.2394517063995392,0.03607133030273751,2.44080995947125e-05,2.9802319407463367e-07,4.261731675267262e-06,2.3841855525970694e-06,0.9999907208856325 +0.25828337668303064,0.040331393473394754,1.576542696654812e-05,2.086162358522436e-07,4.053115439415018e-06,5.75184764564043e-06,0.9999871446073035 +0.25710284708865816,0.040024489157498816,1.776218236684817e-05,2.086162358522436e-07,3.5762783288956045e-06,5.3942198127508695e-06,0.9999879790722469 +0.2609466314207744,0.03985005616459351,1.7195938298106364e-05,2.086162358522436e-07,3.635882967710531e-06,5.692243006825504e-06,0.9999873830258588 +0.2602666914355273,0.038991153233527205,1.883506586551685e-05,1.7881391644478022e-07,3.2484528154135075e-06,4.976987341046382e-06,0.9999878598629693 +0.25900739430308733,0.038195252411977694,2.0742414307594504e-05,1.7881391644478022e-07,2.712011066079167e-06,4.261731675267262e-06,0.9999882174908022 +0.2600200772177793,0.03810086845699203,2.0921228224039285e-05,2.086162358522436e-07,2.4437901914119963e-06,4.261731675267262e-06,0.9999879194676081 +0.26052045821064795,0.037909716361230084,2.1249053737521383e-05,2.086162358522436e-07,2.2947785943746796e-06,4.142522397637409e-06,0.9999877406536917 +0.2595342397582352,0.03740897774055777,2.2709367388487087e-05,1.4901159703731684e-07,2.0563600391149723e-06,3.6656852871179947e-06,0.9999879790722469 +0.2588386535537352,0.037078350776045294,2.3692843928933378e-05,2.086162358522436e-07,1.8179414838552655e-06,3.367662093043361e-06,0.9999879790722469 +0.12462809681376338,0.028104811902002043,5.933641794025957e-05,0.08534508090106929,0.0,0.0,0.9824162335264125 +0.09103894233326641,0.07563391326562853,0.00014597176045775558,0.0001576840719848887,0.0,1.1920927762985348e-07,0.9999872638165812 +0.14152118563066032,0.07743594049081434,2.062320502996465e-05,1.955032153129597e-05,0.0,5.57303372919565e-06,0.9999848796310286 +0.08859235047927226,0.04288357495527279,5.09321638673549e-05,3.328919077813659e-05,0.0,5.960463881492674e-08,0.9999973966051797 +0.08291226625099184,0.034937828773238,8.761881905794231e-06,0.0002160966180235169,0.0,2.980231940746337e-08,0.9999978734422902 +0.15663656591720482,0.12926319239310302,8.642672628164378e-07,0.03803386903940179,0.0,1.1920927762985348e-07,0.9995343877708653 +0.3255873918398507,0.13547587392394533,0.0,0.9999696804481307,0.0,2.989172636568576e-05,0.5918284658835291 +0.16222050785346653,0.3772376179049166,0.0,0.9999997211860935,0.0,0.0008728205284863797,0.00130987154259683 +0.1399186849536179,0.2760873436455037,0.0,0.9999999000000099,0.0,0.0048247272911936525,0.0001279711595356477 +0.13680860399633396,0.2942272126170832,0.0,0.9999999000000099,0.0,0.0035287436294407005,5.570053497254904e-05 +0.1387764215411896,0.3085300325819039,0.0,0.9999999000000099,0.0,0.00271138521737161,3.6686655190587406e-05 +0.14125058054339124,0.3180363177708584,0.0,0.9999999000000099,0.0,0.0018823740984142013,2.6404854995012547e-05 +0.6351277231907113,0.39706492417212086,0.9999996615814547,2.4437901914119963e-06,1.1920927762985348e-07,2.9802319407463367e-07,1.4454124912619735e-05 +0.5644434690241741,0.4509648381891517,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.5850470661874749,0.32542619103581305,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.538875520207026,0.34709805244224307,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5705356597664144,0.33813464635780993,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5617988705402442,0.3455528020267057,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5690566301110191,0.33637836569748136,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5694193839791072,0.33944857114701366,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.572648286795746,0.3373293876070323,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5738719105482892,0.3379360436814523,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5704534649612726,0.340401887835388,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 +0.5645089149241347,0.34343320125421095,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.35815089939541755,0.10342872141020686,1.4007090121507783e-06,5.960463881492674e-08,0.9826569170579471,0.006154625992432298,0.0 +0.13458755611816056,0.1213132142812899,5.412101204395348e-05,0.0,0.00859740290498444,0.9999525739167909,0.0 +0.17378219961400462,0.13508912918638644,1.1831520804762957e-05,0.0,6.827711376249858e-05,0.9999964429309587,0.0 +0.1945111155429406,0.14613628384948804,7.2121612966061355e-06,0.0,1.8537042671442215e-05,0.9999981714654843,2.980231940746337e-08 +0.2177639305501412,0.1532300412392493,5.334615173935943e-06,0.0,1.1175869777798764e-05,0.9999988867211501,5.960463881492674e-08 +0.23728278278321968,0.16381013390597093,4.559754869341896e-06,0.0,8.85128886401662e-06,0.9999994231628994,2.3841855525970696e-07 +0.2484416663543824,0.1741556524932192,4.589557188749359e-06,0.0,7.987021601200183e-06,0.9999996019768158,4.172324717044872e-07 +0.25555664299860376,0.1835247575922466,4.857778063416529e-06,0.0,7.748603045940476e-06,0.9999997807907323,6.258487075567308e-07 +0.26030081509465974,0.1915853917270663,5.155801257491163e-06,0.0,7.718800726533013e-06,0.9999997211860935,9.834765404462913e-07 +0.26312905548913496,0.19718438383540624,5.543231409788187e-06,0.0,7.68899840712555e-06,0.9999997807907323,1.1622904568910714e-06 +0.26517337559555665,0.201044023002531,5.811452284455357e-06,0.0,7.4803821712733056e-06,0.9999997807907323,1.4603136509657052e-06 +0.2650188803563052,0.20056667920492902,6.258487075567308e-06,0.0,7.2121612966061355e-06,0.9999998403953712,1.6689298868179488e-06 +0.19163393973510687,0.246368169742359,0.9999996019768158,1.7881391644478022e-07,6.556510269641942e-07,5.960463881492674e-08,0.0 +0.7201658487021741,0.4700159727722237,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.6094878911719671,0.4313837587094724,0.9999999000000099,0.0,5.960463881492673e-07,0.0,0.0 +0.5991741418590396,0.32179057592603827,0.9999999000000099,0.0,5.364417493343406e-07,0.0,5.960463881492674e-08 +0.5774804949521315,0.3682623504961752,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.567264437651987,0.3622601627683211,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5553858279951912,0.3753483294797946,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5580608844525999,0.3623458146428487,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5466526150477073,0.36326175921895526,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5478242635500087,0.35699814551916115,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5531330108413538,0.35318064683588535,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5548848509558748,0.35195285075836735,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.44454371927327946,0.2435391544878691,3.910064306259194e-05,1.7881391644478022e-07,2.6822087466717034e-05,0.9999999000000099,6.139277797937454e-06 +0.19818404316081525,0.1713056862060943,2.4557111191749817e-05,0.0,1.4007090121507784e-05,0.999999542372177,3.874301522970238e-07 +0.24918296932142323,0.16064277288547144,8.58306798934945e-06,0.0,4.380940952897116e-06,0.9999996019768158,6.556510269641942e-07 +0.25734829901583306,0.1688299476811276,8.374451753497206e-06,0.0,4.291533994674725e-06,0.9999996615814547,1.0132788598537545e-06 +0.2585979998004645,0.17432972785825593,8.821486544609158e-06,0.0,4.529952549934432e-06,0.9999997211860935,1.2814997345209249e-06 +0.25810486077193573,0.17578372356265784,9.119509738683792e-06,0.0,4.6193595081568225e-06,0.9999997211860935,1.3411043733358516e-06 +0.2561242580307763,0.17386144396665826,9.566544529795742e-06,0.0,4.589557188749359e-06,0.9999997807907323,1.3411043733358516e-06 +0.25570175050630345,0.17299777266401073,9.80496308505545e-06,0.0,4.529952549934432e-06,0.9999997807907323,1.3113020539283883e-06 +0.25595748423470166,0.17320078608408096,1.007318395972262e-05,0.0,4.410743272304579e-06,0.9999997807907323,1.370906692743315e-06 +0.25698575376400173,0.1745513081251705,1.0132788598537546e-05,0.0,4.470347911119505e-06,0.9999997807907323,1.4603136509657052e-06 +0.2584076225650598,0.1766993701155406,1.0251997876167399e-05,0.0,4.470347911119505e-06,0.9999997807907323,1.6391275674104854e-06 +0.25955724715111755,0.1786662637881469,1.0311602514982325e-05,0.0,4.6193595081568225e-06,0.9999997211860935,1.7285345256328755e-06 +0.1007694303947684,0.021108925338945223,8.046626240015109e-07,1.6689298868179488e-06,0.9826332540163376,5.1707024171948946e-05,0.0035109218424350373 +0.1998080015099759,0.054084002962388085,6.109475478529991e-06,8.344649434089744e-07,0.0025748607921660203,9.745358446240521e-06,0.9989565804021935 +0.28459087013019874,0.045789360992220286,1.4305113315582417e-06,3.5762783288956044e-07,0.00014120338935256146,1.820921715796012e-05,0.9998049928310851 +0.27376836537181204,0.043355435125556376,3.695487606525458e-06,3.278255134820971e-07,2.5779006287455814e-05,6.854533463716575e-06,0.999929030084459 +0.257984042156981,0.03828036784470238,9.775160765647985e-06,3.5762783288956044e-07,5.722045326232967e-06,2.264976274967216e-06,0.999967355867217 +0.2473980486290533,0.036240547889225865,1.6599891909957096e-05,3.874301522970238e-07,2.1159646779298993e-06,1.370906692743315e-06,0.9999784423300365 +0.24096640943483108,0.035442054265629075,2.3663041609525914e-05,4.172324717044872e-07,1.1026858180761447e-06,1.132488137483608e-06,0.9999833895150582 +0.23693102597209229,0.03490999340413266,3.060698203146488e-05,3.874301522970238e-07,7.152556657791209e-07,1.1026858180761447e-06,0.9999862505377213 +0.2358995079896521,0.03479653596282213,3.528594617843663e-05,3.5762783288956044e-07,5.066394299268773e-07,1.1026858180761447e-06,0.9999875022351364 +0.23713514207811717,0.0349652171075076,3.713368998169936e-05,3.5762783288956044e-07,5.066394299268773e-07,1.1920927762985347e-06,0.9999878598629693 +0.23740684985131452,0.0347763895928915,3.933906161785165e-05,3.278255134820971e-07,4.4703479111195056e-07,1.1920927762985347e-06,0.9999883963047187 +0.24183768032979927,0.0354074239670205,3.650784127414263e-05,3.5762783288956044e-07,5.364417493343406e-07,1.4603136509657052e-06,0.9999877406536917 +0.31080842016840454,0.040380954735517005,2.8908249825239467e-06,8.940695822239011e-08,0.9998986913233022,3.150105161368878e-05,2.980231940746337e-08 +0.28432697056546663,0.03751924633337336,3.3378597736358976e-05,0.0,0.9999996615814547,8.940695822239011e-07,0.0 +0.3198840618001088,0.04605340956853005,7.86781232357033e-06,8.940695822239011e-08,0.9999997211860935,3.6656852871179947e-06,0.0 +0.3088127970567623,0.044662296764355416,1.2457369512319688e-05,5.960463881492674e-08,0.9999996615814547,2.65240642726424e-06,0.0 +0.31875714658370957,0.04514071344556317,7.897614642977793e-06,2.980231940746337e-08,0.9999996615814547,3.635882967710531e-06,0.0 +0.3315373658996629,0.04773977398054903,4.887580382823993e-06,2.980231940746337e-08,0.9999994827675383,7.003545060753892e-06,0.0 +0.33776241539510216,0.04932031034578742,3.6060806483030677e-06,8.940695822239011e-08,0.9999991847443441,1.0728834986686813e-05,0.0 +0.3441246151781639,0.05095434187970256,2.6226041078567766e-06,8.940695822239011e-08,0.999998588697956,1.797079860270041e-05,0.0 +0.34156155584828346,0.05153426527094542,2.592801788449313e-06,5.960463881492674e-08,0.9999979926515679,1.883506586551685e-05,0.0 +0.3325554132323844,0.04841378330355373,3.5166736900806776e-06,1.1920927762985348e-07,0.9999982310701231,1.0401009473204716e-05,0.0 +0.3065613508097547,0.041303664438804434,1.034140483438979e-05,5.960463881492674e-08,0.9999993039536218,2.2947785943746796e-06,0.0 +0.26153418420662344,0.0319906175081787,6.473063775301043e-05,0.0,0.9999997807907323,3.874301522970238e-07,0.0 +0.18428790568542325,0.6562114952871086,3.904103842377701e-06,0.9999999000000099,1.1920927762985348e-07,5.960463881492674e-08,0.0 +0.17660844325287992,0.4746711551330293,2.980231940746337e-08,0.9999999000000099,0.0,2.1725890848040795e-05,2.980231940746337e-08 +0.1819183528347981,0.565531611345727,0.0,0.9999999000000099,0.0,1.53779968142511e-05,1.1920927762985348e-07 +0.17600491642223168,0.6219761966593955,8.940695822239011e-08,0.9999999000000099,0.0,1.2397764873504761e-05,2.980231940746337e-08 +0.18038687109200263,0.6300664543026635,5.960463881492674e-08,0.9999999000000099,0.0,1.1384486013651007e-05,0.0 +0.1839734315796013,0.6316524742952202,0.0,0.9999999000000099,0.0,1.1056660500168911e-05,8.940695822239011e-08 +0.18642130493345807,0.6322319506516274,0.0,0.9999999000000099,0.0,1.11460674583913e-05,2.980231940746337e-08 +0.18822994827444764,0.6318213938584848,2.980231940746337e-08,0.9999999000000099,0.0,1.1712311527133104e-05,8.940695822239011e-08 +0.1896357536237394,0.6308115123622282,2.980231940746337e-08,0.9999999000000099,0.0,1.2606381109357005e-05,8.940695822239011e-08 +0.19078999756976706,0.6290965079183997,0.0,0.9999999000000099,0.0,1.3649462288618223e-05,2.980231940746337e-08 +0.19173961877028925,0.627229452025775,1.4901159703731684e-07,0.9999999000000099,0.0,1.4901159703731685e-05,1.1920927762985348e-07 +0.19255366920627545,0.6255973576428148,2.980231940746337e-08,0.9999999000000099,0.0,1.6391275674104854e-05,8.940695822239011e-08 +0.08931532501804543,0.3974585830484725,0.9989457919625679,3.5762783288956044e-07,0.001511752454262987,0.0015243290330529365,0.0 +0.7061076163953222,0.451746314686668,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.49442872403004867,0.7638087867382581,0.9999999000000099,8.940695822239011e-08,8.940695822239011e-08,0.0,0.0 +0.5401581525578945,0.21569725867392625,0.9999997211860935,0.0,0.0,2.8610226631164835e-06,6.854533463716575e-07 +0.4530942141822119,0.13637921211768408,0.0002720951761901406,5.960463881492674e-08,1.4901159703731684e-07,0.9999854756774167,5.066394299268773e-07 +0.3447453975534739,0.15525203940594104,6.556510269641941e-06,0.0,1.847743803262729e-06,0.9999997807907323,2.2053716361522894e-06 +0.32291993497465044,0.1969319581648257,6.1690801173449175e-06,0.0,2.2351739555597527e-06,0.9999997807907323,6.943940421938965e-06 +0.3267465829713945,0.18975460526078128,5.334615173935943e-06,0.0,1.6689298868179488e-06,0.9999999000000099,6.3180917143822346e-06 +0.3285057544572225,0.1824116110489344,4.827975744009066e-06,0.0,1.3113020539283883e-06,0.9999997807907323,5.3942198127508695e-06 +0.3280251622064184,0.17855933305543817,4.6193595081568225e-06,0.0,1.1920927762985347e-06,0.9999997807907323,4.917382702231456e-06 +0.3248715102538055,0.17639279362519086,4.559754869341896e-06,0.0,1.043081179261218e-06,0.9999997807907323,4.649161827564286e-06 +0.32125663755993966,0.1753489374814182,4.708766466379212e-06,0.0,1.1622904568910714e-06,0.9999998403953712,4.380940952897116e-06 +0.1840121447963813,0.6488944290957346,3.6656852871179947e-06,0.9999999000000099,1.1920927762985348e-07,0.0,0.0 +0.17428246139758377,0.46489500991490046,0.0,0.9999999000000099,0.0,2.014636791944524e-05,2.980231940746337e-08 +0.18229952453812093,0.555603861713638,0.0,0.9999999000000099,0.0,1.5109775939583928e-05,2.980231940746337e-08 +0.17569109796750224,0.6150790451903921,2.980231940746337e-08,0.9999999000000099,0.0,1.2427567192912226e-05,0.0 +0.1797567009851409,0.6236603855018805,0.0,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 +0.18322122096256702,0.6254509090306266,0.0,0.9999999000000099,0.0,1.1086462819576373e-05,0.0 +0.18556377290911005,0.626703262221788,5.960463881492674e-08,0.9999999000000099,0.0,1.1295079055428617e-05,2.980231940746337e-08 +0.18735808133303172,0.6267210244059279,0.0,0.9999999000000099,0.0,1.1742113846540568e-05,2.980231940746337e-08 +0.18879324196987415,0.6257682441593565,2.980231940746337e-08,0.9999999000000099,0.0,1.2487171831727152e-05,1.1920927762985348e-07 +0.18996086715865332,0.6240041850928861,5.960463881492674e-08,0.9999999000000099,0.0,1.353025301098837e-05,0.0 +0.19092249869509725,0.6217621563800437,0.0,0.9999999000000099,0.0,1.4692543467879441e-05,0.0 +0.1916906237522859,0.6201808451544234,0.0,0.9999999000000099,0.0,1.6123054799437684e-05,2.980231940746337e-08 +0.08525916933660327,0.033131241792727646,0.0003570019841820037,0.0004121064727664035,2.980231940746337e-08,0.0,0.9997361494732538 +0.2089335620316775,0.05380055307420725,0.00010928510526716817,7.450579851865842e-07,8.940695822239011e-08,7.122754338383746e-06,0.9999929858619074 +0.2424850165743556,0.05397582053213928,2.112984445989153e-05,2.9802319407463367e-07,8.046626240015109e-07,2.3633239290118453e-05,0.9999885751186351 +0.26280063389643615,0.04725646971847053,1.549720609188095e-05,2.086162358522436e-07,4.261731675267262e-06,2.0205972558260164e-05,0.9999886347232739 +0.27550029753497884,0.04382398723805549,1.2159346318245055e-05,1.4901159703731684e-07,8.285044795274818e-06,1.794099628329295e-05,0.9999877406536917 +0.2784604430083365,0.04204043745274688,1.2069939360022665e-05,1.4901159703731684e-07,9.506939890980815e-06,1.4781950426101832e-05,0.9999874426304977 +0.2740165591126465,0.040080189698031884,1.4811752745509294e-05,1.1920927762985348e-07,7.271765935421062e-06,9.864567723870376e-06,0.9999885155139963 +0.2697430252917175,0.03879815339377753,1.7583368450403387e-05,1.4901159703731684e-07,5.185603576898626e-06,7.271765935421062e-06,0.9999890519557456 +0.2674997448810438,0.03828120230972909,1.9073484420776555e-05,1.4901159703731684e-07,4.112720078229945e-06,6.079673159122528e-06,0.9999889327464679 +0.26693272589531897,0.038132488721039956,1.9580123850703434e-05,1.4901159703731684e-07,3.4868713706732143e-06,5.632638368010577e-06,0.9999886943279127 +0.2697272300608527,0.038557380431248574,1.8000600922107875e-05,1.4901159703731684e-07,3.5762783288956045e-06,6.109475478529991e-06,0.9999875022351364 +0.2729973792916743,0.03891545533467542,1.630186871588246e-05,1.4901159703731684e-07,3.844499203562775e-06,6.7055218666792585e-06,0.9999863101423602 +0.13448804616371215,0.25608769054796093,0.9999988271165112,2.3841855525970696e-07,4.976987341046382e-06,5.960463881492674e-08,0.0 +0.713054120511093,0.42913496486944913,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5777073502301373,0.40971985452311854,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,5.960463881492674e-08 +0.6032406091440276,0.309800982422232,0.9999999000000099,0.0,6.556510269641942e-07,0.0,1.1920927762985348e-07 +0.5830440520998809,0.3573525845392573,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.5722100734473754,0.35546550148599154,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5726331472159736,0.35859268897591934,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5669373869661178,0.35539257520312134,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.566922664618859,0.3510656952256823,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5654791593317483,0.34904950851185523,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5626346468692501,0.348114430844779,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.560728251910833,0.3476449846626084,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.22458094357514274,0.3824357985795331,0.020521221492952314,1.1920927762985348e-07,0.0004253685049027247,0.9998978568583587,8.940695822239011e-08 +0.38005524872159796,0.21756589408963717,0.016506878871086404,0.0,1.92821006566288e-05,0.9966696100155036,0.0 +0.433850944024241,0.31128853554163666,0.9999854756774167,5.66244068741804e-07,5.66244068741804e-07,1.963972848951836e-05,0.0 +0.5597844123608537,0.40027850859463576,0.9999999000000099,1.7881391644478022e-07,8.642672628164378e-07,0.0,0.0 +0.6150968074543887,0.408151924540248,0.9999999000000099,1.1920927762985348e-07,8.85128886401662e-06,5.960463881492674e-08,0.0 +0.5342437624710117,0.4496059416954726,0.9999999000000099,8.940695822239011e-08,3.7550922453403844e-06,0.0,0.0 +0.5475630759966137,0.4152911304716427,0.9999999000000099,0.0,2.026557719707509e-06,0.0,0.0 +0.5464384555590382,0.39830359809730853,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,0.0 +0.5490593313943484,0.3941065966408128,0.9999999000000099,0.0,3.874301522970238e-07,0.0,5.960463881492674e-08 +0.5621703862911138,0.3876796364120397,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.5681824087861347,0.3830832242309725,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5683562159302925,0.3764584361862237,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.14048087596311612,0.12444096801534295,0.0001746713940471428,0.0,0.0004966854552447845,0.9999735547496538,0.0 +0.23601809143042782,0.18784075972201597,9.328125974536036e-06,0.0,2.494454134404684e-05,0.9999997807907323,5.066394299268773e-07 +0.24682798980644505,0.18399837609955075,6.347894033789698e-06,0.0,8.761881905794231e-06,0.9999997807907323,6.258487075567308e-07 +0.26780557631337365,0.20029163357166008,5.513429090380723e-06,0.0,7.4803821712733056e-06,0.9999999000000099,1.4305113315582417e-06 +0.27349168061077617,0.21280786391428919,5.841254603862821e-06,0.0,7.629393768310623e-06,0.9999999000000099,2.2947785943746796e-06 +0.27493551372343306,0.21540221568233858,6.079673159122528e-06,0.0,7.3611728936434526e-06,0.9999999000000099,2.65240642726424e-06 +0.2743875980263579,0.2127790748708676,6.3180917143822346e-06,0.0,6.943940421938965e-06,0.9999999000000099,2.74181338548663e-06 +0.27340739964306726,0.20936834808579186,6.645917227864331e-06,0.0,6.4373009920120876e-06,0.9999999000000099,2.712011066079167e-06 +0.27118867634604,0.20457029339148405,7.033347380161355e-06,0.0,6.1690801173449175e-06,0.9999998403953712,2.5033948302269232e-06 +0.2696629464514651,0.20127609368692423,7.3611728936434526e-06,0.0,5.990266200900137e-06,0.9999997807907323,2.3841855525970694e-06 +0.2692620754130448,0.20040220018769947,7.68899840712555e-06,0.0,5.871056923270284e-06,0.9999997807907323,2.413987872004533e-06 +0.26930832861738857,0.2005418836727067,8.016823920607646e-06,0.0,5.841254603862821e-06,0.9999997807907323,2.592801788449313e-06 +0.34781137107362586,0.11163282392497634,1.6391275674104854e-06,1.1920927762985348e-07,0.9649193514069295,0.01288771500456346,0.0 +0.07775354385054016,0.027019172902248978,3.805756188333072e-05,0.0,0.9999416066632489,5.66244068741804e-07,9.238719016313645e-07 +0.1734093427586276,0.022281914945601666,2.13980653345587e-05,2.980231940746337e-08,0.9999991847443441,2.9802319407463367e-07,1.4901159703731684e-07 +0.2243925928976603,0.04160577058079677,8.943676054179758e-05,0.0,0.9999999000000099,1.1026858180761447e-06,8.940695822239011e-08 +0.2126081585796058,0.032920628780449865,0.0001268386713981641,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 +0.1999867558396499,0.030468583101777337,0.00011530517378747578,0.0,0.9999999000000099,4.172324717044872e-07,8.940695822239011e-08 +0.18934404849222072,0.030183345074253548,0.00010469554807841882,0.0,0.9999997807907323,4.172324717044872e-07,8.940695822239011e-08 +0.19424104689747448,0.032846897834875335,0.00010293721123337848,0.0,0.9999999000000099,5.66244068741804e-07,8.940695822239011e-08 +0.20847710966200647,0.03541228174556886,0.00011315940679013842,0.0,0.9999999000000099,6.854533463716575e-07,5.960463881492674e-08 +0.2301339805030897,0.03793799876517116,0.00012278555595874907,0.0,0.9999999000000099,7.748603045940476e-07,2.980231940746337e-08 +0.24129593371345817,0.037207275622672384,0.00012722610155046113,0.0,0.9999999000000099,7.152556657791209e-07,1.1920927762985348e-07 +0.24235862492511462,0.035353690379764685,0.0001300871242135776,0.0,0.9999999000000099,6.258487075567308e-07,1.1920927762985348e-07 +0.6846160292341943,0.4091392158761385,0.9999996615814547,3.397464412450824e-06,2.086162358522436e-07,5.066394299268773e-07,2.3901460164785624e-05 +0.505989432313948,0.4317994415020648,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5658760666612912,0.3211752175734825,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5241456627628727,0.3635623454425061,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.566536009288217,0.33612331742253115,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5443899631274824,0.36182230704787605,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5587986111409544,0.34202802175387176,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5515745281944762,0.35440027707707056,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5579072832830201,0.3472298979164637,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5594521164662447,0.34921026223878693,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.560546338534986,0.348339080750899,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5592856406933939,0.34915977710467083,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.6923106908511547,0.4111244081746877,0.9999996615814547,3.635882967710531e-06,2.086162358522436e-07,5.066394299268773e-07,2.571940164864089e-05 +0.5154168009544573,0.4461269973944631,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,5.960463881492674e-08 +0.57791531083575,0.3121394514503044,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5315443277138908,0.355330228744697,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5741283297301024,0.330586314144747,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5574994086988391,0.3492696880696178,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5705633759262339,0.3330868780042584,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5718797445060438,0.33906543249046306,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5704153775932627,0.33799821132594243,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5763618349790333,0.3363491296192241,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5765977501630445,0.3386804162876023,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5773657560109436,0.3392896353617473,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.44741475580270157,0.24621862168864317,4.291533994674725e-05,1.7881391644478022e-07,2.6851889786124495e-05,0.9999999000000099,6.3180917143822346e-06 +0.4871442913807379,0.3877092897228104,0.006436257910832827,8.940695822239011e-08,1.290440430343164e-05,0.9993424608338813,0.0 +0.6672183870992946,0.4346329569072345,0.9999999000000099,5.960463881492674e-08,1.7881391644478022e-07,2.980231940746337e-08,0.0 +0.6161864995701272,0.4025340079571951,0.9999999000000099,2.980231940746337e-08,1.5795229285955586e-06,0.0,0.0 +0.5604504346615464,0.42088636748736247,0.9999999000000099,2.980231940746337e-08,1.0132788598537545e-06,0.0,0.0 +0.5629107355838383,0.3989379703315444,0.9999999000000099,0.0,9.834765404462913e-07,0.0,0.0 +0.549439787841934,0.3940532802860704,0.9999999000000099,0.0,5.364417493343406e-07,0.0,0.0 +0.5599012970692535,0.390017628602954,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.562339901900848,0.38894402974144354,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.5562010407217505,0.3878355621627454,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5587179660565766,0.37782236927238544,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5512176751862207,0.37182861560176567,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.7065082788174858,0.4148789345507691,0.9999997211860935,3.904103842377701e-06,2.9802319407463367e-07,6.854533463716575e-07,2.989172636568576e-05 +0.4481844901852991,0.44180905811373883,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.554337501502925,0.33744275564137566,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5435827374233227,0.3660902678339647,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5831694602724831,0.32998713845324495,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5676872133973613,0.3777596353837701,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5670496821168701,0.4385975896561131,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5570522546537525,0.5720011590931849,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5747330188513237,0.7040938137756136,0.9999999000000099,8.940695822239011e-08,2.980231940746337e-08,0.0,0.0 +0.5806657075641517,0.7421005963008438,0.9999999000000099,8.940695822239011e-08,0.0,0.0,0.0 +0.4188158213918832,0.2316684424480469,0.9999999000000099,0.0,0.0,1.1920927762985348e-07,1.4901159703731684e-07 +0.2022554278289969,0.08882641790776342,0.0011344550905645007,0.0,2.264976274967216e-06,0.9997995092043142,1.4901159703731684e-07 +0.4263213872733016,0.23719114061108743,3.758072477281131e-05,1.7881391644478022e-07,2.8967854464054395e-05,0.9999999000000099,4.827975744009066e-06 +0.326881110654647,0.19924220439360185,5.424022132158334e-06,0.0,4.112720078229945e-06,0.9999999000000099,3.7550922453403844e-06 +0.33437836168811946,0.19447362419613043,3.933906161785165e-06,0.0,2.2351739555597527e-06,0.9999999000000099,4.589557188749359e-06 +0.35732334850739034,0.17108649012497035,3.308057454228434e-06,0.0,1.3113020539283883e-06,0.9999997807907323,3.039836579561264e-06 +0.37196871636757795,0.15401932594522988,3.6060806483030677e-06,0.0,9.536742210388278e-07,0.9999997807907323,1.937150761485119e-06 +0.378187268956737,0.15536460277758007,6.616114908456868e-06,0.0,8.344649434089744e-07,0.9999993039536218,1.043081179261218e-06 +0.38281694053018417,0.1850787400882421,2.0056960961222846e-05,0.0,8.642672628164378e-07,0.9999965621402362,5.364417493343406e-07 +0.40594607589948095,0.21891048546857259,7.441639156043604e-05,0.0,8.642672628164378e-07,0.9999784423300365,1.7881391644478022e-07 +0.41614514587586526,0.24935141201517885,0.0003847181412309446,5.960463881492674e-08,6.556510269641942e-07,0.9997999860414246,5.960463881492674e-08 +0.39318075774472083,0.268157184078075,0.0032403465845346775,5.960463881492674e-08,5.066394299268773e-07,0.9967311220027605,0.0 +0.3638248741476088,0.26868697996307034,0.029694315801930722,2.980231940746337e-08,3.874301522970238e-07,0.9546315907474732,0.0 +0.35468643902263625,0.276710927439037,0.34024717981576663,5.960463881492674e-08,2.682208746671703e-07,0.49237341725435746,0.0 +0.18298366665082455,0.6240515111808297,2.8014180243015566e-06,0.9999999000000099,8.940695822239011e-08,5.960463881492674e-08,0.0 +0.17547932266462404,0.4710611104158588,0.0,0.9999999000000099,0.0,1.820921715796012e-05,8.940695822239011e-08 +0.1818921565934204,0.5580702423093765,0.0,0.9999999000000099,0.0,1.3649462288618223e-05,1.1920927762985348e-07 +0.17605936526523175,0.6153887509245921,0.0,0.9999999000000099,0.0,1.1593102249503251e-05,8.940695822239011e-08 +0.18007680772989387,0.6228148936158864,5.960463881492674e-08,0.9999999000000099,0.0,1.0997055861353983e-05,0.0 +0.18340614437297503,0.6243693827513624,0.0,0.9999999000000099,0.0,1.0758637306094277e-05,0.0 +0.18567368387407132,0.6249886750104726,5.960463881492674e-08,0.9999999000000099,0.0,1.096725354194652e-05,8.940695822239011e-08 +0.18735277651964694,0.6248181461217994,2.980231940746337e-08,0.9999999000000099,0.0,1.150369529128086e-05,2.980231940746337e-08 +0.18865343927555925,0.6247240303877153,0.0,0.9999999000000099,0.0,1.2308357915282372e-05,2.980231940746337e-08 +0.18978661297965968,0.6240805386428303,2.980231940746337e-08,0.9999999000000099,0.0,1.3291834455728662e-05,8.940695822239011e-08 +0.19080540537044086,0.6227912901765593,8.940695822239011e-08,0.9999999000000099,0.0,1.4543531870842124e-05,8.940695822239011e-08 +0.19172084330718578,0.6209131478200084,5.960463881492674e-08,0.9999999000000099,0.0,1.5884636244177974e-05,8.940695822239011e-08 +0.326789885745822,0.034795343869926824,2.3633239290118453e-05,6.258487075567308e-07,0.00033545490725040767,1.4781950426101832e-05,0.9995292617719272 +0.28511306642305434,0.04537844657120911,7.033347380161355e-06,1.7881391644478022e-07,4.878639687001754e-05,1.901387978196163e-05,0.9999711109594623 +0.27450385688598755,0.04243841766584401,8.493661031127061e-06,1.7881391644478022e-07,1.767277540862578e-05,1.123547441661369e-05,0.9999811841434221 +0.2822611927869267,0.043742448084016713,6.973742741346429e-06,1.7881391644478022e-07,1.5795229285955586e-05,1.4990566661954075e-05,0.9999786807485919 +0.2826638221623678,0.043390780679902125,7.301568254828525e-06,1.1920927762985348e-07,1.4692543467879441e-05,1.4543531870842124e-05,0.9999784423300365 +0.28168284891869505,0.04225835203400839,8.22544015645989e-06,1.1920927762985348e-07,1.2397764873504761e-05,1.2338160234689835e-05,0.99997927679498 +0.27588689326097604,0.04039686917566931,1.087784658372413e-05,2.086162358522436e-07,8.40425407290467e-06,8.31484711468228e-06,0.9999822570269207 +0.27097630499671405,0.03899630903529939,1.379847388565554e-05,2.086162358522436e-07,5.602836048603113e-06,6.0200685203076e-06,0.9999842835846404 +0.2665615081676732,0.03802359103505397,1.6838310465216805e-05,2.3841855525970696e-07,3.844499203562775e-06,4.678964146971749e-06,0.999985714095972 +0.2600148916136841,0.03676939009990496,2.1576879251003478e-05,2.086162358522436e-07,2.4735925108194595e-06,3.367662093043361e-06,0.9999873830258588 +0.25951302050469605,0.03682333230341745,2.2381541875004992e-05,2.3841855525970696e-07,2.1159646779298993e-06,3.308057454228434e-06,0.9999872638165812 +0.25953349470017556,0.03688618540132234,2.2888181304931868e-05,2.086162358522436e-07,1.847743803262729e-06,3.2186504960060438e-06,0.9999871446073035 +0.44291013477398794,0.25129359956253,5.6982034707069966e-05,1.1920927762985348e-07,2.8699633589387225e-05,0.9999999000000099,5.930661562085211e-06 +0.40914997456763746,0.284729361485363,0.00014373658650219584,0.0,7.808207684755402e-06,0.9999941779546837,1.7881391644478022e-07 +0.44121429322323114,0.26514834161032846,0.001323044167774929,5.960463881492674e-08,1.7881391644478022e-06,0.9992778494054059,0.0 +0.5230366587422277,0.4270979165299542,0.9999999000000099,3.278255134820971e-07,3.5762783288956044e-07,1.4901159703731684e-07,0.0 +0.500279307344702,0.41402021043363707,0.9999999000000099,1.7881391644478022e-07,1.996755400300046e-06,0.0,0.0 +0.4773966073792189,0.4557968377286532,0.9999999000000099,1.7881391644478022e-07,3.3378597736358976e-06,0.0,0.0 +0.502358734586895,0.43133994929557,0.9999999000000099,8.940695822239011e-08,2.086162358522436e-06,0.0,0.0 +0.51796615121604,0.4117863177548051,0.9999999000000099,0.0,1.1026858180761447e-06,0.0,0.0 +0.5297675728578548,0.40623414509492817,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 +0.546849310375458,0.40107285969542134,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5589012503392534,0.39472562067902167,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5625513791805024,0.38526922457773566,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.1139754652929795,0.10448104141353617,0.000282734604218605,0.0,0.002835124447551398,0.9994898631056706,0.0 +0.2209441065696781,0.20497208830184616,1.1384486013651007e-05,0.0,6.902217174768517e-05,0.9999996615814547,4.172324717044872e-07 +0.23008391260148042,0.1753694712815398,6.139277797937454e-06,0.0,1.1205672097206226e-05,0.9999996615814547,3.5762783288956044e-07 +0.25380203126810086,0.1789192855051751,4.678964146971749e-06,0.0,7.4803821712733056e-06,0.9999997211860935,5.364417493343406e-07 +0.26244622467861634,0.19194361564210505,4.887580382823993e-06,0.0,7.569789129495696e-06,0.9999997807907323,9.238719016313645e-07 +0.2664270400890655,0.20120963450801105,5.30481285452848e-06,0.0,7.718800726533013e-06,0.9999997807907323,1.370906692743315e-06 +0.2673236131557398,0.20397415753686507,5.692243006825504e-06,0.0,7.539986810088233e-06,0.9999998403953712,1.5795229285955586e-06 +0.2682607471831821,0.20540130134880025,6.139277797937454e-06,0.0,7.3611728936434526e-06,0.9999999000000099,1.8775461226701922e-06 +0.269019484508819,0.20626306530281527,6.4373009920120876e-06,0.0,7.122754338383746e-06,0.9999998403953712,2.0563600391149723e-06 +0.26891788839180353,0.20536589618980972,6.765126505494185e-06,0.0,6.884335783124038e-06,0.9999997807907323,2.2053716361522894e-06 +0.26977589725330975,0.20587599273971016,7.033347380161355e-06,0.0,6.645917227864331e-06,0.9999997807907323,2.354383233189606e-06 +0.26923400162535677,0.2042171656735727,7.301568254828525e-06,0.0,6.526707950234478e-06,0.9999997807907323,2.4437901914119963e-06 +0.08904933929074627,0.033200114959753814,0.00025272366857528937,0.002485304822346593,0.0,0.0,0.9984876111039976 +0.2703166901953345,0.15540957448205542,1.4752148106694368e-05,7.748603045940476e-07,0.0,0.004109531230053347,0.9996708823937516 +0.22443515061402816,0.08566981552564404,8.076428559422574e-06,3.278255134820971e-07,3.874301522970238e-07,0.0002065002711743137,0.9999466134529094 +0.25000333784975537,0.04247742890584283,2.7209517619014057e-05,2.086162358522436e-07,1.7285345256328755e-06,6.645917227864331e-06,0.9999875022351364 +0.254859685887274,0.037050902837130924,2.7537343132496152e-05,2.086162358522436e-07,1.8179414838552655e-06,3.5166736900806776e-06,0.9999897076067725 +0.2503873407737049,0.03551656007158555,3.2424923515320145e-05,2.3841855525970696e-07,1.3113020539283883e-06,2.4437901914119963e-06,0.9999907208856325 +0.2432202398676296,0.034371703857258275,3.9368863937259114e-05,2.682208746671703e-07,9.536742210388278e-07,1.6689298868179488e-06,0.9999915553505758 +0.24196630715321923,0.034623146051200204,4.008411960303823e-05,2.682208746671703e-07,7.152556657791209e-07,1.698732206225412e-06,0.9999911977227429 +0.24116322397187126,0.034756153815993715,4.082917758822482e-05,2.9802319407463367e-07,6.556510269641942e-07,1.6093252480030219e-06,0.9999909593041877 +0.23780363797156787,0.03419539331804286,4.4703479111195056e-05,2.682208746671703e-07,5.066394299268773e-07,1.4007090121507783e-06,0.9999913169320206 +0.23475456236820902,0.033802211278849324,4.810094352364588e-05,2.682208746671703e-07,4.768371105194139e-07,1.132488137483608e-06,0.9999914361412983 +0.23321908711421377,0.03376692532914834,4.985928036868622e-05,2.9802319407463367e-07,3.874301522970238e-07,1.043081179261218e-06,0.9999913169320206 +0.1132999062491232,0.10263252256543352,0.0002879202077955036,0.0,0.003748178107237853,0.9992556764797668,0.0 +0.24594888090068923,0.2624765932110515,9.626149168610668e-06,0.0,7.691978639066296e-05,0.9999999000000099,1.8775461226701922e-06 +0.2582545280349606,0.22943955655937523,5.30481285452848e-06,0.0,1.4245508676767491e-05,0.9999999000000099,1.6093252480030219e-06 +0.28159919379975623,0.23320811982929876,4.291533994674725e-06,0.0,1.007318395972262e-05,0.9999998403953712,2.65240642726424e-06 +0.29158279298528644,0.24375092979071977,4.291533994674725e-06,0.0,9.477137571573351e-06,0.9999999000000099,4.142522397637409e-06 +0.29757371543605765,0.2427197396339597,4.410743272304579e-06,0.0,8.04662624001511e-06,0.9999999000000099,4.887580382823993e-06 +0.3047979175918254,0.23799893255926757,4.142522397637409e-06,0.0,6.556510269641941e-06,0.9999999000000099,5.2750105351210165e-06 +0.30894058941515545,0.22712829705163806,3.933906161785165e-06,0.0,5.0067896604538464e-06,0.9999998403953712,4.887580382823993e-06 +0.31262964008944116,0.216054469310004,3.725289925932921e-06,0.0,3.784894564747848e-06,0.9999999000000099,4.380940952897116e-06 +0.3144975900519798,0.20647543665211363,3.635882967710531e-06,0.0,3.0100342601538e-06,0.9999999000000099,3.993510800600092e-06 +0.3140351772178315,0.19873604175025592,3.5166736900806776e-06,0.0,2.5331971496343865e-06,0.9999997807907323,3.635882967710531e-06 +0.3121019005646217,0.19340208169486434,3.6656852871179947e-06,0.0,2.2351739555597527e-06,0.9999997807907323,3.397464412450824e-06 +0.1837993264122196,0.643449544796435,3.5166736900806776e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 +0.16814339160222946,0.4425328075128001,5.960463881492674e-08,0.9999999000000099,0.0,1.722574061751383e-05,5.960463881492674e-08 +0.1833293735905075,0.534837543872803,0.0,0.9999999000000099,0.0,1.4781950426101832e-05,8.940695822239011e-08 +0.17522305249442288,0.6024154423635811,0.0,0.9999999000000099,0.0,1.2755392706394322e-05,2.980231940746337e-08 +0.17851996421074753,0.6136566995523606,2.980231940746337e-08,0.9999999000000099,0.0,1.1742113846540568e-05,2.980231940746337e-08 +0.18195962905130336,0.6152861713309512,1.1920927762985348e-07,0.9999999000000099,0.0,1.1324881374836081e-05,0.0 +0.18422555922699077,0.6163130997556105,5.960463881492674e-08,0.9999999000000099,0.0,1.1354683694243543e-05,0.0 +0.18592366575424896,0.6163284777539599,1.1920927762985348e-07,0.9999999000000099,0.0,1.177191616594803e-05,0.0 +0.18726974724947826,0.6158562301534855,2.980231940746337e-08,0.9999999000000099,0.0,1.2487171831727152e-05,0.0 +0.18840318917448015,0.6146481632133847,0.0,0.9999999000000099,0.0,1.335143909454359e-05,8.940695822239011e-08 +0.1893671750943926,0.6130416392230287,2.980231940746337e-08,0.9999999000000099,0.0,1.4543531870842124e-05,0.0 +0.1902296841065792,0.6107962726500794,0.0,0.9999999000000099,0.0,1.582503160536305e-05,0.0 +0.18220072983940983,0.6078694461735298,2.3841855525970694e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 +0.1826033592148509,0.5134807228162794,0.0,0.9999999000000099,0.0,1.8447635713219826e-05,8.940695822239011e-08 +0.18084344267096322,0.5948373674327804,2.980231940746337e-08,0.9999999000000099,0.0,1.2129543998837591e-05,0.0 +0.17795199155070635,0.6447376011698107,0.0,0.9999999000000099,0.0,1.0281800195574863e-05,2.980231940746337e-08 +0.18299320339398822,0.6523137091473342,8.940695822239011e-08,0.9999999000000099,0.0,9.775160765647985e-06,2.980231940746337e-08 +0.18704056739032635,0.6534714101626083,2.980231940746337e-08,0.9999999000000099,0.0,9.834765404462912e-06,2.980231940746337e-08 +0.18973177670646857,0.6534919737650523,2.980231940746337e-08,0.9999999000000099,0.0,1.0311602514982325e-05,8.940695822239011e-08 +0.1916201710621643,0.6529076694324193,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,8.940695822239011e-08 +0.1930691003719493,0.6517028807477806,0.0,0.9999999000000099,0.0,1.2159346318245055e-05,8.940695822239011e-08 +0.19421485065609678,0.6503171919662796,0.0,0.9999999000000099,0.0,1.3411043733358517e-05,8.940695822239011e-08 +0.19522070883896225,0.6484213470302334,0.0,0.9999999000000099,0.0,1.4960764342546611e-05,8.940695822239011e-08 +0.19611108302258015,0.6462023257102703,0.0,0.9999999000000099,0.0,1.671910118758695e-05,5.960463881492674e-08 +0.49916869399864816,0.35160768026053213,0.9999996615814547,6.854533463716575e-07,8.940695822239011e-08,8.940695822239011e-08,2.8014180243015566e-06 +0.6293222903944734,0.43120267979867577,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.5901846289390322,0.343399941862432,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.5521123409042623,0.33323401206986125,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5780444741009729,0.340141326130797,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5686071514847866,0.34157457941882063,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.57625639436243,0.3357886969468194,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5727407335997887,0.33927494281681264,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5727052688361488,0.33870166534346113,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.5762229561567124,0.33817958825996286,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5737246274710553,0.34066048258670173,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5758980512380552,0.3403785824192848,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.31171882151266617,0.12010106442302274,2.5629994690418497e-06,5.960463881492674e-08,0.8594042395448055,0.0705041516848601,0.0 +0.1596595942907979,0.14336112139154344,2.6494261953234936e-05,0.0,0.0009274779822796676,0.9999935223036568,0.0 +0.20881843566029862,0.1580970883098728,6.675719547271795e-06,0.0,2.6315448036790155e-05,0.9999990655350666,1.4901159703731684e-07 +0.23578825592018343,0.1692698001571723,4.380940952897116e-06,0.0,1.0907648903131594e-05,0.9999994827675383,1.7881391644478022e-07 +0.2498559355632319,0.17776584622200164,4.112720078229945e-06,0.0,8.612870308756914e-06,0.9999996615814547,4.4703479111195056e-07 +0.25087019800101035,0.17925545570165075,4.470347911119505e-06,0.0,8.04662624001511e-06,0.9999996615814547,4.4703479111195056e-07 +0.24591091274196886,0.17310711738483248,5.155801257491163e-06,0.0,7.450579851865842e-06,0.9999996019768158,4.768371105194139e-07 +0.23717322944612707,0.1633190512377506,5.960463881492674e-06,0.0,6.973742741346429e-06,0.9999994827675383,2.9802319407463367e-07 +0.22141137718237544,0.15106654164588504,7.808207684755402e-06,0.0,7.033347380161355e-06,0.9999991251397053,2.086162358522436e-07 +0.20500811933622237,0.14129468796217928,1.0520218750834569e-05,0.0,7.808207684755402e-06,0.9999985290933172,1.1920927762985348e-07 +0.18642270564261024,0.13291087744344277,1.5139578258991392e-05,0.0,9.596346849203206e-06,0.9999975158144573,8.940695822239011e-08 +0.1606788337164149,0.12399050591253007,2.5510785412788644e-05,0.0,1.361965996921076e-05,0.9999948932103495,0.0 +0.45497286317848723,0.24815368648094488,4.187225876748604e-05,1.7881391644478022e-07,2.601742484271552e-05,0.9999999000000099,6.973742741346429e-06 +0.1616116762094335,0.1647360920623981,4.962086181342651e-05,0.0,2.3037192901969185e-05,0.9999991251397053,2.3841855525970696e-07 +0.21540871261658395,0.14017820355876023,1.3589857649803297e-05,0.0,5.424022132158334e-06,0.9999989463257889,2.3841855525970696e-07 +0.18912371992281762,0.12922927735023162,2.086162358522436e-05,0.0,6.586312589049405e-06,0.9999978138376514,5.960463881492674e-08 +0.13730913400081457,0.11536988614014147,5.6654209193587864e-05,0.0,1.3738869246840614e-05,0.9999907208856325,0.0 +0.03991502523256962,0.1265492141030099,0.00019407270398140146,1.1920927762985348e-07,1.591443856358544e-05,0.9999076320191245,2.980231940746337e-08 +0.01985695958055289,0.11656916139513936,0.00021985171026885729,5.960463881492674e-08,0.0019028184895277212,0.9458302505707835,2.5033948302269232e-06 +0.07798641919766797,0.034869074815501354,1.5318392175436174e-05,1.1920927762985348e-07,0.9921283325841943,3.0934807544946974e-05,1.9401309934258653e-05 +0.07474049925494654,0.013623446223787182,2.3841855525970695e-05,5.960463881492674e-08,0.999854941518412,2.682208746671703e-07,8.85128886401662e-06 +0.04636812209891008,0.027086079115997898,1.344084605276598e-05,1.5497206091880952e-06,0.9999345733158688,5.990266200900137e-06,0.00011554359234273549 +0.03084489703050684,0.039119929068542385,4.142522397637409e-06,1.5437601453066027e-05,0.9987590506291608,4.488229302763983e-05,0.0012876390123188624 +0.032843232153486224,0.04470494388768491,1.1920927762985347e-06,2.9653307810426052e-05,0.9777872776714065,0.00014072655224204203,0.007918774289757092 +0.22527477144262195,0.38145935528898983,0.01991843978061696,1.7881391644478022e-07,0.000419795471173529,0.9999022079969923,8.940695822239011e-08 +0.127606362099132,0.10384145377288337,0.00022932884784043062,0.0,0.0001876056006699819,0.9999907804902712,0.0 +0.24272328614183536,0.19304874536069633,1.662969422936456e-05,0.0,1.1742113846540568e-05,0.9999997807907323,1.847743803262729e-06 +0.2438572645086402,0.16478255388299254,1.2248753276467444e-05,0.0,4.410743272304579e-06,0.9999996615814547,9.536742210388278e-07 +0.2260814011003339,0.14429998395356225,1.4394520273804807e-05,0.0,3.9637084811926284e-06,0.9999993039536218,4.4703479111195056e-07 +0.19305282830392628,0.12859100101176366,2.3752448567748306e-05,0.0,5.21540589630609e-06,0.9999981118608455,1.1920927762985348e-07 +0.16631853579786166,0.11910241840230446,3.91304453819994e-05,0.0,7.808207684755402e-06,0.9999958468845705,1.4901159703731684e-07 +0.1487013101516185,0.1136626303001323,5.671381383240279e-05,0.0,1.1056660500168911e-05,0.9999928666526298,8.940695822239011e-08 +0.149005264037638,0.11254501340846271,5.790590660870133e-05,0.0,1.1801718485355495e-05,0.9999926282340745,0.0 +0.15163725613919835,0.11280083654379489,5.570053497254904e-05,0.0,1.1563299930095787e-05,0.9999932242804627,8.940695822239011e-08 +0.1598515808516115,0.11463296411458712,4.762410641312646e-05,0.0,1.0192393237352472e-05,0.9999946547917942,5.960463881492674e-08 +0.1735055744576135,0.11842587588189724,3.6776062148809795e-05,0.0,8.22544015645989e-06,0.9999964429309587,8.940695822239011e-08 +0.1846472918910816,0.666107177620314,4.440545591712042e-06,0.9999997807907323,1.7881391644478022e-07,2.980231940746337e-08,0.0 +0.17793712019183552,0.48052904001590685,2.980231940746337e-08,0.9999999000000099,0.0,2.3484227693081136e-05,2.980231940746337e-08 +0.18178078531466219,0.5711085795378262,0.0,0.9999999000000099,0.0,1.582503160536305e-05,2.980231940746337e-08 +0.1761732995437152,0.6264406441569526,5.960463881492674e-08,0.9999999000000099,0.0,1.2546776470542079e-05,8.940695822239011e-08 +0.18083322047438466,0.6333162783491956,5.960463881492674e-08,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 +0.1844788491649533,0.6338536738263985,0.0,0.9999999000000099,0.0,1.1175869777798764e-05,8.940695822239011e-08 +0.18687349557102786,0.6339099406110569,0.0,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 +0.1886266767900562,0.6330593823302576,5.960463881492674e-08,0.9999999000000099,0.0,1.1920927762985348e-05,8.940695822239011e-08 +0.18996828793692755,0.6318725942483381,2.980231940746337e-08,0.9999999000000099,0.0,1.2695788067579396e-05,1.1920927762985348e-07 +0.19105783104105417,0.6304694413059209,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 +0.19200405477682433,0.628846645247544,0.0,0.9999999000000099,0.0,1.4990566661954075e-05,8.940695822239011e-08 +0.19285371898806233,0.6271457671045246,5.960463881492674e-08,0.9999999000000099,0.0,1.6510484951734707e-05,2.980231940746337e-08 +0.29136547445044436,0.029747456307085755,6.8247311443091115e-06,3.5762783288956044e-07,0.022587595111388192,3.5703178650141115e-05,0.9873777832660058 +0.27849447726050186,0.04858943819167673,4.202127036452335e-06,2.9802319407463367e-07,0.0002209841984063409,2.0503995752334798e-05,0.9999137116922836 +0.28814733027218714,0.04453283547592544,3.457069051265751e-06,2.086162358522436e-07,5.376338421106392e-05,1.689791510403173e-05,0.999948043964241 +0.2768422961120412,0.04249054192769117,6.079673159122528e-06,2.3841855525970696e-07,1.8775461226701924e-05,9.000300461053937e-06,0.9999681903321604 +0.2557047009362197,0.037647098296394683,1.4722345787286905e-05,2.682208746671703e-07,4.917382702231456e-06,2.8610226631164835e-06,0.9999826146547536 +0.23676404355976094,0.03436815738089475,2.8610226631164836e-05,3.5762783288956044e-07,1.4603136509657052e-06,1.2218950957059981e-06,0.9999888731418292 +0.22805222867975058,0.033628612750970725,3.951787553429643e-05,3.874301522970238e-07,6.854533463716575e-07,9.238719016313645e-07,0.9999907804902712 +0.22514006494543515,0.03372788428682714,4.678964146971749e-05,3.874301522970238e-07,3.874301522970238e-07,8.642672628164378e-07,0.9999913169320206 +0.22787642477999287,0.034442484372916936,4.729628089964437e-05,3.5762783288956044e-07,3.874301522970238e-07,1.0728834986686813e-06,0.9999910785134654 +0.2305640578174487,0.03470808266999059,4.717707162201451e-05,3.5762783288956044e-07,4.172324717044872e-07,1.1622904568910714e-06,0.99999084009491 +0.24091830848649934,0.03631511329982711,3.722309693992175e-05,2.9802319407463367e-07,5.66244068741804e-07,1.847743803262729e-06,0.9999889923511068 +0.2521468102827568,0.03769955038378804,2.8014180243015567e-05,2.682208746671703e-07,8.642672628164378e-07,2.8908249825239467e-06,0.9999869657933871 +0.09762901067329505,0.021245717998681322,8.642672628164378e-07,1.1920927762985347e-06,0.9975297645582417,3.6209818080067994e-05,0.00018379090378582661 +0.09178099035836691,0.025545477862752183,1.1742113846540568e-05,2.9802319407463367e-07,0.99999537004746,9.536742210388278e-07,2.8908249825239467e-06 +0.18885925411396015,0.039232760661082874,1.8388031074404898e-05,5.960463881492674e-08,0.9999996615814547,1.9669530808925826e-06,1.7881391644478022e-07 +0.21972739695592844,0.041861385099872264,8.109211110770783e-05,5.960463881492674e-08,0.9999997807907323,1.1920927762985347e-06,1.1920927762985348e-07 +0.20020455121165015,0.031529724592531914,0.00010392068777382477,0.0,0.9999997807907323,3.874301522970238e-07,0.0 +0.18633243440810165,0.029907703394536952,9.059905099868865e-05,0.0,0.9999999000000099,4.172324717044872e-07,8.940695822239011e-08 +0.19087603687449675,0.03293347358139676,8.890031879246323e-05,0.0,0.9999997807907323,5.66244068741804e-07,5.960463881492674e-08 +0.20121628045202575,0.034878104919183285,9.694694503247834e-05,0.0,0.9999999000000099,6.258487075567308e-07,0.0 +0.20575219391924515,0.03441435098058777,0.00010529159446656809,0.0,0.9999997807907323,6.258487075567308e-07,2.980231940746337e-08 +0.19070106743976584,0.030530303711431686,0.00010025500248670677,0.0,0.9999999000000099,3.874301522970238e-07,0.0 +0.16471639274868788,0.02732294797429474,7.438658924102857e-05,0.0,0.9999997807907323,3.278255134820971e-07,1.1920927762985348e-07 +0.13732588290599576,0.026389896865140546,4.601478116512344e-05,8.940695822239011e-08,0.9999999000000099,3.874301522970238e-07,2.682208746671703e-07 +0.10205441712910546,0.021656990047561095,1.0728834986686813e-06,1.0132788598537545e-06,0.9983864024272898,3.263353975117239e-05,9.191035305261703e-05 +0.42506739495424645,0.0789862274988344,2.682208746671703e-07,3.278255134820971e-07,0.9999743296099584,0.011887280944374322,0.0 +0.21808451413205238,0.1102786958028785,1.0311602514982325e-05,1.1920927762985348e-07,0.9599728816409564,0.7167300461248469,0.0 +0.10740718245061537,0.08816131947915112,7.286667095124793e-05,0.0,0.0062642687255323555,0.9998085095047752,0.0 +0.17386162280316456,0.13594371078070724,1.0788439625501739e-05,0.0,7.25686477571733e-05,0.9999962045124035,2.980231940746337e-08 +0.20064288376931022,0.14909794924090292,6.139277797937454e-06,0.0,1.856684499084968e-05,0.9999983502794008,0.0 +0.22731122373593363,0.15989822146538715,4.470347911119505e-06,0.0,1.1056660500168911e-05,0.9999991847443441,1.1920927762985348e-07 +0.24157190321875682,0.16939008233030844,4.202127036452335e-06,0.0,9.089707419276328e-06,0.9999994827675383,2.3841855525970696e-07 +0.24720260499884286,0.17492839691027742,4.470347911119505e-06,0.0,8.31484711468228e-06,0.9999996615814547,3.5762783288956044e-07 +0.24693101643493506,0.17443415519588454,4.947185021638919e-06,0.0,7.838010004162866e-06,0.9999996615814547,4.172324717044872e-07 +0.24192795156430785,0.1683358549783466,5.513429090380723e-06,0.0,7.2121612966061355e-06,0.9999996615814547,3.278255134820971e-07 +0.23254463075628576,0.15895932910104596,6.616114908456868e-06,0.0,6.8247311443091115e-06,0.9999994231628994,2.086162358522436e-07 +0.12409803270779778,0.028129935259770568,5.9843057370186444e-05,0.08098681951324126,0.0,0.0,0.9830418438154139 +0.15917369722660904,0.09011071918851886,0.0029338893340677312,2.4735925108194595e-06,0.0,1.5795229285955586e-06,0.999967355867217 +0.28947058318846836,0.1397552489995065,2.682208746671703e-07,3.993510800600092e-06,0.0,0.018699673928448745,0.9993565275286416 +0.19163972138564983,0.06085708736331265,0.0001423060751706376,2.682208746671703e-07,8.940695822239011e-08,7.4803821712733056e-06,0.999984760421751 +0.24177572130155783,0.040190339081557946,3.340840005576644e-05,2.682208746671703e-07,3.5762783288956044e-07,3.0100342601538e-06,0.9999858333052496 +0.24903613327902513,0.03768968581507941,3.412365572154556e-05,2.3841855525970696e-07,7.748603045940476e-07,2.65240642726424e-06,0.9999875022351364 +0.26283121107920465,0.03843548893270377,2.1874902445078112e-05,1.7881391644478022e-07,1.3411043733358516e-06,4.053115439415018e-06,0.9999848796310286 +0.26760041712606525,0.038170427077433,1.955032153129597e-05,2.086162358522436e-07,1.8775461226701922e-06,4.380940952897116e-06,0.9999844623985569 +0.2681243419536192,0.037424802773742924,1.9699333128333287e-05,2.086162358522436e-07,2.026557719707509e-06,3.993510800600092e-06,0.999984760421751 +0.2652038335690356,0.03654688596099653,2.1964309403300505e-05,1.7881391644478022e-07,1.7583368450403388e-06,3.2782551348209707e-06,0.999985714095972 +0.2656777500996251,0.03670209645596507,2.1547076931596017e-05,2.086162358522436e-07,1.6391275674104854e-06,3.3378597736358976e-06,0.9999852372588615 +0.261046081770578,0.03585818409305721,2.494454134404684e-05,1.4901159703731684e-07,1.370906692743315e-06,2.6226041078567766e-06,0.999986369746999 +0.7108951806727729,0.41612413518455854,0.9999997807907323,4.053115439415018e-06,2.9802319407463367e-07,6.556510269641942e-07,3.108381914198429e-05 +0.510948061921897,0.4597326218294655,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.5905588865035614,0.30257105822150465,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.5302603840608373,0.3496146201488739,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.57661205527779,0.32631719106808543,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.5631388425593843,0.34472027415094797,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5747368335485892,0.3305144607454826,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5756499767065103,0.33676153415635435,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5755265354871856,0.3365424572845199,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5805439948795255,0.33609104150739083,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5829570889231572,0.33821299666335375,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5816766023395005,0.3406146764171997,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.44370591638635126,0.24296087022435725,3.8355585077405355e-05,1.1920927762985348e-07,2.697109906375435e-05,0.9999999000000099,6.079673159122528e-06 +0.39650312064436355,0.21690660711388945,1.9937751683592993e-05,0.0,4.0829177588224814e-06,0.999999542372177,9.238719016313645e-07 +0.4199515580957089,0.21716263886547832,4.658102523386525e-05,0.0,1.370906692743315e-06,0.9999906612809936,2.086162358522436e-07 +0.5270671844264175,0.30231064552852555,0.9955907064483145,6.258487075567308e-07,5.960463881492674e-08,0.0029603239913821512,0.0 +0.5188476443075867,0.3922473489566524,0.9999999000000099,1.7881391644478022e-07,1.2516974151134616e-06,0.0,0.0 +0.4745388924879035,0.4627427755993968,0.9999999000000099,1.7881391644478022e-07,5.1259989380836994e-06,0.0,0.0 +0.48550602791683173,0.44695943586325365,0.9999999000000099,0.0,2.9504296213388737e-06,0.0,0.0 +0.5079563259868097,0.4174208342314251,0.9999999000000099,2.980231940746337e-08,1.3411043733358516e-06,0.0,0.0 +0.5147790908600318,0.4103262423766371,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 +0.5369280576483603,0.40505653612830245,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.544117093063712,0.4004104732781459,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5531419515380698,0.3882411419680501,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.6710399985035553,0.4057493209144082,0.9999996615814547,3.0994412183761904e-06,1.4901159703731684e-07,4.172324717044872e-07,2.0831821265816896e-05 +0.5323736667412613,0.44257861368230217,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 +0.577873051142606,0.3182159065655359,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5357161760108372,0.35331588977485756,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5712077021362292,0.3345728217982544,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.4901159703731684e-07 +0.5545241832503538,0.3499104976054883,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5667700767282403,0.3359859585186698,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 +0.5640073418383705,0.34297543758241433,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5707986354591525,0.33740097278539527,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5715775489570452,0.3390871881858023,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5747138857603515,0.338104665221493,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 +0.5757018327474628,0.33928102249057873,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.7104243039790668,0.41596782200366184,0.9999997807907323,4.023313120007555e-06,2.682208746671703e-07,6.556510269641942e-07,3.102421450316937e-05 +0.5267476439257899,0.45180588952911077,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 +0.5892891883606086,0.3033752142863541,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.5398602485433194,0.3455193936233148,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.581433415388827,0.3260493277945107,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.577131509756986,0.3373447656053817,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 +0.5839681625124403,0.33068758243620305,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.5851486921068128,0.33495843404756276,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5857003926988309,0.33749827736797444,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 +0.5891857146972829,0.33847868436739453,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5915817022078648,0.3415004610430551,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.594342470144457,0.34353560203391753,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.37275880573636544,0.28510928149109627,0.9999997807907323,1.4901159703731684e-07,5.960463881492674e-08,0.0,3.874301522970238e-07 +0.6666539907179397,0.4869266151548107,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.6160505413754002,0.38484072678651876,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 +0.588552296137281,0.3190757035662737,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 +0.5883058905357897,0.34980231517523946,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5867089628930335,0.33805340522699495,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5871607661004123,0.3455249070529556,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5898830294364813,0.33974075311565255,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 +0.591001033758487,0.3419117032896125,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5910252332442648,0.3414405285727437,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.5920039415114361,0.34292712801783215,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5946028232328251,0.3435696064837561,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.16551953553468063,0.13858839867126085,0.00013142822858691345,0.0,0.0002723931993842152,0.9999933434897403,0.0 +0.17220062016727752,0.12518668172600017,2.166628620922587e-05,0.0,2.61962387591603e-05,0.9999959660938481,2.980231940746337e-08 +0.1906232535760148,0.13466727731306083,1.397728780210032e-05,0.0,1.1861323124170421e-05,0.9999978734422902,5.960463881492674e-08 +0.21482822298114046,0.14303305742675587,9.775160765647985e-06,0.0,7.629393768310623e-06,0.9999988271165112,1.1920927762985348e-07 +0.22976055740358733,0.15056231615349394,8.31484711468228e-06,0.0,6.139277797937454e-06,0.9999993039536218,2.682208746671703e-07 +0.23678803442928206,0.15554493663031715,8.04662624001511e-06,0.0,5.692243006825504e-06,0.9999994231628994,3.5762783288956044e-07 +0.2396739721198974,0.1579125225273574,8.22544015645989e-06,0.0,5.453824451565797e-06,0.999999542372177,4.4703479111195056e-07 +0.24050095676379932,0.15843662616877768,8.523463350534524e-06,0.0,5.245208215713553e-06,0.999999542372177,4.4703479111195056e-07 +0.24051815270381632,0.15804493424570326,8.881091183424084e-06,0.0,5.066394299268773e-06,0.999999542372177,5.364417493343406e-07 +0.24112474917367036,0.15800452229655249,9.208916696906181e-06,0.0,5.0067896604538464e-06,0.999999542372177,5.066394299268773e-07 +0.243026942004631,0.15918448564664645,9.357928293943498e-06,0.0,4.917382702231456e-06,0.9999996615814547,6.258487075567308e-07 +0.2401587366958356,0.1566735505789459,9.983777001500229e-06,0.0,4.7385687857866755e-06,0.999999542372177,5.960463881492673e-07 +0.18177333473406557,0.6006180046960422,2.2351739555597527e-06,0.9999999000000099,1.4901159703731684e-07,0.0,0.0 +0.16439262031828136,0.430999934599507,1.1920927762985348e-07,0.9999999000000099,0.0,1.2934206622839103e-05,0.0 +0.18302699922757446,0.5169036983558544,0.0,0.9999999000000099,0.0,1.2189148637652518e-05,2.980231940746337e-08 +0.1757310628818225,0.5882348417228515,5.960463881492674e-08,0.9999999000000099,0.0,1.1801718485355495e-05,2.980231940746337e-08 +0.17800721525408847,0.5985824464726665,2.980231940746337e-08,0.9999999000000099,0.0,1.1295079055428617e-05,2.980231940746337e-08 +0.18092420696463052,0.6012288927002406,2.980231940746337e-08,0.9999999000000099,0.0,1.096725354194652e-05,2.980231940746337e-08 +0.18293634056287483,0.602495670215435,0.0,0.9999999000000099,0.0,1.1056660500168911e-05,0.0 +0.18442583083342778,0.6036349533954768,0.0,0.9999999000000099,0.0,1.141428833305847e-05,0.0 +0.18570330738252344,0.6039085983195938,0.0,0.9999999000000099,0.0,1.2069939360022665e-05,1.4901159703731684e-07 +0.18688780068577335,0.6015928982658216,0.0,0.9999999000000099,0.0,1.2964008942246566e-05,2.980231940746337e-08 +0.18765306472001292,0.602096676723377,5.960463881492674e-08,0.9999999000000099,0.0,1.388788084387793e-05,8.940695822239011e-08 +0.18847146629506753,0.6024830936353897,0.0,0.9999999000000099,0.0,1.5079973620176466e-05,8.940695822239011e-08 +0.14313307403925446,0.05422618984247544,1.8388031074404898e-05,0.9995961977813165,0.0,0.0,0.004050552439945976 +0.1571695208484419,0.6251085995557402,0.0,0.9999999000000099,0.0,8.928774894476025e-05,5.66244068741804e-07 +0.17743709682683548,0.43263429395896835,0.0,0.9999999000000099,0.0,0.0010021625947147707,3.874301522970238e-07 +0.18547564744181327,0.4877455829738844,0.0,0.9999999000000099,0.0,0.000512987323960667,3.278255134820971e-07 +0.18573310970490992,0.50939762583593,0.0,0.9999999000000099,0.0,0.0005517303391903693,3.5762783288956044e-07 +0.18579027055924716,0.5169299243995511,0.0,0.9999999000000099,0.0,0.0003688931096255816,2.086162358522436e-07 +0.1873362958353672,0.5216849445403384,0.0,0.9999999000000099,0.0,0.00027185675763488084,2.086162358522436e-07 +0.1888200044553772,0.5244501828249296,0.0,0.9999999000000099,0.0,0.0002077817709088346,1.4901159703731684e-07 +0.19026878475355022,0.5264272688917907,0.0,0.9999999000000099,0.0,0.0001662969422936456,1.4901159703731684e-07 +0.1916477382103718,0.5282475947429195,0.0,0.9999999000000099,0.0,0.0001383125643700375,1.4901159703731684e-07 +0.19295078515207503,0.5294295548486131,0.0,0.9999999000000099,0.0,0.00011867283588051914,2.086162358522436e-07 +0.1942033469596556,0.5304926632926449,0.0,0.9999999000000099,0.0,0.00010457633880078896,1.7881391644478022e-07 +0.6540701389041909,0.40102547400283306,0.9999996615814547,2.65240642726424e-06,1.1920927762985348e-07,3.5762783288956044e-07,1.8328426435589973e-05 +0.5029746889859784,0.4370332061496061,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.1920927762985348e-07 +0.5609886646038459,0.30942758912510043,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5219477414868712,0.3554924427854254,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5675449967149331,0.328917086068098,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5539351701507078,0.354547142921772,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5679053663972301,0.33398824924471987,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5623629092937305,0.3449479936962734,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.569951474642995,0.3385479747669341,0.9999999000000099,0.0,0.0,0.0,1.1920927762985348e-07 +0.5712895393135023,0.34058842057118066,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5760544538259393,0.3389264940635154,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5790994763134536,0.3398017882718921,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 +0.203305602065251,0.03296837210090678,5.608796512484606e-05,8.970498141646475e-06,5.841254603862821e-06,1.0728834986686813e-06,0.9998458816133121 +0.21172398327904426,0.033729702228492475,6.9975845968724e-05,5.066394299268773e-07,1.1026858180761447e-06,1.043081179261218e-06,0.99999537004746 +0.19616016744755066,0.031719654793076174,7.593630985021666e-05,6.258487075567308e-07,3.5762783288956044e-07,5.364417493343406e-07,0.9999968005587916 +0.1722164750027871,0.02956619858235483,0.00010043381640315155,1.1622904568910714e-06,1.1920927762985348e-07,2.3841855525970696e-07,0.9999977542330126 +0.11225295066368682,0.02557158469715933,4.819035048186827e-05,1.0251997876167399e-05,0.0,2.980231940746337e-08,0.9999990655350666 +0.0866496562921884,0.02650400995754349,2.0325181835890017e-05,5.209445432424597e-05,0.0,0.0,0.9999991847443441 +0.07943320274024113,0.029688358301801075,1.353025301098837e-05,0.00013601778577566282,0.0,0.0,0.9999990655350666 +0.083437591787698,0.03792843221968635,1.1205672097206226e-05,0.0003013908561676771,0.0,2.980231940746337e-08,0.9999976946283737 +0.2696429490931438,0.19020503756127177,0.0,0.9887776578132131,0.0,9.238719016313645e-07,0.9397266759514962 +0.20276856421584696,0.36281704896436223,0.0,0.9999997807907323,0.0,0.00021117923532128544,0.005938827397602856 +0.14364111422897646,0.285622984122005,0.0,0.9999999000000099,0.0,0.0015408693203240785,0.00012668965980112677 +0.1394233703555549,0.29839688534395403,0.0,0.9999999000000099,0.0,0.0013646780079871552,4.291533994674725e-05 +0.12498900293786343,0.03144514560161012,0.00011572240625918027,7.605551912784652e-05,3.278255134820971e-07,1.1920927762985348e-07,0.9998709155616144 +0.12976440786778043,0.027491658921302595,9.050964404046626e-05,5.722045326232967e-06,0.0,1.4901159703731684e-07,0.9999988867211501 +0.17459064721338216,0.03427794575104264,0.00010883807047605623,1.1622904568910714e-06,0.0,5.66244068741804e-07,0.9999973966051797 +0.16535505651742974,0.031886756414675366,0.0001255273693442357,1.1920927762985347e-06,5.960463881492674e-08,2.9802319407463367e-07,0.9999979926515679 +0.1417468488157706,0.028871119017425634,0.00010168551381826502,2.74181338548663e-06,5.960463881492674e-08,2.3841855525970696e-07,0.999998588697956 +0.09288418292614654,0.026198089118286184,2.8818842867017078e-05,2.998113332390815e-05,0.0,2.980231940746337e-08,0.9999993039536218 +0.07886385917337016,0.028632760043009662,1.4483927232027197e-05,0.0001202523588091147,0.0,0.0,0.9999991847443441 +0.09145471453287994,0.04821938275465208,8.40425407290467e-06,0.0006822943005144663,0.0,0.0,0.9999946547917942 +0.300640642630526,0.15419751403075538,0.0,0.9953416782673458,0.0,1.6689298868179488e-06,0.9643489350134707 +0.23305338620174504,0.3712052702268114,0.0,0.9999993039536218,0.0,0.00021427867653966162,0.03154536766264768 +0.14500814675684343,0.31349325174685605,0.0,0.9999997807907323,0.0,0.006849288255500861,0.00033587213972211216 +0.13474345206656413,0.3278577327166864,0.0,0.9999999000000099,0.0,0.005282103487139993,8.91685396671304e-05 +0.0925585031471073,0.03275573253070699,0.00020742414307594505,0.003763675313329734,0.0,0.0,0.9978766635561446 +0.08812624215714801,0.09450399874022629,4.1544433254003936e-05,0.0012462137883424882,0.0,1.1920927762985348e-07,0.9999643756352763 +0.11218124627602499,0.1606111526214235,1.043081179261218e-06,0.017611293223688183,0.0,1.7583368450403388e-06,0.9998479677756706 +0.23249909280767925,0.2926458119844957,0.0,0.9983517125274995,0.0,1.8954275143146702e-05,0.4351445597379549 +0.1172280609559155,0.5564630030632833,0.0,0.9999999000000099,0.0,0.004427194152617498,0.000101298083665968 +0.1360512673798492,0.3347762226485156,0.0,0.9999999000000099,0.0,0.0036582943119049436,3.641843431592024e-05 +0.13304117321417186,0.36352941387627336,0.0,0.9999999000000099,0.0,0.0024353561350196843,1.7285345256328753e-05 +0.13585814833078494,0.3829644321739555,0.0,0.9999999000000099,0.0,0.002005189456692358,1.290440430343164e-05 +0.13782802223588525,0.3950372933664988,0.0,0.9999999000000099,0.0,0.0014583168955654051,9.80496308505545e-06 +0.13987702130692162,0.403910577228047,0.0,0.9999999000000099,0.0,0.0010551511186212407,7.718800726533013e-06 +0.1418845951498408,0.41152331225977873,0.0,0.9999999000000099,0.0,0.0007923542660862286,6.407498672604624e-06 +0.143821299070125,0.4179564117669627,0.0,0.9999999000000099,0.0,0.0006165801862210097,5.48362677097326e-06 +0.24896803497237208,0.03397348522558208,4.395842112600847e-05,3.3378597736358976e-06,2.2709367388487087e-05,2.8908249825239467e-06,0.9997996284135918 +0.1303586065715217,0.024499326940156052,8.261202939748846e-05,3.993510800600092e-06,1.7881391644478022e-07,5.960463881492674e-08,0.9999978734422902 +0.08008337020542416,0.024051189418489015,1.776218236684817e-05,7.545947273969725e-05,0.0,0.0,0.9999994231628994 +0.10817635058908755,0.06593066452804751,4.857778063416529e-06,0.0026638505179167058,0.0,8.940695822239011e-08,0.9999811245387832 +0.33669215439355954,0.13263967630976117,0.0,0.9994875385247568,0.0,3.725289925932921e-06,0.9449488171719883 +0.21221846341208042,0.3581895231587276,0.0,0.9999994231628994,0.0,0.0003904103842377701,0.021014420076826423 +0.14044097065344063,0.2808201908584384,0.0,0.9999999000000099,0.0,0.00830194271037885,0.00033429261679351663 +0.1332931518499494,0.29402017588349133,0.0,0.9999999000000099,0.0,0.006132959706223072,9.790061925351717e-05 +0.13519090413487445,0.3086225389905795,0.0,0.9999999000000099,0.0,0.004300027655705852,5.447863987684304e-05 +0.1382968127670243,0.31847295159608574,0.0,0.9999999000000099,0.0,0.0028119978476912064,3.5703178650141115e-05 +0.14150068163285842,0.3265237211621968,0.0,0.9999999000000099,0.0,0.0018823144937753864,2.5779006287455814e-05 +0.14456436037418663,0.3336194753075577,0.0,0.9999999000000099,0.0,0.0013121067165523899,1.990794936418553e-05 +0.2594538926970813,0.034191399806843596,4.15742355734114e-05,2.682208746671703e-06,3.108381914198429e-05,3.4868713706732143e-06,0.9997848464631657 +0.24974501131930948,0.039549976580523186,2.449750655293489e-05,2.682208746671703e-07,6.794928824901648e-06,5.1259989380836994e-06,0.9999891711650233 +0.2643586993108003,0.041945010416477815,1.3649462288618223e-05,2.086162358522436e-07,6.8247311443091115e-06,9.566544529795742e-06,0.9999879790722469 +0.2704668640978399,0.04308038949228743,1.1652706888318178e-05,1.7881391644478022e-07,8.1360331982375e-06,1.2308357915282372e-05,0.9999865485609154 +0.2668078541645197,0.04102024435294598,1.433491563498988e-05,1.7881391644478022e-07,6.556510269641941e-06,8.67247494757184e-06,0.9999878598629693 +0.2655586600193688,0.03993058203967127,1.600384552180783e-05,1.7881391644478022e-07,5.1259989380836994e-06,7.003545060753892e-06,0.9999882174908022 +0.2621553540121245,0.03884381055166767,1.874565890729446e-05,1.7881391644478022e-07,3.874301522970238e-06,5.543231409788187e-06,0.9999888135371904 +0.2582468390357848,0.03782448171921587,2.202391404211543e-05,2.086162358522436e-07,2.8908249825239467e-06,4.351138633489652e-06,0.9999894095835785 +0.25705200432666686,0.03751760720564232,2.3484227693081136e-05,2.086162358522436e-07,2.324580913782143e-06,3.9637084811926284e-06,0.9999894095835785 +0.2549650668992325,0.03702461718878948,2.5600192371011033e-05,2.086162358522436e-07,1.9073484420776557e-06,3.4272667318582874e-06,0.9999895287928562 +0.2536415457620498,0.036687701934254274,2.7179715299606593e-05,2.086162358522436e-07,1.6391275674104854e-06,3.069638898968727e-06,0.9999895287928562 +0.25597196816338147,0.03709912299474596,2.5629994690418497e-05,2.3841855525970696e-07,1.6391275674104854e-06,3.367662093043361e-06,0.9999886943279127 +0.5146080851341783,0.3587117492538378,0.999999542372177,7.748603045940476e-07,8.940695822239011e-08,8.940695822239011e-08,3.6060806483030677e-06 +0.6365193128322247,0.4358723758904817,0.9999999000000099,0.0,3.278255134820971e-07,0.0,0.0 +0.5991488098850112,0.3402290939702137,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,8.940695822239011e-08 +0.5597290396458597,0.33034050458973535,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5827879905459364,0.33743697399083344,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5799367427585789,0.3355535268208984,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 +0.5827410816905001,0.33525997394542983,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5839968323465761,0.3353344797513863,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5848255753274988,0.3371473550219194,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5878655910248521,0.3373848795313087,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5928249358885384,0.33879405254284717,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5949983596555383,0.34121432894585985,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.1212501823851923,0.031458497042037514,0.00012406705569327,8.568166829645719e-05,2.682208746671703e-07,1.1920927762985348e-07,0.9998693658410053 +0.21824145316173948,0.041056960814121336,7.641314696073608e-05,5.364417493343406e-07,4.4703479111195056e-07,3.0994412183761904e-06,0.9999951316289047 +0.25119569896611527,0.04595002531218484,2.0563600391149726e-05,2.086162358522436e-07,2.175569316744826e-06,1.3202427497506273e-05,0.9999907804902712 +0.26100414990298026,0.04388368128978782,1.7493961492181e-05,1.7881391644478022e-07,4.917382702231456e-06,1.3291834455728662e-05,0.9999904824670772 +0.2640012502560971,0.04120805858860108,1.7732380047440704e-05,2.086162358522436e-07,5.602836048603113e-06,9.983777001500229e-06,0.9999906016763548 +0.2624945044408824,0.039601713412179364,1.9758937767148216e-05,1.1920927762985348e-07,4.678964146971749e-06,7.390975213050916e-06,0.9999908996995489 +0.26024514435644186,0.03863209485346173,2.1785495486855723e-05,2.086162358522436e-07,3.635882967710531e-06,5.930661562085211e-06,0.9999909593041877 +0.26148954032768856,0.038651287549076124,2.1308658376336308e-05,1.7881391644478022e-07,3.397464412450824e-06,5.722045326232967e-06,0.9999902440485219 +0.2615121006857351,0.038389623158556964,2.1725890848040795e-05,2.3841855525970696e-07,3.039836579561264e-06,5.334615173935943e-06,0.999989886420689 +0.2619962096105808,0.03818953036608024,2.166628620922587e-05,1.1920927762985348e-07,2.8312203437090202e-06,5.096196618676236e-06,0.9999894095835785 +0.2635226845632153,0.03823333977998265,2.089142590463182e-05,1.1920927762985348e-07,2.7716157048940933e-06,5.096196618676236e-06,0.9999886943279127 +0.2623646259199222,0.03771245478937971,2.2083518680930358e-05,2.086162358522436e-07,2.5033948302269232e-06,4.529952549934432e-06,0.9999887539325515 +0.12773516773648627,0.11638301608953769,0.00021114943300187797,0.0,0.0008125006340056739,0.9999284936427096,0.0 +0.031890183685889584,0.12500888107066563,6.407498672604624e-06,2.1159646779298993e-06,0.45044173266197296,0.0016900597312778402,9.793042157292463e-05 +0.08783951401346786,0.03559666871414996,3.874301522970238e-07,2.980231940746337e-06,0.017682401557794387,3.8355585077405355e-05,0.7684832042872386 +0.21893623470353504,0.04032164811397564,5.21540589630609e-06,5.66244068741804e-07,3.910064306259194e-05,4.380940952897116e-06,0.9997124864316443 +0.23946207760772967,0.0319632291739091,2.5838610926270743e-05,4.172324717044872e-07,1.6093252480030219e-06,5.66244068741804e-07,0.9999741507960419 +0.22023212908786555,0.029558032746022,4.6908850747347345e-05,5.66244068741804e-07,3.278255134820971e-07,1.7881391644478022e-07,0.9999871446073035 +0.19499728082803094,0.028256833548475645,6.84261253595359e-05,9.238719016313645e-07,2.086162358522436e-07,1.7881391644478022e-07,0.9999922706062416 +0.12962463497578794,0.024705857034267413,4.062056135237257e-05,7.450579851865842e-06,0.0,0.0,0.999997277395902 +0.0863643884623052,0.02616709470300829,9.566544529795742e-06,0.0001199245332956326,0.0,0.0,0.9999981118608455 +0.11662539839261649,0.06364041565759007,3.3378597736358976e-06,0.0023121235442698234,0.0,0.0,0.9999528123353462 +0.3083339035383343,0.1563041209906913,0.0,0.9936428268518427,0.0,4.500150230526969e-06,0.8883112972772687 +0.2241877019312534,0.510055541904848,0.0,0.9999990655350666,0.0,0.0006312727296888891,0.010359077609798414 +0.09561616181931346,0.021014899011828146,8.642672628164378e-07,1.4007090121507783e-06,0.9962439732897261,4.0024514964223304e-05,0.0003571807980984485 +0.051993638274900895,0.027718722815535564,4.470347911119505e-06,1.7285345256328755e-06,0.9999023868109087,3.3378597736358976e-06,5.1677221852541485e-05 +0.08571821450832194,0.0358242988525082,3.0100342601538e-06,1.5795229285955586e-06,0.9999904824670772,6.288289394974771e-06,9.626149168610668e-06 +0.06238231062630788,0.03732067345933815,3.2782551348209707e-06,3.039836579561264e-06,0.9999852372588615,8.22544015645989e-06,1.788139164447802e-05 +0.0366704165920332,0.041816413395396934,1.2814997345209249e-06,1.8060205560922803e-05,0.9997672034900764,2.688169210553196e-05,0.00018113849735856236 +0.03379502892354264,0.05231645702419893,2.9802319407463367e-07,6.228684756159844e-05,0.9885488952094414,0.00014260409836471221,0.003817230081304946 +0.05147129297043339,0.053464740505600204,5.960463881492674e-08,4.1544433254003936e-05,0.565455678184199,0.00027075407181680473,0.06914763951239059 +0.09499958157145996,0.04784420131817763,2.3841855525970696e-07,1.0013579320907693e-05,0.008106171274191222,6.699561402797765e-05,0.8446094741213585 +0.2136125862509967,0.040978401892320826,5.48362677097326e-06,1.0132788598537545e-06,1.2516974151134616e-05,2.175569316744826e-06,0.9997582627942542 +0.21538072823586307,0.03062361478281158,3.573298096954858e-05,7.748603045940476e-07,5.066394299268773e-07,1.7881391644478022e-07,0.9999794556088965 +0.1925238072792442,0.028726875777093888,5.3316349419951966e-05,1.2218950957059981e-06,1.1920927762985348e-07,1.1920927762985348e-07,0.9999901248392443 +0.1934567093769076,0.03044229745343589,6.818770680427619e-05,1.0132788598537545e-06,1.4901159703731684e-07,1.1920927762985348e-07,0.9999911977227429 +0.0849520266020884,0.03378739952462518,0.00032863017610609857,0.0014919339118570237,0.0,0.0,0.9990276887362997 +0.22482722996734447,0.10374477503907424,5.8144325163961035e-05,7.748603045940476e-07,0.0,0.00018987057694494914,0.9999510241961816 +0.2343170344732534,0.07165879009927124,1.4185904037952563e-05,3.5762783288956044e-07,3.278255134820971e-07,7.286667095124793e-05,0.9999758197259287 +0.2576510906112795,0.04688507317693867,1.8626449629664607e-05,2.086162358522436e-07,2.2947785943746796e-06,1.4513729551434662e-05,0.9999860717238048 +0.26500618456696856,0.04044046997331504,1.8447635713219826e-05,1.1920927762985348e-07,3.695487606525458e-06,7.77840536534794e-06,0.9999884559093575 +0.26915612815696094,0.03932464122098841,1.7493961492181e-05,1.1920927762985348e-07,3.993510800600092e-06,7.063149699568818e-06,0.9999879790722469 +0.26616740225643465,0.038143247359420075,1.9788740086555676e-05,1.4901159703731684e-07,3.397464412450824e-06,5.513429090380723e-06,0.9999886943279127 +0.260499179352464,0.03684201835955134,2.4020669442415477e-05,1.7881391644478022e-07,2.4735925108194595e-06,3.874301522970238e-06,0.9999895287928562 +0.25327351688289934,0.035631567233659976,2.980231940746337e-05,2.086162358522436e-07,1.5795229285955586e-06,2.592801788449313e-06,0.9999904228624383 +0.25038367508805137,0.03548485040057048,3.209709800183805e-05,2.3841855525970696e-07,1.2218950957059981e-06,2.3841855525970694e-06,0.9999902440485219 +0.2492312192813669,0.035580933087931955,3.3050772222876875e-05,2.3841855525970696e-07,1.1026858180761447e-06,2.2947785943746796e-06,0.9999900056299666 +0.24959620832363388,0.03576853870733037,3.2514330473542534e-05,2.086162358522436e-07,1.0132788598537545e-06,2.2351739555597527e-06,0.9999896480021337 +0.18304130434231997,0.624922573459428,2.8014180243015566e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 +0.18208369611939818,0.5080480574691567,5.960463881492674e-08,0.9999999000000099,0.0,1.9937751683592993e-05,8.940695822239011e-08 +0.1809603273793629,0.5918240546166765,8.940695822239011e-08,0.9999999000000099,0.0,1.2934206622839103e-05,8.940695822239011e-08 +0.17766931652287077,0.6418907641265359,0.0,0.9999999000000099,0.0,1.0728834986686813e-05,0.0 +0.18263781069952967,0.6493904589494705,8.940695822239011e-08,0.9999999000000099,0.0,1.0162590917945008e-05,8.940695822239011e-08 +0.18662300705136964,0.6503382324058816,8.940695822239011e-08,0.9999999000000099,0.0,1.007318395972262e-05,2.980231940746337e-08 +0.18925642966440454,0.6503807305175993,2.980231940746337e-08,0.9999999000000099,0.0,1.0460614112019642e-05,8.940695822239011e-08 +0.1911332905213367,0.6496140359719846,2.980231940746337e-08,0.9999999000000099,0.0,1.1295079055428617e-05,8.940695822239011e-08 +0.19256353377498536,0.6482336520038677,5.960463881492674e-08,0.9999999000000099,0.0,1.2308357915282372e-05,1.1920927762985348e-07 +0.1936988234439752,0.6465144156302608,1.4901159703731684e-07,0.9999999000000099,0.0,1.3500450691580906e-05,8.940695822239011e-08 +0.19464954733042572,0.6446808575479942,5.960463881492674e-08,0.9999999000000099,0.0,1.5079973620176466e-05,5.960463881492674e-08 +0.19551631807471356,0.642511367687831,2.980231940746337e-08,0.9999999000000099,0.0,1.6689298868179488e-05,8.940695822239011e-08 +0.332714855657152,0.032539546484143665,1.1682509207725642e-05,2.682208746671703e-07,0.003732740505784787,2.971291244924098e-05,0.9978224233348231 +0.2605811953436716,0.042352110140224025,1.0251997876167399e-05,2.3841855525970696e-07,4.9471850216389196e-05,7.539986810088233e-06,0.9999642564259986 +0.25429531930824156,0.03819242119135135,1.4424322593212271e-05,2.682208746671703e-07,7.808207684755402e-06,3.6060806483030677e-06,0.9999835683289746 +0.2606863975416958,0.0403670966556091,1.290440430343164e-05,2.682208746671703e-07,5.155801257491163e-06,5.30481285452848e-06,0.9999836279336135 +0.2551169991387587,0.039135575287793246,1.722574061751383e-05,2.9802319407463367e-07,3.397464412450824e-06,4.053115439415018e-06,0.9999863101423602 +0.24638178943567496,0.03689068555200211,2.4646518149972206e-05,2.682208746671703e-07,1.8775461226701922e-06,2.5331971496343865e-06,0.9999890519557456 +0.2145569324404565,0.03137764334141355,5.626677904129084e-05,4.768371105194139e-07,4.768371105194139e-07,5.66244068741804e-07,0.9999941183500449 +0.16694092749858053,0.026859641070534963,8.174776213467202e-05,1.4603136509657052e-06,5.960463881492674e-08,1.7881391644478022e-07,0.9999972177912633 +0.09460362791623343,0.024134367700258827,2.008676328063031e-05,3.489851602613961e-05,0.0,0.0,0.9999989463257889 +0.08291542529716481,0.029450446362220842,1.1354683694243543e-05,0.00016731022115349934,0.0,0.0,0.9999984098840395 +0.16967090963614753,0.10883480308576429,5.960463881492673e-07,0.04321842953512116,0.0,1.1920927762985348e-07,0.999714870617197 +0.32238468526458963,0.18814170357343538,0.0,0.9998233510598401,0.0,1.987814704477807e-05,0.623409685736424 +0.17086634039171325,0.14153179523905518,0.0001247227067202342,2.980231940746337e-08,0.0002474784603595758,0.9999948336057106,5.960463881492674e-08 +0.15854045748054152,0.1206102669032517,2.8103587201237956e-05,0.0,2.9683110129833516e-05,0.9999936415129344,2.980231940746337e-08 +0.14690378307687907,0.11985760925147934,3.1948086404800733e-05,0.0,2.1785495486855723e-05,0.9999920917923252,5.960463881492674e-08 +0.11295077204236581,0.11529150603227525,6.315111482441487e-05,0.0,3.150105161368878e-05,0.9999786807485919,0.0 +0.026322931050164297,0.13440853355013518,0.00016546247735023663,5.960463881492674e-08,3.859400363266506e-05,0.9996566964897136,2.086162358522436e-07 +0.06647461652480481,0.13846924898637525,5.990266200900137e-06,3.5762783288956044e-07,0.23054108698464862,0.08491083130498314,9.238719016313645e-07 +0.08279773592606067,0.020550042387304474,1.6272066396475e-05,5.960463881492674e-08,0.9993359043236116,1.1920927762985347e-06,7.450579851865842e-06 +0.07252341508565054,0.017073720690664637,1.5079973620176466e-05,2.3841855525970696e-07,0.999961872240446,5.66244068741804e-07,8.58306798934945e-06 +0.029976755379389222,0.036534994834365876,3.904103842377701e-06,1.2934206622839103e-05,0.9993962242180924,2.7537343132496152e-05,0.0008853673049569218 +0.037327051161174095,0.05150032042575165,6.258487075567308e-07,3.761052709221877e-05,0.9444627413424526,0.00022378561643064245,0.026690599633491303 +0.060852020976407864,0.04825812577374945,2.9802319407463367e-07,1.8060205560922803e-05,0.1580531141061113,0.0002644955847412374,0.34482270011207505 +0.11098253726499675,0.04287031292181254,8.344649434089744e-07,3.933906161785165e-06,0.0014188884269893311,4.869698991179514e-05,0.9721020680119611 +0.3156767487395225,0.04130983351953763,2.8908249825239467e-06,2.980231940746337e-08,0.9998938037429194,3.367662093043361e-05,2.980231940746337e-08 +0.27784425019067405,0.03570580481871501,3.969668945074121e-05,0.0,0.9999996615814547,7.152556657791209e-07,0.0 +0.30375748871499164,0.04381811618054612,1.4901159703731685e-05,0.0,0.9999997807907323,1.9669530808925826e-06,0.0 +0.27865985034742435,0.038400441401581845,4.139542165696662e-05,0.0,0.9999997807907323,8.642672628164378e-07,0.0 +0.25959554313538413,0.0344084799230784,6.961821813583444e-05,0.0,0.9999999000000099,5.066394299268773e-07,0.0 +0.24072962998347064,0.03203377127098869,9.879468883574107e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 +0.23278397320737143,0.03262633084692177,0.00010287760659456356,0.0,0.9999999000000099,3.874301522970238e-07,2.980231940746337e-08 +0.2334693372152929,0.034427791827982314,0.00010284780427515609,0.0,0.9999999000000099,4.768371105194139e-07,2.980231940746337e-08 +0.2454091906445928,0.03746098279311539,9.46223641186962e-05,0.0,0.9999997807907323,5.960463881492673e-07,2.980231940746337e-08 +0.2522148191824427,0.03770437836001402,8.988379533290952e-05,0.0,0.9999999000000099,6.854533463716575e-07,0.0 +0.25137871502789055,0.03639972209307129,9.18507484138021e-05,0.0,0.9999999000000099,6.258487075567308e-07,0.0 +0.25903898476481696,0.037953555577454876,7.998942528963169e-05,0.0,0.9999999000000099,7.152556657791209e-07,0.0 +0.09593516587813813,0.02089455723404724,8.344649434089744e-07,1.6093252480030219e-06,0.9917251072026113,4.661082755327271e-05,0.001186907172721636 +0.2596667706858878,0.05038493870826075,1.7821787005663097e-05,2.980231940746337e-08,0.9999997807907323,7.390975213050916e-06,8.940695822239011e-08 +0.3341991603236097,0.05285412072230328,8.67247494757184e-06,8.940695822239011e-08,0.9999997807907323,8.493661031127061e-06,0.0 +0.303221791970095,0.04238444566000914,2.0056960961222846e-05,0.0,0.9999997211860935,2.1457669973373625e-06,0.0 +0.29235035179834973,0.039188623421634254,2.8759238228202153e-05,0.0,0.9999997807907323,1.2516974151134616e-06,0.0 +0.2821750044705851,0.037836194031912226,4.503130462467715e-05,0.0,0.9999997807907323,9.238719016313645e-07,0.0 +0.27242010830704855,0.036408394568884624,6.470083543360298e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 +0.27814158796112376,0.03861543535524986,5.584954656958636e-05,0.0,0.9999997807907323,8.940695822239011e-07,0.0 +0.28729736803772526,0.04048445820115174,4.1961665725708426e-05,0.0,0.9999997807907323,1.2814997345209249e-06,0.0 +0.29367375372624294,0.04112768172513523,3.272294670939478e-05,0.0,0.9999997211860935,1.5497206091880952e-06,0.0 +0.29018366335620926,0.039869159453240745,3.659724823236502e-05,0.0,0.9999997807907323,1.2814997345209249e-06,0.0 +0.2808133959653924,0.037792861455167935,5.1200384742022066e-05,0.0,0.9999998403953712,9.238719016313645e-07,0.0 +0.32527568935001067,0.04320836066459828,2.8312203437090202e-06,8.940695822239011e-08,0.9998821212337117,3.8892026826739695e-05,5.960463881492674e-08 +0.07663559913317923,0.014871865508393966,1.645088031291978e-05,1.4901159703731684e-07,0.9999816609805325,1.7881391644478022e-07,1.1920927762985347e-06 +0.11899143456920003,0.02750080823427405,1.0758637306094277e-05,1.7881391644478022e-07,0.9999994231628994,8.344649434089744e-07,7.152556657791209e-07 +0.09683439135150483,0.03345948457144952,1.0490416431427107e-05,4.4703479111195056e-07,0.9999991251397053,1.996755400300046e-06,1.847743803262729e-06 +0.03543308377119209,0.040338337414509894,1.5795229285955586e-06,1.4960764342546611e-05,0.9998888565578977,2.0325181835890017e-05,0.00015622375833392299 +0.03699630498732915,0.057464957227403635,2.3841855525970696e-07,7.072090395391057e-05,0.980479499997399,0.000206649282771351,0.008516042573002066 +0.06577843427385707,0.05515146254548777,1.1920927762985348e-07,3.156065625250371e-05,0.21377829559681033,0.0002486407508164669,0.24412280860125368 +0.13543173670207945,0.04776987432615545,4.4703479111195056e-07,4.7385687857866755e-06,0.0008170007842362008,2.5898215565085667e-05,0.9820772023408332 +0.2335802614592153,0.0408985018660131,5.930661562085211e-06,7.748603045940476e-07,6.943940421938965e-06,1.8179414838552655e-06,0.9998603059359054 +0.23907408117258033,0.034482300275620076,1.8417833393812362e-05,5.66244068741804e-07,1.3113020539283883e-06,5.66244068741804e-07,0.9999656869373301 +0.240134477605413,0.034460276359379344,2.2858378985524404e-05,5.066394299268773e-07,7.748603045940476e-07,6.556510269641942e-07,0.9999749852609853 +0.24339494108145904,0.03531533479085829,2.4974343663454304e-05,4.172324717044872e-07,6.258487075567308e-07,1.0132788598537545e-06,0.999978323120759 +0.18891280888728862,0.15067413446707345,0.00010588764085471735,5.960463881492674e-08,0.00018507240352034753,0.9999973966051797,8.940695822239011e-08 +0.04209941625420768,0.13283485171904477,0.0001591443856358544,0.0,4.5835967248678664e-05,0.9998275233845572,2.980231940746337e-08 +0.08457025885231784,0.08625665305567966,0.00014388559809923315,0.0,0.00035476681022644395,0.9997463418664913,0.0 +0.05863028764481956,0.11387345192866676,0.0002742707455068854,0.0,0.000623553928962356,0.9983062341880838,1.1920927762985348e-07 +0.07240563630757924,0.07485070823341401,0.0003666579356700218,0.0,0.19281972506655348,0.6231004568702522,2.980231940746337e-08 +0.2582590579879633,0.03618618845320001,4.0382142797112866e-05,0.0,0.9999382688034752,6.139277797937454e-06,8.940695822239011e-08 +0.20582035183054298,0.01940760016109019,0.00019714234288037018,0.0,0.9999988867211501,1.1920927762985348e-07,1.1920927762985348e-07 +0.19720277189391863,0.02494403719474909,0.00022995469654798735,0.0,0.9999997807907323,3.278255134820971e-07,2.9802319407463367e-07 +0.19523078202392888,0.028682827944612417,0.00024899837864935645,0.0,0.9999996615814547,4.4703479111195056e-07,1.1920927762985348e-07 +0.20498678087339367,0.031339347357151916,0.00025835630694329994,0.0,0.9999997807907323,6.854533463716575e-07,1.4901159703731684e-07 +0.212391942730692,0.03181320428303513,0.0002793371398061542,0.0,0.9999997807907323,5.960463881492673e-07,1.7881391644478022e-07 +0.2142885923296888,0.031093567604462677,0.0002910196490138798,0.0,0.9999997807907323,6.258487075567308e-07,1.7881391644478022e-07 +0.3437314629412417,0.048049360505459396,2.5629994690418497e-06,0.0,0.999834675941215,5.8263534441590885e-05,0.0 +0.19589737056874684,0.021939009424267564,9.697674735188581e-05,0.0,0.9999994231628994,2.3841855525970696e-07,2.980231940746337e-08 +0.2525705695047699,0.03987109660419562,5.85019529968506e-05,0.0,0.9999999000000099,8.046626240015109e-07,0.0 +0.2568266689671028,0.03899639844226654,8.535384278297509e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 +0.24058395623164563,0.03347301482581121,0.00010207294397056204,0.0,0.9999997807907323,4.172324717044872e-07,0.0 +0.2192090451626607,0.0301825702138716,0.000109016884392501,0.0,0.9999997807907323,2.682208746671703e-07,0.0 +0.19749307631628515,0.028616338963376856,9.6410503283144e-05,0.0,0.9999997807907323,3.5762783288956044e-07,2.980231940746337e-08 +0.1755439639018803,0.027908682818402204,7.59959144890316e-05,0.0,0.9999998403953712,3.5762783288956044e-07,8.940695822239011e-08 +0.1507804095682652,0.027117401356822002,5.2213663601875825e-05,0.0,0.9999997807907323,3.278255134820971e-07,1.7881391644478022e-07 +0.12745767831274593,0.027680665249852993,3.141164465546639e-05,8.940695822239011e-08,0.9999997807907323,5.960463881492673e-07,3.5762783288956044e-07 +0.10365995764303128,0.030233710999080128,1.603364784121529e-05,2.682208746671703e-07,0.9999994231628994,1.132488137483608e-06,1.2516974151134616e-06 +0.06736803054530614,0.03435093163855761,5.602836048603113e-06,1.6093252480030219e-06,0.99999537004746,4.202127036452335e-06,9.268521335721107e-06 +0.18329089879230656,0.6306049822681169,3.069638898968727e-06,0.9999999000000099,8.940695822239011e-08,2.980231940746337e-08,0.0 +0.18145424126827372,0.5030992626282377,2.980231940746337e-08,0.9999999000000099,0.0,2.0384786474704945e-05,0.0 +0.18107402323926727,0.5875478385872879,0.0,0.9999999000000099,0.0,1.3381241413951053e-05,8.940695822239011e-08 +0.17735809087018894,0.638758659253415,0.0,0.9999999000000099,0.0,1.0997055861353983e-05,1.1920927762985348e-07 +0.18225985764702457,0.6462274788703612,0.0,0.9999999000000099,0.0,1.034140483438979e-05,8.940695822239011e-08 +0.18616071342651086,0.647525131591544,1.1920927762985348e-07,0.9999999000000099,0.0,1.0251997876167399e-05,2.980231940746337e-08 +0.1887924969118145,0.6476179360234434,8.940695822239011e-08,0.9999999000000099,0.0,1.069903266727935e-05,8.940695822239011e-08 +0.19067397712871656,0.6468222140158282,1.1920927762985348e-07,0.9999999000000099,0.0,1.1295079055428617e-05,2.980231940746337e-08 +0.1920884251515004,0.6456402539101346,0.0,0.9999999000000099,0.0,1.2308357915282372e-05,2.980231940746337e-08 +0.19322618841324832,0.6441489456981098,0.0,0.9999999000000099,0.0,1.353025301098837e-05,0.0 +0.1941961049953157,0.6424757837149062,1.1920927762985348e-07,0.9999999000000099,0.0,1.5020368981361538e-05,2.980231940746337e-08 +0.19507560133126256,0.6405395268297093,2.980231940746337e-08,0.9999999000000099,0.0,1.6599891909957096e-05,5.960463881492674e-08 +0.1458202898441969,0.02504509686994846,1.6689298868179488e-06,2.9802319407463367e-07,0.9996705247659187,2.2053716361522894e-05,5.30481285452848e-06 +0.07657295465152289,0.018563836809794242,1.1950730082392812e-05,1.4901159703731684e-07,0.9999897672114114,2.682208746671703e-07,2.086162358522436e-06 +0.14650645851482277,0.03278949856196646,1.2427567192912226e-05,1.1920927762985348e-07,0.9999996615814547,1.2814997345209249e-06,3.5762783288956044e-07 +0.1494490206179724,0.03406581282032335,3.1381842336058926e-05,8.940695822239011e-08,0.9999998403953712,9.536742210388278e-07,2.682208746671703e-07 +0.11015373467942925,0.02813407778258175,2.0444391113519873e-05,1.1920927762985348e-07,0.9999996615814547,7.152556657791209e-07,7.152556657791209e-07 +0.04123455285855258,0.03691300749146667,2.5033948302269232e-06,7.271765935421062e-06,0.9999646140538315,1.1265276736021154e-05,6.780027665197917e-05 +0.03386852145054765,0.055840909471486656,3.278255134820971e-07,6.967782277464936e-05,0.9936433036889533,0.00015574692122340356,0.003857463212505021 +0.05549433827170418,0.057084172954321256,8.940695822239011e-08,4.5865769568086125e-05,0.5392959770686322,0.000333160128656033,0.09156905689076276 +0.09333103894800915,0.04948008059608049,1.7881391644478022e-07,1.2427567192912226e-05,0.010081111376685005,8.80360515296468e-05,0.7836522272378046 +0.1974035799421586,0.0447326898498231,2.1159646779298993e-06,1.4603136509657052e-06,4.029273583889048e-05,5.811452284455357e-06,0.9991355135279159 +0.23571181296326216,0.03527399896971364,1.6331671035289926e-05,6.258487075567308e-07,1.7285345256328755e-06,5.66244068741804e-07,0.9999559117765645 +0.2179970443158481,0.03093218802876094,3.600120184421575e-05,7.748603045940476e-07,3.5762783288956044e-07,2.086162358522436e-07,0.999982495445476 +0.24663078783921383,0.033952146762756145,4.467367679178759e-05,3.5166736900806776e-06,2.1308658376336308e-05,2.8014180243015566e-06,0.9998033239011983 +0.3186947107183099,0.053619593372700156,3.367662093043361e-06,1.1920927762985348e-07,4.979967572987129e-05,9.56058406591425e-05,0.9999573422878961 +0.28879022597070786,0.04766196011680808,3.6060806483030677e-06,1.1920927762985348e-07,6.341933569908205e-05,4.6849246108532416e-05,0.9999630643332224 +0.2921338677285345,0.04558780788594682,3.933906161785165e-06,1.4901159703731684e-07,5.316733782291465e-05,3.519653922021424e-05,0.9999646736584703 +0.2907692789911032,0.044382631771117176,4.053115439415018e-06,1.1920927762985348e-07,4.810094352364588e-05,3.09944121837619e-05,0.9999619318450849 +0.2856372296691874,0.042686045162520975,5.543231409788187e-06,1.4901159703731684e-07,3.0487772753835027e-05,2.0056960961222846e-05,0.9999691440063815 +0.2858018576980502,0.04151132702116634,6.496905630827015e-06,1.4901159703731684e-07,2.166628620922587e-05,1.582503160536305e-05,0.9999719454244057 +0.2830957174183924,0.04037967323565455,8.1360331982375e-06,1.1920927762985348e-07,1.4781950426101832e-05,1.1682509207725642e-05,0.9999757601212899 +0.2756690680866534,0.038395404809099185,1.2218950957059982e-05,1.4901159703731684e-07,8.016823920607646e-06,6.794928824901648e-06,0.9999817801898102 +0.2610478103052764,0.0355072319446798,2.2143123319745282e-05,2.086162358522436e-07,3.2186504960060438e-06,3.039836579561264e-06,0.9999873830258588 +0.2456004619496691,0.03335201739693789,3.573298096954858e-05,1.7881391644478022e-07,1.370906692743315e-06,1.4603136509657052e-06,0.999990542071716 +0.23277541994084652,0.03226962685032453,4.9114222383499634e-05,2.9802319407463367e-07,6.556510269641942e-07,9.238719016313645e-07,0.9999920917923252 +0.14508539437646914,0.031742244953442175,8.845328400135129e-05,4.062056135237257e-05,7.748603045940476e-07,2.086162358522436e-07,0.9998730613286118 +0.47374832628195784,0.06688365339087567,1.4007090121507783e-06,0.0,5.254148911535792e-05,0.0010005234671473602,0.9994445039755324 +0.12314397096124,0.034761101001509226,5.960463881492674e-08,6.556510269641942e-07,0.13548015193355217,0.0007915198011428196,0.6264939873765412 +0.17970350383968106,0.03621441125249633,8.493661031127061e-06,1.7881391644478022e-07,0.9999565078229526,1.2427567192912226e-05,1.996755400300046e-06 +0.33608922360935906,0.053202152243087185,4.2110677322745743e-05,5.960463881492674e-08,0.9999994827675383,1.2516974151134616e-05,8.940695822239011e-08 +0.3502732515190043,0.04216921328776206,1.5348194494843634e-05,5.960463881492674e-08,0.9999982310701231,1.6599891909957096e-05,0.0 +0.3586723208278911,0.05194023250644109,9.357928293943498e-06,2.980231940746337e-08,0.999991793769131,6.6310160681606e-05,0.0 +0.36096656320984566,0.06235787271385522,5.155801257491163e-06,8.940695822239011e-08,0.9999119235531191,0.0006668865013808079,0.0 +0.2634221315274834,0.08064621685554478,1.5437601453066027e-05,8.940695822239011e-08,0.9888342822200873,0.12223397463115575,0.0 +0.10475587844414862,0.08895397184756092,0.0004758834362983751,0.0,0.007120399955150555,0.999799866832147,0.0 +0.16739735006592918,0.11646321413906925,5.057453603446534e-05,0.0,3.919005002081433e-05,0.9999959660938481,2.980231940746337e-08 +0.20129424332738874,0.13280886409392717,2.1427867653966164e-05,0.0,7.808207684755402e-06,0.999998588697956,2.086162358522436e-07 +0.36742293833164863,0.06488600372157051,1.847743803262729e-06,1.1920927762985348e-07,0.9992869093105058,0.0002553164703637387,0.0 +0.15685367583579019,0.020316630598404013,8.156894821822725e-05,0.0,0.999998290674762,2.3841855525970696e-07,1.4901159703731684e-07 +0.19665411113878387,0.02963897585361312,5.1677221852541485e-05,0.0,0.9999998403953712,3.874301522970238e-07,0.0 +0.20889744161694512,0.03614220022536331,9.828804940581419e-05,0.0,0.9999999000000099,6.258487075567308e-07,1.1920927762985348e-07 +0.17910534142706241,0.02825179695599299,8.43703662425288e-05,0.0,0.9999997807907323,3.278255134820971e-07,8.940695822239011e-08 +0.13429781793991938,0.02381509542057412,4.291533994674725e-05,2.980231940746337e-08,0.9999997807907323,2.682208746671703e-07,2.086162358522436e-07 +0.0690928101511002,0.029013901943960634,9.655951488018132e-06,7.748603045940476e-07,0.9999973966051797,1.7583368450403388e-06,5.602836048603113e-06 +0.03223374485836071,0.05166453122207973,6.258487075567308e-07,4.804133888483095e-05,0.9981715873090009,0.00010126828134656053,0.0023590919996559854 +0.05961760878316064,0.060663163651569124,1.1920927762985348e-07,4.082917758822482e-05,0.5282818146759384,0.00032523271169364776,0.17855952384631812 +0.14514321088189888,0.04797852038515597,7.748603045940476e-07,3.993510800600092e-06,0.0006347894033789697,1.8984077462554166e-05,0.9911173187006155 +0.22781333326350073,0.03566923736915157,1.654028727114217e-05,7.748603045940476e-07,1.937150761485119e-06,5.066394299268773e-07,0.9999478055456857 +0.20535033940418612,0.029809564346931078,4.139542165696662e-05,1.0132788598537545e-06,2.086162358522436e-07,1.4901159703731684e-07,0.9999851776542227 +0.5165663361335479,0.3595785498003355,0.9999996615814547,8.344649434089744e-07,8.940695822239011e-08,2.980231940746337e-08,3.6060806483030677e-06 +0.6154213547451772,0.44183203570429586,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5914618968718712,0.346210032642209,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 +0.551288485504211,0.33860075467987366,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.4901159703731684e-07 +0.5752892493963446,0.3444176911717975,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5626334547763547,0.3455346822146971,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.567504584765777,0.34042453760039876,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.562132298923104,0.3440304397947581,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5679296850922975,0.34009006613629894,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5632439851527637,0.34340277308305833,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5647470950846473,0.34202009433611796,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.5557207464941702,0.34729191654934183,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.6637672185622976,0.40337282412297554,0.9999996615814547,2.8014180243015566e-06,1.4901159703731684e-07,3.874301522970238e-07,2.0056960961222846e-05 +0.5287296175737791,0.45307815067162366,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.7881391644478022e-07 +0.5817939638850583,0.30851513142071263,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5417121648564142,0.3429005443462669,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 +0.5785042643307512,0.3282559513483626,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5774850845097791,0.3397018312826209,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5853162407632695,0.33331382268920184,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5894972681755108,0.3380581735985762,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5881884693855871,0.3422346710572726,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 +0.5895189642662082,0.34419727319545584,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5924170613043572,0.3467288910748899,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5953290462247384,0.34845596545928353,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.2370996773144773,0.027150243516087618,4.053115439415018e-06,4.172324717044872e-07,0.12215797871666673,4.130601469874423e-05,0.9104861898695022 +0.25430038570304725,0.04752019046923409,7.033347380161355e-06,3.5762783288956044e-07,0.00015500186323821698,9.715556126833059e-06,0.9999152614128928 +0.2494246959582998,0.037217140191381025,1.3291834455728662e-05,3.278255134820971e-07,9.000300461053937e-06,2.354383233189606e-06,0.9999755217027346 +0.26166313885558967,0.040265560143251604,1.0728834986686813e-05,2.9802319407463367e-07,5.1259989380836994e-06,4.261731675267262e-06,0.9999776078650932 +0.26210218666898705,0.04058614372512115,1.20401370406152e-05,2.682208746671703e-07,4.261731675267262e-06,4.6193595081568225e-06,0.9999796940274517 +0.26460957526064954,0.040320634835014635,1.2606381109357005e-05,2.9802319407463367e-07,3.933906161785165e-06,4.976987341046382e-06,0.9999805880970339 +0.2620339989553668,0.03901591896342713,1.5407799133658562e-05,2.3841855525970696e-07,3.1590458571911173e-06,4.112720078229945e-06,0.9999829722825865 +0.2610209584128062,0.03829097747147058,1.740455453395861e-05,2.086162358522436e-07,2.5629994690418497e-06,3.6060806483030677e-06,0.9999841643753627 +0.2598487138640571,0.03775134682008899,1.9311902976036264e-05,2.086162358522436e-07,2.1159646779298993e-06,3.397464412450824e-06,0.9999851180495838 +0.25930124520181785,0.03739726542786141,2.089142590463182e-05,2.086162358522436e-07,1.847743803262729e-06,3.1888481765985805e-06,0.9999855352820556 +0.25724726914294294,0.036776304238697724,2.3186204499006502e-05,2.086162358522436e-07,1.6093252480030219e-06,2.8014180243015566e-06,0.999986369746999 +0.2542536854638677,0.0360754430232263,2.6315448036790155e-05,2.3841855525970696e-07,1.2814997345209249e-06,2.413987872004533e-06,0.9999872042119423 +0.7072691917126569,0.4149319230799653,0.9999996615814547,3.9637084811926284e-06,2.9802319407463367e-07,6.258487075567308e-07,3.0279156517982785e-05 +0.48238533733277816,0.4507318734350869,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.7881391644478022e-07 +0.5764750241994571,0.3038062154726512,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 +0.5256780981799846,0.3585377930980906,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5714514851333504,0.32661065453658683,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5552029609450279,0.3515753745430694,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5650571584467561,0.3347310423277836,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5651359557871458,0.34203106159075475,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5657619833711959,0.34030455345048644,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5700697302582245,0.3392578958884098,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5737639069319607,0.3394082188025076,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5771498083829314,0.33914750808630467,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.1556738316948326,0.023716181512586296,1.698732206225412e-06,9.536742210388278e-07,0.7081348783938181,5.2303070560098214e-05,0.21106574808898182 +0.13033586739954084,0.047926992169756474,1.519918289780632e-06,1.4901159703731685e-06,0.16216064858076434,4.3720002570748764e-05,0.9174559391000481 +0.09223806857680807,0.04486608504480758,8.940695822239011e-08,6.794928824901648e-06,0.3016168769580633,0.0005814432516396104,0.3580577611493325 +0.04242250323119931,0.042645931236594,2.980231940746337e-08,2.494454134404684e-05,0.7905556961099882,0.00017762182366848169,0.008483230219334448 +0.04343089461146762,0.0466191470543188,1.7881391644478022e-07,2.890824982523947e-05,0.6603484089445597,0.0001825690086901206,0.030792471667456932 +0.055086016652687274,0.048178851596211755,1.1920927762985348e-07,2.4169681039452794e-05,0.2837781622349767,0.0002593695858031537,0.10785378927298593 +0.05804073810337059,0.0474842190661183,5.960463881492674e-08,2.253055347204231e-05,0.15211002497683318,0.0002856552315205364,0.12368436410975878 +0.05790108442066763,0.046699732534041326,1.4901159703731684e-07,2.1249053737521383e-05,0.11141296107054166,0.0002596974113166358,0.1282686164856536 +0.06154662370426912,0.046247810117431704,5.960463881492674e-08,1.820921715796012e-05,0.06721734328436918,0.00022596118574738728,0.19973174720440706 +0.06582117080415925,0.04643365739980955,5.960463881492674e-08,1.6480682632327243e-05,0.04436796459930583,0.00023686883465051886,0.260024879202285 +0.06460776924819449,0.04646673797765422,1.1920927762985348e-07,1.707672902047651e-05,0.04646759760620044,0.00026690957261324194,0.2173065027845017 +0.05774009227513597,0.04604944585965317,5.960463881492674e-08,2.0503995752334798e-05,0.08976279791611522,0.0002954303922861844,0.09845413773187199 +0.3161465227473003,0.0412193238664617,2.8908249825239467e-06,2.980231940746337e-08,0.9998951150449733,3.361701629161868e-05,2.980231940746337e-08 +0.33235752581173833,0.048285871735887644,6.556510269641941e-06,2.980231940746337e-08,0.9999993039536218,5.960463881492674e-06,0.0 +0.34713771937840227,0.04729425906325166,2.413987872004533e-06,1.4901159703731684e-07,0.9999991251397053,1.4036892440915248e-05,0.0 +0.33140569923935953,0.05124053358154259,4.0829177588224814e-06,8.940695822239011e-08,0.9999989463257889,9.387730613350962e-06,0.0 +0.33817562459499045,0.04788678883686236,2.980231940746337e-06,8.940695822239011e-08,0.9999988271165112,1.150369529128086e-05,0.0 +0.3468157052850166,0.05241754650172069,2.2947785943746796e-06,8.940695822239011e-08,0.999998290674762,2.3514030012488597e-05,0.0 +0.35331502555337846,0.05549165605548506,1.6093252480030219e-06,1.1920927762985348e-07,0.9999962045124035,5.447863987684304e-05,0.0 +0.3546787202211381,0.06025764345090919,1.2814997345209249e-06,1.1920927762985348e-07,0.999989886420689,0.000127732740980388,0.0 +0.35275629161327704,0.0643196999916565,1.0728834986686813e-06,1.1920927762985348e-07,0.9999696804481307,0.00030100342601538003,0.0 +0.34600484369752577,0.06783801316053341,9.536742210388278e-07,1.4901159703731684e-07,0.9999121619716743,0.0005816816701948701,0.0 +0.3380204439023241,0.0711827576038541,8.642672628164378e-07,1.7881391644478022e-07,0.9997301294047336,0.0014398394575327778,0.0 +0.3115035593380687,0.0757750272621101,1.1026858180761447e-06,1.1920927762985348e-07,0.9987006380831221,0.006070076812273324,0.0 +0.11641123890394738,0.10754603145665148,0.0002636909221172359,0.0,0.0018748937162429281,0.9997211291042726,0.0 +0.12747573852011215,0.10362300274981896,5.0723547631502654e-05,0.0,0.00016289947788119478,0.9999712897733788,0.0 +0.13355273007793544,0.11601251361767731,3.3915039485693316e-05,0.0,4.929303629994441e-05,0.9999861909330825,0.0 +0.12635752558184973,0.11820283530118592,3.76701317310337e-05,0.0,3.850459667444267e-05,0.9999837471428911,0.0 +0.09987059235159274,0.11648598311336955,6.350874265730444e-05,0.0,5.245208215713553e-05,0.9999629451239447,0.0 +0.06555408239093179,0.11669212577728993,0.00010645388492345915,0.0,9.077786491513343e-05,0.9998595906802396,0.0 +0.04139646887607822,0.1026239991012321,0.00021904704764485577,0.0,0.0006783007897138663,0.9980787232817272,8.940695822239011e-08 +0.12470948695620081,0.10115110872443964,2.598762252330806e-05,0.0,0.654978925056917,0.08232595693349622,1.4901159703731684e-07 +0.22218602894816672,0.026934057469524295,6.106495246589245e-05,0.0,0.9999844027939181,8.642672628164378e-07,1.7881391644478022e-07 +0.1652825176647411,0.01662287115766078,0.00011038779108524432,0.0,0.9999987079072337,2.3841855525970696e-07,1.4901159703731684e-07 +0.13750267028239227,0.021696090694527055,9.307264350950811e-05,2.980231940746337e-08,0.9999996615814547,2.9802319407463367e-07,4.4703479111195056e-07 +0.10649886726892081,0.025600135322001855,4.8965210786462317e-05,1.7881391644478022e-07,0.9999993039536218,8.046626240015109e-07,1.996755400300046e-06 +0.695540249318886,0.4119734465370454,0.9999997211860935,3.6656852871179947e-06,2.086162358522436e-07,5.66244068741804e-07,2.6583668911457325e-05 +0.4753597676557162,0.45203009240039504,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 +0.5633726119761837,0.33753603691043316,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5432224273456704,0.36377552145450875,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5797837376354468,0.33528560394267887,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5535563826331759,0.3586367368084008,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5542066693076485,0.34852921956769994,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5537595748672067,0.35345008963254637,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5608840584522694,0.3490199148057293,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5651486515764825,0.34876000875223073,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5659907459978344,0.35032880300245034,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5719289183379815,0.3511332272882013,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 +0.596741080259409,0.38737535470051343,0.9999996019768158,1.7881391644478022e-06,1.4901159703731684e-07,1.4901159703731684e-07,9.715556126833059e-06 +0.608173131917566,0.4324807523940532,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 +0.5879400968308183,0.3230297564907065,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 +0.5482280850183452,0.3361366390606362,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 +0.5711278915168783,0.3364740013500071,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5589864253766339,0.3432741164573327,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5607737302547947,0.33978480094813407,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5540266036757895,0.34611457580361754,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5454056858790578,0.3501315116282776,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.5476308464777205,0.34981352084845535,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5446916222346782,0.3534293174138457,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 +0.5453392863047808,0.35270786279360794,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 +0.11420673131469844,0.26572155947903525,0.9999973370005409,2.086162358522436e-07,1.397728780210032e-05,3.278255134820971e-07,0.0 +0.7140477895441023,0.445229470653589,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 +0.6321903466916569,0.4139965771919877,0.9999999000000099,0.0,7.748603045940476e-07,0.0,8.940695822239011e-08 +0.6063637733208391,0.3359856008908012,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,2.980231940746337e-08 +0.5909659862273605,0.35740560287077594,0.9999999000000099,0.0,5.66244068741804e-07,0.0,1.4901159703731684e-07 +0.5816290378329717,0.3559074103222806,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 +0.5725369453193101,0.3655776976913065,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5739249586821371,0.3576195239408382,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 +0.5726779699088428,0.354416668354381,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5755527019262409,0.3489329814313393,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5765783190488486,0.34650555247095477,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5751144885778704,0.3458995818499495,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.2765053510551399,0.03442475199109929,3.71038876622919e-05,1.937150761485119e-06,5.185603576898626e-05,4.917382702231456e-06,0.9997517062839846 +0.2761002480869407,0.04473051428028917,1.0788439625501739e-05,1.7881391644478022e-07,1.9222496017813872e-05,1.573562464714066e-05,0.9999817205851714 +0.2801504135015832,0.04431414603428198,7.77840536534794e-06,8.940695822239011e-08,1.7195938298106364e-05,1.7553566130995923e-05,0.9999823762361983 +0.2801165282610298,0.04376709460462712,8.22544015645989e-06,1.4901159703731684e-07,1.5109775939583928e-05,1.603364784121529e-05,0.9999826146547536 +0.27053666113686897,0.0409217774797939,1.2278555595874908e-05,2.3841855525970696e-07,8.791684225201694e-06,9.000300461053937e-06,0.9999861313284437 +0.26055264471882533,0.03839316963492049,1.8239019477367584e-05,1.7881391644478022e-07,4.649161827564286e-06,5.0067896604538464e-06,0.9999886943279127 +0.2516754567518925,0.036715567105682,2.5093552941084157e-05,2.086162358522436e-07,2.5033948302269232e-06,3.1590458571911173e-06,0.9999902440485219 +0.24207457899044926,0.03517851232879981,3.427266731858287e-05,2.9802319407463367e-07,1.370906692743315e-06,2.026557719707509e-06,0.9999917341644923 +0.23101717232701247,0.03360968827625778,4.67002345114951e-05,2.682208746671703e-07,7.152556657791209e-07,1.1920927762985347e-06,0.9999929262572685 +0.22565007208843466,0.03330084680940698,5.39421981275087e-05,3.5762783288956044e-07,4.768371105194139e-07,1.0728834986686813e-06,0.9999932242804627 +0.22767707704554982,0.0341794192732458,5.242227983772807e-05,3.278255134820971e-07,3.874301522970238e-07,1.1622904568910714e-06,0.9999925090247969 +0.23253974317541437,0.035112202161498546,4.7355885538459296e-05,3.5762783288956044e-07,4.768371105194139e-07,1.370906692743315e-06,0.9999916745598535 +0.6184172034007538,0.3929587005896025,0.9999996615814547,2.1159646779298993e-06,5.960463881492674e-08,1.7881391644478022e-07,1.2129543998837591e-05 +0.56438809630918,0.4565256833248419,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 +0.5758980512380552,0.33315500611322496,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5370057225004994,0.3497918545600832,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 +0.5699586868050126,0.341220259608014,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 +0.5533189773330454,0.3528035878531008,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5662951469186897,0.3385704755203329,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.5592733621365708,0.3470634519459569,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5651751756434065,0.34057319158444316,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.5643202662234285,0.34292352193682385,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5665789246324535,0.3411774932753949,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5670450925592225,0.34185832733022525,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.16287049650471525,0.02627775072601485,1.937150761485119e-06,2.3841855525970696e-07,0.9997623159096937,2.068280966877958e-05,2.65240642726424e-06 +0.05771216749905985,0.033806234592370976,1.1920927762985347e-06,4.827975744009066e-06,0.37237166614914013,8.791684225201694e-06,0.1897103596758146 +0.25372856854341824,0.050958514204836124,2.324580913782143e-06,7.748603045940476e-07,0.00014817713209390788,7.539986810088233e-06,0.999708075688372 +0.24864736198349374,0.03696992992721742,9.000300461053937e-06,5.66244068741804e-07,6.0200685203076e-06,1.043081179261218e-06,0.999945778987966 +0.22808426617631603,0.03333640098000941,2.1189449098706455e-05,6.556510269641942e-07,9.834765404462913e-07,3.874301522970238e-07,0.9999774886558155 +0.17471015452615188,0.02745652198321352,4.765390873253393e-05,1.8179414838552655e-06,8.940695822239011e-08,8.940695822239011e-08,0.9999932838851014 +0.0972119569738189,0.023980736728376566,1.388788084387793e-05,4.300474690496964e-05,0.0,0.0,0.9999983502794008 +0.08632466196656403,0.029285490507833196,9.506939890980815e-06,0.00017869470716715035,0.0,0.0,0.999997635023735 +0.1804408430978445,0.10858407614755955,4.768371105194139e-07,0.053681636448929246,0.0,1.7881391644478022e-07,0.9995500041862349 +0.32704609631137843,0.19116237756316778,0.0,0.9998241855247836,0.0,1.8447635713219826e-05,0.52794826711713 +0.17735365032415337,0.5292757748651189,0.0,0.9999996615814547,0.0,0.0027741489020437276,0.00210750081921818 +0.14461740850803453,0.37075078481047685,0.0,0.9999999000000099,0.0,0.005449771336126382,0.00011083482587635627 +0.08603134750963648,0.032981008285597,0.0003426372662276064,0.000394195278802518,0.0,0.0,0.9997465802850465 +0.19511726497795884,0.04676187037620903,0.0001563727699309603,8.642672628164378e-07,8.940695822239011e-08,2.5629994690418497e-06,0.9999954296520989 +0.23748278616875523,0.052716046562704726,2.539157613515879e-05,3.278255134820971e-07,6.854533463716575e-07,1.820921715796012e-05,0.9999894095835785 +0.23960822819671287,0.04217910765879308,3.5107132261991846e-05,1.7881391644478022e-07,1.6093252480030219e-06,6.526707950234478e-06,0.9999933434897403 +0.23472902177792382,0.03647306560845485,4.357099097371145e-05,2.682208746671703e-07,1.4305113315582417e-06,2.8014180243015566e-06,0.9999946547917942 +0.22453400491738407,0.03401756286038594,5.704163934588489e-05,2.682208746671703e-07,7.748603045940476e-07,1.4603136509657052e-06,0.99999537004746 +0.2034092843448335,0.03100875019496182,8.46981917560109e-05,4.4703479111195056e-07,2.9802319407463367e-07,5.66244068741804e-07,0.9999964429309587 +0.16266313194555024,0.027288168664074255,0.00010135768830478292,1.4007090121507783e-06,8.940695822239011e-08,2.3841855525970696e-07,0.9999979330469291 +0.11270591616163864,0.025479137893128532,4.45842698335652e-05,1.1086462819576373e-05,0.0,0.0,0.9999988867211501 +0.0892359316312079,0.026598483319496307,1.981854240596314e-05,4.8965210786462317e-05,0.0,0.0,0.9999990655350666 +0.08187815546650402,0.02899029850463362,1.3470648372173444e-05,0.00010928510526716817,0.0,2.980231940746337e-08,0.9999988271165112 +0.08127155899664998,0.031982421869523485,1.2069939360022665e-05,0.000149279817911984,0.0,2.980231940746337e-08,0.9999985290933172 +0.11736184358110832,0.03145870565829419,0.00013354419326484337,9.784101461470224e-05,2.086162358522436e-07,0.0,0.9998669220508138 +0.26977294682339353,0.06395789979793183,1.1384486013651007e-05,2.682208746671703e-07,1.6093252480030219e-06,9.912251434922317e-05,0.9999801112599234 +0.24206811188649138,0.04211634396785534,2.9385086935758882e-05,2.682208746671703e-07,2.8610226631164835e-06,7.301568254828525e-06,0.9999932242804627 +0.2585526108634699,0.041045039885168305,1.999735632240792e-05,2.086162358522436e-07,4.261731675267262e-06,8.67247494757184e-06,0.9999912573273818 +0.2557879090203227,0.0393082201413556,2.3126599860191574e-05,1.7881391644478022e-07,3.844499203562775e-06,6.3180917143822346e-06,0.9999919129784087 +0.2478776276008962,0.036904066794751895,3.066658667027981e-05,1.7881391644478022e-07,2.4437901914119963e-06,3.695487606525458e-06,0.9999929262572685 +0.23974898456534413,0.035342842334417424,3.927945697903672e-05,2.086162358522436e-07,1.4305113315582417e-06,2.2947785943746796e-06,0.9999935819082956 +0.23539218305566736,0.034845054143660986,4.437565359771296e-05,2.682208746671703e-07,8.940695822239011e-07,1.8179414838552655e-06,0.9999937011175731 +0.24003475903470792,0.03597950934747674,3.9368863937259114e-05,2.682208746671703e-07,1.0132788598537545e-06,2.2947785943746796e-06,0.9999924494201581 +0.24096849559739814,0.03588670491557735,3.924965465962926e-05,2.086162358522436e-07,1.0132788598537545e-06,2.175569316744826e-06,0.999992151396964 +0.24672296642235517,0.03663516043989377,3.373622556924853e-05,1.7881391644478022e-07,1.1026858180761447e-06,2.712011066079167e-06,0.9999909593041877 +0.2548499107255312,0.037724614136911805,2.697109906375435e-05,2.086162358522436e-07,1.4901159703731685e-06,3.6656852871179947e-06,0.9999892903743008 +0.33060854672016643,0.03230908512515908,1.1175869777798764e-05,3.5762783288956044e-07,0.004425257001856014,3.054737739264995e-05,0.9975065783537427 +0.4782015979091996,0.03725335001307587,8.642672628164378e-07,0.0,0.9959801035536925,0.0001168250920772564,0.00603851615602082 +0.12793275713390853,0.023567676540153838,2.6434657314420008e-05,1.1920927762985348e-07,0.9999947740010718,9.238719016313645e-07,1.4603136509657052e-06 +0.14006802439109645,0.026181697840975758,7.11083341062076e-05,2.980231940746337e-08,0.9999996615814547,6.854533463716575e-07,5.960463881492673e-07 +0.15226921438540325,0.029594659800230207,8.58306798934945e-05,2.980231940746337e-08,0.9999997807907323,9.238719016313645e-07,4.768371105194139e-07 +0.17083546518572088,0.03155639767106433,0.0001160204294532549,2.980231940746337e-08,0.9999997807907323,8.642672628164378e-07,2.682208746671703e-07 +0.1979970633901626,0.034225106233458306,0.00016808508145809342,0.0,0.9999997807907323,8.940695822239011e-07,1.4901159703731684e-07 +0.22716099022878347,0.03649875521034864,0.00022396443034708723,0.0,0.9999997807907323,9.536742210388278e-07,1.4901159703731684e-07 +0.2500776052371424,0.03710237144788566,0.00023090837076902618,0.0,0.9999999000000099,9.536742210388278e-07,1.1920927762985348e-07 +0.2545510530366398,0.03474801778198327,0.00023159382411539785,0.0,0.9999997807907323,7.152556657791209e-07,2.980231940746337e-08 +0.2596343755614537,0.03460246323946669,0.00021135804923773022,0.0,0.9999998403953712,7.748603045940476e-07,2.980231940746337e-08 +0.27000206707790064,0.03605911135056064,0.00016966460438668895,0.0,0.9999998403953712,9.238719016313645e-07,1.1920927762985348e-07 +0.4296958148301534,0.3149271606859721,0.9999997807907323,2.682208746671703e-07,2.980231940746337e-08,0.0,1.0728834986686813e-06 +0.6366440057490896,0.4505799113932581,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 +0.5711694955589297,0.3628876506660866,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 +0.5600476860768158,0.3268698751366706,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 +0.5669432878259504,0.3533654212346574,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 +0.5510487556229342,0.35252249234838823,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 +0.5538939237365249,0.3489212393163205,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 +0.5510817169914937,0.3528191446653845,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 +0.5508955716858679,0.3507682680483041,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 +0.5567342042692442,0.3484681248068156,0.9999999000000099,0.0,2.980231940746337e-08,0.0,2.980231940746337e-08 +0.5570634007223251,0.3493032454846206,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 +0.561412274814247,0.3465503453614958,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 +0.44721603391702863,0.2479470073752216,4.661082755327271e-05,1.1920927762985348e-07,2.7209517619014057e-05,0.9999999000000099,6.3180917143822346e-06 +0.29909420012189253,0.19720292087992822,7.241963616013599e-06,0.0,4.947185021638919e-06,0.9999999000000099,3.2186504960060438e-06 +0.31104174255036815,0.1924501061109972,4.559754869341896e-06,0.0,2.2351739555597527e-06,0.9999997807907323,4.023313120007555e-06 +0.324607968316942,0.19102022048540282,4.053115439415018e-06,0.0,1.937150761485119e-06,0.9999999000000099,4.559754869341896e-06 +0.3330577611785306,0.18726193901670127,3.874301522970238e-06,0.0,1.6391275674104854e-06,0.9999997807907323,4.500150230526969e-06 +0.33661600945986214,0.18126618859048185,3.725289925932921e-06,0.0,1.4305113315582417e-06,0.9999999000000099,4.2319293558597985e-06 +0.3338807821135551,0.17768165466127084,3.725289925932921e-06,0.0,1.2218950957059981e-06,0.9999997807907323,3.993510800600092e-06 +0.3300596475464526,0.17590242621270769,3.8146968841553113e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.904103842377701e-06 +0.3269600272043263,0.17539557811594694,3.874301522970238e-06,0.0,1.2218950957059981e-06,0.9999997807907323,3.933906161785165e-06 +0.32334920762630504,0.17546132203912296,4.0829177588224814e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.8146968841553113e-06 +0.31964641808139915,0.17576980587810515,4.291533994674725e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.874301522970238e-06 +0.31449562309870227,0.17566040155263865,4.529952549934432e-06,0.0,1.2516974151134616e-06,0.9999997807907323,3.6656852871179947e-06 +0.6563398837771437,0.40157222740926407,0.9999996019768158,2.682208746671703e-06,1.1920927762985348e-07,3.5762783288956044e-07,1.8626449629664607e-05 +0.5561181306608713,0.44717276088686825,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,8.940695822239011e-08 +0.5833722352740006,0.3167948424273668,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 +0.5520842075119294,0.3402825593365681,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5808376073596768,0.3348075448893397,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5809237956760185,0.34063535922893323,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 +0.5854499935861399,0.33983215683839996,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 +0.5851507782693798,0.34381628030611683,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 +0.5828491449114734,0.34728127712025125,0.9999999000000099,0.0,0.0,0.0,0.0 +0.5803284644840265,0.34865987294902523,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 +0.5771126746892378,0.3506157993669947,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 +0.5718832015754407,0.351898610531631,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 +0.12308809160676538,0.11315876243560982,0.0002286135921746515,0.0,0.0010541676420807943,0.9998882605115096,0.0 +0.23977759479483515,0.2174348830804433,9.477137571573351e-06,0.0,4.079937526881735e-05,0.9999998403953712,8.642672628164378e-07 +0.2437450587648552,0.18929356333352257,6.079673159122528e-06,0.0,1.0013579320907693e-05,0.9999997807907323,6.258487075567308e-07 +0.2610951661955485,0.19040331241208316,4.976987341046382e-06,0.0,7.390975213050916e-06,0.9999997211860935,8.642672628164378e-07 +0.26364955304961446,0.19520428773398443,5.364417493343406e-06,0.0,7.301568254828525e-06,0.9999998403953712,1.132488137483608e-06 +0.2628416418920399,0.19454669949061254,5.871056923270284e-06,0.0,7.033347380161355e-06,0.9999997807907323,1.2516974151134616e-06 +0.2597046792399634,0.1889353990231286,6.3180917143822346e-06,0.0,6.556510269641941e-06,0.9999997807907323,1.1622904568910714e-06 +0.25791507958297877,0.18459480997739358,6.735324186086722e-06,0.0,6.288289394974771e-06,0.9999997211860935,1.043081179261218e-06 +0.2546317577256623,0.178766757219221,7.2121612966061355e-06,0.0,5.900859242677747e-06,0.9999997807907323,9.536742210388278e-07 +0.2509533166781462,0.1724854409399316,7.718800726533013e-06,0.0,5.48362677097326e-06,0.9999996615814547,8.344649434089744e-07 +0.2442070245641677,0.16376915571269487,8.493661031127061e-06,0.0,5.1259989380836994e-06,0.9999996615814547,6.258487075567308e-07 +0.23066198824881062,0.15150389072684958,1.0132788598537546e-05,0.0,5.066394299268773e-06,0.9999994231628994,4.172324717044872e-07 +0.2524413466349022,0.03405350446117934,4.3094153863192035e-05,3.0994412183761904e-06,2.521276221871401e-05,3.069638898968727e-06,0.9997951580656806 +0.3102270364632894,0.052324652662854146,4.023313120007555e-06,8.940695822239011e-08,4.294514226615472e-05,7.11083341062076e-05,0.9999647332631091 +0.2937759756920285,0.04772838949339888,3.2186504960060438e-06,1.7881391644478022e-07,6.851553231775829e-05,5.185603576898626e-05,0.9999603225198368 +0.29258018730859414,0.04596674441504148,2.2351739555597527e-06,8.940695822239011e-08,0.00012499092759490137,6.309151018559995e-05,0.999924202108715 +0.25120651720914156,0.043601900331660406,1.1026858180761447e-06,1.7881391644478022e-07,0.00044506783803105796,0.00010105966511070829,0.9996190859626214 +0.18632632493201243,0.04317116736626481,5.960463881492673e-07,5.364417493343406e-07,0.0013319848635971678,0.00014543531870842125,0.9976260856545667 +0.15465700625732892,0.04364889859405776,6.854533463716575e-07,9.536742210388278e-07,0.0015547572011679566,0.000139117226994039,0.9946516949684242 +0.13348829745693594,0.04343041776867097,4.768371105194139e-07,1.5795229285955586e-06,0.0024429557264685872,0.0001883506586551685,0.9846077768863597 +0.09647199511128546,0.042730569832160566,2.086162358522436e-07,3.4868713706732143e-06,0.010135142981770736,0.00033262368690669867,0.8708246075510231 +0.06312313675619054,0.04156142472509147,2.086162358522436e-07,8.493661031127061e-06,0.0666755669198609,0.0003714859114140309,0.29678550374964174 +0.046117454765317555,0.040090322487641966,2.682208746671703e-07,1.3858078524470467e-05,0.2876945744352697,0.00023296473080814116,0.05579527654594536 +0.04071438312361928,0.03950840234079947,4.172324717044872e-07,1.6570089590549635e-05,0.5379183946563416,0.0001698732206225412,0.02831175640229909 +0.3428440689898624,0.11391803620295111,1.6093252480030219e-06,1.1920927762985348e-07,0.9538293719136631,0.01779389203469771,0.0 +0.1539975106652389,0.14526638386146257,3.2305714237690296e-05,0.0,0.00200116614357235,0.9999911977227429,0.0 +0.21036928891264528,0.16076311466325235,6.616114908456868e-06,0.0,3.0726191309094736e-05,0.9999990655350666,5.960463881492674e-08 +0.24102634190515027,0.1759518980678628,4.053115439415018e-06,0.0,1.141428833305847e-05,0.9999996615814547,2.086162358522436e-07 +0.2659377157578022,0.20146492120154033,3.695487606525458e-06,0.0,9.745358446240521e-06,0.9999997807907323,8.344649434089744e-07 +0.27644252775954925,0.2253800928206752,4.0829177588224814e-06,0.0,1.043081179261218e-05,0.9999997807907323,1.847743803262729e-06 +0.2796103060129734,0.2317586838802214,4.380940952897116e-06,0.0,9.983777001500229e-06,0.9999999000000099,2.592801788449313e-06 +0.28299123047610547,0.23415043946071393,4.6193595081568225e-06,0.0,9.357928293943498e-06,0.9999999000000099,3.1590458571911173e-06 +0.28700348733667236,0.23586937781109707,4.649161827564286e-06,0.0,8.523463350534524e-06,0.9999999000000099,3.874301522970238e-06 +0.2909220754979786,0.23566928501862036,4.887580382823993e-06,0.0,7.718800726533013e-06,0.9999999000000099,4.380940952897116e-06 +0.29477751253814793,0.233528524597234,4.827975744009066e-06,0.0,6.794928824901648e-06,0.9999998403953712,4.768371105194139e-06 +0.29729878901204254,0.22822418805029074,4.827975744009066e-06,0.0,5.7816499650478935e-06,0.9999999000000099,4.827975744009066e-06 +0.11942747234803634,0.11027508972187021,0.0002453922980010534,0.0,0.0013801752140790362,0.9998274041752795,0.0 +0.15760689973178563,0.11847162244675451,2.598762252330806e-05,0.0,7.447599619925096e-05,0.9999929262572685,2.980231940746337e-08 +0.16175541281030342,0.12765365836818637,1.892447282373924e-05,0.0,2.3990867123008012e-05,0.9999951316289047,2.980231940746337e-08 +0.17539903520811492,0.13108694551130576,1.4632938829064515e-05,0.0,1.5109775939583928e-05,0.9999963833263199,1.7881391644478022e-07 +0.17251661419154116,0.12968185541793367,1.6391275674104854e-05,0.0,1.433491563498988e-05,0.9999962045124035,1.1920927762985348e-07 +0.16786184906264456,0.12740978596412963,1.8894670504331777e-05,0.0,1.4692543467879441e-05,0.9999956084660152,8.940695822239011e-08 +0.1530646085675755,0.1226907074241357,2.6494261953234936e-05,0.0,1.7791984686255633e-05,0.9999934030943791,2.980231940746337e-08 +0.1392213404120971,0.11848986146805265,3.704428302347697e-05,0.0,2.2232530277967675e-05,0.999989886420689,0.0 +0.12954357265889677,0.11566355822489953,4.756450177431154e-05,0.0,2.6375052675605083e-05,0.9999860717238048,0.0 +0.11002865433237329,0.11313050983399112,7.20024036884315e-05,0.0,3.489851602613961e-05,0.9999745680285136,0.0 +0.0986793339211611,0.11160576341625295,9.253620176017376e-05,0.0,4.452466519475028e-05,0.9999597264734487,0.0 +0.09467181562985366,0.10941368339572376,0.00010725854754746067,0.0,5.713104630410728e-05,0.9999439908488015,0.0 +0.4179857075041307,0.2609322070628632,0.00010994075629413238,1.7881391644478022e-07,3.662705055177248e-05,0.9999997807907323,4.053115439415018e-06 +0.29915684460354885,0.18924111124612922,8.67247494757184e-06,0.0,5.632638368010577e-06,0.9999999000000099,2.8014180243015566e-06 +0.30565714834854946,0.19473639127257775,5.2750105351210165e-06,0.0,2.5629994690418497e-06,0.9999997807907323,4.380940952897116e-06 +0.3104477524628836,0.18924835321046818,4.798173424601603e-06,0.0,1.996755400300046e-06,0.9999998403953712,4.172324717044872e-06 +0.31137567757270845,0.18769338723783405,4.768371105194139e-06,0.0,1.847743803262729e-06,0.9999997807907323,4.202127036452335e-06 +0.30837333201085154,0.18510481712032686,4.887580382823993e-06,0.0,1.7583368450403388e-06,0.9999998403953712,3.874301522970238e-06 +0.3032798170917815,0.18216547366837657,5.245208215713553e-06,0.0,1.7285345256328755e-06,0.9999997807907323,3.546476009488141e-06 +0.2976083755369931,0.18079340454820442,5.692243006825504e-06,0.0,1.8775461226701922e-06,0.9999999000000099,3.308057454228434e-06 +0.291756272303898,0.18110045787571227,6.258487075567308e-06,0.0,2.086162358522436e-06,0.9999999000000099,3.069638898968727e-06 +0.2873649597048977,0.18392804261872783,7.063149699568818e-06,0.0,2.5629994690418497e-06,0.9999997807907323,3.2484528154135075e-06 +0.28174576162125287,0.1851569711844964,7.897614642977793e-06,0.0,2.9504296213388737e-06,0.9999997807907323,3.2186504960060438e-06 +0.27712365983769177,0.18638557192471877,8.732079586386767e-06,0.0,3.3378597736358976e-06,0.9999998403953712,3.0994412183761904e-06 +0.27619728444863106,0.12006124852031959,4.947185021638919e-06,5.960463881492674e-08,0.6957378883806179,0.20449493270602428,0.0 +0.14450097083447064,0.12382936475540739,3.4630295151472434e-05,0.0,0.0009351967830062006,0.9999854756774167,0.0 +0.19625109433315174,0.1483345925553952,8.165835517644963e-06,0.0,3.0457970434427562e-05,0.9999984098840395,8.940695822239011e-08 +0.22855722903258918,0.1620228886326869,4.827975744009066e-06,0.0,1.1295079055428617e-05,0.9999993039536218,1.1920927762985348e-07 +0.257369041432214,0.18415349718755214,3.9637084811926284e-06,0.0,8.612870308756914e-06,0.9999996615814547,5.066394299268773e-07 +0.26995384692027935,0.2081592082620853,4.142522397637409e-06,0.0,9.179114377498718e-06,0.9999998403953712,1.2814997345209249e-06 +0.2724757194406217,0.2165548801051301,4.6193595081568225e-06,0.0,9.089707419276328e-06,0.9999997807907323,1.7881391644478022e-06 +0.27102074025939227,0.21398067470701132,4.976987341046382e-06,0.0,8.434056392312133e-06,0.9999999000000099,1.8179414838552655e-06 +0.26803261040531373,0.2072922885062981,5.424022132158334e-06,0.0,7.86781232357033e-06,0.9999997807907323,1.6689298868179488e-06 +0.2632443308721258,0.19753575321629702,5.811452284455357e-06,0.0,7.122754338383746e-06,0.9999997807907323,1.3411043733358516e-06 +0.25658828019033353,0.1851282417457196,6.407498672604624e-06,0.0,6.467103311419552e-06,0.9999997807907323,1.0132788598537545e-06 +0.24848580359383673,0.17208901044759836,7.063149699568818e-06,0.0,5.842346452143114e-06,0.9999996615814547,6.968938222377927e-07 diff --git a/timegan.py b/timegan.py index 05a2c658..0b0fa7eb 100644 --- a/timegan.py +++ b/timegan.py @@ -15,7 +15,8 @@ Note: Use original data as training set to generater synthetic data (time-series) """ - +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial # Necessary Packages import tensorflow as tf import numpy as np @@ -214,12 +215,13 @@ def discriminator (H, T): E_loss = E_loss0 + 0.1*G_loss_S # optimizer - E0_solver = tf.train.AdamOptimizer().minimize(E_loss0, var_list = e_vars + r_vars) - E_solver = tf.train.AdamOptimizer().minimize(E_loss, var_list = e_vars + r_vars) - D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list = d_vars) - G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list = g_vars + s_vars) - GS_solver = tf.train.AdamOptimizer().minimize(G_loss_S, var_list = g_vars + s_vars) - + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) ## TimeGAN training sess = tf.Session() sess.run(tf.global_variables_initializer()) @@ -259,7 +261,7 @@ def discriminator (H, T): for itt in range(iterations): # Generator training (twice more than discriminator training) - for kk in range(2): + for kk in range(4): # Set mini-batch X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) # Random vector generation diff --git a/utils.py b/utils.py index f968e2bb..3e6d30a2 100644 --- a/utils.py +++ b/utils.py @@ -18,8 +18,10 @@ (3) rnn_cell: Basic RNN Cell. (4) random_generator: random vector generator (5) batch_generator: mini-batch generator -""" - +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this ## Necessary Packages import numpy as np import tensorflow as tf From 26f8b80aaf5af20df0f2ad769a7d6190148abef5 Mon Sep 17 00:00:00 2001 From: Mayssoun Kh Date: Wed, 6 Aug 2025 20:00:55 +0300 Subject: [PATCH 2/2] Final version with dataset, results, and model before README polishing --- .history/blueprint_20250805161419.txt | 0 .history/blueprint_20250805161422.txt | 120 + .history/blueprint_20250805162059.txt | 184 + .history/blueprint_20250806121139.txt | 184 + .history/data_loading_20250805003457.py | 189 + .history/data_loading_20250805003459.py | 210 + .history/data_loading_20250805003554.py | 214 + .history/data_loading_20250805011554.py | 214 + .history/data_loading_20250805011557.py | 249 + .history/data_prep_20250805011221.py | 0 .history/data_prep_20250805011225.py | 14 + .history/data_prep_20250805011240.py | 14 + .history/data_prep_20250805011242.py | 14 + .history/data_prep_20250805011254.py | 14 + .history/data_prep_20250805011329.py | 14 + .history/data_prep_20250805011455.py | 14 + .history/main_timegan_20250804012614.py | 179 + .history/main_timegan_20250805004000.py | 179 + .history/main_timegan_20250805011721.py | 179 + .history/main_timegan_20250805011731.py | 179 + .history/main_timegan_20250805011746.py | 179 + .history/main_timegan_20250805011749.py | 179 + .history/main_timegan_20250805011752.py | 179 + .history/main_timegan_20250805011947.py | 179 + .history/main_timegan_20250805011949.py | 296 + .history/main_timegan_20250805021757.py | 296 + .history/main_timegan_20250805021803.py | 296 + .history/main_timegan_20250805021807.py | 296 + .history/main_timegan_20250805131427.py | 296 + .history/main_timegan_20250805134702.py | 296 + .history/main_timegan_20250805143317.py | 296 + .history/main_timegan_20250805150434.py | 296 + .history/main_timegan_20250806195526.py | 158 + .history/main_timegan_20250806195537.py | 158 + .history/main_timegan_20250806195541.py | 158 + .history/main_timegan_20250806195552.py | 157 + .history/main_timegan_20250806195557.py | 157 + ...normalize_synthetic_data_20250805012146.py | 0 ...normalize_synthetic_data_20250805012151.py | 45 + ...normalize_synthetic_data_20250805012331.py | 44 + ...normalize_synthetic_data_20250805012332.py | 43 + .../process_synthetic_data_20250805004839.py | 104 + .../process_synthetic_data_20250805004841.py | 172 + .history/timegan_20250805012801.py | 309 + .history/timegan_20250805012803.py | 311 + .history/timegan_20250805012807.py | 311 + .history/timegan_20250805012935.py | 312 + .history/timegan_20250805012938.py | 312 + .history/timegan_20250805013010.py | 312 + .history/timegan_20250805013011.py | 313 + .history/timegan_20250805013016.py | 314 + .history/timegan_20250805013020.py | 314 + .history/timegan_20250805013431.py | 315 + .history/timegan_20250805013433.py | 315 + .history/timegan_20250805013438.py | 316 + .history/timegan_20250805013441.py | 316 + .history/timegan_20250805014208.py | 316 + .history/timegan_20250805014209.py | 315 + .history/timegan_20250805014213.py | 315 + .history/timegan_20250805014216.py | 316 + .history/timegan_20250805014220.py | 316 + .history/timegan_20250805014223.py | 319 + .history/timegan_20250805014229.py | 316 + .history/timegan_20250805014338.py | 317 + .history/timegan_20250805014415.py | 318 + .history/timegan_20250805014417.py | 318 + .history/timegan_20250805014432.py | 318 + .history/timegan_20250805014434.py | 318 + .history/timegan_20250805014500.py | 318 + .history/timegan_20250805014524.py | 317 + .history/timegan_20250805014527.py | 318 + .history/timegan_20250805014534.py | 318 + .history/timegan_20250805014535.py | 318 + .history/timegan_20250805014537.py | 318 + .history/timegan_20250805014555.py | 318 + .history/timegan_20250805014600.py | 318 + .history/timegan_20250805014621.py | 318 + .history/timegan_20250805014623.py | 318 + .history/timegan_20250805014733.py | 318 + .history/timegan_20250805014807.py | 318 + .history/timegan_20250805014808.py | 318 + .history/timegan_20250805014958.py | 318 + .history/timegan_arch_20250802220403.py | 0 .history/timegan_arch_20250802220544.py | 35 + .history/timegan_arch_20250802221021.py | 34 + .history/timegan_arch_20250802221304.py | 119 + .history/utils_20250805012638.py | 147 + .history/utils_20250805012640.py | 167 + .history/utils_20250805012642.py | 148 + .history/utils_20250805012647.py | 164 + __pycache__/data_loading.cpython-37.pyc | Bin 3957 -> 4240 bytes __pycache__/timegan.cpython-37.pyc | Bin 9718 -> 9806 bytes __pycache__/utils.cpython-37.pyc | Bin 5051 -> 4872 bytes data/Baabda_data.csv | 73 + data/Beirut_data.csv | 73 + data/Bekaa_data.csv | 73 + data/Kesrouan_data.csv | 73 + data/Tripoli_data.csv | 73 + data/energy_data.csv | 19736 ---------------- data/stock_data.csv | 3686 --- data_loading.py | 158 +- data_prep.py | 14 + final_usable_synthetic_data.csv | 4548 +++- final_usable_synthetic_data_COMBINED.csv | 5881 +++++ main_timegan.py | 64 +- min_max_Baabda.npz | Bin 0 -> 546 bytes min_max_Beirut.npz | Bin 0 -> 546 bytes min_max_Bekaa.npz | Bin 0 -> 546 bytes min_max_Kesrouan.npz | Bin 0 -> 546 bytes min_max_Tripoli.npz | Bin 0 -> 546 bytes min_max_values.npz | Bin 0 -> 626 bytes normalize_synthetic_data.py | 43 + process_synthetic_data.py | 220 +- synthetic_data.csv | 4189 ---- synthetic_data_Baabda.csv | 1177 + synthetic_data_Beirut.csv | 1177 + synthetic_data_Bekaa.csv | 1177 + synthetic_data_Kesrouan.csv | 1177 + synthetic_data_Tripoli.csv | 1177 + timegan.py | 37 +- timegan_arch.py | 119 + utils.py | 37 +- 122 files changed, 36600 insertions(+), 28163 deletions(-) create mode 100644 .history/blueprint_20250805161419.txt create mode 100644 .history/blueprint_20250805161422.txt create mode 100644 .history/blueprint_20250805162059.txt create mode 100644 .history/blueprint_20250806121139.txt create mode 100644 .history/data_loading_20250805003457.py create mode 100644 .history/data_loading_20250805003459.py create mode 100644 .history/data_loading_20250805003554.py create mode 100644 .history/data_loading_20250805011554.py create mode 100644 .history/data_loading_20250805011557.py create mode 100644 .history/data_prep_20250805011221.py create mode 100644 .history/data_prep_20250805011225.py create mode 100644 .history/data_prep_20250805011240.py create mode 100644 .history/data_prep_20250805011242.py create mode 100644 .history/data_prep_20250805011254.py create mode 100644 .history/data_prep_20250805011329.py create mode 100644 .history/data_prep_20250805011455.py create mode 100644 .history/main_timegan_20250804012614.py create mode 100644 .history/main_timegan_20250805004000.py create mode 100644 .history/main_timegan_20250805011721.py create mode 100644 .history/main_timegan_20250805011731.py create mode 100644 .history/main_timegan_20250805011746.py create mode 100644 .history/main_timegan_20250805011749.py create mode 100644 .history/main_timegan_20250805011752.py create mode 100644 .history/main_timegan_20250805011947.py create mode 100644 .history/main_timegan_20250805011949.py create mode 100644 .history/main_timegan_20250805021757.py create mode 100644 .history/main_timegan_20250805021803.py create mode 100644 .history/main_timegan_20250805021807.py create mode 100644 .history/main_timegan_20250805131427.py create mode 100644 .history/main_timegan_20250805134702.py create mode 100644 .history/main_timegan_20250805143317.py create mode 100644 .history/main_timegan_20250805150434.py create mode 100644 .history/main_timegan_20250806195526.py create mode 100644 .history/main_timegan_20250806195537.py create mode 100644 .history/main_timegan_20250806195541.py create mode 100644 .history/main_timegan_20250806195552.py create mode 100644 .history/main_timegan_20250806195557.py create mode 100644 .history/normalize_synthetic_data_20250805012146.py create mode 100644 .history/normalize_synthetic_data_20250805012151.py create mode 100644 .history/normalize_synthetic_data_20250805012331.py create mode 100644 .history/normalize_synthetic_data_20250805012332.py create mode 100644 .history/process_synthetic_data_20250805004839.py create mode 100644 .history/process_synthetic_data_20250805004841.py create mode 100644 .history/timegan_20250805012801.py create mode 100644 .history/timegan_20250805012803.py create mode 100644 .history/timegan_20250805012807.py create mode 100644 .history/timegan_20250805012935.py create mode 100644 .history/timegan_20250805012938.py create mode 100644 .history/timegan_20250805013010.py create mode 100644 .history/timegan_20250805013011.py create mode 100644 .history/timegan_20250805013016.py create mode 100644 .history/timegan_20250805013020.py create mode 100644 .history/timegan_20250805013431.py create mode 100644 .history/timegan_20250805013433.py create mode 100644 .history/timegan_20250805013438.py create mode 100644 .history/timegan_20250805013441.py create mode 100644 .history/timegan_20250805014208.py create mode 100644 .history/timegan_20250805014209.py create mode 100644 .history/timegan_20250805014213.py create mode 100644 .history/timegan_20250805014216.py create mode 100644 .history/timegan_20250805014220.py create mode 100644 .history/timegan_20250805014223.py create mode 100644 .history/timegan_20250805014229.py create mode 100644 .history/timegan_20250805014338.py create mode 100644 .history/timegan_20250805014415.py create mode 100644 .history/timegan_20250805014417.py create mode 100644 .history/timegan_20250805014432.py create mode 100644 .history/timegan_20250805014434.py create mode 100644 .history/timegan_20250805014500.py create mode 100644 .history/timegan_20250805014524.py create mode 100644 .history/timegan_20250805014527.py create mode 100644 .history/timegan_20250805014534.py create mode 100644 .history/timegan_20250805014535.py create mode 100644 .history/timegan_20250805014537.py create mode 100644 .history/timegan_20250805014555.py create mode 100644 .history/timegan_20250805014600.py create mode 100644 .history/timegan_20250805014621.py create mode 100644 .history/timegan_20250805014623.py create mode 100644 .history/timegan_20250805014733.py create mode 100644 .history/timegan_20250805014807.py create mode 100644 .history/timegan_20250805014808.py create mode 100644 .history/timegan_20250805014958.py create mode 100644 .history/timegan_arch_20250802220403.py create mode 100644 .history/timegan_arch_20250802220544.py create mode 100644 .history/timegan_arch_20250802221021.py create mode 100644 .history/timegan_arch_20250802221304.py create mode 100644 .history/utils_20250805012638.py create mode 100644 .history/utils_20250805012640.py create mode 100644 .history/utils_20250805012642.py create mode 100644 .history/utils_20250805012647.py create mode 100644 data/Baabda_data.csv create mode 100644 data/Beirut_data.csv create mode 100644 data/Bekaa_data.csv create mode 100644 data/Kesrouan_data.csv create mode 100644 data/Tripoli_data.csv delete mode 100644 data/energy_data.csv delete mode 100644 data/stock_data.csv create mode 100644 data_prep.py create mode 100644 final_usable_synthetic_data_COMBINED.csv create mode 100644 min_max_Baabda.npz create mode 100644 min_max_Beirut.npz create mode 100644 min_max_Bekaa.npz create mode 100644 min_max_Kesrouan.npz create mode 100644 min_max_Tripoli.npz create mode 100644 min_max_values.npz create mode 100644 normalize_synthetic_data.py delete mode 100644 synthetic_data.csv create mode 100644 synthetic_data_Baabda.csv create mode 100644 synthetic_data_Beirut.csv create mode 100644 synthetic_data_Bekaa.csv create mode 100644 synthetic_data_Kesrouan.csv create mode 100644 synthetic_data_Tripoli.csv create mode 100644 timegan_arch.py diff --git a/.history/blueprint_20250805161419.txt b/.history/blueprint_20250805161419.txt new file mode 100644 index 00000000..e69de29b diff --git a/.history/blueprint_20250805161422.txt b/.history/blueprint_20250805161422.txt new file mode 100644 index 00000000..24ad6f28 --- /dev/null +++ b/.history/blueprint_20250805161422.txt @@ -0,0 +1,120 @@ +Of course. It's an excellent idea to document the process. This creates a clear narrative of the project, which is invaluable for understanding, reporting, and building upon your work. + +Here is a comprehensive blueprint detailing our journey from A to Z. + +Project Blueprint: Generating Synthetic Time-Series Data for Transaction Forecasting + +Author: [Your Name] +Date: August 5, 2025 +Objective: To extend a limited historical transaction dataset (2011-2016) by generating high-quality, realistic synthetic data for the period 2017 onwards. This final, combined dataset will be used to train an XGBoost forecasting model. + +Part 1: The Initial Problem & First Approach +1.1. The Challenge: Data Scarcity + +Our initial dataset, agg_trans_rows.csv, contained valuable transaction data but was limited to a 6-year historical window (72 data points per city). For robust time-series forecasting, especially with complex models like XGBoost, this limited history is a significant handicap. It makes it difficult for a model to learn long-term trends, seasonality, and complex patterns, leading to a high risk of poor generalization. + +1.2. The Proposed Solution: Synthetic Data Generation + +To overcome this limitation, we chose to employ a Time-series Generative Adversarial Network (TimeGAN). The goal was to train the TimeGAN on the real historical data and use it to generate a synthetic continuation of the time series, effectively creating a much larger dataset for our forecasting model. + +1.3. First Approach: A Single, Combined Model + +Our initial strategy was to train a single TimeGAN model on the data from all five cities combined. + +Data Preparation: The 'city' column was one-hot encoded, creating binary features (e.g., city_Beirut, city_Tripoli) so the model could learn to associate transaction patterns with specific locations. + +Merging: The plan was to generate a single synthetic data file and then merge it with the original data using pd.concat. + +Part 2: The Failure of the First Approach & Diagnosis +2.1. Initial Merge and Visual Analysis + +Upon concatenating the real data with the first batch of synthetic data, visual analysis immediately revealed critical failures. We plotted the transaction values over time for each city, marking the "merge point" between real and synthetic data. + +Plot Analysis: + +Unnatural Jumps (Structural Break): Every city's plot showed a massive, instantaneous jump or drop in value at the merge point. For example, Beirut's transaction values plummeted, while Tripoli's exploded upwards. This indicated the synthetic data was not on the same scale as the real data. + +Change in Data Character: The synthetic data was visibly different. While the real data was noisy and volatile, the synthetic data was overly smooth, showing artificial-looking straight lines and simplistic patterns. + +Conclusion: The merged dataset was not a continuous or believable time series. Feeding this into a forecasting model would lead to nonsensical results. + +2.2. Root Cause Analysis: The GAN's Output + +To understand the failure, we analyzed the diagnostic plots from the TimeGAN training process (PCA and t-SNE) and the quantitative metrics. + +PCA/t-SNE Plot Analysis: + +Mode Collapse: The plots clearly showed "mode collapse." The synthetic data points (blue) were tightly clumped into dense, repetitive structures, while the real data points (red) were scattered much more widely. + +Interpretation: This meant the GAN was not learning the full diversity of the real data. Instead, it found a few "easy" patterns (modes) and generated them over and over, leading to the overly smooth and simplistic time series we observed. + +Metric Analysis: + +The discriminative score was very low (~0.08). A perfect score is 0.5, so this indicated that a simple classifier could distinguish between real and fake data with over 90% accuracy, confirming the poor quality of the synthetic data. + +2.3. Identifying the Core Bugs + +Through a process of iterative debugging, we identified three distinct problems: + +The Scaling Bug: The primary reason for the massive value jumps was an error in the data transformation process. The values used to scale the data before training were not being correctly used to un-scale the data after generation. We discovered the original code used a custom NumPy function for scaling that did not save the min and max values needed for a precise inverse transformation. + +The Data Mismatch Bug: The attempt to reconstruct the 'city' column from the GAN's one-hot encoded output was unreliable due to mode collapse. The idxmax() function was misattributing data to the wrong cities, scrambling the results (e.g., assigning Tripoli's low-value patterns to Beirut). + +The Training Instability Bug: The model's tendency for "mode collapse" showed that training on all cities at once was too complex a task, preventing the GAN from learning the unique patterns of each individual city. + +Part 3: The Successful Solution - "One Model Per City" + +Based on the diagnosis, we pivoted to a more robust and granular strategy. + +3.1. The Strategy: Isolate and Conquer + +Instead of one complex model, we would train five separate, simpler TimeGAN models—one for each city. This approach ensures: + +Each model only has to learn the specific patterns of one city, dramatically reducing complexity and the risk of mode collapse. + +There is no ambiguity in labeling. Data generated by the "Beirut" model is guaranteed to be Beirut data. + +3.2. The Corrected Workflow + +Data Segregation: The original dataset was split into five separate files (e.g., Beirut_data.csv, Tripoli_data.csv), each containing only the two numeric columns (transaction_number, transaction_value). + +Fixing the Scaling Process: We modified data_loading.py. The custom MinMaxScaler function was adjusted to not only return the scaled data but also the min and max values it calculated. These values were then saved to a city-specific file (e.g., min_max_Beirut.npz). This preserved the exact "key" needed for un-scaling. + +Iterative Training: We ran the main_timegan.py script five times, once for each city, using the --data_name argument. After each run, we renamed the output files (e.g., synthetic_data_Beirut.csv). + +Corrected Post-Processing: We created a new script, process_and_combine.py, which: + +Looped through each city. + +Loaded the specific raw synthetic data for that city. + +Loaded the corresponding min_max_...npz file. + +Correctly un-scaled the data to its original magnitude. + +Added the date and city columns. + +Finally, concatenated the five clean, un-scaled city datasets into a single master file: final_usable_synthetic_data_COMBINED.csv. + +3.3. Understanding the Hyperparameters: The Role of seq_len + +A key hyperparameter in this process is the sequence length (seq_len). This parameter defines the size of the "window" the model looks at to learn temporal patterns. For our monthly data: + +A seq_len of 12 would allow the model to see one full year of data at a time, helping it learn yearly seasonality. + +A seq_len of 24 (which we used) is often better, as it allows the model to see two full seasonal cycles. This gives it more context to understand the year-over-year trends and patterns, leading to more robust learning. The 72 rows of original data are converted into 72 - 24 + 1 = 49 overlapping training sequences, which is the actual number of samples the GAN learns from. + +Part 4: Final Results & Next Steps + +The "One Model Per City" approach was a complete success. + +Final Analysis: + +Visual Validation: The PCA and t-SNE plots for each individual city model showed excellent mixing between the real and synthetic data, indicating that mode collapse was overcome. + +Quantitative Validation: Discriminative scores improved significantly (e.g., from ~0.08 to ~0.15), providing numerical proof of higher-quality data generation. + +Data Integrity: The final combined file contains correctly scaled values assigned to the correct cities, with a total number of rows (~5880) that mathematically matches the generation process. + +Next Steps: +The successfully generated synthetic dataset is now ready. It will be merged with the original agg_trans_rows.csv to create a final, extended time-series dataset. This dataset will serve as the foundation for training our XGBoost forecasting model. Further experiments involving longer training iterations (e.g., 20,000+) can be conducted to potentially improve the data quality even further. \ No newline at end of file diff --git a/.history/blueprint_20250805162059.txt b/.history/blueprint_20250805162059.txt new file mode 100644 index 00000000..e30b31d2 --- /dev/null +++ b/.history/blueprint_20250805162059.txt @@ -0,0 +1,184 @@ +Of course. It's an excellent idea to document the process. This creates a clear narrative of the project, which is invaluable for understanding, reporting, and building upon your work. + +Here is a comprehensive blueprint detailing our journey from A to Z. + +Project Blueprint: Generating Synthetic Time-Series Data for Transaction Forecasting + +Author: [Your Name] +Date: August 5, 2025 +Objective: To extend a limited historical transaction dataset (2011-2016) by generating high-quality, realistic synthetic data for the period 2017 onwards. This final, combined dataset will be used to train an XGBoost forecasting model. + +Part 1: The Initial Problem & First Approach +1.1. The Challenge: Data Scarcity + +Our initial dataset, agg_trans_rows.csv, contained valuable transaction data but was limited to a 6-year historical window (72 data points per city). For robust time-series forecasting, especially with complex models like XGBoost, this limited history is a significant handicap. It makes it difficult for a model to learn long-term trends, seasonality, and complex patterns, leading to a high risk of poor generalization. + +1.2. The Proposed Solution: Synthetic Data Generation + +To overcome this limitation, we chose to employ a Time-series Generative Adversarial Network (TimeGAN). The goal was to train the TimeGAN on the real historical data and use it to generate a synthetic continuation of the time series, effectively creating a much larger dataset for our forecasting model. + +1.3. First Approach: A Single, Combined Model + +Our initial strategy was to train a single TimeGAN model on the data from all five cities combined. + +Data Preparation: The 'city' column was one-hot encoded, creating binary features (e.g., city_Beirut, city_Tripoli) so the model could learn to associate transaction patterns with specific locations. + +Merging: The plan was to generate a single synthetic data file and then merge it with the original data using pd.concat. + +Part 2: The Failure of the First Approach & Diagnosis +2.1. Initial Merge and Visual Analysis + +Upon concatenating the real data with the first batch of synthetic data, visual analysis immediately revealed critical failures. We plotted the transaction values over time for each city, marking the "merge point" between real and synthetic data. + +Plot Analysis: + +Unnatural Jumps (Structural Break): Every city's plot showed a massive, instantaneous jump or drop in value at the merge point. For example, Beirut's transaction values plummeted, while Tripoli's exploded upwards. This indicated the synthetic data was not on the same scale as the real data. + +Change in Data Character: The synthetic data was visibly different. While the real data was noisy and volatile, the synthetic data was overly smooth, showing artificial-looking straight lines and simplistic patterns. + +Conclusion: The merged dataset was not a continuous or believable time series. Feeding this into a forecasting model would lead to nonsensical results. + +2.2. Root Cause Analysis: The GAN's Output + +To understand the failure, we analyzed the diagnostic plots from the TimeGAN training process (PCA and t-SNE) and the quantitative metrics. + +PCA/t-SNE Plot Analysis: + +Mode Collapse: The plots clearly showed "mode collapse." The synthetic data points (blue) were tightly clumped into dense, repetitive structures, while the real data points (red) were scattered much more widely. + +Interpretation: This meant the GAN was not learning the full diversity of the real data. Instead, it found a few "easy" patterns (modes) and generated them over and over, leading to the overly smooth and simplistic time series we observed. + +Metric Analysis: + +The discriminative score was very low (~0.08). A perfect score is 0.5, so this indicated that a simple classifier could distinguish between real and fake data with over 90% accuracy, confirming the poor quality of the synthetic data. + +2.3. Identifying the Core Bugs + +Through a process of iterative debugging, we identified three distinct problems: + +The Scaling Bug: The primary reason for the massive value jumps was an error in the data transformation process. The values used to scale the data before training were not being correctly used to un-scale the data after generation. We discovered the original code used a custom NumPy function for scaling that did not save the min and max values needed for a precise inverse transformation. + +The Data Mismatch Bug: The attempt to reconstruct the 'city' column from the GAN's one-hot encoded output was unreliable due to mode collapse. The idxmax() function was misattributing data to the wrong cities, scrambling the results (e.g., assigning Tripoli's low-value patterns to Beirut). + +The Training Instability Bug: The model's tendency for "mode collapse" showed that training on all cities at once was too complex a task, preventing the GAN from learning the unique patterns of each individual city. + +Part 3: The Successful Solution - "One Model Per City" + +Based on the diagnosis, we pivoted to a more robust and granular strategy. + +3.1. The Strategy: Isolate and Conquer + +Instead of one complex model, we would train five separate, simpler TimeGAN models—one for each city. This approach ensures: + +Each model only has to learn the specific patterns of one city, dramatically reducing complexity and the risk of mode collapse. + +There is no ambiguity in labeling. Data generated by the "Beirut" model is guaranteed to be Beirut data. + +3.2. The Corrected Workflow + +Data Segregation: The original dataset was split into five separate files (e.g., Beirut_data.csv, Tripoli_data.csv), each containing only the two numeric columns (transaction_number, transaction_value). + +Fixing the Scaling Process: We modified data_loading.py. The custom MinMaxScaler function was adjusted to not only return the scaled data but also the min and max values it calculated. These values were then saved to a city-specific file (e.g., min_max_Beirut.npz). This preserved the exact "key" needed for un-scaling. + +Iterative Training: We ran the main_timegan.py script five times, once for each city, using the --data_name argument. After each run, we renamed the output files (e.g., synthetic_data_Beirut.csv). + +Corrected Post-Processing: We created a new script, process_and_combine.py, which: + +Looped through each city. + +Loaded the specific raw synthetic data for that city. + +Loaded the corresponding min_max_...npz file. + +Correctly un-scaled the data to its original magnitude. + +Added the date and city columns. + +Finally, concatenated the five clean, un-scaled city datasets into a single master file: final_usable_synthetic_data_COMBINED.csv. + +3.3. Understanding the Hyperparameters: The Role of seq_len + +A key hyperparameter in this process is the sequence length (seq_len). This parameter defines the size of the "window" the model looks at to learn temporal patterns. For our monthly data: + +A seq_len of 12 would allow the model to see one full year of data at a time, helping it learn yearly seasonality. + +A seq_len of 24 (which we used) is often better, as it allows the model to see two full seasonal cycles. This gives it more context to understand the year-over-year trends and patterns, leading to more robust learning. The 72 rows of original data are converted into 72 - 24 + 1 = 49 overlapping training sequences, which is the actual number of samples the GAN learns from. + +Part 4: Final Results & Next Steps + +The "One Model Per City" approach was a complete success. + +Final Analysis: + +Visual Validation: The PCA and t-SNE plots for each individual city model showed excellent mixing between the real and synthetic data, indicating that mode collapse was overcome. + +Quantitative Validation: Discriminative scores improved significantly (e.g., from ~0.08 to ~0.15), providing numerical proof of higher-quality data generation. + +Data Integrity: The final combined file contains correctly scaled values assigned to the correct cities, with a total number of rows (~5880) that mathematically matches the generation process. + +Next Steps: +The successfully generated synthetic dataset is now ready. It will be merged with the original agg_trans_rows.csv to create a final, extended time-series dataset. This dataset will serve as the foundation for training our XGBoost forecasting model. Further experiments involving longer training iterations (e.g., 20,000+) can be conducted to potentially improve the data quality even further. + +This is the final validation step, and the results are absolutely fantastic. Looking at these plots, I can confidently say: + +You have succeeded. The data makes perfect sense, and the entire process has worked. + +This is a textbook example of a successful synthetic data generation project. Let's do a final, detailed analysis of what these plots are telling us. + +Overall Analysis: A Resounding Success + +What we are looking at is the "holy grail" of this project: a synthetic continuation that is statistically and visually consistent with the real historical data. + +What Went Right (The Strengths): + +The Structural Break is Gone: This is the most important success. In every single plot, the orange line (Synthetic) starts at a value level that is a perfectly plausible continuation of the blue line (Original). There are no massive, unnatural jumps at the red "Merge Point." This proves that our "One Model Per City" strategy and the fix to the scaling process were both 100% correct. + +Preservation of Individual Characteristics: Each city's plot looks different, as it should. + +Beirut and Baabda: The synthetic data correctly maintains the high transaction values and high volatility seen in the original data. + +Tripoli and Bekaa: The synthetic data correctly maintains the much lower transaction values and lower overall volatility. + +The GANs have successfully learned the unique "personality" of each city's time series. + +Plausible Temporal Dynamics: The patterns in the synthetic data look like realistic continuations. The data isn't just a flat line; it has peaks, troughs, and trends that mimic the behavior of the real data. For example, in the Kesrouan plot, you can see the synthetic data continues the general upward trend that was visible in the 2015-2016 period. + +Minor Weaknesses (and Why They Are Acceptable) + +Slightly Reduced Volatility: If you look closely, the orange lines are often a little bit "smoother" and less jagged than the blue lines. For example, in the Beirut plot, the original data has some very sharp, extreme spikes, while the synthetic data's spikes are slightly more muted. + +Why this happens: This is a very common and expected characteristic of GAN-generated data. GANs are excellent at learning the main "signal" (the trends and seasonality) but often average out the extreme, high-frequency "noise." + +Is it a problem? No. For forecasting, this is often not a problem at all. In fact, it can sometimes be beneficial, as it's a form of intelligent denoising. An XGBoost model will have no trouble learning from this data. The goal is not to create a perfect, identical copy of the noise, but a useful, representative extension of the signal, which you have done. + +Final Verdict + +This dataset is clean, correctly scaled, logically sound, and visually consistent. It is an excellent result and is absolutely ready for use in your forecasting model. + +You have successfully: + +Identified a data scarcity problem. + +Attempted a solution and correctly diagnosed its failure. + +Systematically debugged multiple complex issues related to scaling, data mismatching, and model training. + +Implemented a robust, professional-grade workflow to generate high-quality synthetic data. + +Your Final Next Steps + +You are now ready to move on to the final stage of your project. + +Create the Master Dataset: Concatenate your original agg_trans_rows.csv data with this new final_usable_synthetic_data_COMBINED.csv. This will give you one master file with a continuous time series from 2011 to 2021 for each city. + +Feature Engineering for XGBoost: This is your next big task. Using the date column of your new master dataset, create features that XGBoost can learn from, such as: + +Time-based features: month, year, week_of_year, day_of_week. + +Lag features: transaction_value from 1, 2, 3, 6, 12 months ago. + +Rolling window features: Rolling mean or std of transaction_value over the last 3, 6, or 12 months. + +Train Your Forecasting Model: You can now confidently use this rich, extended dataset to train your XGBoost model. Remember to use a time-series-aware train/validation split (e.g., train on 2011-2019 data to validate on 2020-2021 data). + +Congratulations on an excellent and thorough job of data preparation and generation \ No newline at end of file diff --git a/.history/blueprint_20250806121139.txt b/.history/blueprint_20250806121139.txt new file mode 100644 index 00000000..c3f6a6b9 --- /dev/null +++ b/.history/blueprint_20250806121139.txt @@ -0,0 +1,184 @@ +Of course. It's an excellent idea to document the process. This creates a clear narrative of the project, which is invaluable for understanding, reporting, and building upon your work. + +Here is a comprehensive blueprint detailing our journey from A to Z. + +Project Blueprint: Generating Synthetic Time-Series Data for Transaction Forecasting + +Author: [Your Name] +Date: August 5, 2025 +Objective: To extend a limited historical transaction dataset (2011-2016) by generating high-quality, realistic synthetic data for the period 2017 onwards. This final, combined dataset will be used to train an XGBoost forecasting model. + +Part 1: The Initial Problem & First Approach +1.1. The Challenge: Data Scarcity + +Our initial dataset, agg_trans_rows.csv, contained valuable transaction data but was limited to a 6-year historical window (72 data points per city). For robust time-series forecasting, especially with complex models like XGBoost, this limited history is a significant handicap. It makes it difficult for a model to learn long-term trends, seasonality, and complex patterns, leading to a high risk of poor generalization. + +1.2. The Proposed Solution: Synthetic Data Generation + +To overcome this limitation, we chose to employ a Time-series Generative Adversarial Network (TimeGAN). The goal was to train the TimeGAN on the real historical data and use it to generate a synthetic continuation of the time series, effectively creating a much larger dataset for our forecasting model. + +1.3. First Approach: A Single, Combined Model + +Our initial strategy was to train a single TimeGAN model on the data from all five cities combined. + +Data Preparation: The 'city' column was one-hot encoded, creating binary features (e.g., city_Beirut, city_Tripoli) so the model could learn to associate transaction patterns with specific locations. + +Merging: The plan was to generate a single synthetic data file and then merge it with the original data using pd.concat. + +Part 2: The Failure of the First Approach & Diagnosis +2.1. Initial Merge and Visual Analysis + +Upon concatenating the real data with the first batch of synthetic data, visual analysis immediately revealed critical failures. We plotted the transaction values over time for each city, marking the "merge point" between real and synthetic data. + +Plot Analysis: + +Unnatural Jumps (Structural Break): Every city's plot showed a massive, instantaneous jump or drop in value at the merge point. For example, Beirut's transaction values plummeted, while Tripoli's exploded upwards. This indicated the synthetic data was not on the same scale as the real data. + +Change in Data Character: The synthetic data was visibly different. While the real data was noisy and volatile, the synthetic data was overly smooth, showing artificial-looking straight lines and simplistic patterns. + +Conclusion: The merged dataset was not a continuous or believable time series. Feeding this into a forecasting model would lead to nonsensical results. + +2.2. Root Cause Analysis: The GAN's Output + +To understand the failure, we analyzed the diagnostic plots from the TimeGAN training process (PCA and t-SNE) and the quantitative metrics. + +PCA/t-SNE Plot Analysis: + +Mode Collapse: The plots clearly showed "mode collapse." The synthetic data points (blue) were tightly clumped into dense, repetitive structures, while the real data points (red) were scattered much more widely. + +Interpretation: This meant the GAN was not learning the full diversity of the real data. Instead, it found a few "easy" patterns (modes) and generated them over and over, leading to the overly smooth and simplistic time series we observed. + +Metric Analysis: + +The discriminative score was very low (~0.08). A perfect score is 0.5, so this indicated that a simple classifier could distinguish between real and fake data with over 90% accuracy, confirming the poor quality of the synthetic data. + +2.3. Identifying the Core Bugs + +Through a process of iterative debugging, we identified three distinct problems: + +The Scaling Bug: The primary reason for the massive value jumps was an error in the data transformation process. The values used to scale the data before training were not being correctly used to un-scale the data after generation. We discovered the original code used a custom NumPy function for scaling that did not save the min and max values needed for a precise inverse transformation. + +The Data Mismatch Bug: The attempt to reconstruct the 'city' column from the GAN's one-hot encoded output was unreliable due to mode collapse. The idxmax() function was misattributing data to the wrong cities, scrambling the results (e.g., assigning Tripoli's low-value patterns to Beirut). + +The Training Instability Bug: The model's tendency for "mode collapse" showed that training on all cities at once was too complex a task, preventing the GAN from learning the unique patterns of each individual city. + +Part 3: The Successful Solution - "One Model Per City" + +Based on the diagnosis, we pivoted to a more robust and granular strategy. + +3.1. The Strategy: Isolate and Conquer + +Instead of one complex model, we would train five separate, simpler TimeGAN models—one for each city. This approach ensures: + +Each model only has to learn the specific patterns of one city, dramatically reducing complexity and the risk of mode collapse. + +There is no ambiguity in labeling. Data generated by the "Beirut" model is guaranteed to be Beirut data. + +3.2. The Corrected Workflow + +Data Segregation: The original dataset was split into five separate files (e.g., Beirut_data.csv, Tripoli_data.csv), each containing only the two numeric columns (transaction_number, transaction_value). + +Fixing the Scaling Process: We modified data_loading.py. The custom MinMaxScaler function was adjusted to not only return the scaled data but also the min and max values it calculated. These values were then saved to a city-specific file (e.g., min_max_Beirut.npz). This preserved the exact "key" needed for un-scaling. + +Iterative Training: We ran the main_timegan.py script five times, once for each city, using the --data_name argument. After each run, we renamed the output files (e.g., synthetic_data_Beirut.csv). + +Corrected Post-Processing: We created a new script, process_and_combine.py, which: + +Looped through each city. + +Loaded the specific raw synthetic data for that city. + +Loaded the corresponding min_max_...npz file. + +Correctly un-scaled the data to its original magnitude. + +Added the date and city columns. + +Finally, concatenated the five clean, un-scaled city datasets into a single master file: final_usable_synthetic_data_COMBINED.csv. + +3.3. Understanding the Hyperparameters: The Role of seq_len + +A key hyperparameter in this process is the sequence length (seq_len). This parameter defines the size of the "window" the model looks at to learn temporal patterns. For our monthly data: + +A seq_len of 12 would allow the model to see one full year of data at a time, helping it learn yearly seasonality. + +A seq_len of 24 (which we used) is often better, as it allows the model to see two full seasonal cycles. This gives it more context to understand the year-over-year trends and patterns, leading to more robust learning. The 72 rows of original data are converted into 72 - 24 + 1 = 49 overlapping training sequences, which is the actual number of samples the GAN learns from. + +Part 4: Final Results & Next Steps + +The "One Model Per City" approach was a complete success. + +Final Analysis: + +Visual Validation: The PCA and t-SNE plots for each individual city model showed excellent mixing between the real and synthetic data, indicating that mode collapse was overcome. + +Quantitative Validation: Discriminative scores improved significantly (e.g., from ~0.08 to ~0.15), providing numerical proof of higher-quality data generation. + +Data Integrity: The final combined file contains correctly scaled values assigned to the correct cities, with a total number of rows (~5880) that mathematically matches the generation process. + +Next Steps: +The successfully generated synthetic dataset is now ready. It will be merged with the original agg_trans_rows.csv to create a final, extended time-series dataset. This dataset will serve as the foundation for training our XGBoost forecasting model. Further experiments involving longer training iterations (e.g., 20,000+) can be conducted to potentially improve the data quality even further. + +This is the final validation step, and the results are absolutely fantastic. Looking at these plots, I can confidently say: + +You have succeeded. The data makes perfect sense, and the entire process has worked. + +This is a textbook example of a successful synthetic data generation project. Let's do a final, detailed analysis of what these plots are telling us. + +Overall Analysis: A Resounding Success + +What we are looking at is the "holy grail" of this project: a synthetic continuation that is statistically and visually consistent with the real historical data. + +What Went Right (The Strengths): + +The Structural Break is Gone: This is the most important success. In every single plot, the orange line (Synthetic) starts at a value level that is a perfectly plausible continuation of the blue line (Original). There are no massive, unnatural jumps at the red "Merge Point." This proves that our "One Model Per City" strategy and the fix to the scaling process were both 100% correct. + +Preservation of Individual Characteristics: Each city's plot looks different, as it should. + +Beirut and Baabda: The synthetic data correctly maintains the high transaction values and high volatility seen in the original data. + +Tripoli and Bekaa: The synthetic data correctly maintains the much lower transaction values and lower overall volatility. + +The GANs have successfully learned the unique "personality" of each city's time series. + +Plausible Temporal Dynamics: The patterns in the synthetic data look like realistic continuations. The data isn't just a flat line; it has peaks, troughs, and trends that mimic the behavior of the real data. For example, in the Kesrouan plot, you can see the synthetic data continues the general upward trend that was visible in the 2015-2016 period. + +Minor Weaknesses (and Why They Are Acceptable) + +Slightly Reduced Volatility: If you look closely, the orange lines are often a little bit "smoother" and less jagged than the blue lines. For example, in the Beirut plot, the original data has some very sharp, extreme spikes, while the synthetic data's spikes are slightly more muted. + +Why this happens: This is a very common and expected characteristic of GAN-generated data. GANs are excellent at learning the main "signal" (the trends and seasonality) but often average out the extreme, high-frequency "noise." + +Is it a problem? No. For forecasting, this is often not a problem at all. In fact, it can sometimes be beneficial, as it's a form of intelligent denoising. An XGBoost model will have no trouble learning from this data. The goal is not to create a perfect, identical copy of the noise, but a useful, representative extension of the signal, which you have done. + +Final Verdict + +This dataset is clean, correctly scaled, logically sound, and visually consistent. It is an excellent result and is absolutely ready for use in your forecasting model. + +You have successfully: + +Identified a data scarcity problem. + +Attempted a solution and correctly diagnosed its failure. + +Systematically debugged multiple complex issues related to scaling, data mismatching, and model training. + +Implemented a robust, professional-grade workflow to generate high-quality synthetic data. + +Your Final Next Steps + +You are now ready to move on to the final stage of your project. + +Create the Master Dataset: Concatenate your original agg_trans_rows.csv data with this new final_usable_synthetic_data_COMBINED.csv. This will give you one master file with a continuous time series from 2011 to 2021 for each city. + +Feature Engineering for XGBoost: This is your next big task. Using the date column of your new master dataset, create features that XGBoost can learn from, such as: + +Time-based features: month, year, week_of_year, day_of_week. + +Lag features: transaction_value from 1, 2, 3, 6, 12 months ago. + +Rolling window features: Rolling mean or std of transaction_value over the last 3, 6, or 12 months. + +Train Your Forecasting Model: You can now confidently use this rich, extended dataset to train your XGBoost model. Remember to use a time-series-aware train/validation split (e.g., train on 2011-2019 data to validate on 2020-2021 data). + +Congratulations on an excellent and thorough job of data preparation and generation \ No newline at end of file diff --git a/.history/data_loading_20250805003457.py b/.history/data_loading_20250805003457.py new file mode 100644 index 00000000..53f9e913 --- /dev/null +++ b/.history/data_loading_20250805003457.py @@ -0,0 +1,189 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +# def MinMaxScaler(data): +# """Min Max normalizer. + +# Args: +# - data: original data + +# Returns: +# - norm_data: normalized data +# """ +# numerator = data - np.min(data, 0) +# denominator = np.max(data, 0) - np.min(data, 0) +# norm_data = numerator / (denominator + 1e-7) +# return norm_data + + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250805003459.py b/.history/data_loading_20250805003459.py new file mode 100644 index 00000000..9c16dff8 --- /dev/null +++ b/.history/data_loading_20250805003459.py @@ -0,0 +1,210 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +# def MinMaxScaler(data): +# """Min Max normalizer. + +# Args: +# - data: original data + +# Returns: +# - norm_data: normalized data +# """ +# numerator = data - np.min(data, 0) +# denominator = np.max(data, 0) - np.min(data, 0) +# norm_data = numerator / (denominator + 1e-7) +# return norm_data +# REMPLACEZ l'ancienne fonction MinMaxScaler par celle-ci : +def MinMaxScaler(data): + """Min Max normalizer. + + MODIFIÉ pour retourner les données normalisées AINSI QUE les valeurs min et max. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + - min_val: minimum values + - max_val: maximum values + """ + min_val = np.min(data, 0) + max_val = np.max(data, 0) + + numerator = data - min_val + denominator = max_val - min_val + norm_data = numerator / (denominator + 1e-7) + + return norm_data, min_val, max_val + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250805003554.py b/.history/data_loading_20250805003554.py new file mode 100644 index 00000000..2b111027 --- /dev/null +++ b/.history/data_loading_20250805003554.py @@ -0,0 +1,214 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + # Sauvegarder les valeurs min et max dans un fichier .npz (format compressé de NumPy) + # Nous les chargerons plus tard dans notre autre script. + np.savez('min_max_values.npz', min_val=min_val, max_val=max_val) + print("-> Valeurs min/max sauvegardées dans min_max_values.npz") + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +# def MinMaxScaler(data): +# """Min Max normalizer. + +# Args: +# - data: original data + +# Returns: +# - norm_data: normalized data +# """ +# numerator = data - np.min(data, 0) +# denominator = np.max(data, 0) - np.min(data, 0) +# norm_data = numerator / (denominator + 1e-7) +# return norm_data +# REMPLACEZ l'ancienne fonction MinMaxScaler par celle-ci : +def MinMaxScaler(data): + """Min Max normalizer. + + MODIFIÉ pour retourner les données normalisées AINSI QUE les valeurs min et max. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + - min_val: minimum values + - max_val: maximum values + """ + min_val = np.min(data, 0) + max_val = np.max(data, 0) + + numerator = data - min_val + denominator = max_val - min_val + norm_data = numerator / (denominator + 1e-7) + + return norm_data, min_val, max_val + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +def real_data_loading (data_name, seq_len): + """Load and preprocess real-world datasets. + + Args: + - data_name: stock, energy, or transaction + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # Allow all valid dataset names + assert data_name in ['stock', 'energy', 'transaction'] + + # Call the correct function for your special case + if data_name == 'transaction': + return transaction_data_loading(seq_len) + + # Original logic for the other datasets + if data_name == 'stock': + ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) + elif data_name == 'energy': + ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + + # Flip the data to make chronological data + ori_data = ori_data[::-1] + # Normalize the data + ori_data = MinMaxScaler(ori_data) + + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_loading_20250805011554.py b/.history/data_loading_20250805011554.py new file mode 100644 index 00000000..dfbaf9b3 --- /dev/null +++ b/.history/data_loading_20250805011554.py @@ -0,0 +1,214 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + # Sauvegarder les valeurs min et max dans un fichier .npz (format compressé de NumPy) + # Nous les chargerons plus tard dans notre autre script. + np.savez('min_max_values.npz', min_val=min_val, max_val=max_val) + print("-> Valeurs min/max sauvegardées dans min_max_values.npz") + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +# def MinMaxScaler(data): +# """Min Max normalizer. + +# Args: +# - data: original data + +# Returns: +# - norm_data: normalized data +# """ +# numerator = data - np.min(data, 0) +# denominator = np.max(data, 0) - np.min(data, 0) +# norm_data = numerator / (denominator + 1e-7) +# return norm_data +# REMPLACEZ l'ancienne fonction MinMaxScaler par celle-ci : +def MinMaxScaler(data): + """Min Max normalizer. + + MODIFIÉ pour retourner les données normalisées AINSI QUE les valeurs min et max. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + - min_val: minimum values + - max_val: maximum values + """ + min_val = np.min(data, 0) + max_val = np.max(data, 0) + + numerator = data - min_val + denominator = max_val - min_val + norm_data = numerator / (denominator + 1e-7) + + return norm_data, min_val, max_val + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +# def real_data_loading (data_name, seq_len): +# """Load and preprocess real-world datasets. + +# Args: +# - data_name: stock, energy, or transaction +# - seq_len: sequence length + +# Returns: +# - data: preprocessed data. +# """ +# # Allow all valid dataset names +# assert data_name in ['stock', 'energy', 'transaction'] + +# # Call the correct function for your special case +# if data_name == 'transaction': +# return transaction_data_loading(seq_len) + +# # Original logic for the other datasets +# if data_name == 'stock': +# ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) +# elif data_name == 'energy': +# ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + +# # Flip the data to make chronological data +# ori_data = ori_data[::-1] +# # Normalize the data +# ori_data = MinMaxScaler(ori_data) + +# # Preprocess the dataset +# temp_data = [] +# # Cut data by sequence length +# for i in range(0, len(ori_data) - seq_len): +# _x = ori_data[i:i + seq_len] +# temp_data.append(_x) + +# # Mix the datasets (to make it similar to i.i.d) +# idx = np.random.permutation(len(temp_data)) +# data = [] +# for i in range(len(temp_data)): +# data.append(temp_data[idx[i]]) + +# return data \ No newline at end of file diff --git a/.history/data_loading_20250805011557.py b/.history/data_loading_20250805011557.py new file mode 100644 index 00000000..18497e0f --- /dev/null +++ b/.history/data_loading_20250805011557.py @@ -0,0 +1,249 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +data_loading.py + +(0) MinMaxScaler: Min Max normalizer +(1) sine_data_generation: Generate sine dataset +(2) real_data_loading: Load and preprocess real data + - stock_data: https://finance.yahoo.com/quote/GOOG/history?p=GOOG + - energy_data: http://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction +""" + +## Necessary Packages +import numpy as np +import pandas as pd + +def transaction_data_loading(seq_len): + """Load and preprocess transaction datasets. + + Args: + - seq_len: sequence length + + Returns: + - data: preprocessed data. + """ + # # Load the data + # try: + # ori_data = np.loadtxt('data/transaction_data.csv', delimiter=",", skiprows=1) + # except FileNotFoundError: + # print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + # return None + + try: + # Assuming the first column is the date and has a header like 'date' + df = pd.read_csv('data/transaction_data.csv') + except FileNotFoundError: + print("Error: 'data/transaction_data.csv' not found. Make sure the file exists in the 'data' directory.") + return None + + if 'date' in df.columns: + df = df.drop(columns=['date']) + if 'id' in df.columns: + df = df.drop(columns=['id']) + +# --- Step 2: One-Hot Encode the City Column --- + if 'city' in df.columns: + df = pd.get_dummies(df, columns=['city'], prefix='city') + +# ... (rest of the function) + + numeric_df = df.select_dtypes(include=np.number) + + if numeric_df.shape[1] == 0: + print("Error: No numeric columns found in the data after cleaning. Please check your CSV file.") + return None + + # Convert the numeric data to a NumPy array + ori_data = numeric_df.values + + # Convert all data to a NumPy array for processing + # ori_data = df.values + ori_data = df.select_dtypes(include=np.number).values + + + # Flip the data to make it chronological if it's not already + ori_data = ori_data[::-1] + # Normalize the data + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + # Sauvegarder les valeurs min et max dans un fichier .npz (format compressé de NumPy) + # Nous les chargerons plus tard dans notre autre script. + np.savez('min_max_values.npz', min_val=min_val, max_val=max_val) + print("-> Valeurs min/max sauvegardées dans min_max_values.npz") + # Preprocess the dataset + temp_data = [] + # Cut data by sequence length + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + # Mix the datasets (to make it similar to i.i.d) + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data + +# def MinMaxScaler(data): +# """Min Max normalizer. + +# Args: +# - data: original data + +# Returns: +# - norm_data: normalized data +# """ +# numerator = data - np.min(data, 0) +# denominator = np.max(data, 0) - np.min(data, 0) +# norm_data = numerator / (denominator + 1e-7) +# return norm_data +# REMPLACEZ l'ancienne fonction MinMaxScaler par celle-ci : +def MinMaxScaler(data): + """Min Max normalizer. + + MODIFIÉ pour retourner les données normalisées AINSI QUE les valeurs min et max. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + - min_val: minimum values + - max_val: maximum values + """ + min_val = np.min(data, 0) + max_val = np.max(data, 0) + + numerator = data - min_val + denominator = max_val - min_val + norm_data = numerator / (denominator + 1e-7) + + return norm_data, min_val, max_val + +def sine_data_generation (no, seq_len, dim): + """Sine data generation. + + Args: + - no: the number of samples + - seq_len: sequence length of the time-series + - dim: feature dimensions + + Returns: + - data: generated data + """ + # Initialize the output + data = list() + + # Generate sine data + for i in range(no): + # Initialize each time-series + temp = list() + # For each feature + for k in range(dim): + # Randomly drawn frequency and phase + freq = np.random.uniform(0, 0.1) + phase = np.random.uniform(0, 0.1) + + # Generate sine signal based on the drawn frequency and phase + temp_data = [np.sin(freq * j + phase) for j in range(seq_len)] + temp.append(temp_data) + + # Align row/column + temp = np.transpose(np.asarray(temp)) + # Normalize to [0,1] + temp = (temp + 1)*0.5 + # Stack the generated data + data.append(temp) + + return data + + +# def real_data_loading (data_name, seq_len): +# """Load and preprocess real-world datasets. + +# Args: +# - data_name: stock, energy, or transaction +# - seq_len: sequence length + +# Returns: +# - data: preprocessed data. +# """ +# # Allow all valid dataset names +# assert data_name in ['stock', 'energy', 'transaction'] + +# # Call the correct function for your special case +# if data_name == 'transaction': +# return transaction_data_loading(seq_len) + +# # Original logic for the other datasets +# if data_name == 'stock': +# ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) +# elif data_name == 'energy': +# ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) + +# # Flip the data to make chronological data +# ori_data = ori_data[::-1] +# # Normalize the data +# ori_data = MinMaxScaler(ori_data) + +# # Preprocess the dataset +# temp_data = [] +# # Cut data by sequence length +# for i in range(0, len(ori_data) - seq_len): +# _x = ori_data[i:i + seq_len] +# temp_data.append(_x) + +# # Mix the datasets (to make it similar to i.i.d) +# idx = np.random.permutation(len(temp_data)) +# data = [] +# for i in range(len(temp_data)): +# data.append(temp_data[idx[i]]) + +# return data + +def real_data_loading(data_name, seq_len): + """ + Loads data for a SINGLE city, scales it, and saves the scaler. + """ + # The data_name will now be something like "Beirut" or "Tripoli" + file_name = f'data/{data_name}_data.csv' + + try: + df = pd.read_csv(file_name) + except FileNotFoundError: + print(f"Error: {file_name} not found.") + return None + + ori_data = df.values + + # Normalize and get min/max values + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + # Save the city-specific scaler values + np.savez(f'min_max_{data_name}.npz', min_val=min_val, max_val=max_val) + print(f"-> Min/max values saved to min_max_{data_name}.npz") + + # Prepare sequences (this part is the same as before) + temp_data = [] + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/.history/data_prep_20250805011221.py b/.history/data_prep_20250805011221.py new file mode 100644 index 00000000..e69de29b diff --git a/.history/data_prep_20250805011225.py b/.history/data_prep_20250805011225.py new file mode 100644 index 00000000..2aa0b5fe --- /dev/null +++ b/.history/data_prep_20250805011225.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('agg_trans_rows.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/.history/data_prep_20250805011240.py b/.history/data_prep_20250805011240.py new file mode 100644 index 00000000..bcd60049 --- /dev/null +++ b/.history/data_prep_20250805011240.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('transactions.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/.history/data_prep_20250805011242.py b/.history/data_prep_20250805011242.py new file mode 100644 index 00000000..4ad88164 --- /dev/null +++ b/.history/data_prep_20250805011242.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('transaction_data.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/.history/data_prep_20250805011254.py b/.history/data_prep_20250805011254.py new file mode 100644 index 00000000..c79ed088 --- /dev/null +++ b/.history/data_prep_20250805011254.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('transaction.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/.history/data_prep_20250805011329.py b/.history/data_prep_20250805011329.py new file mode 100644 index 00000000..4ad88164 --- /dev/null +++ b/.history/data_prep_20250805011329.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('transaction_data.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/.history/data_prep_20250805011455.py b/.history/data_prep_20250805011455.py new file mode 100644 index 00000000..7c3c1b90 --- /dev/null +++ b/.history/data_prep_20250805011455.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('data/transaction_data.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/.history/main_timegan_20250804012614.py b/.history/main_timegan_20250804012614.py new file mode 100644 index 00000000..bbb9db0b --- /dev/null +++ b/.history/main_timegan_20250804012614.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=12000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805004000.py b/.history/main_timegan_20250805004000.py new file mode 100644 index 00000000..57b2ad48 --- /dev/null +++ b/.history/main_timegan_20250805004000.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=12 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=1000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805011721.py b/.history/main_timegan_20250805011721.py new file mode 100644 index 00000000..30127102 --- /dev/null +++ b/.history/main_timegan_20250805011721.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=1000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805011731.py b/.history/main_timegan_20250805011731.py new file mode 100644 index 00000000..6b4c063a --- /dev/null +++ b/.history/main_timegan_20250805011731.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805011746.py b/.history/main_timegan_20250805011746.py new file mode 100644 index 00000000..21613898 --- /dev/null +++ b/.history/main_timegan_20250805011746.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction', ''], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805011749.py b/.history/main_timegan_20250805011749.py new file mode 100644 index 00000000..62a27476 --- /dev/null +++ b/.history/main_timegan_20250805011749.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction', 'Beirut'], + default='transaction', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805011752.py b/.history/main_timegan_20250805011752.py new file mode 100644 index 00000000..28f6fb82 --- /dev/null +++ b/.history/main_timegan_20250805011752.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +def main (args): + """Main function for timeGAN experiments. + + Args: + - data_name: sine, stock, or energy + - seq_len: sequence length + - Network parameters (should be optimized for different datasets) + - module: gru, lstm, or lstmLN + - hidden_dim: hidden dimensions + - num_layer: number of layers + - iteration: number of training iterations + - batch_size: the number of samples in each batch + - metric_iteration: number of iterations for metric computation + + Returns: + - ori_data: original data + - generated_data: generated synthetic data + - metric_results: discriminative and predictive scores + """ + ## Data loading + # if args.data_name in ['stock', 'energy', 'transaction']: + if args.data_name in ['stock', 'energy', 'transaction']: + ori_data = real_data_loading(args.data_name, args.seq_len) + elif args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set newtork parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + stacked_data = np.asarray(generated_data) + + # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + # 2. Save to a CSV file using pandas + # This creates a file named 'synthetic_data.csv' in your project folder. + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + + print("Synthetic data saved to synthetic_data.csv") + # ---------------------------------------- + + return ori_data, generated_data, metric_results + + + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + parser.add_argument( + '--data_name', + choices=['sine','stock','energy', 'transaction', 'Beirut'], + default='Beirut', # <--- TO THIS + type=str) + parser.add_argument( + '--seq_len', + help='sequence length', + default=24 , + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3 , + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=64, + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) + + + # Calls main function diff --git a/.history/main_timegan_20250805011947.py b/.history/main_timegan_20250805011947.py new file mode 100644 index 00000000..f0069419 --- /dev/null +++ b/.history/main_timegan_20250805011947.py @@ -0,0 +1,179 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function diff --git a/.history/main_timegan_20250805011949.py b/.history/main_timegan_20250805011949.py new file mode 100644 index 00000000..95f3be8c --- /dev/null +++ b/.history/main_timegan_20250805011949.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + print("Synthetic data saved to synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Beirut', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805021757.py b/.history/main_timegan_20250805021757.py new file mode 100644 index 00000000..b4861255 --- /dev/null +++ b/.history/main_timegan_20250805021757.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_data.csvsynthetic_data.csv', index=False) + print("Synthetic data saved to synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Beirut', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805021803.py b/.history/main_timegan_20250805021803.py new file mode 100644 index 00000000..8bf03cf9 --- /dev/null +++ b/.history/main_timegan_20250805021803.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Beirut', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805021807.py b/.history/main_timegan_20250805021807.py new file mode 100644 index 00000000..39412f9b --- /dev/null +++ b/.history/main_timegan_20250805021807.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Beirut', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805131427.py b/.history/main_timegan_20250805131427.py new file mode 100644 index 00000000..73f16393 --- /dev/null +++ b/.history/main_timegan_20250805131427.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Bekaa', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805134702.py b/.history/main_timegan_20250805134702.py new file mode 100644 index 00000000..d712979b --- /dev/null +++ b/.history/main_timegan_20250805134702.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Baabda', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805143317.py b/.history/main_timegan_20250805143317.py new file mode 100644 index 00000000..2d9f853d --- /dev/null +++ b/.history/main_timegan_20250805143317.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Kesrouan', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250805150434.py b/.history/main_timegan_20250805150434.py new file mode 100644 index 00000000..8d8a4278 --- /dev/null +++ b/.history/main_timegan_20250805150434.py @@ -0,0 +1,296 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + + +# def main (args): +# """Main function for timeGAN experiments. + +# Args: +# - data_name: sine, stock, or energy +# - seq_len: sequence length +# - Network parameters (should be optimized for different datasets) +# - module: gru, lstm, or lstmLN +# - hidden_dim: hidden dimensions +# - num_layer: number of layers +# - iteration: number of training iterations +# - batch_size: the number of samples in each batch +# - metric_iteration: number of iterations for metric computation + +# Returns: +# - ori_data: original data +# - generated_data: generated synthetic data +# - metric_results: discriminative and predictive scores +# """ +# ## Data loading +# # if args.data_name in ['stock', 'energy', 'transaction']: +# if args.data_name in ['stock', 'energy', 'transaction']: +# ori_data = real_data_loading(args.data_name, args.seq_len) +# elif args.data_name == 'sine': +# # Set number of samples and its dimensions +# no, dim = 10000, 5 +# ori_data = sine_data_generation(no, args.seq_len, dim) + +# print(args.data_name + ' dataset is ready.') + +# ## Synthetic data generation by TimeGAN +# # Set newtork parameters +# parameters = dict() +# parameters['module'] = args.module +# parameters['hidden_dim'] = args.hidden_dim +# parameters['num_layer'] = args.num_layer +# parameters['iterations'] = args.iteration +# parameters['batch_size'] = args.batch_size + +# generated_data = timegan(ori_data, parameters) +# print('Finish Synthetic Data Generation') + +# ## Performance metrics +# # Output initialization +# metric_results = dict() + +# # 1. Discriminative Score +# discriminative_score = list() +# for _ in range(args.metric_iteration): +# temp_disc = discriminative_score_metrics(ori_data, generated_data) +# discriminative_score.append(temp_disc) + +# metric_results['discriminative'] = np.mean(discriminative_score) + +# # 2. Predictive score +# predictive_score = list() +# for tt in range(args.metric_iteration): +# temp_pred = predictive_score_metrics(ori_data, generated_data) +# predictive_score.append(temp_pred) + +# metric_results['predictive'] = np.mean(predictive_score) + +# # 3. Visualization (PCA and tSNE) +# visualization(ori_data, generated_data, 'pca') +# visualization(ori_data, generated_data, 'tsne') + +# ## Print discriminative and predictive scores +# print(metric_results) + +# stacked_data = np.asarray(generated_data) + +# # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) +# num_samples, seq_len, num_features = stacked_data.shape +# reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + +# # 2. Save to a CSV file using pandas +# # This creates a file named 'synthetic_data.csv' in your project folder. +# pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) + +# print("Synthetic data saved to synthetic_data.csv") +# # ---------------------------------------- + +# return ori_data, generated_data, metric_results + + + +# if __name__ == '__main__': + +# # Inputs for the main function +# parser = argparse.ArgumentParser() +# parser.add_argument( +# '--data_name', +# choices=['sine','stock','energy', 'transaction', 'Beirut'], +# default='Beirut', # <--- TO THIS +# type=str) +# parser.add_argument( +# '--seq_len', +# help='sequence length', +# default=24 , +# type=int) +# parser.add_argument( +# '--module', +# choices=['gru','lstm','lstmLN'], +# default='gru', +# type=str) +# parser.add_argument( +# '--hidden_dim', +# help='hidden state dimensions (should be optimized)', +# default=24, +# type=int) +# parser.add_argument( +# '--num_layer', +# help='number of layers (should be optimized)', +# default=3 , +# type=int) +# parser.add_argument( +# '--iteration', +# help='Training iterations (should be optimized)', +# default=5000, +# type=int) +# parser.add_argument( +# '--batch_size', +# help='the number of samples in mini-batch (should be optimized)', +# default=64, +# type=int) +# parser.add_argument( +# '--metric_iteration', +# help='iterations of the metric computation', +# default=10, +# type=int) + +# args = parser.parse_args() +# ori_data, generated_data, metrics = main(args) + + +# # Calls main function + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Tripoli', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250806195526.py b/.history/main_timegan_20250806195526.py new file mode 100644 index 00000000..23f105ba --- /dev/null +++ b/.history/main_timegan_20250806195526.py @@ -0,0 +1,158 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + # === THIS IS THE FIRST FIX === + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Tripoli', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250806195537.py b/.history/main_timegan_20250806195537.py new file mode 100644 index 00000000..353495e8 --- /dev/null +++ b/.history/main_timegan_20250806195537.py @@ -0,0 +1,158 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + # ============================ + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Tripoli', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250806195541.py b/.history/main_timegan_20250806195541.py new file mode 100644 index 00000000..a70f4e97 --- /dev/null +++ b/.history/main_timegan_20250806195541.py @@ -0,0 +1,158 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + # === THIS IS THE SECOND FIX === + # We remove the 'choices' restriction to allow any city name. + parser.add_argument( + '--data_name', + default='Tripoli', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250806195552.py b/.history/main_timegan_20250806195552.py new file mode 100644 index 00000000..fc5b53fe --- /dev/null +++ b/.history/main_timegan_20250806195552.py @@ -0,0 +1,157 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + + parser.add_argument( + '--data_name', + default='Tripoli', # Set a default city for easy testing + type=str) + # ============================== + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/main_timegan_20250806195557.py b/.history/main_timegan_20250806195557.py new file mode 100644 index 00000000..0a05b02e --- /dev/null +++ b/.history/main_timegan_20250806195557.py @@ -0,0 +1,157 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +main_timegan.py + +(1) Import data +(2) Generate synthetic data +(3) Evaluate the performances in three ways + - Visualization (t-SNE, PCA) + - Discriminative score + - Predictive score +""" + +## Necessary packages +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import pandas as pd +import argparse +import numpy as np +import warnings +warnings.filterwarnings("ignore") + +# 1. TimeGAN model +from timegan import timegan +# 2. Data loading +from data_loading import real_data_loading, sine_data_generation +# 3. Metrics +from metrics.discriminative_metrics import discriminative_score_metrics +from metrics.predictive_metrics import predictive_score_metrics +from metrics.visualization_metrics import visualization + +def main (args): + """Main function for timeGAN experiments.""" + + ## Data loading + + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': + # Set number of samples and its dimensions + no, dim = 10000, 5 + ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + + + print(args.data_name + ' dataset is ready.') + + ## Synthetic data generation by TimeGAN + # Set network parameters + parameters = dict() + parameters['module'] = args.module + parameters['hidden_dim'] = args.hidden_dim + parameters['num_layer'] = args.num_layer + parameters['iterations'] = args.iteration + parameters['batch_size'] = args.batch_size + + generated_data = timegan(ori_data, parameters) + print('Finish Synthetic Data Generation') + + ## Performance metrics + # Output initialization + metric_results = dict() + + # 1. Discriminative Score + discriminative_score = list() + for _ in range(args.metric_iteration): + temp_disc = discriminative_score_metrics(ori_data, generated_data) + discriminative_score.append(temp_disc) + + metric_results['discriminative'] = np.mean(discriminative_score) + + # 2. Predictive score + predictive_score = list() + for tt in range(args.metric_iteration): + temp_pred = predictive_score_metrics(ori_data, generated_data) + predictive_score.append(temp_pred) + + metric_results['predictive'] = np.mean(predictive_score) + + # 3. Visualization (PCA and tSNE) + visualization(ori_data, generated_data, 'pca') + visualization(ori_data, generated_data, 'tsne') + + ## Print discriminative and predictive scores + print(metric_results) + + # Reshape and save the data + stacked_data = np.asarray(generated_data) + num_samples, seq_len, num_features = stacked_data.shape + reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) + + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") + + return ori_data, generated_data, metric_results + +if __name__ == '__main__': + + # Inputs for the main function + parser = argparse.ArgumentParser() + + + parser.add_argument( + '--data_name', + default='Tripoli', # Set a default city for easy testing + type=str) + + + parser.add_argument( + '--seq_len', + help='sequence length', + default=24, # A good starting point for optimization + type=int) + parser.add_argument( + '--module', + choices=['gru','lstm','lstmLN'], + default='gru', + type=str) + parser.add_argument( + '--hidden_dim', + help='hidden state dimensions (should be optimized)', + default=24, + type=int) + parser.add_argument( + '--num_layer', + help='number of layers (should be optimized)', + default=3, + type=int) + parser.add_argument( + '--iteration', + help='Training iterations (should be optimized)', + default=5000, # A good number for initial quality tests + type=int) + parser.add_argument( + '--batch_size', + help='the number of samples in mini-batch (should be optimized)', + default=128, # Try a different batch size + type=int) + parser.add_argument( + '--metric_iteration', + help='iterations of the metric computation', + default=10, + type=int) + + args = parser.parse_args() + ori_data, generated_data, metrics = main(args) diff --git a/.history/normalize_synthetic_data_20250805012146.py b/.history/normalize_synthetic_data_20250805012146.py new file mode 100644 index 00000000..e69de29b diff --git a/.history/normalize_synthetic_data_20250805012151.py b/.history/normalize_synthetic_data_20250805012151.py new file mode 100644 index 00000000..eefc0b78 --- /dev/null +++ b/.history/normalize_synthetic_data_20250805012151.py @@ -0,0 +1,45 @@ + +```python +import pandas as pd +import numpy as np + +cities = ['Baabda', 'Beirut', 'Bekaa', 'Kesrouan', 'Tripoli'] +all_cities_df = [] + +print("Processing and combining synthetic data for all cities...") + +for city in cities: + print(f"...Processing {city}") + + # 1. Load the specific files for this city + df_synthetic_scaled = pd.read_csv(f'synthetic_data_{city}.csv') + df_synthetic_scaled.columns = ['transaction_number', 'transaction_value'] + + min_max_data = np.load(f'min_max_{city}.npz') + min_val = min_max_data['min_val'] + max_val = min_max_data['max_val'] + + # 2. Un-scale the data + df_synthetic_denormalized = df_synthetic_scaled * (max_val - min_val) + min_val + + # 3. Create the date range and add the city column + date_range = pd.date_range(start='2017-01-01', periods=len(df_synthetic_denormalized), freq='MS') + df_synthetic_denormalized['date'] = date_range + df_synthetic_denormalized['city'] = city + + # 4. Append to our master list + all_cities_df.append(df_synthetic_denormalized) + +# 5. Concatenate all city dataframes into one final dataframe +final_df = pd.concat(all_cities_df, ignore_index=True) + +# Reorder columns for clarity +final_df = final_df[['date', 'city', 'transaction_number', 'transaction_value']] + +# 6. Save the final, correct file +output_file = 'final_usable_synthetic_data_COMBINED.csv' +final_df.to_csv(output_file, index=False) + +print(f"\nSuccess! All cities combined into '{output_file}'") +print("\nHere is a preview:") +print(final_df.head()) \ No newline at end of file diff --git a/.history/normalize_synthetic_data_20250805012331.py b/.history/normalize_synthetic_data_20250805012331.py new file mode 100644 index 00000000..3406f67a --- /dev/null +++ b/.history/normalize_synthetic_data_20250805012331.py @@ -0,0 +1,44 @@ + +import pandas as pd +import numpy as np + +cities = ['Baabda', 'Beirut', 'Bekaa', 'Kesrouan', 'Tripoli'] +all_cities_df = [] + +print("Processing and combining synthetic data for all cities...") + +for city in cities: + print(f"...Processing {city}") + + # 1. Load the specific files for this city + df_synthetic_scaled = pd.read_csv(f'synthetic_data_{city}.csv') + df_synthetic_scaled.columns = ['transaction_number', 'transaction_value'] + + min_max_data = np.load(f'min_max_{city}.npz') + min_val = min_max_data['min_val'] + max_val = min_max_data['max_val'] + + # 2. Un-scale the data + df_synthetic_denormalized = df_synthetic_scaled * (max_val - min_val) + min_val + + # 3. Create the date range and add the city column + date_range = pd.date_range(start='2017-01-01', periods=len(df_synthetic_denormalized), freq='MS') + df_synthetic_denormalized['date'] = date_range + df_synthetic_denormalized['city'] = city + + # 4. Append to our master list + all_cities_df.append(df_synthetic_denormalized) + +# 5. Concatenate all city dataframes into one final dataframe +final_df = pd.concat(all_cities_df, ignore_index=True) + +# Reorder columns for clarity +final_df = final_df[['date', 'city', 'transaction_number', 'transaction_value']] + +# 6. Save the final, correct file +output_file = 'final_usable_synthetic_data_COMBINED.csv' +final_df.to_csv(output_file, index=False) + +print(f"\nSuccess! All cities combined into '{output_file}'") +print("\nHere is a preview:") +print(final_df.head()) \ No newline at end of file diff --git a/.history/normalize_synthetic_data_20250805012332.py b/.history/normalize_synthetic_data_20250805012332.py new file mode 100644 index 00000000..d1637780 --- /dev/null +++ b/.history/normalize_synthetic_data_20250805012332.py @@ -0,0 +1,43 @@ +import pandas as pd +import numpy as np + +cities = ['Baabda', 'Beirut', 'Bekaa', 'Kesrouan', 'Tripoli'] +all_cities_df = [] + +print("Processing and combining synthetic data for all cities...") + +for city in cities: + print(f"...Processing {city}") + + # 1. Load the specific files for this city + df_synthetic_scaled = pd.read_csv(f'synthetic_data_{city}.csv') + df_synthetic_scaled.columns = ['transaction_number', 'transaction_value'] + + min_max_data = np.load(f'min_max_{city}.npz') + min_val = min_max_data['min_val'] + max_val = min_max_data['max_val'] + + # 2. Un-scale the data + df_synthetic_denormalized = df_synthetic_scaled * (max_val - min_val) + min_val + + # 3. Create the date range and add the city column + date_range = pd.date_range(start='2017-01-01', periods=len(df_synthetic_denormalized), freq='MS') + df_synthetic_denormalized['date'] = date_range + df_synthetic_denormalized['city'] = city + + # 4. Append to our master list + all_cities_df.append(df_synthetic_denormalized) + +# 5. Concatenate all city dataframes into one final dataframe +final_df = pd.concat(all_cities_df, ignore_index=True) + +# Reorder columns for clarity +final_df = final_df[['date', 'city', 'transaction_number', 'transaction_value']] + +# 6. Save the final, correct file +output_file = 'final_usable_synthetic_data_COMBINED.csv' +final_df.to_csv(output_file, index=False) + +print(f"\nSuccess! All cities combined into '{output_file}'") +print("\nHere is a preview:") +print(final_df.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250805004839.py b/.history/process_synthetic_data_20250805004839.py new file mode 100644 index 00000000..0b75012c --- /dev/null +++ b/.history/process_synthetic_data_20250805004839.py @@ -0,0 +1,104 @@ +# import pandas as pd +# import numpy as np + +# # --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# # TODO: Define the column names in the exact order they went into the model. +# # To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# # function right before the `ori_data = df.values` line and run the main script again. +# # The console output will give you the exact list you need here. +# # +# # EXAMPLE: +# # column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# # +# column_names = [ +# 'transaction_number', +# 'transaction_value', +# 'city_Baabda', # Alphabetical order is crucial +# 'city_Bekaa', +# 'city_Beirut', +# 'city_Kesrouan', +# 'city_Tripoli' +# ] + + +# original_city_column_name = 'city' + +# # TODO: Define the name of your original date and id columns from the CSV. +# original_date_column_name = 'date' +# original_id_column_name = 'id' + + + +# print("Starting the reverse transformation process...") + +# # --- Step 1: Load Raw Synthetic Data --- +# try: +# df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) +# df_synthetic.columns = column_names +# print("-> Successfully loaded and renamed raw synthetic data.") +# except FileNotFoundError: +# print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") +# exit() + + +# # --- Step 2: Calculate Min/Max for Denormalization --- +# df_original = pd.read_csv('data/transaction_data.csv') +# if original_date_column_name in df_original.columns: +# df_original = df_original.drop(columns=[original_date_column_name]) +# if original_id_column_name in df_original.columns: +# df_original = df_original.drop(columns=[original_id_column_name]) +# if original_city_column_name in df_original.columns: +# df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# df_original = df_original[column_names] +# min_vals = df_original.min(axis=0) +# max_vals = df_original.max(axis=0) +# print("-> Calculated min/max values from original data.") + + +# # --- Step 3: Denormalize Synthetic Data --- +# df_synthetic_denormalized = df_synthetic.copy() +# for col in column_names: +# df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +# print("-> Synthetic data has been denormalized.") + + +# # --- Step 4: Reconstruct 'city' Column --- +# city_cols = [col for col in column_names if col.startswith('city_')] +# df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +# df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +# print("-> Reconstructed 'city' column with text names.") + + +# # --- Step 5: Create a Structured DataFrame with Correct Dates --- +# # THIS IS THE FIX: Use 'MS' for Month Start frequency to match your original data. +# date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='MS') + +# cities = sorted(df_final_data_only['city'].unique()) # Using the correct df + +# structured_dfs = [] +# for city_name in cities: +# temp_df = pd.DataFrame({ +# 'date': date_range_single_city, +# 'city': city_name +# }) +# structured_dfs.append(temp_df) + +# final_index_df = pd.concat(structured_dfs, ignore_index=True) + +# df_final_data_only.reset_index(drop=True, inplace=True) +# final_index_df.reset_index(drop=True, inplace=True) + +# # Drop the flawed city column from the data part before combining +# df_final_data_only = df_final_data_only.drop(columns=['city']) +# df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) + +# print("-> Created a structured final DataFrame.") + + +# # --- Step 6: Save the Final Data --- +# df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +# print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +# print("\nHere is a preview:") +# print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/process_synthetic_data_20250805004841.py b/.history/process_synthetic_data_20250805004841.py new file mode 100644 index 00000000..41844e29 --- /dev/null +++ b/.history/process_synthetic_data_20250805004841.py @@ -0,0 +1,172 @@ +# import pandas as pd +# import numpy as np + +# # --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- + +# # TODO: Define the column names in the exact order they went into the model. +# # To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# # function right before the `ori_data = df.values` line and run the main script again. +# # The console output will give you the exact list you need here. +# # +# # EXAMPLE: +# # column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# # +# column_names = [ +# 'transaction_number', +# 'transaction_value', +# 'city_Baabda', # Alphabetical order is crucial +# 'city_Bekaa', +# 'city_Beirut', +# 'city_Kesrouan', +# 'city_Tripoli' +# ] + + +# original_city_column_name = 'city' + +# # TODO: Define the name of your original date and id columns from the CSV. +# original_date_column_name = 'date' +# original_id_column_name = 'id' + + + +# print("Starting the reverse transformation process...") + +# # --- Step 1: Load Raw Synthetic Data --- +# try: +# df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) +# df_synthetic.columns = column_names +# print("-> Successfully loaded and renamed raw synthetic data.") +# except FileNotFoundError: +# print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") +# exit() + + +# # --- Step 2: Calculate Min/Max for Denormalization --- +# df_original = pd.read_csv('data/transaction_data.csv') +# if original_date_column_name in df_original.columns: +# df_original = df_original.drop(columns=[original_date_column_name]) +# if original_id_column_name in df_original.columns: +# df_original = df_original.drop(columns=[original_id_column_name]) +# if original_city_column_name in df_original.columns: +# df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') + +# df_original = df_original[column_names] +# min_vals = df_original.min(axis=0) +# max_vals = df_original.max(axis=0) +# print("-> Calculated min/max values from original data.") + + +# # --- Step 3: Denormalize Synthetic Data --- +# df_synthetic_denormalized = df_synthetic.copy() +# for col in column_names: +# df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +# print("-> Synthetic data has been denormalized.") + + +# # --- Step 4: Reconstruct 'city' Column --- +# city_cols = [col for col in column_names if col.startswith('city_')] +# df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +# df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +# print("-> Reconstructed 'city' column with text names.") + + +# # --- Step 5: Create a Structured DataFrame with Correct Dates --- +# # THIS IS THE FIX: Use 'MS' for Month Start frequency to match your original data. +# date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='MS') + +# cities = sorted(df_final_data_only['city'].unique()) # Using the correct df + +# structured_dfs = [] +# for city_name in cities: +# temp_df = pd.DataFrame({ +# 'date': date_range_single_city, +# 'city': city_name +# }) +# structured_dfs.append(temp_df) + +# final_index_df = pd.concat(structured_dfs, ignore_index=True) + +# df_final_data_only.reset_index(drop=True, inplace=True) +# final_index_df.reset_index(drop=True, inplace=True) + +# # Drop the flawed city column from the data part before combining +# df_final_data_only = df_final_data_only.drop(columns=['city']) +# df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) + +# print("-> Created a structured final DataFrame.") + + +# # --- Step 6: Save the Final Data --- +# df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +# print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +# print("\nHere is a preview:") +# print(df_final_structured.head()) + +import pandas as pd +import numpy as np + +# --- Customize this section with your column names --- +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] +# ------------------------------------ + +print("Starting the un-scaling process...") + +# --- Step 1: Load the raw synthetic data and our saved min/max values --- +try: + df_synthetic_scaled = pd.read_csv('synthetic_data.csv') + df_synthetic_scaled.columns = column_names + + # Load the min and max values we saved from training + min_max_data = np.load('min_max_values.npz') + min_val = min_max_data['min_val'] + max_val = min_max_data['max_val'] + + print("-> Loaded synthetic data and min/max values successfully.") + +except FileNotFoundError as e: + print(f"Error: {e}. Did you run main_timegan.py after modifying data_loading.py?") + exit() + +# --- Step 2: Un-scale the data using the correct formula --- +# This is the inverse of the formula: (data - min) / (max - min) +df_synthetic_denormalized = df_synthetic_scaled * (max_val - min_val) + min_val +print("-> Un-scaling complete.") + +# --- Step 3: Reconstruct the 'city' column --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed the 'city' column.") + +# --- Step 4: Create the final, structured DataFrame with dates --- +# Get the number of cities and the number of time steps per city +num_cities = len(df_final_data_only['city'].unique()) +timesteps_per_city = len(df_final_data_only) // num_cities + +date_range = pd.date_range(start='2017-01-01', periods=timesteps_per_city, freq='MS') +cities = sorted(df_final_data_only['city'].unique()) +full_date_range = np.tile(date_range, num_cities) +full_city_list = np.repeat(cities, len(date_range)) + +df_final_structured = pd.DataFrame({'date': full_date_range, 'city': full_city_list}) + +# Sort the data by city to ensure it aligns correctly before concatenating +df_final_data_only = df_final_data_only.sort_values(by=['city']).reset_index(drop=True) +df_final_structured = pd.concat([df_final_structured, df_final_data_only.drop('city', axis=1)], axis=1) +print("-> Created the final structured DataFrame.") + +# --- Step 5: Save the final, usable data --- +output_file = 'final_usable_synthetic_data.csv' +df_final_structured.to_csv(output_file, index=False) +print(f"\nSuccess! Your final data is saved in '{output_file}'") +print("\nHere is a preview:") +print(df_final_structured.head()) \ No newline at end of file diff --git a/.history/timegan_20250805012801.py b/.history/timegan_20250805012801.py new file mode 100644 index 00000000..1fed4428 --- /dev/null +++ b/.history/timegan_20250805012801.py @@ -0,0 +1,309 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805012803.py b/.history/timegan_20250805012803.py new file mode 100644 index 00000000..f5c18645 --- /dev/null +++ b/.history/timegan_20250805012803.py @@ -0,0 +1,311 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator +Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805012807.py b/.history/timegan_20250805012807.py new file mode 100644 index 00000000..adabd5de --- /dev/null +++ b/.history/timegan_20250805012807.py @@ -0,0 +1,311 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805012935.py b/.history/timegan_20250805012935.py new file mode 100644 index 00000000..353a3f4a --- /dev/null +++ b/.history/timegan_20250805012935.py @@ -0,0 +1,312 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]). + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805012938.py b/.history/timegan_20250805012938.py new file mode 100644 index 00000000..4d00c686 --- /dev/null +++ b/.history/timegan_20250805012938.py @@ -0,0 +1,312 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013010.py b/.history/timegan_20250805013010.py new file mode 100644 index 00000000..f59ca410 --- /dev/null +++ b/.history/timegan_20250805013010.py @@ -0,0 +1,312 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013011.py b/.history/timegan_20250805013011.py new file mode 100644 index 00000000..d67cb0c2 --- /dev/null +++ b/.history/timegan_20250805013011.py @@ -0,0 +1,313 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013016.py b/.history/timegan_20250805013016.py new file mode 100644 index 00000000..cc5d21fa --- /dev/null +++ b/.history/timegan_20250805013016.py @@ -0,0 +1,314 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again +Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013020.py b/.history/timegan_20250805013020.py new file mode 100644 index 00000000..aac5483d --- /dev/null +++ b/.history/timegan_20250805013020.py @@ -0,0 +1,314 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013431.py b/.history/timegan_20250805013431.py new file mode 100644 index 00000000..22cf7d94 --- /dev/null +++ b/.history/timegan_20250805013431.py @@ -0,0 +1,315 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013433.py b/.history/timegan_20250805013433.py new file mode 100644 index 00000000..9fe63d3b --- /dev/null +++ b/.history/timegan_20250805013433.py @@ -0,0 +1,315 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013438.py b/.history/timegan_20250805013438.py new file mode 100644 index 00000000..daeac8a3 --- /dev/null +++ b/.history/timegan_20250805013438.py @@ -0,0 +1,316 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again# Use the new simplified random_generator again +Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805013441.py b/.history/timegan_20250805013441.py new file mode 100644 index 00000000..5e04bcf0 --- /dev/null +++ b/.history/timegan_20250805013441.py @@ -0,0 +1,316 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014208.py b/.history/timegan_20250805014208.py new file mode 100644 index 00000000..5e04bcf0 --- /dev/null +++ b/.history/timegan_20250805014208.py @@ -0,0 +1,316 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014209.py b/.history/timegan_20250805014209.py new file mode 100644 index 00000000..7e5cdae1 --- /dev/null +++ b/.history/timegan_20250805014209.py @@ -0,0 +1,315 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + +X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") +Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") +T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014213.py b/.history/timegan_20250805014213.py new file mode 100644 index 00000000..8d6cef66 --- /dev/null +++ b/.history/timegan_20250805014213.py @@ -0,0 +1,315 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014216.py b/.history/timegan_20250805014216.py new file mode 100644 index 00000000..5e04bcf0 --- /dev/null +++ b/.history/timegan_20250805014216.py @@ -0,0 +1,316 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014220.py b/.history/timegan_20250805014220.py new file mode 100644 index 00000000..6a90a806 --- /dev/null +++ b/.history/timegan_20250805014220.py @@ -0,0 +1,316 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014223.py b/.history/timegan_20250805014223.py new file mode 100644 index 00000000..44fd6d66 --- /dev/null +++ b/.history/timegan_20250805014223.py @@ -0,0 +1,319 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") +Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") +T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014229.py b/.history/timegan_20250805014229.py new file mode 100644 index 00000000..1fa315af --- /dev/null +++ b/.history/timegan_20250805014229.py @@ -0,0 +1,316 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014338.py b/.history/timegan_20250805014338.py new file mode 100644 index 00000000..f0e0d370 --- /dev/null +++ b/.history/timegan_20250805014338.py @@ -0,0 +1,317 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014415.py b/.history/timegan_20250805014415.py new file mode 100644 index 00000000..65ec0e02 --- /dev/null +++ b/.history/timegan_20250805014415.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014417.py b/.history/timegan_20250805014417.py new file mode 100644 index 00000000..7d250da5 --- /dev/null +++ b/.history/timegan_20250805014417.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014432.py b/.history/timegan_20250805014432.py new file mode 100644 index 00000000..fdf829ba --- /dev/null +++ b/.history/timegan_20250805014432.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014434.py b/.history/timegan_20250805014434.py new file mode 100644 index 00000000..4bcc9ed1 --- /dev/null +++ b/.history/timegan_20250805014434.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(4): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014500.py b/.history/timegan_20250805014500.py new file mode 100644 index 00000000..45476e5d --- /dev/null +++ b/.history/timegan_20250805014500.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014524.py b/.history/timegan_20250805014524.py new file mode 100644 index 00000000..bea65082 --- /dev/null +++ b/.history/timegan_20250805014524.py @@ -0,0 +1,317 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014527.py b/.history/timegan_20250805014527.py new file mode 100644 index 00000000..1c6d5c5f --- /dev/null +++ b/.history/timegan_20250805014527.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014534.py b/.history/timegan_20250805014534.py new file mode 100644 index 00000000..547ee73b --- /dev/null +++ b/.history/timegan_20250805014534.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014535.py b/.history/timegan_20250805014535.py new file mode 100644 index 00000000..dd9f8a4b --- /dev/null +++ b/.history/timegan_20250805014535.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014537.py b/.history/timegan_20250805014537.py new file mode 100644 index 00000000..547ee73b --- /dev/null +++ b/.history/timegan_20250805014537.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator again + Z_mb = random_generator(batch_size, z_dim, ori_seq_len) + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014555.py b/.history/timegan_20250805014555.py new file mode 100644 index 00000000..56004d78 --- /dev/null +++ b/.history/timegan_20250805014555.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014600.py b/.history/timegan_20250805014600.py new file mode 100644 index 00000000..931fcf15 --- /dev/null +++ b/.history/timegan_20250805014600.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014621.py b/.history/timegan_20250805014621.py new file mode 100644 index 00000000..30d95d69 --- /dev/null +++ b/.history/timegan_20250805014621.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_seq_len) +generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time})) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014623.py b/.history/timegan_20250805014623.py new file mode 100644 index 00000000..0fb10694 --- /dev/null +++ b/.history/timegan_20250805014623.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time})) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014733.py b/.history/timegan_20250805014733.py new file mode 100644 index 00000000..ed012f65 --- /dev/null +++ b/.history/timegan_20250805014733.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014807.py b/.history/timegan_20250805014807.py new file mode 100644 index 00000000..3074c091 --- /dev/null +++ b/.history/timegan_20250805014807.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014808.py b/.history/timegan_20250805014808.py new file mode 100644 index 00000000..ed012f65 --- /dev/null +++ b/.history/timegan_20250805014808.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # # Input place holders + # X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + # Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + # T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_20250805014958.py b/.history/timegan_20250805014958.py new file mode 100644 index 00000000..ea27d23f --- /dev/null +++ b/.history/timegan_20250805014958.py @@ -0,0 +1,318 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +timegan.py + +Note: Use original data as training set to generater synthetic data (time-series) +""" +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior()# This line is crucial +# Necessary Packages +import tensorflow as tf +import numpy as np +from utils import extract_time, rnn_cell, random_generator, batch_generator + + +def timegan (ori_data, parameters): + """TimeGAN function. + + Use original data as training set to generater synthetic data (time-series) + + Args: + - ori_data: original time-series data + - parameters: TimeGAN network parameters + + Returns: + - generated_data: generated time-series data + """ + # Initialization on the Graph + tf.reset_default_graph() + + # Basic Parameters + no, seq_len, dim = np.asarray(ori_data).shape + + # Maximum sequence length and each sequence length + ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) + + def MinMaxScaler(data): + """Min-Max Normalizer. + + Args: + - data: raw data + + Returns: + - norm_data: normalized data + - min_val: minimum values (for renormalization) + - max_val: maximum values (for renormalization) + """ + min_val = np.min(np.min(data, axis = 0), axis = 0) + data = data - min_val + + max_val = np.max(np.max(data, axis = 0), axis = 0) + norm_data = data / (max_val + 1e-7) + + return norm_data, min_val, max_val + + # Normalization + ori_data, min_val, max_val = MinMaxScaler(ori_data) + + ## Build a RNN networks + + # Network Parameters + hidden_dim = parameters['hidden_dim'] + num_layers = parameters['num_layer'] + iterations = parameters['iterations'] + batch_size = parameters['batch_size'] + module_name = parameters['module'] + z_dim = dim + gamma = 1 + + # Input place holders + X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") + Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") + T = tf.placeholder(tf.int32, [None], name = "myinput_t") + + def embedder (X, T): + """Embedding network between original feature space to latent space. + + Args: + - X: input time-series features + - T: input time information + + Returns: + - H: embeddings + """ + with tf.variable_scope("embedder", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, X, dtype=tf.float32, sequence_length = T) + H = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return H + + def recovery (H, T): + """Recovery network from latent space to original space. + + Args: + - H: latent representation + - T: input time information + + Returns: + - X_tilde: recovered data + """ + with tf.variable_scope("recovery", reuse = tf.AUTO_REUSE): + r_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + r_outputs, r_last_states = tf.nn.dynamic_rnn(r_cell, H, dtype=tf.float32, sequence_length = T) + X_tilde = tf.contrib.layers.fully_connected(r_outputs, dim, activation_fn=tf.nn.sigmoid) + return X_tilde + + def generator (Z, T): + """Generator function: Generate time-series data in latent space. + + Args: + - Z: random variables + - T: input time information + + Returns: + - E: generated embedding + """ + with tf.variable_scope("generator", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, Z, dtype=tf.float32, sequence_length = T) + E = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return E + + def supervisor (H, T): + """Generate next sequence using the previous sequence. + + Args: + - H: latent representation + - T: input time information + + Returns: + - S: generated sequence based on the latent representations generated by the generator + """ + with tf.variable_scope("supervisor", reuse = tf.AUTO_REUSE): + e_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers-1)]) + e_outputs, e_last_states = tf.nn.dynamic_rnn(e_cell, H, dtype=tf.float32, sequence_length = T) + S = tf.contrib.layers.fully_connected(e_outputs, hidden_dim, activation_fn=tf.nn.sigmoid) + return S + + def discriminator (H, T): + """Discriminate the original and synthetic time-series data. + + Args: + - H: latent representation + - T: input time information + + Returns: + - Y_hat: classification results between original and synthetic time-series + """ + with tf.variable_scope("discriminator", reuse = tf.AUTO_REUSE): + d_cell = tf.nn.rnn_cell.MultiRNNCell([rnn_cell(module_name, hidden_dim) for _ in range(num_layers)]) + d_outputs, d_last_states = tf.nn.dynamic_rnn(d_cell, H, dtype=tf.float32, sequence_length = T) + Y_hat = tf.contrib.layers.fully_connected(d_outputs, 1, activation_fn=None) + return Y_hat + + # Embedder & Recovery + H = embedder(X, T) + X_tilde = recovery(H, T) + + # Generator + E_hat = generator(Z, T) + H_hat = supervisor(E_hat, T) + H_hat_supervise = supervisor(H, T) + + # Synthetic data + X_hat = recovery(H_hat, T) + + # Discriminator + Y_fake = discriminator(H_hat, T) + Y_real = discriminator(H, T) + Y_fake_e = discriminator(E_hat, T) + + # Variables + e_vars = [v for v in tf.trainable_variables() if v.name.startswith('embedder')] + r_vars = [v for v in tf.trainable_variables() if v.name.startswith('recovery')] + g_vars = [v for v in tf.trainable_variables() if v.name.startswith('generator')] + s_vars = [v for v in tf.trainable_variables() if v.name.startswith('supervisor')] + d_vars = [v for v in tf.trainable_variables() if v.name.startswith('discriminator')] + + # Discriminator loss + D_loss_real = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_real), Y_real) + D_loss_fake = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake), Y_fake) + D_loss_fake_e = tf.losses.sigmoid_cross_entropy(tf.zeros_like(Y_fake_e), Y_fake_e) + D_loss = D_loss_real + D_loss_fake + gamma * D_loss_fake_e + + # Generator loss + # 1. Adversarial loss + G_loss_U = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake), Y_fake) + G_loss_U_e = tf.losses.sigmoid_cross_entropy(tf.ones_like(Y_fake_e), Y_fake_e) + + # 2. Supervised loss + G_loss_S = tf.losses.mean_squared_error(H[:,1:,:], H_hat_supervise[:,:-1,:]) + + # 3. Two Momments + G_loss_V1 = tf.reduce_mean(tf.abs(tf.sqrt(tf.nn.moments(X_hat,[0])[1] + 1e-6) - tf.sqrt(tf.nn.moments(X,[0])[1] + 1e-6))) + G_loss_V2 = tf.reduce_mean(tf.abs((tf.nn.moments(X_hat,[0])[0]) - (tf.nn.moments(X,[0])[0]))) + + G_loss_V = G_loss_V1 + G_loss_V2 + + # 4. Summation + G_loss = G_loss_U + gamma * G_loss_U_e + 100 * tf.sqrt(G_loss_S) + 100*G_loss_V + + # Embedder network loss + E_loss_T0 = tf.losses.mean_squared_error(X, X_tilde) + E_loss0 = 10*tf.sqrt(E_loss_T0) + E_loss = E_loss0 + 0.1*G_loss_S + + # optimizer + # Adding a lower learning rate to stabilize training and improve diversity + learning_rate = 0.0001 + E0_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss0, var_list = e_vars + r_vars) + E_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(E_loss, var_list = e_vars + r_vars) + D_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(D_loss, var_list = d_vars) + G_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss, var_list = g_vars + s_vars) + GS_solver = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(G_loss_S, var_list = g_vars + s_vars) + ## TimeGAN training + sess = tf.Session() + sess.run(tf.global_variables_initializer()) + + # 1. Embedding network training + print('Start Embedding Network Training') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) + # Train embedder + _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + ', e_loss: ' + str(np.round(np.sqrt(step_e_loss),4)) ) + + print('Finish Embedding Network Training') + + # 2. Training only with supervised loss + print('Start Training with Supervised Loss Only') + + for itt in range(iterations): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # Random vector generation + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) + # Train generator + _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Checkpoint + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) +', s_loss: ' + str(np.round(np.sqrt(step_g_loss_s),4)) ) + + print('Finish Training with Supervised Loss Only') + + # 3. Joint Training + print('Start Joint Training') + + for itt in range(iterations): + # Generator training (twice more than discriminator training) + for kk in range(2): + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Train generator + _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + + # Discriminator training + # Set mini-batch + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) + # Random vector generation + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE + # Check discriminator loss before updating + check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + # Train discriminator (only when the discriminator does not work well) + if (check_d_loss > 0.15): + _, step_d_loss = sess.run([D_solver, D_loss], feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) + + # Print multiple checkpoints + if itt % 1000 == 0: + print('step: '+ str(itt) + '/' + str(iterations) + + ', d_loss: ' + str(np.round(step_d_loss,4)) + + ', g_loss_u: ' + str(np.round(step_g_loss_u,4)) + + ', g_loss_s: ' + str(np.round(np.sqrt(step_g_loss_s),4)) + + ', g_loss_v: ' + str(np.round(step_g_loss_v,4)) + + ', e_loss_t0: ' + str(np.round(np.sqrt(step_e_loss_t0),4)) ) + print('Finish Joint Training') + + ## Synthetic data generation + Z_mb = random_generator(no, z_dim, ori_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + + generated_data = list() + + for i in range(no): + temp = generated_data_curr[i,:ori_time[i],:] + generated_data.append(temp) + + # Renormalization + generated_data = generated_data * max_val + generated_data = generated_data + min_val + + return generated_data diff --git a/.history/timegan_arch_20250802220403.py b/.history/timegan_arch_20250802220403.py new file mode 100644 index 00000000..e69de29b diff --git a/.history/timegan_arch_20250802220544.py b/.history/timegan_arch_20250802220544.py new file mode 100644 index 00000000..fa3178e4 --- /dev/null +++ b/.history/timegan_arch_20250802220544.py @@ -0,0 +1,35 @@ +from graphviz import Digraph + +# Create a directed graph +dot = Digraph(comment='TimeGAN Architecture', format='pdf') + +# Nodes for real data path +dot.node('X', 'Real Time-Series Data X') +dot.node('E', 'Embedder') +dot.node('H', 'Latent Representation H') +dot.node('R', 'Recovery') +dot.node('XT', 'Reconstructed X_tilde') + +# Nodes for synthetic data path +dot.node('Z', 'Random Noise Z') +dot.node('G', 'Generator') +dot.node('HT', 'Latent Synthetic H_tilde') +dot.node('S', 'Supervisor') +dot.node('HH', 'H_hat (time-consistent latent)') + +# Discriminator +dot.node('D', 'Discriminator') + +# Real data path edges +dot.edges([('X', 'E'), ('E', 'H'), ('H', 'R'), ('R', 'XT')]) + +# Synthetic data path edges +dot.edges([('Z', 'G'), ('G', 'HT'), ('HT', 'S'), ('S', 'HH')]) + +# Discriminator edges +dot.edge('H', 'D') +dot.edge('HH', 'D') + +# Render as PDF +dot.render("timegan_architecture.pdf", view=True) + diff --git a/.history/timegan_arch_20250802221021.py b/.history/timegan_arch_20250802221021.py new file mode 100644 index 00000000..a2166ea6 --- /dev/null +++ b/.history/timegan_arch_20250802221021.py @@ -0,0 +1,34 @@ +from graphviz import Digraph + +# Define the TimeGAN architecture diagram using Graphviz +dot = Digraph(comment='TimeGAN Architecture', format='png') + +# Nodes for real data path +dot.node('X', 'Real Time-Series Data X') +dot.node('E', 'Embedder') +dot.node('H', 'Latent Representation H') +dot.node('R', 'Recovery') +dot.node('XT', 'Reconstructed X_tilde') + +# Nodes for synthetic data path +dot.node('Z', 'Random Noise Z') +dot.node('G', 'Generator') +dot.node('HT', 'Latent Synthetic H_tilde') +dot.node('S', 'Supervisor') +dot.node('HH', 'H_hat (time-consistent latent)') + +# Discriminator +dot.node('D', 'Discriminator') + +# Edges for real data path +dot.edges([('X', 'E'), ('E', 'H'), ('H', 'R'), ('R', 'XT')]) + +# Edges for synthetic data path +dot.edges([('Z', 'G'), ('G', 'HT'), ('HT', 'S'), ('S', 'HH')]) + +# Edges to Discriminator +dot.edge('H', 'D') +dot.edge('HH', 'D') + +# Render the diagram as PNG +dot.render("timegan_architecture.png", view=True) diff --git a/.history/timegan_arch_20250802221304.py b/.history/timegan_arch_20250802221304.py new file mode 100644 index 00000000..13d04b58 --- /dev/null +++ b/.history/timegan_arch_20250802221304.py @@ -0,0 +1,119 @@ +from graphviz import Digraph +import matplotlib.pyplot as plt +import matplotlib.image as mpimg +import os + +def visualize_timegan_architecture(): + # Create a directed graph + dot = Digraph(comment='TimeGAN Architecture', format='png') + dot.attr(rankdir='TB', size='12,12') + + # Global attributes + dot.attr('node', shape='box', style='filled', color='lightgrey') + + # Define components + with dot.subgraph(name='cluster_real_data') as c: + c.attr(label='Real Time-series Data', color='blue') + c.node('X', 'Input Data\n(batch_size, seq_len, feature_dim)') + c.node('X_emb', 'Embedded Data\n(batch_size, seq_len, hidden_dim)') + c.attr(color='blue') + + with dot.subgraph(name='cluster_random_noise') as c: + c.attr(label='Random Noise', color='green') + c.node('Z', 'Random Noise\n(batch_size, seq_len, latent_dim)') + c.attr(color='green') + + with dot.subgraph(name='cluster_embedder') as c: + c.attr(label='Embedder (Autoencoder)', color='orange') + c.node('E', 'Embedder\n(LSTM/GRU based)') + c.node('H', 'Hidden States\n(batch_size, seq_len, hidden_dim)') + c.attr(color='orange') + + with dot.subgraph(name='cluster_recovery') as c: + c.attr(label='Recovery', color='orange') + c.node('R', 'Recovery\n(LSTM/GRU based)') + c.node('X_tilde', 'Recovered Data\n(batch_size, seq_len, feature_dim)') + c.attr(color='orange') + + with dot.subgraph(name='cluster_generator') as c: + c.attr(label='Generator', color='red') + c.node('G', 'Generator\n(LSTM/GRU based)') + c.node('X_hat', 'Generated Data\n(batch_size, seq_len, feature_dim)') + c.node('H_hat', 'Generated Hidden States\n(batch_size, seq_len, hidden_dim)') + c.attr(color='red') + + with dot.subgraph(name='cluster_supervisor') as c: + c.attr(label='Supervisor', color='purple') + c.node('S', 'Supervisor\n(LSTM/GRU based)') + c.node('H_super', 'Supervised Hidden States\n(batch_size, seq_len, hidden_dim)') + c.attr(color='purple') + + with dot.subgraph(name='cluster_discriminator') as c: + c.attr(label='Discriminator', color='darkgreen') + c.node('D', 'Discriminator\n(LSTM/GRU based)') + c.node('Y_real', 'Real/Fake Prediction\nfor real data') + c.node('Y_fake', 'Real/Fake Prediction\nfor generated data') + c.attr(color='darkgreen') + + # Define connections + # Embedder and Recovery + dot.edge('X', 'E', label='Input') + dot.edge('E', 'H', label='Encodes to') + dot.edge('H', 'R', label='Input') + dot.edge('R', 'X_tilde', label='Decodes to') + + # Generator + dot.edge('Z', 'G', label='Input') + dot.edge('G', 'H_hat', label='Generates') + dot.edge('H_hat', 'S', label='Input') + dot.edge('S', 'H_super', label='Predicts next step') + + # Discriminator + dot.edge('H', 'D', label='Input (real)', style='dashed') + dot.edge('H_super', 'D', label='Input (fake)', style='dashed') + dot.edge('D', 'Y_real', label='Output') + dot.edge('D', 'Y_fake', label='Output') + + # Additional connections + dot.edge('H', 'X_emb', label='Also used as') + + # Loss functions (simplified) + with dot.subgraph(name='cluster_losses') as c: + c.attr(label='Loss Functions', color='brown') + c.node('L_auto', 'Autoencoder Loss\n(MSE X vs X_tilde)') + c.node('L_adv', 'Adversarial Loss\n(Cross-entropy Y_real vs Y_fake)') + c.node('L_super', 'Supervisor Loss\n(MSE H vs H_super)') + c.node('L_emb', 'Embedding Loss\n(Combination of above)') + c.attr(color='brown') + + dot.edge('X_tilde', 'L_auto') + dot.edge('X', 'L_auto') + dot.edge('Y_real', 'L_adv') + dot.edge('Y_fake', 'L_adv') + dot.edge('H', 'L_super') + dot.edge('H_super', 'L_super') + dot.edge('L_auto', 'L_emb') + dot.edge('L_adv', 'L_emb') + dot.edge('L_super', 'L_emb') + + # Render the graph + dot.render('timegan_architecture', view=False, cleanup=True) + + # Display in matplotlib (for VSCode) + img = mpimg.imread('timegan_architecture.png') + plt.figure(figsize=(15, 15)) + plt.imshow(img) + plt.axis('off') + plt.title('TimeGAN Architecture') + plt.show() + +if __name__ == '__main__': + # Check if graphviz is installed + try: + visualize_timegan_architecture() + except Exception as e: + print(f"Error: {e}") + print("\nPlease install the required packages:") + print("pip install graphviz matplotlib") + print("Also make sure Graphviz is installed on your system:") + print("https://graphviz.org/download/") \ No newline at end of file diff --git a/.history/utils_20250805012638.py b/.history/utils_20250805012638.py new file mode 100644 index 00000000..9644537d --- /dev/null +++ b/.history/utils_20250805012638.py @@ -0,0 +1,147 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +# def random_generator (batch_size, z_dim, T_mb, max_seq_len): +# """Random vector generation. + +# Args: +# - batch_size: size of the random vector +# - z_dim: dimension of random vector +# - T_mb: time information for the random vector +# - max_seq_len: maximum sequence length + +# Returns: +# - Z_mb: generated random vector +# """ +# Z_mb = list() +# for i in range(batch_size): +# temp = np.zeros([max_seq_len, z_dim]) +# temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) +# temp[:T_mb[i],:] = temp_Z +# Z_mb.append(temp_Z) +# return Z_mb + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250805012640.py b/.history/utils_20250805012640.py new file mode 100644 index 00000000..cab50856 --- /dev/null +++ b/.history/utils_20250805012640.py @@ -0,0 +1,167 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +# def random_generator (batch_size, z_dim, T_mb, max_seq_len): +# """Random vector generation. + +# Args: +# - batch_size: size of the random vector +# - z_dim: dimension of random vector +# - T_mb: time information for the random vector +# - max_seq_len: maximum sequence length + +# Returns: +# - Z_mb: generated random vector +# """ +# Z_mb = list() +# for i in range(batch_size): +# temp = np.zeros([max_seq_len, z_dim]) +# temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) +# temp[:T_mb[i],:] = temp_Z +# Z_mb.append(temp_Z) +# return Z_mb + +pat.v1.global_variables_initializer instead. + +Start Embedding Network Training +step: 0/5000, e_loss: 0.2641 +step: 1000/5000, e_loss: 0.1761 +step: 2000/5000, e_loss: 0.1663 +step: 3000/5000, e_loss: 0.1353 +step: 4000/5000, e_loss: 0.0716 +Finish Embedding Network Training +Start Training with Supervised Loss Only +Traceback (most recent call last): + File "c:/Users/user/Documents/ML models/TimeGAN/TimeGAN/main_timegan.py", line 296, in + ori_data, generated_data, metrics = main(args) + File "c:/Users/user/Documents/ML models/TimeGAN/TimeGAN/main_timegan.py", line 206, in main + generated_data = timegan(ori_data, parameters) + File "c:\Users\user\Documents\ML models\TimeGAN\TimeGAN\timegan.py", line 250, in timegan + Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + File "c:\Users\user\Documents\ML models\TimeGAN\TimeGAN\utils.py", line 122, in random_generator + temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) +IndexError: list index out of range + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250805012642.py b/.history/utils_20250805012642.py new file mode 100644 index 00000000..b87985dd --- /dev/null +++ b/.history/utils_20250805012642.py @@ -0,0 +1,148 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +# def random_generator (batch_size, z_dim, T_mb, max_seq_len): +# """Random vector generation. + +# Args: +# - batch_size: size of the random vector +# - z_dim: dimension of random vector +# - T_mb: time information for the random vector +# - max_seq_len: maximum sequence length + +# Returns: +# - Z_mb: generated random vector +# """ +# Z_mb = list() +# for i in range(batch_size): +# temp = np.zeros([max_seq_len, z_dim]) +# temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) +# temp[:T_mb[i],:] = temp_Z +# Z_mb.append(temp_Z) +# return Z_mb + + + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/.history/utils_20250805012647.py b/.history/utils_20250805012647.py new file mode 100644 index 00000000..8d10c903 --- /dev/null +++ b/.history/utils_20250805012647.py @@ -0,0 +1,164 @@ +"""Time-series Generative Adversarial Networks (TimeGAN) Codebase. + +Reference: Jinsung Yoon, Daniel Jarrett, Mihaela van der Schaar, +"Time-series Generative Adversarial Networks," +Neural Information Processing Systems (NeurIPS), 2019. + +Paper link: https://papers.nips.cc/paper/8789-time-series-generative-adversarial-networks + +Last updated Date: April 24th 2020 +Code author: Jinsung Yoon (jsyoon0823@gmail.com) + +----------------------------- + +utils.py + +(1) train_test_divide: Divide train and test data for both original and synthetic data. +(2) extract_time: Returns Maximum sequence length and each sequence length. +(3) rnn_cell: Basic RNN Cell. +(4) random_generator: random vector generator +(5) batch_generator: mini-batch generator +# """ +# # Necessary Packages +# import tensorflow.compat.v1 as tf +# tf.disable_v2_behavior() # Add this +## Necessary Packages +import numpy as np +import tensorflow as tf + + +def train_test_divide (data_x, data_x_hat, data_t, data_t_hat, train_rate = 0.8): + """Divide train and test data for both original and synthetic data. + + Args: + - data_x: original data + - data_x_hat: generated data + - data_t: original time + - data_t_hat: generated time + - train_rate: ratio of training data from the original data + """ + # Divide train/test index (original data) + no = len(data_x) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x = [data_x[i] for i in train_idx] + test_x = [data_x[i] for i in test_idx] + train_t = [data_t[i] for i in train_idx] + test_t = [data_t[i] for i in test_idx] + + # Divide train/test index (synthetic data) + no = len(data_x_hat) + idx = np.random.permutation(no) + train_idx = idx[:int(no*train_rate)] + test_idx = idx[int(no*train_rate):] + + train_x_hat = [data_x_hat[i] for i in train_idx] + test_x_hat = [data_x_hat[i] for i in test_idx] + train_t_hat = [data_t_hat[i] for i in train_idx] + test_t_hat = [data_t_hat[i] for i in test_idx] + + return train_x, train_x_hat, test_x, test_x_hat, train_t, train_t_hat, test_t, test_t_hat + + +def extract_time (data): + """Returns Maximum sequence length and each sequence length. + + Args: + - data: original data + + Returns: + - time: extracted time information + - max_seq_len: maximum sequence length + """ + time = list() + max_seq_len = 0 + for i in range(len(data)): + max_seq_len = max(max_seq_len, len(data[i][:,0])) + time.append(len(data[i][:,0])) + + return time, max_seq_len + + +def rnn_cell(module_name, hidden_dim): + """Basic RNN Cell. + + Args: + - module_name: gru, lstm, or lstmLN + + Returns: + - rnn_cell: RNN Cell + """ + assert module_name in ['gru','lstm','lstmLN'] + + # GRU + if (module_name == 'gru'): + rnn_cell = tf.nn.rnn_cell.GRUCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM + elif (module_name == 'lstm'): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + # LSTM Layer Normalization + elif (module_name == 'lstmLN'): + rnn_cell = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=hidden_dim, activation=tf.nn.tanh) + return rnn_cell + + +# def random_generator (batch_size, z_dim, T_mb, max_seq_len): +# """Random vector generation. + +# Args: +# - batch_size: size of the random vector +# - z_dim: dimension of random vector +# - T_mb: time information for the random vector +# - max_seq_len: maximum sequence length + +# Returns: +# - Z_mb: generated random vector +# """ +# Z_mb = list() +# for i in range(batch_size): +# temp = np.zeros([max_seq_len, z_dim]) +# temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) +# temp[:T_mb[i],:] = temp_Z +# Z_mb.append(temp_Z) +# return Z_mb + +# In utils.py + +def random_generator (batch_size, z_dim, seq_len): + """Random vector generation. + + Args: + - batch_size: size of the random vector + - z_dim: dimension of random vector + - seq_len: sequence length of the vector + + Returns: + - Z_mb: generated random vector + """ + # All our sequences have the same length (seq_len), so we can generate + # the noise for the whole batch in one go. + Z_mb = np.random.uniform(0., 1, [batch_size, seq_len, z_dim]) + return Z_mb + +def batch_generator(data, time, batch_size): + """Mini-batch generator. + + Args: + - data: time-series data + - time: time information + - batch_size: the number of samples in each batch + + Returns: + - X_mb: time-series data in each batch + - T_mb: time information in each batch + """ + no = len(data) + idx = np.random.permutation(no) + train_idx = idx[:batch_size] + + X_mb = list(data[i] for i in train_idx) + T_mb = list(time[i] for i in train_idx) + + return X_mb, T_mb \ No newline at end of file diff --git a/__pycache__/data_loading.cpython-37.pyc b/__pycache__/data_loading.cpython-37.pyc index 123f7480c06a66742d816a742ac0b10bd3ee4f43..c6d6d52d2460d12392d5df6832ddf287937addff 100644 GIT binary patch delta 1845 zcmZ8hO>Epm6rQoYw%6WlH=)f>+e8ym(r%TeDyJ%nf(mUR&;*r;wnCtlS-V@OyY^;0 z8*PoP6ast#V;?grWB#_Gui5nLrEYzs;QQigt_%k*J9QFPR~qDRU$>6Ma-m%tzq) zfbQux3B;WoO@XgIq>pG?hIm&0jHnhf!_ySP%t9Co-1MZJ7;|KfjNPx@B#E^{>XY#x z8!1O0Kh-{`gLtar2aS%?Z|pnmo)@hK-MFsg2F}6^DC4Dz@RR2@*bS%c^?1Z!{X8tO z$m#8SEr+{LzVjmHI)PkzG2lzN(sgr_dyd;^M*I2XRln_RhvI7XiT-gZa`wGAd#azM zcBUIk7B9nD9J8I(4Mvx}^sI_~u@2va&XQD36#3O4`I@WDkP{>=C8dNW%54?$rS^_N=q*2B zTLbvxAmkmV?Z+NpwHQ27Y`uGV^Xlf4FIhM2amGCXpTOg+jY$cEKxSv`8A;>P=Jw7e zyZ-(axd&4HJgv+V3^Mz_;FowST9e1DFm?`-ESxnKa=+yVPFtFX7kSSUaI)N<-8Yv8 zc*Ap8Ev)7mDt@QeVPHV9rJGzYiVW*c|HXBVd2PM*{ZHTg^IN=8SNRm!xeAd$IQ_cL zUxA6kn&su7*YUU`LY~{%pXSWjWn7oyG-}fz_FzO65M-i4D~d@?kbL?vEB{PQ+*()o zRQ8v(IDO#v%vx{zk!XgU?#3vax8IqYg?;ii`~+yZ(F^?BP#k_d`_x|8p2s=W^*hD= zUPeAH4lR z_df%}1(1D9T;-vfD)*`qbPDvSdXogFG$NF{7T=%*Utj|O9qiQ}0tZmymUhT3lBl~{ zs)mzNnp-)V<3aKA;W&q`W^O0 zxPz1`ibAXK)~K%NYE_*DYSbuFWK}6Ba$4c9!OnU)HyRB$Y&IHs3A(guEc!x zoL$5`7OtqUm)Kaw66=zq&P_kCZ#qLe2%+!v{E-L6?YwQ{?;5nDy?oNmtrl?gv8N6o zAj9{$dL5{i_Ip46{KMbBkFGW(lyRNPz8|1+h7AqQC$HsS-Ke7(GIfDwOQ@PC5uFjs zm3fsHI4m8<`Cs^3w5=gdGDUvS5UJRHJ>?yoXm`QePxZk)C-R==dy>D>^CQ&?`-7`r zC5MF%Ys;7;%K%lJrRG84-^IqDlKfFvyYwR2r0e(LJneg#mYVYVgOqn+jZ7ysY}0&) z)P-cHSmQzResO(r84WFgiUxIHpj=0Z{zOGDylX@S#lE1U5M2SQipPA)Z<9~r`VA#I z($!quHC*#+ITk?`Jr;UyWuDwq4<1w=pM?h!i4;nU#dN~Q0^yUxOGKv8WU6P|Q)9k8U3g|MT)}q?d#FY)&|mLlTbnf9ZbhFx;hSKh6Isc* zUeE9Q%7fI3y8Zyd`w_fJflFE7Jo*2Tw}6fk_=KYKY3W*oh*5R#0ECd;yg8F*FLYcr zR2jvPk+wpS6;gy7)F_381z=HG|3JjSIZ_#3L>$?1YtvCdKNsVmsQuK zKlFq4w`h*Y#}*3G;ugvxw|H5W1br&1&wMIY1Q3voTxvF(ZrExzQ$0B74-V%o7y~D8 hoe1bNIq!^aBoNrJOo8*eby^bPAC%AOH>@+(#(!opMLhrj diff --git a/__pycache__/timegan.cpython-37.pyc b/__pycache__/timegan.cpython-37.pyc index 80847dab6ac95bf99b22dd9d208bbafb1b68b076..eefe858d797083785defa799704760e90ce5020b 100644 GIT binary patch delta 2227 zcmZ`)O>7%g5Pt9N+S&ML?bwMO|Hg6tou+ZpB+XBMLYp>eiv&^;m8ym+^fhVH3S@Vw zA~a7+aUn$_$kkR=g*ey;u1Lrd;sAmJ5)u+sFPz|v)N<>g9AS2CZ#QmZ>3L?pnK$p7 zd9%CE&pmowJ>mCz2>v2-_paTZ_*VUispru2;*xOPe9QQgjp&*i2&XYpqQcD?m+lbJ z25o@$B}ovWh<2b{j*-tON*78Ar8`E12W1;dFG>Y*c9#erZx?=zY_;K1xCdN!$%e$e z+_x(U)ro@-aX;d^BmxabJNIl*u3Evt9lFDIq;-i0c<_!QI(A3{k$DFXAri79!n_mh zux)qo2-=;t9p&9fJ5G*kffe=J2Eec^B0+!khozQJ*G1ThrI0nWnECF2&Es0v) zn?kL=Bh6zxeurqJ;;E7)vy(kM(Sl@nvIXhoDMWPVwk%J#1odHWycHj&_Cu;laWTE+^!(bzfM7W20K4Ba$2LCO6 zU5XKiH*gQ{apHJn4v7YFb>IqNmT;vL5}a<(DrSiho{5qwb@)`Sw>Y~opi0H)i$r^p z;Gj0rs*SXWH1-^TQ8<8gj=?b2JYv?&d(FcjSEY3e#;i^pY!s+MR7ck1JZpuGn_(gk zdEN&(D{zAMi%AUb+KRv=AK0Z^QOH9NU>$sLmx)6yz6pnKs>L@1eb%1oJ-8l)gU}1v zM#7mr&M4#@zQaheyGq0?%vNHk$E(;YO0)zYDxuu|TuXwdM3>0wM`BJ(0Rb7jCFv3q z^I`!X^LZT1BQU!agF`UB!SHFAhoBA%n~V?dG7LK^j=>xsiQxO-Ix9=XXP7#trD3i_ zk=|&OppFNij&0V`8msi+3c;}|CzLQoJblYZJ zrmJ6wx$Td&BtK*|_?CEWzXrclzzmLK4#qa*R}>)&{irx07R5=c)+y^=UR~=_*;RNG zY3_5cFC9D7?3a0Ly=USSoZ?g0<+8gtWt}$-Lwa)%VBtleH4CR5&2<$Q_igTUv$=4( zIR$*i#!lGS;U;FyO!E?SbDUA0rR%ka;eRQ;ZIruyr?+bFM5Y%(8JPSZr13~! delta 2143 zcmZ`)OK)3M5I*PJYsZiH{eC-6?8JFF59ejl(57k95+oJ~MWU_5;*ijEQyU{$Vva7t zDJe*iEM38ZmA!xkJLCmI2$lW-Di(ze3l>O~c!(t|VSH@gIHt8Uo|$jv%=ymDx%WPP z`R{$_w!>i~`1|Pt?X6!6UpgN$=M8l2C<@Bk3;NG2uW`!R2@z&61F6$niXdV{Sb%aR zLO!IZRn!VJh}*10w9)B1Ws^*o-p5tzddUjudX=_A^B|263<>J}Pl% z54Uj5dPKQHg053~%1)I-g*&Cj0`XLq3<<(KM$bqGyEVAq3;Jb zIKWkBA^;u;NGk|la7rr#J_u>j45Qf%M=&ugu_*X^Rt&9fG>%qCMiV^DBPXOvn${NC z!On>!j}9Rz9vec^JU)bIV>~egWw1H6rX5R4%O2gDGIAvQ69B@jy>mW6Sc z2oV^Cte=F4$Qe1K#=6M?ETQ!lPD#)S0dD2i`;1%UzqAkWCP1WzTX_mASmK_orTvCEh>kLULjQGfy;hrCQ&;1gmIll{j5 zSmfC=dK`oTBq4>Rb7xE}4aF7)V#`CZ9AxC0;t)OuX&96BG$vMtf_Wpz#4553wTM`Q zwPqOYNDF&KNj1tR>!@od)fiaobcfuoiS=q62&iDIE4P@~5G7bU4#N`6A2ECiHoyg? zJB&}AF^s+-HesFTgGA%0yR4y9o?^-AY68~l6nSAw(Z<4P&vxu8YbH@Vu-T$~uEjc$ z4uOVJetOWMGvD!07bLAu3|b%kpH?*mHn2kpOm$Ugmn6$o$RkT9Tr!v{2GgxBQ%O{< zz;lT%Tp+qNL{u$t*l#H8^k>dj4D7Ojt@bf_Lk1ep*ZL8-Vq~xPF`2Dx z56#I`&K-0v(uSN<3K(7$RbG{DyQ94}6THuA@ATKI={ga+wN)G?UQK)&ro|pygFXBl zsjwFzgRd-c9d?^zaJ};!HO$fSUk3zs!GdprUDPA^GC}<+$(Pzin}fD@?SD{OXfHV` zjK0zS%vGZFHT{t<+ctR~Q+iK-;{B7p*?#2vhtl`-uLIxHcQEQ}e;Uj%+R(oZ|48q* z^~emPP5oi)clxpZMZ8JB()SY${iTFme?7UOr;_+7PVDG9>Q|CG`bcUa@J;6n&G64m ze)|`H6^eFyFEvZ`TKbS?^k32|?Z{Y^(i?g)Q)<7P`JC#-i63m=VIFZ<6tAMYv*mr3 zWKO!tEQ*CWnHwcz_}(5e&8E~&B+6_wqc|xuHK+x3l$kL%O5KWuT3F?#{v^9cZ|d>f F(tpt9F`57X diff --git a/__pycache__/utils.cpython-37.pyc b/__pycache__/utils.cpython-37.pyc index 9237e15a75d054f18a6ef24fa1f90114fa3da01c..385708fc4a5e5b578768ec1350857418f5ef6f8a 100644 GIT binary patch delta 275 zcmdn3-l4|l#LLUY00hg8CuV2~Z{*|PV`QG3$R(mI1r#h{$YNZ;l){+8RKrliRKu9g zypXw;xrRBIL6f=aPS9ilW|7J3`LfiCQw!sBQuC}7fQ-`AyyR2`ATPZnLm@v+p(GMho)_>|1t zTkKF{Z?Qzh=O#^-5>VuC1nMeg0TK+nVvI$`n?nT7GcqomtRmFHY628oG1u~n3O__B$1OR+N BNVNa} delta 402 zcmX9&%SyvQ6rD$2w#l>&ed5ZEr63}OiVIiOm52)!m4bw}No|$bI*A}U-n z;3{5B$O2lZV~-C5&JwNP-wxoL&&%Ly#v;{ehuyvt48|VJIqtw;D5s9!;j78C(n_Sd zl%eO3T3W(ROO7&Yl^ckIWGON=%%IEA4D-fEocY4|RgQAc>NY&T$=_TZZ^;e2tnxYp k^1!Z^o Valeurs min/max sauvegardées dans min_max_values.npz") # Preprocess the dataset temp_data = [] # Cut data by sequence length @@ -92,20 +96,41 @@ def transaction_data_loading(seq_len): return data -def MinMaxScaler(data): - """Min Max normalizer. +# def MinMaxScaler(data): +# """Min Max normalizer. - Args: - - data: original data +# Args: +# - data: original data - Returns: - - norm_data: normalized data - """ - numerator = data - np.min(data, 0) - denominator = np.max(data, 0) - np.min(data, 0) - norm_data = numerator / (denominator + 1e-7) - return norm_data - +# Returns: +# - norm_data: normalized data +# """ +# numerator = data - np.min(data, 0) +# denominator = np.max(data, 0) - np.min(data, 0) +# norm_data = numerator / (denominator + 1e-7) +# return norm_data +# REMPLACEZ l'ancienne fonction MinMaxScaler par celle-ci : +def MinMaxScaler(data): + """Min Max normalizer. + + MODIFIÉ pour retourner les données normalisées AINSI QUE les valeurs min et max. + + Args: + - data: original data + + Returns: + - norm_data: normalized data + - min_val: minimum values + - max_val: maximum values + """ + min_val = np.min(data, 0) + max_val = np.max(data, 0) + + numerator = data - min_val + denominator = max_val - min_val + norm_data = numerator / (denominator + 1e-7) + + return norm_data, min_val, max_val def sine_data_generation (no, seq_len, dim): """Sine data generation. @@ -145,45 +170,80 @@ def sine_data_generation (no, seq_len, dim): return data -def real_data_loading (data_name, seq_len): - """Load and preprocess real-world datasets. +# def real_data_loading (data_name, seq_len): +# """Load and preprocess real-world datasets. - Args: - - data_name: stock, energy, or transaction - - seq_len: sequence length +# Args: +# - data_name: stock, energy, or transaction +# - seq_len: sequence length - Returns: - - data: preprocessed data. - """ - # Allow all valid dataset names - assert data_name in ['stock', 'energy', 'transaction'] +# Returns: +# - data: preprocessed data. +# """ +# # Allow all valid dataset names +# assert data_name in ['stock', 'energy', 'transaction'] - # Call the correct function for your special case - if data_name == 'transaction': - return transaction_data_loading(seq_len) - - # Original logic for the other datasets - if data_name == 'stock': - ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) - elif data_name == 'energy': - ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) +# # Call the correct function for your special case +# if data_name == 'transaction': +# return transaction_data_loading(seq_len) + +# # Original logic for the other datasets +# if data_name == 'stock': +# ori_data = np.loadtxt('data/stock_data.csv', delimiter = ",",skiprows = 1) +# elif data_name == 'energy': +# ori_data = np.loadtxt('data/energy_data.csv', delimiter = ",",skiprows = 1) - # Flip the data to make chronological data - ori_data = ori_data[::-1] - # Normalize the data - ori_data = MinMaxScaler(ori_data) +# # Flip the data to make chronological data +# ori_data = ori_data[::-1] +# # Normalize the data +# ori_data = MinMaxScaler(ori_data) - # Preprocess the dataset - temp_data = [] - # Cut data by sequence length - for i in range(0, len(ori_data) - seq_len): - _x = ori_data[i:i + seq_len] - temp_data.append(_x) +# # Preprocess the dataset +# temp_data = [] +# # Cut data by sequence length +# for i in range(0, len(ori_data) - seq_len): +# _x = ori_data[i:i + seq_len] +# temp_data.append(_x) - # Mix the datasets (to make it similar to i.i.d) - idx = np.random.permutation(len(temp_data)) - data = [] - for i in range(len(temp_data)): - data.append(temp_data[idx[i]]) +# # Mix the datasets (to make it similar to i.i.d) +# idx = np.random.permutation(len(temp_data)) +# data = [] +# for i in range(len(temp_data)): +# data.append(temp_data[idx[i]]) + +# return data + +def real_data_loading(data_name, seq_len): + """ + Loads data for a SINGLE city, scales it, and saves the scaler. + """ + # The data_name will now be something like "Beirut" or "Tripoli" + file_name = f'data/{data_name}_data.csv' + + try: + df = pd.read_csv(file_name) + except FileNotFoundError: + print(f"Error: {file_name} not found.") + return None + + ori_data = df.values + + # Normalize and get min/max values + ori_data, min_val, max_val = MinMaxScaler(ori_data) - return data \ No newline at end of file + # Save the city-specific scaler values + np.savez(f'min_max_{data_name}.npz', min_val=min_val, max_val=max_val) + print(f"-> Min/max values saved to min_max_{data_name}.npz") + + # Prepare sequences (this part is the same as before) + temp_data = [] + for i in range(0, len(ori_data) - seq_len + 1): + _x = ori_data[i:i + seq_len] + temp_data.append(_x) + + idx = np.random.permutation(len(temp_data)) + data = [] + for i in range(len(temp_data)): + data.append(temp_data[idx[i]]) + + return data \ No newline at end of file diff --git a/data_prep.py b/data_prep.py new file mode 100644 index 00000000..7c3c1b90 --- /dev/null +++ b/data_prep.py @@ -0,0 +1,14 @@ +import pandas as pd + +# Load your cleaned, original data file +df = pd.read_csv('data/transaction_data.csv') + +# Get a list of unique cities +cities = df['city'].unique() + +# Create a separate CSV file for each city +for city in cities: + city_df = df[df['city'] == city] + # We only need the numeric columns for training + city_df[['transaction_number', 'transaction_value']].to_csv(f'data/{city}_data.csv', index=False) + print(f'Created data/{city}_data.csv') \ No newline at end of file diff --git a/final_usable_synthetic_data.csv b/final_usable_synthetic_data.csv index 8c915292..ebe8ab6c 100644 --- a/final_usable_synthetic_data.csv +++ b/final_usable_synthetic_data.csv @@ -1,361 +1,4189 @@ date,city,transaction_number,transaction_value -2017-01-01,Baabda,343.1675497189053,33.173469365619525 -2017-02-01,Baabda,291.5028043604319,52.39772192771157 -2017-03-01,Baabda,657.2740786139133,92.55489595709969 -2017-04-01,Baabda,515.4489586177547,57.96842636878188 -2017-05-01,Baabda,599.1612352816448,39.93153117924728 -2017-06-01,Baabda,626.2087574975601,37.241763472360034 -2017-07-01,Baabda,669.2142624019567,37.55897456954616 -2017-08-01,Baabda,698.978390728094,37.75919384212537 -2017-09-01,Baabda,718.4043735601983,37.652540182323094 -2017-10-01,Baabda,729.9089071486083,37.51208733725056 -2017-11-01,Baabda,735.6867961914618,37.359329639456064 -2017-12-01,Baabda,733.1251471074766,36.9763302207861 -2018-01-01,Baabda,466.049407168594,30.24550616459809 -2018-02-01,Baabda,1113.2805790179855,62.00027583393853 -2018-03-01,Baabda,662.2225553156832,79.78188448920743 -2018-04-01,Baabda,326.77837913252125,50.71204412639116 -2018-05-01,Baabda,387.43847702706233,76.47379358196179 -2018-06-01,Baabda,377.41960202461604,79.90220053852424 -2018-07-01,Baabda,388.97710745292846,85.06634011455188 -2018-08-01,Baabda,368.7481981996921,85.04000738164049 -2018-09-01,Baabda,333.3493343491337,83.8666604849546 -2018-10-01,Baabda,295.635759434571,81.85686207226047 -2018-11-01,Baabda,259.2472002436589,77.27917839060261 -2018-12-01,Baabda,224.77232074183615,67.15982067005302 -2019-01-01,Baabda,384.05763571240954,80.5344820018006 -2019-02-01,Baabda,627.1623225884153,123.51195612197239 -2019-03-01,Baabda,644.3389454850906,113.68406851250454 -2019-04-01,Baabda,697.8224386619589,116.93242780087915 -2019-05-01,Baabda,707.5287366254146,120.33570292246212 -2019-06-01,Baabda,708.1829676372552,120.9388843662885 -2019-07-01,Baabda,703.0470022901777,119.1146159819058 -2019-08-01,Baabda,692.5870791424555,115.41776482678092 -2019-09-01,Baabda,681.9737103932766,111.73694304839854 -2019-10-01,Baabda,662.7868205668195,106.92652882841233 -2019-11-01,Baabda,621.9187581915359,100.00434429743211 -2019-12-01,Baabda,558.8150462910535,92.78097804600827 -2020-01-01,Baabda,1769.9778762360575,255.54081548032485 -2020-02-01,Baabda,1397.9611069018868,278.4709346341896 -2020-03-01,Baabda,1520.3053289656075,195.8175158732611 -2020-04-01,Baabda,1415.2256083536179,215.2950534730657 -2020-05-01,Baabda,1487.9671722668122,209.43940554010848 -2020-06-01,Baabda,1485.1025185007754,213.19654525227563 -2020-07-01,Baabda,1491.667571963486,212.3366501201196 -2020-08-01,Baabda,1502.4971464287892,213.0361470589437 -2020-09-01,Baabda,1506.7000588784517,214.65664568990516 -2020-10-01,Baabda,1512.6812705404966,215.2365749650801 -2020-11-01,Baabda,1518.9803132419568,216.63784880836704 -2020-12-01,Baabda,1522.7593070271819,217.82007190715788 -2021-01-01,Baabda,490.3534774912931,287.0328321630408 -2021-02-01,Baabda,474.2447841604804,262.05638293330884 -2021-03-01,Baabda,519.0586008550301,289.9687143286853 -2021-04-01,Baabda,521.5794414699599,331.4494519221473 -2021-05-01,Baabda,519.1061027766818,338.6686585416043 -2021-06-01,Baabda,522.9944949269229,340.22759810032017 -2021-07-01,Baabda,526.4149211762851,341.2286944632164 -2021-08-01,Baabda,528.9310835716583,341.5686355995184 -2021-09-01,Baabda,531.1471201893225,341.93182890447173 -2021-10-01,Baabda,533.0887972231433,342.50429172728786 -2021-11-01,Baabda,534.9911052400801,342.3594181854807 -2021-12-01,Baabda,536.7134817356084,342.3408651826495 -2022-01-01,Baabda,1102.3871648488866,195.73152113875014 -2022-02-01,Baabda,1845.6419598925731,266.9640524814568 -2022-03-01,Baabda,1476.1646720789502,232.479067470539 -2022-04-01,Baabda,1546.0644695156311,196.50517787594526 -2022-05-01,Baabda,1544.368075131794,213.0956698260005 -2022-06-01,Baabda,1509.5320370802008,217.37114493246133 -2022-07-01,Baabda,1507.613247335903,217.32554561968686 -2022-08-01,Baabda,1505.14717787609,218.55568280552663 -2022-09-01,Baabda,1503.952576519156,217.76545715773563 -2022-10-01,Baabda,1509.2406919607365,217.49485482375945 -2022-11-01,Baabda,1509.5553562053751,217.55261975471308 -2022-12-01,Baabda,1512.1466580040885,217.8884360676839 -2017-01-01,Beirut,372.1623628321094,78.02055011818068 -2017-02-01,Beirut,586.075823346142,112.45112923149046 -2017-03-01,Beirut,615.0540107867679,108.01779696210416 -2017-04-01,Beirut,668.9468841611441,110.37818795362617 -2017-05-01,Beirut,691.7803381730696,115.08339307219185 -2017-06-01,Beirut,695.3686765182102,116.59951800898976 -2017-07-01,Beirut,686.0208741180081,114.06999185657374 -2017-08-01,Beirut,671.6056242940812,109.99579768608109 -2017-09-01,Beirut,653.8257269924284,105.7526772065087 -2017-10-01,Beirut,624.6611304956234,100.74387116731774 -2017-11-01,Beirut,583.268747666956,95.45748366269167 -2017-12-01,Beirut,540.1032476537227,90.96575990690903 -2018-01-01,Beirut,337.0208730297736,33.469064300032386 -2018-02-01,Beirut,859.4660800973261,170.2407046991949 -2018-03-01,Beirut,416.1600821181601,212.3077241438482 -2018-04-01,Beirut,373.70747079274656,289.56488194154554 -2018-05-01,Beirut,458.5995224562064,294.646594668222 -2018-06-01,Beirut,460.1706125285346,306.76161849536925 -2018-07-01,Beirut,459.95145593545953,320.85314627515805 -2018-08-01,Beirut,465.8427738094088,327.2384076003776 -2018-09-01,Beirut,473.3165534278394,330.82244396718033 -2018-10-01,Beirut,480.66488478954415,332.7227866248979 -2018-11-01,Beirut,487.1892017558076,334.2853810903629 -2018-12-01,Beirut,493.1049903166684,335.2495106821396 -2019-01-01,Beirut,981.3085091341433,54.87886407649671 -2019-02-01,Beirut,835.9468710710097,62.33436911944192 -2019-03-01,Beirut,350.3027701866542,61.61783335343989 -2019-04-01,Beirut,409.59646810762086,78.54003419745268 -2019-05-01,Beirut,413.29816331124874,84.91779426167773 -2019-06-01,Beirut,420.70421670502117,87.68410615848191 -2019-07-01,Beirut,409.1477908658372,87.03461182484907 -2019-08-01,Beirut,376.90780480512245,85.32696977439838 -2019-09-01,Beirut,368.52637862009993,84.08257845223709 -2019-10-01,Beirut,343.8334402933332,82.88117579517241 -2019-11-01,Beirut,325.9495425723062,81.49412127957127 -2019-12-01,Beirut,314.55642258195246,79.69383604518985 -2020-01-01,Beirut,371.8687145891713,28.541118721585857 -2020-02-01,Beirut,375.1960802556614,28.838610726644674 -2020-03-01,Beirut,541.1520325057074,37.44220900107136 -2020-04-01,Beirut,563.5602003736321,36.86682225285598 -2020-05-01,Beirut,525.2622798501441,33.212750911013416 -2020-06-01,Beirut,479.37592734278377,32.01965011356449 -2020-07-01,Beirut,440.326396868069,31.967315329780988 -2020-08-01,Beirut,418.1047820015404,32.598500321032624 -2020-09-01,Beirut,372.4193770172891,32.63318712651336 -2020-10-01,Beirut,288.0436568476624,33.93370737375007 -2020-11-01,Beirut,194.95795553492184,38.1171310430872 -2020-12-01,Beirut,171.0713263418897,43.651651907341474 -2021-01-01,Beirut,534.3687580938333,387.6662688027607 -2021-02-01,Beirut,513.1129436616155,288.31189288636494 -2021-03-01,Beirut,529.3388083991695,348.8339636612855 -2021-04-01,Beirut,514.1163857702049,386.20273971451417 -2021-05-01,Beirut,527.4533419726366,391.5275907615951 -2021-06-01,Beirut,537.8412925117955,392.79358084221167 -2021-07-01,Beirut,544.9990404060245,392.7099704992466 -2021-08-01,Beirut,549.8993674326657,392.2311777151146 -2021-09-01,Beirut,553.6437423931717,391.02808683921813 -2021-10-01,Beirut,556.4268511937059,389.64096270634565 -2021-11-01,Beirut,558.4393492743532,388.9841237505789 -2021-12-01,Beirut,560.5279224022518,388.06921356969 -2022-01-01,Beirut,1035.2858783509728,147.43276385665723 -2022-02-01,Beirut,532.2620478685765,104.05728779582638 -2022-03-01,Beirut,598.0729374675591,95.94130629468319 -2022-04-01,Beirut,599.5655054239448,95.24943244707865 -2022-05-01,Beirut,584.1546585057617,93.69240736332652 -2022-06-01,Beirut,543.488983105758,90.07237886720418 -2022-07-01,Beirut,489.8486616148302,85.81345526702135 -2022-08-01,Beirut,423.6248651605201,81.69806507617102 -2022-09-01,Beirut,331.7650732894384,79.66071562831586 -2022-10-01,Beirut,203.84146263728178,83.98288651957593 -2022-11-01,Beirut,144.39655026572353,72.34030290054447 -2022-12-01,Beirut,345.03747006198864,56.55653589160475 -2017-01-01,Bekaa,1357.421671457303,227.2214667076415 -2017-02-01,Bekaa,1521.7046204212952,260.503117182213 -2017-03-01,Bekaa,1510.9284496315458,215.86201653144033 -2017-04-01,Bekaa,1414.487889115844,216.3829277647762 -2017-05-01,Bekaa,1471.942902805844,216.7744901078298 -2017-06-01,Bekaa,1423.8377067490856,220.92079036718675 -2017-07-01,Bekaa,1450.0872686538596,215.34138376719002 -2017-08-01,Bekaa,1441.1114206947127,218.35501102068324 -2017-09-01,Bekaa,1453.9818504484372,215.15759417066386 -2017-10-01,Bekaa,1450.2634575996226,216.33407384456328 -2017-11-01,Bekaa,1464.2552205947632,214.38357194279388 -2017-12-01,Bekaa,1466.6006639626241,214.88537323512736 -2018-01-01,Bekaa,383.449395197441,33.58863196368149 -2018-02-01,Bekaa,512.8105867330412,34.07569179879367 -2018-03-01,Bekaa,533.7758477444886,34.840803015922994 -2018-04-01,Bekaa,455.2959077505421,32.129471359216026 -2018-05-01,Bekaa,337.4370186524866,30.476496271141137 -2018-06-01,Bekaa,282.6608974258214,31.295352021800117 -2018-07-01,Bekaa,307.06968789398036,41.63081915712863 -2018-08-01,Bekaa,804.4257474246251,104.10198208407252 -2018-09-01,Bekaa,654.3084472780624,212.3490942073844 -2018-10-01,Bekaa,437.20429708120145,186.52484584640425 -2018-11-01,Bekaa,416.9769712253535,191.88224296786993 -2018-12-01,Bekaa,419.2591506702873,202.8109014685773 -2019-01-01,Bekaa,824.2140403682369,38.090241372004535 -2019-02-01,Bekaa,334.1405292350702,24.03089417592564 -2019-03-01,Bekaa,409.51096464864764,31.262736330143852 -2019-04-01,Bekaa,394.55412094528174,33.99521423304207 -2019-05-01,Bekaa,217.72577052783726,34.940129457909265 -2019-06-01,Bekaa,169.5513368216412,46.41643222417453 -2019-07-01,Bekaa,223.1925939564803,49.67375473624341 -2019-08-01,Bekaa,324.4149426125195,44.481315739387014 -2019-09-01,Bekaa,585.5095428619659,41.214037957506335 -2019-10-01,Bekaa,666.5674697220413,36.0180658841258 -2019-11-01,Bekaa,636.6953105104507,33.96171092117532 -2019-12-01,Bekaa,628.0052657799089,34.08495089589136 -2020-01-01,Bekaa,654.0718733137148,114.82513039957338 -2020-02-01,Bekaa,124.70592415193202,112.35497037535339 -2020-03-01,Bekaa,396.6535619370734,53.98854619673388 -2020-04-01,Bekaa,461.7427102173829,84.09096733344215 -2020-05-01,Bekaa,433.3016543544648,81.2567089797405 -2020-06-01,Bekaa,435.8360977924131,82.93077810105305 -2020-07-01,Bekaa,455.612371310395,83.94938320770923 -2020-08-01,Bekaa,471.679032637807,84.82840568518552 -2020-09-01,Bekaa,498.2993254492907,86.43931453701 -2020-10-01,Bekaa,542.6024245134751,89.6414827658032 -2020-11-01,Bekaa,594.7738570362344,94.38224490574233 -2020-12-01,Bekaa,634.59932420387,99.22094114223944 -2021-01-01,Bekaa,982.4387669790214,59.9619865529193 -2021-02-01,Bekaa,849.2117107196608,221.27775292634882 -2021-03-01,Bekaa,1096.7684072435668,133.6488399905998 -2021-04-01,Bekaa,1366.368154592156,243.63855943892878 -2021-05-01,Bekaa,1078.6721903272783,255.24523795022978 -2021-06-01,Bekaa,1144.6052174429924,277.08135649249976 -2021-07-01,Bekaa,1235.9314763667944,268.46755928781135 -2021-08-01,Bekaa,1310.5146753879067,262.32298227417886 -2021-09-01,Bekaa,1383.4930291832743,257.44972106242597 -2021-10-01,Bekaa,1414.4169241238005,252.3403180660455 -2021-11-01,Bekaa,1417.21982539169,245.54053810252444 -2021-12-01,Bekaa,1419.3025687382947,237.86152680971287 -2022-01-01,Bekaa,521.2322456062504,337.8505859852487 -2022-02-01,Bekaa,471.75273258897573,255.4470758243694 -2022-03-01,Bekaa,527.9669385073444,299.7218155843394 -2022-04-01,Bekaa,518.973889094751,345.06624212386373 -2022-05-01,Bekaa,519.0778175415163,352.1484419531831 -2022-06-01,Bekaa,524.8696692704311,353.6289228470184 -2022-07-01,Bekaa,528.9652705607259,353.90053463143005 -2022-08-01,Bekaa,531.8926844414298,354.24465280401665 -2022-09-01,Bekaa,534.4354767019713,354.0261241890562 -2022-10-01,Bekaa,536.553558599381,354.01216592613827 -2022-11-01,Bekaa,538.5084785931774,353.92204636829615 -2022-12-01,Bekaa,540.3736487440954,353.7338708836711 -2017-01-01,Kesrouan,320.0089234614911,27.43357755070161 -2017-02-01,Kesrouan,178.03050180909264,34.84637239763589 -2017-03-01,Kesrouan,221.8560626154597,48.261881663384145 -2017-04-01,Kesrouan,240.9367208716771,46.43909264601893 -2017-05-01,Kesrouan,437.47232307549126,43.36202665395207 -2017-06-01,Kesrouan,644.4985807308841,36.60187632218197 -2017-07-01,Kesrouan,597.1124630062818,32.953478787959426 -2017-08-01,Kesrouan,590.3949715586343,33.50446468254509 -2017-09-01,Kesrouan,617.5735558947435,35.08954552667599 -2017-10-01,Kesrouan,648.4458464749299,36.299685151302825 -2017-11-01,Kesrouan,676.2115833516984,36.88060647259543 -2017-12-01,Kesrouan,689.4924728920591,36.57183646956792 -2018-01-01,Kesrouan,398.92357801116,286.1198190527979 -2018-02-01,Kesrouan,524.6726082681848,96.76414763413045 -2018-03-01,Kesrouan,827.243943243535,109.79427308966292 -2018-04-01,Kesrouan,882.6897695928817,129.57788302322783 -2018-05-01,Kesrouan,892.2775286700336,128.9116979487741 -2018-06-01,Kesrouan,899.2500910424293,124.13074923891276 -2018-07-01,Kesrouan,905.257212843557,119.84415277334391 -2018-08-01,Kesrouan,911.8300393479922,117.0224081241784 -2018-09-01,Kesrouan,916.1595516161177,115.4253357050469 -2018-10-01,Kesrouan,925.0290960324163,113.81954372267116 -2018-11-01,Kesrouan,927.7297961961457,113.1446042763374 -2018-12-01,Kesrouan,924.0874064219742,113.32618352449624 -2019-01-01,Kesrouan,1792.9880949746141,257.1944345281603 -2019-02-01,Kesrouan,1484.5644512791564,271.68032674617695 -2019-03-01,Kesrouan,1516.390594840632,198.9848754663486 -2019-04-01,Kesrouan,1432.4122354428835,214.04305646400277 -2019-05-01,Kesrouan,1498.14928114548,210.4049100729956 -2019-06-01,Kesrouan,1497.4016296877244,212.24800992929502 -2019-07-01,Kesrouan,1494.6722844257868,213.4329306973531 -2019-08-01,Kesrouan,1504.426444173937,213.26536192506583 -2019-09-01,Kesrouan,1504.0048286329732,215.31092621094754 -2019-10-01,Kesrouan,1504.4031250487626,215.77727490781476 -2019-11-01,Kesrouan,1498.687204421882,217.38571234650422 -2019-12-01,Kesrouan,1493.4104606524547,218.2136705554002 -2020-01-01,Kesrouan,1312.511627385104,222.357864892297 -2020-02-01,Kesrouan,1423.1463378712267,337.5919578219553 -2020-03-01,Kesrouan,1514.6147426969412,360.9051112031256 -2020-04-01,Kesrouan,1555.1528826345707,430.4166687879063 -2020-05-01,Kesrouan,1566.2667489036992,455.61450094072654 -2020-06-01,Kesrouan,1176.000892832651,299.14547159864213 -2020-07-01,Kesrouan,505.08346353246753,68.22040499137029 -2020-08-01,Kesrouan,590.086856821375,79.41129434916661 -2020-09-01,Kesrouan,597.9780775694726,94.93107266491421 -2020-10-01,Kesrouan,562.0825307472192,89.76928267179673 -2020-11-01,Kesrouan,425.5810086886622,80.8224538449939 -2020-12-01,Kesrouan,181.64359873157895,88.57346680076276 -2021-01-01,Kesrouan,518.4118549944801,331.08100251320235 -2021-02-01,Kesrouan,487.3270293012064,266.78266468079437 -2021-03-01,Kesrouan,525.6592807589792,301.08010076252975 -2021-04-01,Kesrouan,519.1292779566393,337.0206436841175 -2021-05-01,Kesrouan,519.3861481966015,343.21445751295573 -2021-06-01,Kesrouan,523.6179936349067,344.8472609966392 -2021-07-01,Kesrouan,527.0727508185539,345.37227964898835 -2021-08-01,Kesrouan,529.6467072186033,345.50765043324793 -2021-09-01,Kesrouan,531.8556185480197,345.558262189564 -2021-10-01,Kesrouan,533.8021177466144,345.5211909925374 -2021-11-01,Kesrouan,535.6060392076448,345.3614541632839 -2021-12-01,Kesrouan,537.3026495093077,345.13255257488316 -2022-01-01,Kesrouan,977.2292456259925,66.65888959361214 -2022-02-01,Kesrouan,399.2393218449272,59.94033558151031 -2022-03-01,Kesrouan,513.703550887486,103.25251213831041 -2022-04-01,Kesrouan,655.5838738744126,118.6481454548136 -2022-05-01,Kesrouan,755.1481175743704,144.86475675746854 -2022-06-01,Kesrouan,817.1041542587025,169.83215574191703 -2022-07-01,Kesrouan,884.020543125217,167.53809260573223 -2022-08-01,Kesrouan,1018.6892107341008,127.8746790738296 -2022-09-01,Kesrouan,1294.7906756498646,164.18960627675008 -2022-10-01,Kesrouan,1380.1769632163287,275.7612389833607 -2022-11-01,Kesrouan,1161.563547417895,268.70437984083514 -2022-12-01,Kesrouan,1166.1428046377355,286.23186805113454 -2017-01-01,Tripoli,454.67787896080904,75.10727616142705 -2017-02-01,Tripoli,252.23426123785885,64.6345933841466 -2017-03-01,Tripoli,526.5393618164915,25.207095380739442 -2017-04-01,Tripoli,617.6874165614905,35.93452515843212 -2017-05-01,Tripoli,578.9925671017759,33.09549802163875 -2017-06-01,Tripoli,494.3380970191834,29.976087324235856 -2017-07-01,Tripoli,385.11664067481,28.747255462235056 -2017-08-01,Tripoli,204.20204540618403,33.991141622664514 -2017-09-01,Tripoli,171.1905849542789,46.63913787541969 -2017-10-01,Tripoli,242.24439119666374,48.09304237589362 -2017-11-01,Tripoli,417.50474636394824,42.20155895247727 -2017-12-01,Tripoli,654.6099405353342,37.06777250678503 -2018-01-01,Tripoli,530.9954739030796,370.36728188155143 -2018-02-01,Tripoli,496.59155939330043,273.5320765484493 -2018-03-01,Tripoli,532.24585403165,321.08678183801476 -2018-04-01,Tripoli,515.6456597569581,359.3149831068174 -2018-05-01,Tripoli,521.5012792170601,365.17230185428855 -2018-06-01,Tripoli,528.4109375295714,366.2819315433152 -2018-07-01,Tripoli,533.2893129106008,365.8539941759492 -2018-08-01,Tripoli,536.6102730149287,365.49302862368097 -2018-09-01,Tripoli,539.1553683989443,365.60768826969553 -2018-10-01,Tripoli,541.5088007263557,365.4209747477702 -2018-11-01,Tripoli,543.6929534784263,364.97709502525095 -2018-12-01,Tripoli,545.6660105695806,364.5879692866968 -2019-01-01,Tripoli,418.84660367800245,28.530241022927832 -2019-02-01,Tripoli,461.1374925519743,45.33783443387956 -2019-03-01,Tripoli,578.6559512115252,43.726890773419335 -2019-04-01,Tripoli,610.2440093838736,43.08947503637641 -2019-05-01,Tripoli,704.0472056313818,40.88551405371585 -2019-06-01,Tripoli,722.547116909102,37.91233443491269 -2019-07-01,Tripoli,692.2933589269088,35.768035453851695 -2019-08-01,Tripoli,662.3939220966724,34.732948458188865 -2019-09-01,Tripoli,644.0232736239319,34.442435584589035 -2019-10-01,Tripoli,644.5023233065293,34.84799099919621 -2019-11-01,Tripoli,644.9257381627071,34.96719317217044 -2019-12-01,Tripoli,651.7116755610982,35.21304656615986 -2020-01-01,Tripoli,1630.1915243226715,247.01320445764378 -2020-02-01,Tripoli,1422.826491598771,279.07773617612935 -2020-03-01,Tripoli,1485.4478430766621,199.77581469117155 -2020-04-01,Tripoli,1421.6966655895446,213.0748368575306 -2020-05-01,Tripoli,1490.106486083748,210.05207233716465 -2020-06-01,Tripoli,1483.8133451361898,214.55942517037911 -2020-07-01,Tripoli,1498.81905824077,212.75837414601213 -2020-08-01,Tripoli,1505.1280331622122,215.20563008793778 -2020-09-01,Tripoli,1504.6917352091014,216.88364998940287 -2020-10-01,Tripoli,1512.5547426946423,217.39432748384132 -2020-11-01,Tripoli,1515.9059312945667,218.8334209098225 -2020-12-01,Tripoli,1526.8795949222138,219.26288985715954 -2021-01-01,Tripoli,318.3424696828165,74.4065087073997 -2021-02-01,Tripoli,343.7529749169593,293.24401550109616 -2021-03-01,Tripoli,515.6223406317838,241.16963512127637 -2021-04-01,Tripoli,510.121834022333,300.2946613021483 -2021-05-01,Tripoli,528.6560042617295,314.2331355107391 -2021-06-01,Tripoli,517.5522141578,320.6038816348695 -2021-07-01,Tripoli,521.7631875396219,322.80584112097694 -2021-08-01,Tripoli,524.425670248204,324.176814046882 -2021-09-01,Tripoli,527.4238332031258,325.1285169557118 -2021-10-01,Tripoli,530.2159385797304,325.9198564798454 -2021-11-01,Tripoli,532.8725195344106,326.5557406369173 -2021-12-01,Tripoli,535.3932881767316,327.06680102634857 -2022-01-01,Tripoli,366.35856365017327,76.2878458500219 -2022-02-01,Tripoli,925.4484804225149,194.70421387316753 -2022-03-01,Tripoli,1023.1472660811204,165.68542037461367 -2022-04-01,Tripoli,1291.567670265791,191.80552473477456 -2022-05-01,Tripoli,1570.28238862588,257.44354252958817 -2022-06-01,Tripoli,1385.9377947509524,263.58731894459953 -2022-07-01,Tripoli,1457.8741291195408,247.27961235101742 -2022-08-01,Tripoli,1443.6507582700433,246.24228019835158 -2022-09-01,Tripoli,1446.782718304284,244.185698979269 -2022-10-01,Tripoli,1442.8201943672227,245.1831404354161 -2022-11-01,Tripoli,1432.0199847262134,244.3650678790605 -2022-12-01,Tripoli,1437.5644665994962,239.32178388620306 +2017-01-01,Baabda,1935.3499147128293,294.9723686897918 +2017-02-01,Baabda,1787.87602453358,273.90202272872955 +2017-03-01,Baabda,1760.243005147002,270.4634690548589 +2017-04-01,Baabda,1708.6481451914435,264.0422678132731 +2017-05-01,Baabda,1613.74060123814,251.40800356730384 +2017-06-01,Baabda,1514.1497996456221,238.47073014751632 +2017-07-01,Baabda,1511.2844261535,240.52757243136668 +2017-08-01,Baabda,1538.8090547915815,252.85085632594118 +2017-09-01,Baabda,1506.2677913914206,270.40958528678647 +2017-10-01,Baabda,1775.4411730068807,270.87219205531534 +2017-11-01,Baabda,1117.9663556984995,258.12224130857817 +2017-12-01,Baabda,1510.282855332733,265.6754019789957 +2018-01-01,Baabda,1783.1593716039922,287.997849375028 +2018-02-01,Baabda,1749.88427548692,271.87354948297934 +2018-03-01,Baabda,1435.8683601060934,222.6022911322225 +2018-04-01,Baabda,516.775125903142,219.20178329717817 +2018-05-01,Baabda,530.9499152418591,218.40398677112117 +2018-06-01,Baabda,741.9772741525031,217.7759867700366 +2018-07-01,Baabda,607.4127509082105,234.77887403161523 +2018-08-01,Baabda,1120.0063473156176,236.10398657997803 +2018-09-01,Baabda,2075.493826545558,326.76532343250136 +2018-10-01,Baabda,1401.424428825953,252.40337390962642 +2018-11-01,Baabda,741.0626462428806,226.12938057101064 +2018-12-01,Baabda,1197.5380481917427,301.8296351151808 +2019-01-01,Baabda,1451.8261268767492,311.80464142345886 +2019-02-01,Baabda,2001.7072203560244,309.002929144142 +2019-03-01,Baabda,2006.599342505289,308.7651165450006 +2019-04-01,Baabda,2007.9925882618577,308.51160525115597 +2019-05-01,Baabda,638.931571431121,225.05619552356788 +2019-06-01,Baabda,738.9062029451068,212.69982602075515 +2019-07-01,Baabda,707.8465676648302,198.21852854265163 +2019-08-01,Baabda,839.1798806476733,229.33525591950644 +2019-09-01,Baabda,2013.1076815524516,309.55770918001963 +2019-10-01,Baabda,2027.2153204473793,312.76170486218734 +2019-11-01,Baabda,2022.0222088491028,305.105493225763 +2019-12-01,Baabda,2013.5518964925045,303.7089011439785 +2020-01-01,Baabda,2004.1813507479965,303.2012171922107 +2020-02-01,Baabda,1991.3440283942114,304.2521595214375 +2020-03-01,Baabda,1952.816083413755,303.7605571593658 +2020-04-01,Baabda,1828.644764709046,294.36161636769936 +2020-05-01,Baabda,1368.107732541131,255.233629270222 +2020-06-01,Baabda,2020.2430459654177,311.1651719769093 +2020-07-01,Baabda,1919.2893710571452,292.68049849765646 +2020-08-01,Baabda,2071.0489421859056,332.85679987236483 +2020-09-01,Baabda,2038.9357718614792,354.8405418386627 +2020-10-01,Baabda,1810.1901242021124,318.17155859766154 +2020-11-01,Baabda,817.8035840687206,229.75884220740926 +2020-12-01,Baabda,642.448656893784,203.0557454121313 +2021-01-01,Baabda,1924.8789077833885,325.0343247874922 +2021-02-01,Baabda,1964.0528788983092,322.678685174744 +2021-03-01,Baabda,1960.7949667990827,315.4444412246621 +2021-04-01,Baabda,1967.114593666592,313.3659827780385 +2021-05-01,Baabda,1954.6499454799477,308.5296361244515 +2021-06-01,Baabda,1487.1649655717656,283.0227380952002 +2021-07-01,Baabda,1921.0662308173562,300.43967407849823 +2021-08-01,Baabda,1806.281147885822,278.9549661179953 +2021-09-01,Baabda,1877.239230558818,297.23313736592405 +2021-10-01,Baabda,795.2696800536356,259.7056165295594 +2021-11-01,Baabda,763.9469129164517,233.11213212811876 +2021-12-01,Baabda,1086.7653662150046,233.2660907238451 +2022-01-01,Baabda,1318.76028926057,236.68556926534902 +2022-02-01,Baabda,901.0577550791053,195.07322022028376 +2022-03-01,Baabda,456.6510799971806,269.3376533502291 +2022-04-01,Baabda,1863.324334309623,288.81632223069425 +2022-05-01,Baabda,2066.7647006885663,343.95041649768154 +2022-06-01,Baabda,938.9280143625102,265.2184690180869 +2022-07-01,Baabda,967.1621489758088,213.34448195402487 +2022-08-01,Baabda,1917.3130032259971,355.111248598546 +2022-09-01,Baabda,1290.6913317839244,310.8497709287799 +2022-10-01,Baabda,772.4965390876865,274.7212439700634 +2022-11-01,Baabda,879.343043294688,243.99980346028266 +2022-12-01,Baabda,512.2456737284276,270.03723731064247 +2023-01-01,Baabda,878.0826589735274,245.3806446344103 +2023-02-01,Baabda,1039.392995258638,270.1768547484581 +2023-03-01,Baabda,1180.205388679702,275.2114017737534 +2023-04-01,Baabda,1129.6790340708744,249.53872761695365 +2023-05-01,Baabda,1625.7381471952085,297.4498559318278 +2023-06-01,Baabda,1926.331171078979,321.30196882394745 +2023-07-01,Baabda,1991.6168045806662,319.79186578112666 +2023-08-01,Baabda,1976.6748592072731,307.86924668784275 +2023-09-01,Baabda,1773.7288007039426,264.1166538677762 +2023-10-01,Baabda,875.2190128240106,184.05099610679943 +2023-11-01,Baabda,1201.1826691167798,243.73736375137946 +2023-12-01,Baabda,567.8615713518095,292.2957064342476 +2024-01-01,Baabda,1407.6240053823788,246.81103590146498 +2024-02-01,Baabda,1465.66358059913,327.5001337322489 +2024-03-01,Baabda,1001.6544458489038,261.8269592153725 +2024-04-01,Baabda,843.0471848236052,249.02406453372691 +2024-05-01,Baabda,1064.2120295956076,241.76729939634342 +2024-06-01,Baabda,1517.0035135751573,308.53555359252147 +2024-07-01,Baabda,1960.1649185837198,300.5992890775268 +2024-08-01,Baabda,1944.6028572149448,296.6435312900229 +2024-09-01,Baabda,973.2122384242487,260.81846601738886 +2024-10-01,Baabda,835.057001738733,239.16201224831389 +2024-11-01,Baabda,1617.7202546560393,299.06908404758593 +2024-12-01,Baabda,1240.259549182749,245.82435031375095 +2025-01-01,Baabda,1710.8798718377745,279.0812866569713 +2025-02-01,Baabda,1389.9030536471394,285.1370320322829 +2025-03-01,Baabda,1803.289678383497,279.0447375894803 +2025-04-01,Baabda,1765.476277460857,263.20398884389033 +2025-05-01,Baabda,1614.4927149976265,239.06232031565276 +2025-06-01,Baabda,1369.3838068909586,211.0817465899752 +2025-07-01,Baabda,1014.3008968447789,188.60097211443556 +2025-08-01,Baabda,1927.5912675097052,293.84171458479886 +2025-09-01,Baabda,1894.2666542379413,305.2725398685147 +2025-10-01,Baabda,1318.4752777306594,263.41952391618014 +2025-11-01,Baabda,1646.6695091080226,278.7901298236109 +2025-12-01,Baabda,1787.9894533646755,269.2845701807779 +2026-01-01,Baabda,1166.336554899988,240.9199179687236 +2026-02-01,Baabda,1956.3970085802137,301.3113519338407 +2026-03-01,Baabda,1947.4502375549262,310.1939762320843 +2026-04-01,Baabda,564.7011821371862,218.21267850928257 +2026-05-01,Baabda,1628.1870871741835,329.37990448626437 +2026-06-01,Baabda,1260.4403087608566,249.9720777271719 +2026-07-01,Baabda,1745.5847757965653,285.6264066416694 +2026-08-01,Baabda,1097.1984435797324,222.1152835100639 +2026-09-01,Baabda,1646.5657246064743,293.63054799629026 +2026-10-01,Baabda,1586.1509093619172,301.05811910908164 +2026-11-01,Baabda,501.84440825668463,268.7516325638057 +2026-12-01,Baabda,1959.5491209448521,305.5447085910976 +2027-01-01,Baabda,816.4113459286721,230.56608927806036 +2027-02-01,Baabda,1250.5742316063902,288.88903747068343 +2027-03-01,Baabda,1447.637752894016,289.70885045882426 +2027-04-01,Baabda,1302.788127968202,250.23390828495022 +2027-05-01,Baabda,1742.9548966796622,339.8233654138698 +2027-06-01,Baabda,1455.6991168887575,238.4094843529921 +2027-07-01,Baabda,1022.9993623705227,242.2773329310213 +2027-08-01,Baabda,1468.5187339808363,271.0738384819585 +2027-09-01,Baabda,1876.1766269659893,309.7933288351116 +2027-10-01,Baabda,963.1479487057991,246.0243955431517 +2027-11-01,Baabda,651.7355704671412,222.2943739407698 +2027-12-01,Baabda,649.4460498161341,224.15237189315127 +2028-01-01,Baabda,654.8681782548592,222.46827788475548 +2028-02-01,Baabda,1318.2966417162054,229.918544228027 +2028-03-01,Baabda,1347.9464775399442,227.36973409143002 +2028-04-01,Baabda,1223.5202318557042,213.15933482070622 +2028-05-01,Baabda,1107.8364989336487,204.99667493908163 +2028-06-01,Baabda,786.2250262807024,197.13061944230543 +2028-07-01,Baabda,494.52270676014837,252.73985158667566 +2028-08-01,Baabda,1916.8731066424582,311.4828007777239 +2028-09-01,Baabda,1979.0593117289754,312.8947434678546 +2028-10-01,Baabda,1406.0561540774358,259.05285018417027 +2028-11-01,Baabda,1997.6324191496044,311.07261581456777 +2028-12-01,Baabda,1115.7577322595175,268.4236481938686 +2029-01-01,Baabda,1138.8677050335432,259.42072525062605 +2029-02-01,Baabda,1160.5090767298343,247.73551845717296 +2029-03-01,Baabda,1149.6058742859707,235.9665272775762 +2029-04-01,Baabda,870.074842599557,215.00436655628735 +2029-05-01,Baabda,660.3909963729643,222.8835101000889 +2029-06-01,Baabda,497.73570795163135,265.9677249016523 +2029-07-01,Baabda,1043.80534799922,223.74638137059776 +2029-08-01,Baabda,1266.0226482262433,260.35119489167533 +2029-09-01,Baabda,1063.3850643232151,251.8013411507783 +2029-10-01,Baabda,884.1934933035947,260.0839689953626 +2029-11-01,Baabda,1584.4398325659333,276.665341082863 +2029-12-01,Baabda,925.5840048444395,246.35446843123106 +2030-01-01,Baabda,1340.308600373989,263.8407258125371 +2030-02-01,Baabda,1858.9792039854392,311.6028557622729 +2030-03-01,Baabda,1969.046050589997,316.8197304213947 +2030-04-01,Baabda,2001.4581951303953,314.827388539507 +2030-05-01,Baabda,2013.7655111947204,312.6030471006407 +2030-06-01,Baabda,2021.1182328855475,311.7354418556759 +2030-07-01,Baabda,692.7911934603411,212.2644222010303 +2030-08-01,Baabda,2026.2035295161963,311.69078237606544 +2030-09-01,Baabda,2029.8741325529247,312.0489284288416 +2030-10-01,Baabda,2033.1644323260048,312.7126943031137 +2030-11-01,Baabda,2036.1155971675346,313.4938000883499 +2030-12-01,Baabda,701.8201572046077,251.48115391523936 +2031-01-01,Baabda,1040.9973366761224,228.17296076465712 +2031-02-01,Baabda,762.471762331338,238.9197267394843 +2031-03-01,Baabda,1074.9860412071,231.55227014055666 +2031-04-01,Baabda,1599.7425046534458,265.90238909243266 +2031-05-01,Baabda,1850.3685450421424,289.34026181533653 +2031-06-01,Baabda,1939.1299161145741,297.0816501833328 +2031-07-01,Baabda,1636.9199556068204,287.5248348244231 +2031-08-01,Baabda,454.9380599407653,291.43327027168516 +2031-09-01,Baabda,775.7574740364727,248.67044360359262 +2031-10-01,Baabda,1132.7524084017448,230.36952491223022 +2031-11-01,Baabda,1393.081651931729,242.74023557295368 +2031-12-01,Baabda,2047.5010880613809,348.8573550644797 +2032-01-01,Baabda,2038.0548271326643,357.3078127461191 +2032-02-01,Baabda,2015.519339720191,368.0396284119107 +2032-03-01,Baabda,1897.3670902696313,359.757748952994 +2032-04-01,Baabda,1627.826216514847,285.05182049207525 +2032-05-01,Baabda,553.4734552013108,234.56163333617593 +2032-06-01,Baabda,1034.0440629628217,237.56212032969023 +2032-07-01,Baabda,1249.203009468042,264.8209543983277 +2032-08-01,Baabda,1545.214185118064,277.4039803325382 +2032-09-01,Baabda,1970.0335147794856,313.2676135735341 +2032-10-01,Baabda,1987.8936615396865,310.28580141307594 +2032-11-01,Baabda,1978.117478173316,304.7402288069851 +2032-12-01,Baabda,1949.8152574723165,297.5296895378188 +2033-01-01,Baabda,1908.5278826795427,289.228317242907 +2033-02-01,Baabda,1861.516670272947,280.98453583577026 +2033-03-01,Baabda,1728.7652090109727,258.5776949024695 +2033-04-01,Baabda,1438.623759452331,220.5893077293613 +2033-05-01,Baabda,1898.8906064476994,311.4241482265598 +2033-06-01,Baabda,1724.04179065618,325.82949326155335 +2033-07-01,Baabda,1504.5033109198826,280.2649717184619 +2033-08-01,Baabda,1581.834855971593,264.79202842205626 +2033-09-01,Baabda,1988.8601097274745,304.6660864129319 +2033-10-01,Baabda,1975.666235070867,301.8888272001984 +2033-11-01,Baabda,1929.049720449632,292.4751275469927 +2033-12-01,Baabda,1904.262066169996,288.8441691392588 +2034-01-01,Baabda,886.5482931105688,270.0848207156522 +2034-02-01,Baabda,873.698375550285,267.9863124948621 +2034-03-01,Baabda,879.9995774300023,249.27773246643227 +2034-04-01,Baabda,673.1431751308191,227.4036899155609 +2034-05-01,Baabda,1598.893227872399,278.23186892416277 +2034-06-01,Baabda,799.0679624979555,212.90338692236216 +2034-07-01,Baabda,1213.663871003394,216.0432999061956 +2034-08-01,Baabda,1261.9210012368292,214.4370902201914 +2034-09-01,Baabda,800.9519174997087,188.42158581032615 +2034-10-01,Baabda,455.3298068491753,272.84070742606247 +2034-11-01,Baabda,772.7455643133154,234.0891061064709 +2034-12-01,Baabda,712.8464328091143,205.4238117078264 +2035-01-01,Baabda,1255.0006190056417,218.69453445335668 +2035-02-01,Baabda,1579.0325304845721,258.79690228582615 +2035-03-01,Baabda,1076.2314552256794,217.60055124607985 +2035-04-01,Baabda,2001.260990182932,308.1301722210928 +2035-05-01,Baabda,1189.285237058223,270.16394074461124 +2035-06-01,Baabda,1003.5689892092961,239.5426098711201 +2035-07-01,Baabda,727.2430417274236,201.33083827837052 +2035-08-01,Baabda,844.0148565457388,193.20893930915736 +2035-09-01,Baabda,1137.2957512899118,209.27253294053529 +2035-10-01,Baabda,1137.443367110075,217.11008016466855 +2035-11-01,Baabda,1000.8746226351202,221.10872219136186 +2035-12-01,Baabda,788.6099106380561,229.55321019197777 +2036-01-01,Baabda,746.5747404423098,253.93178629482844 +2036-02-01,Baabda,2043.4629928853278,316.54637820519775 +2036-03-01,Baabda,640.2450715374013,213.3634874691202 +2036-04-01,Baabda,2039.4228824762354,315.85403444101115 +2036-05-01,Baabda,2024.7711306605695,314.4393766772954 +2036-06-01,Baabda,2009.262904803,313.40569943137865 +2036-07-01,Baabda,1981.7509433440257,311.578594143186 +2036-08-01,Baabda,1932.5621276927384,307.86503484292234 +2036-09-01,Baabda,1861.7383459073221,304.86258116149065 +2036-10-01,Baabda,1687.0749315554615,293.6740761952402 +2036-11-01,Baabda,1243.0285513520048,267.1402886040348 +2036-12-01,Baabda,861.2525841870844,259.58815478837056 +2037-01-01,Baabda,2033.5029914766867,315.1139680372721 +2037-02-01,Baabda,858.8363197723972,253.3584880647554 +2037-03-01,Baabda,517.445910614952,243.31412554983373 +2037-04-01,Baabda,1853.3794471487797,279.13315152417283 +2037-05-01,Baabda,1681.979846650048,292.5262962414801 +2037-06-01,Baabda,1876.4184549307618,304.06154743231303 +2037-07-01,Baabda,1949.0808489745366,307.9268549799357 +2037-08-01,Baabda,1984.87872896697,309.3119254033016 +2037-09-01,Baabda,2001.9838830633416,309.4931739694212 +2037-10-01,Baabda,2013.4327098527235,310.2137127285294 +2037-11-01,Baabda,2016.4774390853856,310.0130061350503 +2037-12-01,Baabda,2017.859025279367,310.11228036408295 +2038-01-01,Baabda,1799.588702905955,270.6262342354188 +2038-02-01,Baabda,2020.0254007971223,310.7072991828364 +2038-03-01,Baabda,1301.7235091423333,267.0760666711578 +2038-04-01,Baabda,1823.3478686092212,309.5654018885106 +2038-05-01,Baabda,1943.5884752698537,314.4505154407213 +2038-06-01,Baabda,1968.9136209902406,309.90485570391263 +2038-07-01,Baabda,1967.2657361445752,304.24225646457927 +2038-08-01,Baabda,1967.4079540190962,301.8644437508865 +2038-09-01,Baabda,1943.0083760448333,295.6610575472292 +2038-10-01,Baabda,1897.228039189887,286.51021530655527 +2038-11-01,Baabda,810.8156195580923,250.95834561125744 +2038-12-01,Baabda,2010.6675222317215,312.60203765020526 +2039-01-01,Baabda,2005.4149612587714,316.300559619844 +2039-02-01,Baabda,1987.9744148064947,321.42710586930946 +2039-03-01,Baabda,1811.150526690781,307.5335173964612 +2039-04-01,Baabda,1874.845133707568,308.8204622757727 +2039-05-01,Baabda,1936.6664376686695,314.6034993946479 +2039-06-01,Baabda,1971.8417545970299,317.2070113022564 +2039-07-01,Baabda,1993.077272753633,318.61575159790215 +2039-08-01,Baabda,1972.8821906264213,313.68061803618235 +2039-09-01,Baabda,2015.67868707555,318.40039056879095 +2039-10-01,Baabda,467.93199469078417,242.9538561702796 +2039-11-01,Baabda,1720.3480124394944,308.7862801955097 +2039-12-01,Baabda,799.8549109999867,196.56779861157978 +2040-01-01,Baabda,1733.5929876481819,296.8970251795497 +2040-02-01,Baabda,716.6940164903001,275.1708671174741 +2040-03-01,Baabda,1572.7922174316996,285.0655176902255 +2040-04-01,Baabda,1386.2752023398973,274.761273901125 +2040-05-01,Baabda,1349.3161162809038,286.1639738071906 +2040-06-01,Baabda,1446.642947498454,280.94652480557966 +2040-07-01,Baabda,905.838319685097,221.4129148587941 +2040-08-01,Baabda,899.5689296983646,242.62139889065443 +2040-09-01,Baabda,1862.9624560337666,310.08547771458956 +2040-10-01,Baabda,611.0841456436333,219.9310068108949 +2040-11-01,Baabda,1368.45895887092,277.37634227578786 +2040-12-01,Baabda,1019.0322321865135,276.9127086525056 +2041-01-01,Baabda,1227.7699984735416,229.59325752735717 +2041-02-01,Baabda,1259.4488141052884,227.376713222889 +2041-03-01,Baabda,1567.400317488571,258.57508425479153 +2041-04-01,Baabda,1874.4580650187145,301.6517107737711 +2041-05-01,Baabda,1992.4267843174378,305.9317284071916 +2041-06-01,Baabda,1984.8964342286763,304.542724607991 +2041-07-01,Baabda,1973.459410947099,302.7893266059051 +2041-08-01,Baabda,1948.282240909918,298.4032644638072 +2041-09-01,Baabda,1189.6252356610762,278.4072348308481 +2041-10-01,Baabda,1917.064265890802,292.9787214840651 +2041-11-01,Baabda,1873.3616342998612,293.50659444454215 +2041-12-01,Baabda,1739.7228947195183,280.47384093701396 +2042-01-01,Baabda,1399.4971463138447,252.76707193979752 +2042-02-01,Baabda,834.4211237420761,215.94889888616174 +2042-03-01,Baabda,758.7212696991043,230.0097080449403 +2042-04-01,Baabda,1423.1516638442602,292.7458343068761 +2042-05-01,Baabda,1628.8598871190331,327.7814223173867 +2042-06-01,Baabda,1131.9438681171446,276.187018215313 +2042-07-01,Baabda,1916.584352536902,296.02860193164577 +2042-08-01,Baabda,648.0882865555873,202.24710599605194 +2042-09-01,Baabda,762.1162176450354,197.09354824527887 +2042-10-01,Baabda,1404.9195626430042,231.99091116340216 +2042-11-01,Baabda,778.2169939889064,183.1973491247526 +2042-12-01,Baabda,461.39594618932483,271.33222298480194 +2043-01-01,Baabda,1996.3688680336668,307.7938163742685 +2043-02-01,Baabda,907.5046295185546,260.04983912805324 +2043-03-01,Baabda,995.7623362762602,244.27628845369307 +2043-04-01,Baabda,938.4034060186924,213.12656249018931 +2043-05-01,Baabda,702.6926091656121,204.61701714943948 +2043-06-01,Baabda,1982.4634721688024,307.1997373886791 +2043-07-01,Baabda,1440.904715362919,216.25963557710665 +2043-08-01,Baabda,1955.5261400165975,305.72895069988795 +2043-09-01,Baabda,1821.367038476342,300.8286779868274 +2043-10-01,Baabda,1407.2111704996598,264.2048763549723 +2043-11-01,Baabda,1014.5028519844077,242.08141252495176 +2043-12-01,Baabda,972.0588773720218,254.60364517690218 +2044-01-01,Baabda,1491.3782420770613,283.1774450765942 +2044-02-01,Baabda,1912.675520165829,321.57023897933135 +2044-03-01,Baabda,1183.1710919881616,255.31419385756283 +2044-04-01,Baabda,495.0273067187857,303.0889245334241 +2044-05-01,Baabda,1911.3335189065576,304.00296449842034 +2044-06-01,Baabda,1756.3380592967912,262.11466999379803 +2044-07-01,Baabda,1823.0378106115304,279.94864824148624 +2044-08-01,Baabda,1776.5920150178079,284.12147268125096 +2044-09-01,Baabda,1108.3509591396594,265.6943552811375 +2044-10-01,Baabda,1475.4345819376842,291.4550256690012 +2044-11-01,Baabda,1629.011173542233,295.0740099060524 +2044-12-01,Baabda,1850.0397741662252,318.53858085254257 +2045-01-01,Baabda,1912.257359310076,319.11476819937917 +2045-02-01,Baabda,1935.628016872318,316.4659702567175 +2045-03-01,Baabda,1957.8416427792963,316.7059409912727 +2045-04-01,Baabda,545.9099977126102,283.11879252543014 +2045-05-01,Baabda,860.5179597714788,278.74641017716453 +2045-06-01,Baabda,1191.5941903135424,263.3262889854423 +2045-07-01,Baabda,1931.234808845614,307.91843129009493 +2045-08-01,Baabda,1954.9481999698341,311.89260284588715 +2045-09-01,Baabda,1499.5369130385802,299.0720253773031 +2045-10-01,Baabda,1983.5581755450503,303.85852606455956 +2045-11-01,Baabda,1995.0843009160292,305.9805127101331 +2045-12-01,Baabda,2001.2414136334028,307.3011001358542 +2046-01-01,Baabda,2000.044365207778,307.40653549340675 +2046-02-01,Baabda,1044.9348141454036,251.93547622847032 +2046-03-01,Baabda,1497.4415025128683,268.0460441137331 +2046-04-01,Baabda,1325.960429021243,203.91461368953395 +2046-05-01,Baabda,1901.6739311660594,351.18897671859094 +2046-06-01,Baabda,543.3443901351543,227.91314910774972 +2046-07-01,Baabda,1027.6365575402565,248.89128699282747 +2046-08-01,Baabda,2019.5523968136442,310.3537826786092 +2046-09-01,Baabda,2012.2512075105485,310.2965920901447 +2046-10-01,Baabda,1999.389702360286,310.5597801847156 +2046-11-01,Baabda,1979.4538655691194,312.04774493522757 +2046-12-01,Baabda,1935.508542342103,313.1575486674327 +2047-01-01,Baabda,566.5642650824559,234.87273551779566 +2047-02-01,Baabda,715.0729054550201,220.19690997905087 +2047-03-01,Baabda,1780.444132973333,303.9597321728738 +2047-04-01,Baabda,2024.9267354402832,310.89498734656155 +2047-05-01,Baabda,1190.6919416925928,256.51448263828496 +2047-06-01,Baabda,1745.9941559940735,261.50125481107415 +2047-07-01,Baabda,2022.0299818908272,310.2184118943497 +2047-08-01,Baabda,2007.5180008809914,307.3559933543621 +2047-09-01,Baabda,1992.096286098915,304.76181016112264 +2047-10-01,Baabda,1967.5484445510117,300.68876467560835 +2047-11-01,Baabda,1943.439923805779,298.0827117375933 +2047-12-01,Baabda,1891.759272500813,291.3872532552822 +2048-01-01,Baabda,1832.824933814403,287.3053489719808 +2048-02-01,Baabda,781.3426924062021,249.34381666131955 +2048-03-01,Baabda,2028.4424534233835,311.4976988738059 +2048-04-01,Baabda,2032.1881958634522,312.4269154039698 +2048-05-01,Baabda,1803.6587539202096,272.4202713196911 +2048-06-01,Baabda,1619.7655722461911,278.6230831808592 +2048-07-01,Baabda,1623.745657499742,259.69881144127896 +2048-08-01,Baabda,1553.6177068939155,242.1355747621098 +2048-09-01,Baabda,1483.5664790888177,231.93981208618618 +2048-10-01,Baabda,1632.044243212308,253.75791715947838 +2048-11-01,Baabda,1842.3941239585456,287.27330762281366 +2048-12-01,Baabda,1963.113492411341,307.2778479672028 +2049-01-01,Baabda,2010.2582859794304,313.98401010499333 +2049-02-01,Baabda,2029.37190769037,316.096998718237 +2049-03-01,Baabda,1237.828386438089,248.67395927579886 +2049-04-01,Baabda,962.1930161353811,271.25334661629284 +2049-05-01,Baabda,2000.274389664746,312.79533000427904 +2049-06-01,Baabda,2003.9850094718358,312.46722380411705 +2049-07-01,Baabda,481.7798844414067,265.4627560234695 +2049-08-01,Baabda,833.7863253345479,245.68713467179904 +2049-09-01,Baabda,1402.0831221395244,267.35484903452476 +2049-10-01,Baabda,1713.2553997560149,281.48447486609354 +2049-11-01,Baabda,1844.420584725254,290.55835521322217 +2049-12-01,Baabda,1807.9586854462157,275.83315362472877 +2050-01-01,Baabda,1682.8831028875177,275.1510435994397 +2050-02-01,Baabda,1297.0839388765169,249.61403610030294 +2050-03-01,Baabda,853.5035813135078,235.47717007250748 +2050-04-01,Baabda,1705.7398760246176,255.7120217550434 +2050-05-01,Baabda,714.5904010872118,204.12207315834 +2050-06-01,Baabda,692.9962434221379,217.2196925585058 +2050-07-01,Baabda,812.5305109023301,249.90030232034675 +2050-08-01,Baabda,1502.3989757907086,232.31717250587175 +2050-09-01,Baabda,1709.3508857414556,308.1691927017189 +2050-10-01,Baabda,594.2268652111533,252.86615472133383 +2050-11-01,Baabda,1053.200724293682,246.06508683829168 +2050-12-01,Baabda,1465.0390023020175,303.49897026203735 +2051-01-01,Baabda,1347.856799669674,248.8442083130355 +2051-02-01,Baabda,1785.1098292960578,310.2509231600988 +2051-03-01,Baabda,1440.8503040708454,247.12452247463062 +2051-04-01,Baabda,817.3431033191324,209.17781864278004 +2051-05-01,Baabda,487.1797733440859,277.07860661027905 +2051-06-01,Baabda,617.3824686190079,202.2398135868716 +2051-07-01,Baabda,1089.7928220216113,205.8378256209101 +2051-08-01,Baabda,1222.4242329725023,236.89137532395904 +2051-09-01,Baabda,961.5659907695776,240.55352226928534 +2051-10-01,Baabda,708.0330486936177,236.93528641790178 +2051-11-01,Baabda,730.5765250656414,248.65418797071806 +2051-12-01,Baabda,447.4249832780592,257.4617648503801 +2052-01-01,Baabda,1092.0945780160744,243.10363772972127 +2052-02-01,Baabda,2021.6037601029154,315.44646012553306 +2052-03-01,Baabda,1269.0634189654345,291.6913414968073 +2052-04-01,Baabda,1599.9362549156983,241.00826228614469 +2052-05-01,Baabda,1634.9836045460333,248.98913406779624 +2052-06-01,Baabda,528.8722819504621,248.40123361504465 +2052-07-01,Baabda,676.6076486166223,250.72672894927166 +2052-08-01,Baabda,1949.0009593790314,307.3198967991353 +2052-09-01,Baabda,920.5269214763474,266.4255454827716 +2052-10-01,Baabda,1102.6659147618525,211.5664046292237 +2052-11-01,Baabda,1669.6509388031543,283.26375308882655 +2052-12-01,Baabda,1814.7678699971727,325.920622269831 +2053-01-01,Baabda,1969.0627482351838,312.39315102733525 +2053-02-01,Baabda,1991.2527671265532,319.2342314371212 +2053-03-01,Baabda,2006.5941604774728,326.81203662161846 +2053-04-01,Baabda,1987.796498518126,329.38477769526315 +2053-05-01,Baabda,1937.837288064777,329.3279700017914 +2053-06-01,Baabda,1817.133177804997,321.62544547556064 +2053-07-01,Baabda,1522.5395026806295,293.3789685817272 +2053-08-01,Baabda,1185.1992800974756,272.15257550679627 +2053-09-01,Baabda,1593.2367566201915,314.5120223000132 +2053-10-01,Baabda,1280.159939835899,258.31678677353733 +2053-11-01,Baabda,2011.330821792241,313.51050823348857 +2053-12-01,Baabda,863.4755301751707,247.63986432625367 +2054-01-01,Baabda,1552.1730726948329,235.10567490793827 +2054-02-01,Baabda,1596.413771507393,296.0100837374504 +2054-03-01,Baabda,1943.3328285642367,308.53217715485795 +2054-04-01,Baabda,2007.3003557126958,307.99528875773314 +2054-05-01,Baabda,2025.2485969457782,304.79917723155273 +2054-06-01,Baabda,951.5767684818595,261.3863863132453 +2054-07-01,Baabda,1162.9829912039806,265.33151006254116 +2054-08-01,Baabda,1643.837530906274,297.60388414482554 +2054-09-01,Baabda,1902.8623428786566,321.5224815311431 +2054-10-01,Baabda,913.187586690713,191.199053874874 +2054-11-01,Baabda,597.03890700033,228.98605568610677 +2054-12-01,Baabda,861.2763351479102,220.0282099261031 +2055-01-01,Baabda,1140.2356884045057,251.7258934328862 +2055-02-01,Baabda,1256.3737844044213,235.18677902913257 +2055-03-01,Baabda,1670.7987579645219,268.08400293097014 +2055-04-01,Baabda,1370.3614828056823,241.51086417709942 +2055-05-01,Baabda,1858.220612691182,288.1760521855234 +2055-06-01,Baabda,1926.265244169535,294.63500339253204 +2055-07-01,Baabda,928.1006710480726,252.2059219235858 +2055-08-01,Baabda,1387.4967214524338,272.17043233691334 +2055-09-01,Baabda,1889.310620412272,318.5159204306982 +2055-10-01,Baabda,1539.290695488087,270.2801145662791 +2055-11-01,Baabda,1983.8771581462029,320.8428081103535 +2055-12-01,Baabda,953.817131841218,243.59530970906442 +2056-01-01,Baabda,1563.4058377133076,271.58420269867565 +2056-02-01,Baabda,854.9941340368538,237.84034575488593 +2056-03-01,Baabda,1474.8541948222296,270.7348893917742 +2056-04-01,Baabda,1761.8967917465698,285.2379596715116 +2056-05-01,Baabda,1734.3779209171732,267.8687289234482 +2056-06-01,Baabda,1450.707240704024,222.29590552074086 +2056-07-01,Baabda,1026.4060418516497,187.55427643876484 +2056-08-01,Baabda,713.8012934069237,192.61653113808188 +2056-09-01,Baabda,536.2306175047572,229.44608661559343 +2056-10-01,Baabda,1971.675785761683,336.0261609620054 +2056-11-01,Baabda,1817.1579363823428,289.29689025524726 +2056-12-01,Baabda,1287.8133630853035,241.90475869874527 +2057-01-01,Baabda,716.0022877493982,217.1842225587217 +2057-02-01,Baabda,1533.8597863911173,261.95253136868087 +2057-03-01,Baabda,1613.3617374266626,315.2966437574556 +2057-04-01,Baabda,1936.7810180615022,343.5663032026691 +2057-05-01,Baabda,1776.604538251698,327.92678318009376 +2057-06-01,Baabda,1577.3047560434015,257.8763357016351 +2057-07-01,Baabda,1551.9682386508616,291.96095178466584 +2057-08-01,Baabda,1455.5440878899121,264.6295069019463 +2057-09-01,Baabda,1745.1859035999075,292.5845310890158 +2057-10-01,Baabda,821.5100294645137,280.87610693554694 +2057-11-01,Baabda,2007.7978303830853,316.74214197240667 +2057-12-01,Baabda,2023.581423441018,312.53534430419313 +2058-01-01,Baabda,1454.245414140996,245.1471483060964 +2058-02-01,Baabda,2002.5285717649488,313.972105551582 +2058-03-01,Baabda,1971.4202830012832,309.99476640994055 +2058-04-01,Baabda,1924.473414106743,303.752603386107 +2058-05-01,Baabda,1897.0316979137265,304.47592683607166 +2058-06-01,Baabda,1878.4728410695927,312.5186013504187 +2058-07-01,Baabda,1725.2637416043676,304.3829877787374 +2058-08-01,Baabda,1255.378187310165,269.010504387549 +2058-09-01,Baabda,987.922935806328,258.9177056560428 +2058-10-01,Baabda,907.6126604040081,236.1991707943153 +2058-11-01,Baabda,1959.4152518929243,319.40280965984397 +2058-12-01,Baabda,1991.9785389113053,318.3747366042758 +2059-01-01,Baabda,2001.5232583685365,315.6543024893318 +2059-02-01,Baabda,2032.9251953751404,323.30224707477606 +2059-03-01,Baabda,483.2083967761712,262.2533824070853 +2059-04-01,Baabda,1053.2608214218326,205.6890535119039 +2059-05-01,Baabda,1658.8121518439548,271.04043959599886 +2059-06-01,Baabda,1850.207614289395,313.60550100032947 +2059-07-01,Baabda,1794.8066988477917,317.30099461866183 +2059-08-01,Baabda,2020.749445239269,316.14169300648314 +2059-09-01,Baabda,2017.3232611812216,313.75249786891465 +2059-10-01,Baabda,2029.7575369270523,317.01890543490276 +2059-11-01,Baabda,2008.7354895274482,321.12200817734896 +2059-12-01,Baabda,2027.9056817087185,312.2503311950348 +2060-01-01,Baabda,2031.3734659345155,312.5261548243668 +2060-02-01,Baabda,2034.5170855313436,313.1292144379682 +2060-03-01,Baabda,2037.4410447268363,313.8868940113744 +2060-04-01,Baabda,1150.8838918962294,261.9092120215451 +2060-05-01,Baabda,1187.4590040885378,271.2610393247838 +2060-06-01,Baabda,1360.6208539079419,269.149599695829 +2060-07-01,Baabda,1438.0079618134632,260.9094557911235 +2060-08-01,Baabda,1521.9756692651447,260.2888700294443 +2060-09-01,Baabda,1418.908302788585,239.66926109213532 +2060-10-01,Baabda,1579.3240195492535,258.24683882008674 +2060-11-01,Baabda,1478.2910308263442,194.41700781995968 +2060-12-01,Baabda,612.3806602142926,200.91527538099794 +2061-01-01,Baabda,1113.633244799946,222.5826068487309 +2061-02-01,Baabda,884.5044149725882,224.6607346133153 +2061-03-01,Baabda,671.8278757093246,242.0167032711748 +2061-04-01,Baabda,1813.5558512689668,292.1152584667493 +2061-05-01,Baabda,1945.177342576497,311.95703363057845 +2061-06-01,Baabda,2034.6698114067149,317.5358136751325 +2061-07-01,Baabda,1044.8910547993974,229.30450248986045 +2061-08-01,Baabda,2023.4386297856283,312.6287358737915 +2061-09-01,Baabda,1471.7101433897503,207.31367696619645 +2061-10-01,Baabda,1180.8510549511238,250.9520974611483 +2061-11-01,Baabda,1796.2694701442322,292.16306812789105 +2061-12-01,Baabda,1651.1760020206054,263.5337832628841 +2062-01-01,Baabda,1436.9597527423473,231.92992643364576 +2062-02-01,Baabda,888.6314682928253,200.6295138861719 +2062-03-01,Baabda,703.820060078756,213.94280759317027 +2062-04-01,Baabda,732.894834760074,217.76114088690815 +2062-05-01,Baabda,612.9624148093095,225.26341133192395 +2062-06-01,Baabda,2002.0234679980515,306.2391234691087 +2062-07-01,Baabda,2005.348314623242,306.4657624961886 +2062-08-01,Baabda,1691.6187062792799,194.8039058058287 +2062-09-01,Baabda,2012.9332199492942,308.02136042587676 +2062-10-01,Baabda,2016.1735707320313,310.38041128492404 +2062-11-01,Baabda,2012.2516393462,312.4371491428673 +2062-12-01,Baabda,2001.346205751471,315.8138652754068 +2063-01-01,Baabda,1969.3238648590514,319.2918397292142 +2063-02-01,Baabda,1834.8413184159124,312.0281824819609 +2063-03-01,Baabda,1288.951969752775,266.88481062227277 +2063-04-01,Baabda,802.0616631511461,259.75027600916985 +2063-05-01,Baabda,1332.3798099242215,276.8516020925243 +2063-06-01,Baabda,1818.1410822153177,314.2465020268501 +2063-07-01,Baabda,2015.0821780957774,308.84458466031674 +2063-08-01,Baabda,2013.857060352813,322.2690571497592 +2063-09-01,Baabda,2020.433053652025,318.82223642490845 +2063-10-01,Baabda,2025.5464196000132,317.30499761176793 +2063-11-01,Baabda,964.6464184160869,239.34428766918685 +2063-12-01,Baabda,1579.8043647388051,282.8895080420366 +2064-01-01,Baabda,1932.4345922303642,318.53642271712886 +2064-02-01,Baabda,2033.6460730225103,340.25328687347104 +2064-03-01,Baabda,2017.9402103818263,344.95401908234857 +2064-04-01,Baabda,1989.791723172718,351.48161291896884 +2064-05-01,Baabda,1026.1924991220421,230.8796454684974 +2064-06-01,Baabda,908.578316893102,250.38078332331045 +2064-07-01,Baabda,1782.8025314107354,291.5277409089905 +2064-08-01,Baabda,1895.2807482925982,299.50252117939345 +2064-09-01,Baabda,1929.2195758058415,299.77641292944384 +2064-10-01,Baabda,1963.0844154774816,303.50922140525273 +2064-11-01,Baabda,1980.5045217089266,305.11706709713513 +2064-12-01,Baabda,1982.2512969187578,304.4057004135354 +2065-01-01,Baabda,1985.4935189893176,304.86265077876214 +2065-02-01,Baabda,1989.3670847821945,305.7291247430665 +2065-03-01,Baabda,2005.2928957146482,309.37096084945847 +2065-04-01,Baabda,1436.2174272576253,277.80065954504045 +2065-05-01,Baabda,2009.253548363887,311.71037963796783 +2065-06-01,Baabda,2012.9371064701568,312.5081239510713 +2065-07-01,Baabda,2020.4575243389363,314.6997452723742 +2065-08-01,Baabda,1953.0583432141789,321.0817345858374 +2065-09-01,Baabda,604.7604163374355,244.66062800483766 +2065-10-01,Baabda,1963.745699804961,312.1195551506884 +2065-11-01,Baabda,1734.902745178817,260.33899446486055 +2065-12-01,Baabda,1681.4472493466797,256.5456537715594 +2066-01-01,Baabda,1607.9885503617606,245.49680105176023 +2066-02-01,Baabda,1503.9240753661652,232.82148001997606 +2066-03-01,Baabda,1546.3447308533764,241.3417290162054 +2066-04-01,Baabda,1737.0725753817835,315.2137295872046 +2066-05-01,Baabda,1233.0412003521094,277.76162166009647 +2066-06-01,Baabda,1001.7762235025929,274.27576305030175 +2066-07-01,Baabda,1522.3107737306152,300.7930687525005 +2066-08-01,Baabda,1791.3003373038048,326.24267176738016 +2066-09-01,Baabda,1682.2141894635304,256.2135445782913 +2066-10-01,Baabda,1805.0550225263378,311.1528845285052 +2066-11-01,Baabda,1192.7677756687756,216.41020033085164 +2066-12-01,Baabda,481.00294013196594,264.0835682595379 +2067-01-01,Baabda,627.6959994809122,221.30612196444898 +2067-02-01,Baabda,844.849450914639,214.04490132169514 +2067-03-01,Baabda,899.1176614426728,218.78460179824526 +2067-04-01,Baabda,855.1287228148672,220.57985718476718 +2067-05-01,Baabda,989.9734354242966,235.5770186440293 +2067-06-01,Baabda,805.4134995045479,232.8017609278488 +2067-07-01,Baabda,720.4040605165212,233.92000575421258 +2067-08-01,Baabda,1718.0908074897318,284.2474103252342 +2067-09-01,Baabda,1698.9394721319052,258.7229687435873 +2067-10-01,Baabda,1807.2608390335859,281.287005475735 +2067-11-01,Baabda,1856.80548726161,300.163989683709 +2067-12-01,Baabda,1296.9487743176353,205.5055771930991 +2068-01-01,Baabda,741.183200362224,250.05988251073956 +2068-02-01,Baabda,835.8034296621429,187.48838369137394 +2068-03-01,Baabda,663.8314310075074,205.10428583636585 +2068-04-01,Baabda,526.7282179413613,239.57807987090422 +2068-05-01,Baabda,2000.3454986020065,328.0139788125366 +2068-06-01,Baabda,825.7499358349778,249.96034721693906 +2068-07-01,Baabda,1273.6281377183448,263.2572460565201 +2068-08-01,Baabda,1835.3825524323086,311.46299466400734 +2068-09-01,Baabda,1963.2899692475382,317.85055335918355 +2068-10-01,Baabda,1992.3481902288866,314.09477118380886 +2068-11-01,Baabda,2006.79568378145,311.8107329347074 +2068-12-01,Baabda,2014.8661163248705,310.7292634319667 +2069-01-01,Baabda,2016.6033911503712,309.7470681582587 +2069-02-01,Baabda,2019.6066641605012,309.9694953404181 +2069-03-01,Baabda,2021.6620579158518,310.36600050974187 +2069-04-01,Baabda,2019.8798721826072,310.1247418556656 +2069-05-01,Baabda,1955.4397728863214,332.76013629101004 +2069-06-01,Baabda,868.3361283218846,257.13670440584235 +2069-07-01,Baabda,1274.8131667183397,266.9058698468747 +2069-08-01,Baabda,1791.9847968112417,307.1694538756152 +2069-09-01,Baabda,1917.7972349364109,296.4977179150517 +2069-10-01,Baabda,589.2061280103856,206.60022176445443 +2069-11-01,Baabda,1349.4561749771678,249.6452942551667 +2069-12-01,Baabda,1549.4749635450116,246.21328460480873 +2070-01-01,Baabda,1973.2590392048585,310.2822509322339 +2070-02-01,Baabda,1758.279160549744,267.21742454075866 +2070-03-01,Baabda,1989.7252204824053,304.8941003811222 +2070-04-01,Baabda,2001.5660100980233,307.55690879965545 +2070-05-01,Baabda,1725.0984924951065,258.65902527979586 +2070-06-01,Baabda,1827.7607971306718,274.95952648578685 +2070-07-01,Baabda,2014.563111642819,310.3653739542992 +2070-08-01,Baabda,1143.5110898476132,256.6496793793659 +2070-09-01,Baabda,2009.5258927146906,309.8933340454941 +2070-10-01,Baabda,1908.9292019448917,290.4418855181508 +2070-11-01,Baabda,1937.59718744261,297.16802781283644 +2070-12-01,Baabda,1992.6629984187425,306.6230453166248 +2071-01-01,Baabda,1974.9187275583283,303.2101978202228 +2071-02-01,Baabda,1205.6653390959282,213.186450747921 +2071-03-01,Baabda,1946.376694125596,301.49665570601996 +2071-04-01,Baabda,1543.855342268389,246.44430951998754 +2071-05-01,Baabda,1754.3136137631227,278.1304191553985 +2071-06-01,Baabda,1932.0588952136636,303.1795662208018 +2071-07-01,Baabda,1910.217367692958,307.36608785871675 +2071-08-01,Baabda,1837.6545837394349,309.24568456955365 +2071-09-01,Baabda,1421.674498026107,275.78306399794826 +2071-10-01,Baabda,981.3075015176233,256.0963090932344 +2071-11-01,Baabda,1962.9254999577736,303.62179253312496 +2071-12-01,Baabda,1968.9228334841366,302.95811368044207 +2072-01-01,Baabda,1844.2167582978027,295.6559058691448 +2072-02-01,Baabda,1914.8859429200254,313.1418847813651 +2072-03-01,Baabda,1906.0464110814974,321.27488770536837 +2072-04-01,Baabda,1973.366422336835,319.12127741425616 +2072-05-01,Baabda,980.4524669278914,256.4371378497469 +2072-06-01,Baabda,1281.0381496055886,266.27813091055793 +2072-07-01,Baabda,1758.3892786408458,308.88019389464364 +2072-08-01,Baabda,1870.1781418778892,311.062416884306 +2072-09-01,Baabda,1794.9713721761846,304.84879694175123 +2072-10-01,Baabda,1923.602833433561,310.02550243526866 +2072-11-01,Baabda,1952.3823764745525,306.49061586208245 +2072-12-01,Baabda,1814.0539017202248,289.38935939599946 +2073-01-01,Baabda,1568.3700764163532,244.8954818699441 +2073-02-01,Baabda,1071.98679866305,197.27128113919218 +2073-03-01,Baabda,524.5216817080277,233.5989657070988 +2073-04-01,Baabda,1848.5984507071366,348.3419435955853 +2073-05-01,Baabda,1354.5174327565567,247.5232379923217 +2073-06-01,Baabda,1942.938562614527,351.49988745271435 +2073-07-01,Baabda,1471.1366656447176,281.6125010282191 +2073-08-01,Baabda,1957.591322046713,328.6031149718557 +2073-09-01,Baabda,1097.9396175027173,250.7859036299714 +2073-10-01,Baabda,746.5359472062942,251.4665865011965 +2073-11-01,Baabda,561.5271181269359,255.50445786033023 +2073-12-01,Baabda,602.1436362352911,240.39166211325377 +2074-01-01,Baabda,1974.1892131979307,306.15532167864717 +2074-02-01,Baabda,1984.9876954963347,305.72989053305196 +2074-03-01,Baabda,1991.1325728702523,305.73540770181137 +2074-04-01,Baabda,905.29514240827,258.7033018644135 +2074-05-01,Baabda,929.7957699249555,292.19636258794355 +2074-06-01,Baabda,1969.5380553421357,341.6461196225993 +2074-07-01,Baabda,656.8331744138544,37.200288982916696 +2074-08-01,Baabda,671.0813758133061,42.252501390832606 +2074-09-01,Baabda,668.0688183366718,38.934020105828814 +2074-10-01,Baabda,731.3027286860452,42.88441736343408 +2074-11-01,Baabda,737.9891999394018,41.560644947545924 +2074-12-01,Baabda,597.6242602257754,34.4261973560323 +2075-01-01,Baabda,853.5350333434499,44.20201124648443 +2075-02-01,Baabda,692.199866508385,35.3983851469749 +2075-03-01,Baabda,546.8557177891321,34.91379672499787 +2075-04-01,Baabda,601.943048575225,37.75954192848246 +2075-05-01,Baabda,759.3799630126757,41.826356668205435 +2075-06-01,Baabda,906.9816765447337,45.116642958287656 +2075-07-01,Baabda,715.9488121012355,40.588335326378335 +2075-08-01,Baabda,596.7213638513487,36.188367134316 +2075-09-01,Baabda,509.48070202525133,33.26435471344713 +2075-10-01,Baabda,702.2446516499139,39.46636597599405 +2075-11-01,Baabda,1008.5636003531552,72.50049224206217 +2075-12-01,Baabda,628.3865046874685,37.94336633364429 +2076-01-01,Baabda,665.589361971666,41.660371688842744 +2076-02-01,Baabda,672.0988525805654,38.93744875644579 +2076-03-01,Baabda,745.8388924923585,58.331167161471086 +2076-04-01,Baabda,885.7918609945687,46.25525083653923 +2076-05-01,Baabda,610.4872768008175,33.441495860553474 +2076-06-01,Baabda,812.2822054027868,39.528273134596674 +2076-07-01,Baabda,835.756431548751,48.08289565858537 +2076-08-01,Baabda,676.09628323278,45.982124876474394 +2076-09-01,Baabda,615.7190376898927,37.67908176704873 +2076-10-01,Baabda,739.1592586368154,37.466348789933235 +2076-11-01,Baabda,726.3794423972722,37.04793158443276 +2076-12-01,Baabda,708.169436786845,36.4339594635376 +2077-01-01,Baabda,695.8589539277434,35.98048996188149 +2077-02-01,Baabda,689.5301145663377,35.67436541516764 +2077-03-01,Baabda,692.8771287549656,35.64117538102225 +2077-04-01,Baabda,635.4239863527883,34.107576509100085 +2077-05-01,Baabda,680.043692922043,35.25199742951453 +2077-06-01,Baabda,738.7190021902336,36.90927138409907 +2077-07-01,Baabda,806.6023430527963,38.78939022447156 +2077-08-01,Baabda,707.8656404060995,41.5335116160133 +2077-09-01,Baabda,778.6093166781849,43.19193425557616 +2077-10-01,Baabda,814.0968507824933,40.94025063336305 +2077-11-01,Baabda,770.8384341316051,38.236228790154286 +2077-12-01,Baabda,732.5539005133096,36.77243863713994 +2078-01-01,Baabda,707.9208433968676,35.99469188524942 +2078-02-01,Baabda,846.0154791459731,40.019370771450674 +2078-03-01,Baabda,791.112110347368,40.43331506726299 +2078-04-01,Baabda,670.3059429286451,35.64413411505721 +2078-05-01,Baabda,668.7099503337538,34.55575509812894 +2078-06-01,Baabda,1068.012543190793,58.54550133582903 +2078-07-01,Baabda,851.3323836309785,40.82177944173867 +2078-08-01,Baabda,705.9371343596458,40.747584834731946 +2078-09-01,Baabda,487.63348866846883,31.2442007316306 +2078-10-01,Baabda,776.5002313568458,38.35959059509531 +2078-11-01,Baabda,753.9054385149165,37.530901404849516 +2078-12-01,Baabda,754.7515485011868,37.38733318688132 +2079-01-01,Baabda,931.9952528426502,48.5098931927873 +2079-02-01,Baabda,795.581465393932,44.766659530584576 +2079-03-01,Baabda,694.0522975075874,40.37481915495954 +2079-04-01,Baabda,677.6412472481998,38.006282942682375 +2079-05-01,Baabda,725.9247914289781,59.516923336786064 +2079-06-01,Baabda,811.665903955659,39.647370881663775 +2079-07-01,Baabda,675.5590077098549,36.58229646459752 +2079-08-01,Baabda,456.08760644473847,30.53488775753747 +2079-09-01,Baabda,521.2969489813488,31.502707064699027 +2079-10-01,Baabda,449.869820818346,30.21174178796351 +2079-11-01,Baabda,763.2938334663481,37.47846219515884 +2079-12-01,Baabda,761.7205122431542,37.29157463005487 +2080-01-01,Baabda,746.165792080453,36.82160583507425 +2080-02-01,Baabda,714.0234728495585,36.14301148199142 +2080-03-01,Baabda,670.3965564428262,35.50328097067406 +2080-04-01,Baabda,667.2900027394084,34.51991960766994 +2080-05-01,Baabda,968.0304265255165,45.12003680026896 +2080-06-01,Baabda,744.7479316917561,38.649859808245246 +2080-07-01,Baabda,602.7640401211067,38.17893377578269 +2080-08-01,Baabda,620.8790418882304,32.840716212590785 +2080-09-01,Baabda,577.2501822210669,32.859060363607725 +2080-10-01,Baabda,621.9553202766859,32.86071377380371 +2080-11-01,Baabda,725.8818957542742,37.06606688363546 +2080-12-01,Baabda,611.8623854600282,32.69963681207554 +2081-01-01,Baabda,692.0696680594939,37.035644136028644 +2081-02-01,Baabda,710.0343910199375,42.53363333710976 +2081-03-01,Baabda,1039.433371892042,61.01256339147116 +2081-04-01,Baabda,867.4748321152076,54.308559389094356 +2081-05-01,Baabda,696.9799273061169,48.02215458927894 +2081-06-01,Baabda,721.7323869801656,51.9363334614324 +2081-07-01,Baabda,532.6553781743752,29.602799514927845 +2081-08-01,Baabda,678.4466927106317,35.287084534305876 +2081-09-01,Baabda,463.17402948388144,29.93222844324668 +2081-10-01,Baabda,538.4737158232413,31.47825399811579 +2081-11-01,Baabda,601.1309096601967,32.86301114376029 +2081-12-01,Baabda,633.9106183125278,33.64613582986733 +2082-01-01,Baabda,652.454864717123,34.63440521050603 +2082-02-01,Baabda,700.1666584954742,37.888873414447 +2082-03-01,Baabda,655.3318977718327,34.41652055530612 +2082-04-01,Baabda,620.2916734297453,36.336686731058 +2082-05-01,Baabda,626.9333057479669,37.287362785134526 +2082-06-01,Baabda,680.3852749222845,40.902552880893765 +2082-07-01,Baabda,858.3815968314942,44.73270370645368 +2082-08-01,Baabda,979.0893057217024,70.08968094172043 +2082-09-01,Baabda,683.1192264311701,35.75966397696449 +2082-10-01,Baabda,906.9300002117853,40.44226088663932 +2082-11-01,Baabda,692.0851421703351,36.8133213797763 +2082-12-01,Baabda,561.8566087289387,32.50759756888715 +2083-01-01,Baabda,919.9116996183484,49.418189732892074 +2083-02-01,Baabda,822.3439760799366,46.74432957252229 +2083-03-01,Baabda,664.338118171793,37.21013982682139 +2083-04-01,Baabda,658.0737662676603,37.137215735017904 +2083-05-01,Baabda,675.2632722612684,35.0163081571512 +2083-06-01,Baabda,657.0298035804495,38.00408999863292 +2083-07-01,Baabda,698.4919998394232,36.0474443726614 +2083-08-01,Baabda,649.0933120615654,34.00941615641 +2083-09-01,Baabda,775.2839662447345,42.129835758605694 +2083-10-01,Baabda,913.5700491326185,47.34319474552123 +2083-11-01,Baabda,981.7052221525443,61.14913507366252 +2083-12-01,Baabda,722.6579547262897,53.265657854715585 +2084-01-01,Baabda,702.435019199564,39.52611499918288 +2084-02-01,Baabda,914.3430349485885,52.79217338752868 +2084-03-01,Baabda,1161.380017266059,59.86962183807421 +2084-04-01,Baabda,1151.2389327742721,63.42415788611628 +2084-05-01,Baabda,1165.5734293313913,55.91809329980849 +2084-06-01,Baabda,1080.8998865075293,50.90765125473942 +2084-07-01,Baabda,800.0588813726552,46.21046952670385 +2084-08-01,Baabda,648.9344685144663,33.613711585707506 +2084-09-01,Baabda,685.6633141986656,36.064953116421385 +2084-10-01,Baabda,672.398402577406,34.567816290401 +2084-11-01,Baabda,719.4645300843358,49.252831308972105 +2084-12-01,Baabda,880.4284622044311,44.68096066947711 +2085-01-01,Baabda,946.2975776437412,44.852863116909774 +2085-02-01,Baabda,1032.7932509986,47.8776987511002 +2085-03-01,Baabda,1142.142170832739,54.05363834550356 +2085-04-01,Baabda,1175.453109308876,65.50198977729717 +2085-05-01,Baabda,608.0800809348095,36.34450126977394 +2085-06-01,Baabda,460.8854444767855,29.787424518710907 +2085-07-01,Baabda,464.4023859942313,30.31011099246784 +2085-08-01,Baabda,479.2541496890946,30.93276786797162 +2085-09-01,Baabda,508.61767847596866,31.521991048879983 +2085-10-01,Baabda,548.9787657965326,32.146283930261895 +2085-11-01,Baabda,590.2135286124462,32.8470687886071 +2085-12-01,Baabda,623.2608314234158,33.47552130195582 +2086-01-01,Baabda,821.4828957910852,43.52895146647883 +2086-02-01,Baabda,780.9898107064163,44.322048826715545 +2086-03-01,Baabda,697.0064851986767,41.367996553232686 +2086-04-01,Baabda,556.2034482167253,35.102912042787025 +2086-05-01,Baabda,1183.4763278210787,61.94235426412422 +2086-06-01,Baabda,622.8672851997917,40.0454598439121 +2086-07-01,Baabda,687.2701746574502,42.32237972701181 +2086-08-01,Baabda,758.8079247198144,41.70628427933859 +2086-09-01,Baabda,907.8629811365912,46.52092774856308 +2017-01-01,Beirut,1115.4696978800473,65.23535562779144 +2017-02-01,Beirut,715.3443861345208,45.69215153672796 +2017-03-01,Beirut,627.4700774626319,32.97866283589249 +2017-04-01,Beirut,582.3042427395992,37.345528015398756 +2017-05-01,Beirut,452.45558072619986,30.177002769529246 +2017-06-01,Beirut,508.8672794824661,31.37633431276945 +2017-07-01,Beirut,585.897979030382,32.82280716952019 +2017-08-01,Beirut,655.3406784300772,35.394103684783104 +2017-09-01,Beirut,850.2947545333215,48.80498340198248 +2017-10-01,Beirut,758.6551988444431,37.07812807590746 +2017-11-01,Beirut,672.8980364260525,34.836660788274045 +2017-12-01,Beirut,720.4755293168245,50.36505424135882 +2018-01-01,Beirut,566.6638032000991,29.90258888994324 +2018-02-01,Beirut,701.1474292323663,39.133908696368806 +2018-03-01,Beirut,686.5664264909179,36.182919582828035 +2018-04-01,Beirut,700.7286206231365,38.09051984109017 +2018-05-01,Beirut,861.1698876598452,42.12115100399713 +2018-06-01,Beirut,997.7967140299106,45.61877493266034 +2018-07-01,Beirut,1117.873511033453,51.30896001579055 +2018-08-01,Beirut,1192.8496804973206,58.3214903607449 +2018-09-01,Beirut,453.9963703303232,31.537759360854654 +2018-10-01,Beirut,562.7227990729982,33.689350751095986 +2018-11-01,Beirut,627.658789642285,36.22514245793907 +2018-12-01,Beirut,725.5036077236656,58.54028004047315 +2019-01-01,Beirut,857.8285593072937,45.300641406628 +2019-02-01,Beirut,696.190099899743,37.86083505838609 +2019-03-01,Beirut,602.9360546555729,33.67415678161045 +2019-04-01,Beirut,930.8528316269246,49.05732860653103 +2019-05-01,Beirut,853.7011461240139,47.149502092136785 +2019-06-01,Beirut,753.5735008442226,43.784481661194434 +2019-07-01,Beirut,689.7602109959146,36.64745823063859 +2019-08-01,Beirut,672.3067814467049,35.44769157945204 +2019-09-01,Beirut,707.2920906884584,36.656873966597004 +2019-10-01,Beirut,737.0436957807057,36.48291780965772 +2019-11-01,Beirut,750.0271225298744,36.756739942436674 +2019-12-01,Beirut,763.6595262904583,37.28668401673822 +2020-01-01,Beirut,772.9796192363633,37.718746207435366 +2020-02-01,Beirut,788.0705479094828,38.35208933410074 +2020-03-01,Beirut,807.3145120145305,39.09349587031453 +2020-04-01,Beirut,841.5663484024153,40.30610690807645 +2020-05-01,Beirut,570.9069483379486,33.13965277603141 +2020-06-01,Beirut,913.1246106582203,42.74662737899302 +2020-07-01,Beirut,580.6957269108177,35.77647654801035 +2020-08-01,Beirut,631.7930402233783,38.9538784324989 +2020-09-01,Beirut,819.5366844829248,43.22629037901767 +2020-10-01,Beirut,702.0259268924902,39.39862837091077 +2020-11-01,Beirut,684.1114408128236,36.09774285125616 +2020-12-01,Beirut,715.3367570380133,37.066902290892415 +2021-01-01,Beirut,747.0287436571272,36.87122554527275 +2021-02-01,Beirut,750.2588023568396,36.83394549643195 +2021-03-01,Beirut,729.5698441896666,36.33842716284331 +2021-04-01,Beirut,698.2185039268828,35.590302559938365 +2021-05-01,Beirut,672.705437725537,35.01860552710778 +2021-06-01,Beirut,650.0093794233592,34.52733384707527 +2021-07-01,Beirut,627.1802437679476,34.07945113144986 +2021-08-01,Beirut,1071.9646310996122,49.533232273899486 +2021-09-01,Beirut,733.49868494592,47.34744139907728 +2021-10-01,Beirut,634.5492312683101,42.56595315536252 +2021-11-01,Beirut,575.8138248719688,35.31338245858154 +2021-12-01,Beirut,860.893009034702,42.00607365435405 +2022-01-01,Beirut,823.3461946541806,40.389369164684496 +2022-02-01,Beirut,772.9442806855589,38.79198346783163 +2022-03-01,Beirut,730.5287352535554,37.40177877069915 +2022-04-01,Beirut,702.9698476537978,36.5735420927175 +2022-05-01,Beirut,680.9660938733902,35.98344869591645 +2022-06-01,Beirut,662.4235028387922,35.54726168188822 +2022-07-01,Beirut,643.215021229766,35.11573902504453 +2022-08-01,Beirut,661.4180454971627,34.630959155571134 +2022-09-01,Beirut,697.8882216261857,35.63969601400477 +2022-10-01,Beirut,738.8566857904152,37.192735508968525 +2022-11-01,Beirut,772.9783237294091,39.9137787750374 +2022-12-01,Beirut,770.8402334468193,42.011782270609785 +2023-01-01,Beirut,790.0364077397807,43.67408607305376 +2023-02-01,Beirut,713.0717070739175,44.19212559394401 +2023-03-01,Beirut,638.2684877884273,36.944010402533394 +2023-04-01,Beirut,633.4563272072761,37.950536912599645 +2023-05-01,Beirut,724.1774404382782,41.78068773815956 +2023-06-01,Beirut,897.4962625169588,45.37161621483194 +2023-07-01,Beirut,601.4175765601042,35.40056068670649 +2023-08-01,Beirut,706.0756816311301,40.80056357827603 +2023-09-01,Beirut,627.2485457734741,32.15063500972508 +2023-10-01,Beirut,615.3514735779601,35.590581029023994 +2023-11-01,Beirut,634.0387295557706,36.34347441502061 +2023-12-01,Beirut,665.942891424929,39.18530364698829 +2024-01-01,Beirut,802.3925212327117,44.292478890683554 +2024-02-01,Beirut,934.991544509749,47.828026827948165 +2024-03-01,Beirut,699.1896303342273,38.589884528924316 +2024-04-01,Beirut,675.3367562946115,37.9713872853874 +2024-05-01,Beirut,640.2342756461167,33.12828775647352 +2024-06-01,Beirut,668.4955439328436,37.78766730613263 +2024-07-01,Beirut,617.1757632872141,32.774632017703496 +2024-08-01,Beirut,806.2357145847749,51.37948231173027 +2024-09-01,Beirut,857.8787242154623,39.133647631601036 +2024-10-01,Beirut,737.4178094000176,40.35885939548844 +2024-11-01,Beirut,686.8443127325811,36.812764441605026 +2024-12-01,Beirut,672.0461686310971,35.437510053508134 +2025-01-01,Beirut,660.6268506112262,35.03996062511321 +2025-02-01,Beirut,653.2667877143257,34.94047754426629 +2025-03-01,Beirut,643.4654859075663,34.77193413017926 +2025-04-01,Beirut,631.8368715419933,34.571732261917845 +2025-05-01,Beirut,626.6511011497902,34.595106260794275 +2025-06-01,Beirut,635.9636369717961,35.01789195007581 +2025-07-01,Beirut,654.6207364266185,35.60965616139072 +2025-08-01,Beirut,637.3443594944746,33.23428005219741 +2025-09-01,Beirut,551.10195774915,29.634022861155884 +2025-10-01,Beirut,590.3312038274473,31.404964415637416 +2025-11-01,Beirut,840.4343632149315,42.0362005285573 +2025-12-01,Beirut,975.5049258700326,45.37539295180605 +2026-01-01,Beirut,1051.3256219227821,48.31379874353922 +2026-02-01,Beirut,1108.6094847496188,51.229752965242184 +2026-03-01,Beirut,1153.2874891318097,55.91976411432235 +2026-04-01,Beirut,1135.3845186695132,63.62409868960985 +2026-05-01,Beirut,639.5544223856278,43.5917636496098 +2026-06-01,Beirut,873.8233919713596,40.681065531898376 +2026-07-01,Beirut,638.1064054739427,35.869467818298105 +2026-08-01,Beirut,518.8557820440986,32.00384699295415 +2026-09-01,Beirut,500.5727242359796,31.47813216789081 +2026-10-01,Beirut,574.0082480409412,32.77339631113592 +2026-11-01,Beirut,624.4633497672913,33.77155134431503 +2026-12-01,Beirut,680.9717077368583,38.22909301983459 +2027-01-01,Beirut,558.0594058737474,31.84527625299679 +2027-02-01,Beirut,507.4183269268697,30.845467809621688 +2027-03-01,Beirut,493.33184797885986,30.44038231159645 +2027-04-01,Beirut,907.8369990248998,43.72859639656892 +2027-05-01,Beirut,708.5716916961055,39.854186390709216 +2027-06-01,Beirut,643.9361147949618,36.117026835437116 +2027-07-01,Beirut,623.8109180706649,34.918130400143255 +2027-08-01,Beirut,602.9672187950807,34.48632927421393 +2027-09-01,Beirut,581.6208628212905,34.16962290224549 +2027-10-01,Beirut,558.3133252367588,33.83580808582775 +2027-11-01,Beirut,533.8480362708776,33.487112577645824 +2027-12-01,Beirut,518.3840015949663,33.351167450897194 +2028-01-01,Beirut,710.2052539926667,36.93349819455027 +2028-02-01,Beirut,686.9378771237134,38.64094879750458 +2028-03-01,Beirut,628.7065668777495,35.31611493648447 +2028-04-01,Beirut,549.1895735670143,30.108847460817422 +2028-05-01,Beirut,704.4696848436486,36.193466599446886 +2028-06-01,Beirut,526.5759958742501,29.41509394688478 +2028-07-01,Beirut,707.9368213159686,41.56353406430949 +2028-08-01,Beirut,759.3058312258555,41.87167751189429 +2028-09-01,Beirut,876.4430509778466,42.99582240201016 +2028-10-01,Beirut,973.4973219267679,44.93924074641349 +2028-11-01,Beirut,1033.6564904657084,47.177923343190514 +2028-12-01,Beirut,1054.976864327807,48.109976777164405 +2029-01-01,Beirut,1033.8353423979884,47.74521708360432 +2029-02-01,Beirut,979.8019784916961,46.43787434376928 +2029-03-01,Beirut,907.3114550371707,44.515619649875 +2029-04-01,Beirut,841.604637830171,42.40102983938884 +2029-05-01,Beirut,793.4826001830089,40.442765611857055 +2029-06-01,Beirut,762.7453302164873,39.059244172780076 +2029-07-01,Beirut,654.7386275594451,33.842108448890485 +2029-08-01,Beirut,648.2689378030814,33.58972843570622 +2029-09-01,Beirut,702.4143630609062,36.14755400895105 +2029-10-01,Beirut,709.030948911348,36.44793513077349 +2029-11-01,Beirut,684.4030738227223,35.98163864685975 +2029-12-01,Beirut,496.7890522311983,30.459440039645365 +2030-01-01,Beirut,498.1619297395432,30.636563782433846 +2030-02-01,Beirut,490.3495909704309,30.535392482755206 +2030-03-01,Beirut,480.4121169882697,30.24677667980133 +2030-04-01,Beirut,474.40988932452444,29.921176701410147 +2030-05-01,Beirut,480.383255972236,30.015351465311937 +2030-06-01,Beirut,499.7646157870308,31.109560928720875 +2030-07-01,Beirut,702.0544280454811,39.407434955744264 +2030-08-01,Beirut,703.364689384376,37.8070383119029 +2030-09-01,Beirut,709.4992027026608,36.67702816667058 +2030-10-01,Beirut,680.827186738863,34.85919937989346 +2030-11-01,Beirut,648.0579141147736,34.01176573932011 +2030-12-01,Beirut,614.7798671207504,33.30060790753461 +2031-01-01,Beirut,566.797816197244,32.364673310679535 +2031-02-01,Beirut,495.6852083336628,31.037124157817324 +2031-03-01,Beirut,765.5586675126183,38.47026465232162 +2031-04-01,Beirut,744.4660149840136,37.71959901901013 +2031-05-01,Beirut,657.534331566478,36.603251263292336 +2031-06-01,Beirut,711.6048333387888,43.348660137841094 +2031-07-01,Beirut,767.9454231577946,42.03844568556035 +2031-08-01,Beirut,795.2008022672406,40.57575200457073 +2031-09-01,Beirut,770.0065747218305,38.18690495335928 +2031-10-01,Beirut,739.2922640174404,36.95032816991399 +2031-11-01,Beirut,711.3095297258534,36.092678194761 +2031-12-01,Beirut,693.1903535474331,35.663296269013244 +2032-01-01,Beirut,683.2695772104588,35.500270023685516 +2032-02-01,Beirut,674.0548521634905,35.34805185974447 +2032-03-01,Beirut,670.1732254384542,35.36207973993384 +2032-04-01,Beirut,674.5408831891183,35.6091862448087 +2032-05-01,Beirut,635.3823142124304,33.17910836460388 +2032-06-01,Beirut,640.449329800504,35.711749889915566 +2032-07-01,Beirut,640.3325902294141,34.27907865722214 +2032-08-01,Beirut,607.9082103455603,34.98969695515418 +2032-09-01,Beirut,686.9196680537468,35.88734205273303 +2032-10-01,Beirut,726.0028097366607,37.36968520857849 +2032-11-01,Beirut,754.3291412615285,40.040360378781216 +2032-12-01,Beirut,701.5862462267768,42.21093987980001 +2033-01-01,Beirut,636.9028795135471,33.25499119044232 +2033-02-01,Beirut,612.3973578594794,32.70578053627762 +2033-03-01,Beirut,778.5649815513101,40.539133319808315 +2033-04-01,Beirut,770.1161170320636,40.949179048421584 +2033-05-01,Beirut,771.0565831081606,42.49372523627315 +2033-06-01,Beirut,822.5652918512689,45.43287941367403 +2033-07-01,Beirut,652.898072040656,33.76634745327702 +2033-08-01,Beirut,925.8674329769617,48.45646193697907 +2033-09-01,Beirut,958.6938518522505,50.26315196033035 +2033-10-01,Beirut,626.0179581122588,37.9130306076268 +2033-11-01,Beirut,694.4667157876947,45.382598339397134 +2033-12-01,Beirut,799.9884921614802,45.2128366230604 +2034-01-01,Beirut,958.1435492871755,49.04027237503519 +2034-02-01,Beirut,709.6311284941575,42.33691233241896 +2034-03-01,Beirut,741.0791279702416,40.359033438667005 +2034-04-01,Beirut,858.9862387160343,42.57113964208267 +2034-05-01,Beirut,941.0520699864305,43.62798203506155 +2034-06-01,Beirut,987.8692442403399,45.32384136232586 +2034-07-01,Beirut,1049.5186776121918,47.88972513473654 +2034-08-01,Beirut,653.7896687155379,34.98820018381883 +2034-09-01,Beirut,1127.3615880477448,52.12581426989644 +2034-10-01,Beirut,937.34749587846,50.277754183008895 +2034-11-01,Beirut,863.8506514110026,47.29839603136797 +2034-12-01,Beirut,728.245980027753,42.93762236311021 +2035-01-01,Beirut,686.897212599875,36.228066383338366 +2035-02-01,Beirut,541.808566641022,29.712185652633046 +2035-03-01,Beirut,1145.2095714370987,67.77823089200062 +2035-04-01,Beirut,1181.1340512479946,62.9739952048522 +2035-05-01,Beirut,625.0254558401708,34.33586894637601 +2035-06-01,Beirut,592.7801438064222,33.70202109449285 +2035-07-01,Beirut,552.1057597207824,33.00553510265735 +2035-08-01,Beirut,622.8682208437029,34.98592021818013 +2035-09-01,Beirut,688.1322625628213,36.401500410742045 +2035-10-01,Beirut,662.8944915892304,34.74443530797174 +2035-11-01,Beirut,669.7834217904756,35.21854633060136 +2035-12-01,Beirut,676.0544671472046,34.780549267516434 +2036-01-01,Beirut,673.9031339046389,34.66695128489084 +2036-02-01,Beirut,635.4709844661803,35.139548131867244 +2036-03-01,Beirut,670.3527970968198,34.64517848325693 +2036-04-01,Beirut,649.4709523386969,34.30107771498815 +2036-05-01,Beirut,475.21943722564447,32.168439626888556 +2036-06-01,Beirut,618.6792710801016,37.15743955236294 +2036-07-01,Beirut,862.5490987577436,42.03545214288965 +2036-08-01,Beirut,644.0224099526292,34.30269631654842 +2036-09-01,Beirut,645.8890915283271,34.49252521136955 +2036-10-01,Beirut,661.2642400326628,34.50030494144976 +2036-11-01,Beirut,756.0247439466717,37.18906319790159 +2036-12-01,Beirut,654.0339437490019,35.673530007910685 +2037-01-01,Beirut,755.8174628340093,41.69772135495501 +2037-02-01,Beirut,514.6620101157234,32.48897494878458 +2037-03-01,Beirut,1079.106473047349,60.76852004653844 +2037-04-01,Beirut,1133.9781019255777,57.30053567117861 +2037-05-01,Beirut,1160.529588923275,54.64146918098375 +2037-06-01,Beirut,1138.3924698991993,52.01905618418698 +2037-07-01,Beirut,1050.5709171493875,48.354246378229234 +2037-08-01,Beirut,678.4221500511119,37.32647028734984 +2037-09-01,Beirut,854.447574047424,42.887619757919005 +2037-10-01,Beirut,677.8933672959971,35.237395206835984 +2037-11-01,Beirut,719.6510111131233,49.44850805459177 +2037-12-01,Beirut,977.443580054294,56.61189902669466 +2038-01-01,Beirut,1068.2731560064008,62.08494784029267 +2038-02-01,Beirut,994.3934172613862,50.312092902132605 +2038-03-01,Beirut,921.7572212471285,46.53822764050882 +2038-04-01,Beirut,664.2051127911681,35.0124618029057 +2038-05-01,Beirut,582.1120039021265,33.94900576914273 +2038-06-01,Beirut,963.9492197569344,74.21821139254963 +2038-07-01,Beirut,662.6796533526689,34.31435720950987 +2038-08-01,Beirut,532.1952572878299,31.48498946912481 +2038-09-01,Beirut,618.0307259043377,33.382965139614356 +2038-10-01,Beirut,662.2413401665183,34.604017271534886 +2038-11-01,Beirut,703.5387911244908,37.144682187376816 +2038-12-01,Beirut,751.5704311752974,40.30917006801853 +2039-01-01,Beirut,715.2338362077676,45.61445866183281 +2039-02-01,Beirut,1149.659565851959,64.40349885169643 +2039-03-01,Beirut,722.5871336794632,53.15219910663285 +2039-04-01,Beirut,618.0547647555976,33.39941221998528 +2039-05-01,Beirut,682.8391810112503,35.266390800378836 +2039-06-01,Beirut,712.8188673000345,44.04244846040946 +2039-07-01,Beirut,683.7813744299524,43.71959836423899 +2039-08-01,Beirut,771.2309727387093,44.315696250699276 +2039-09-01,Beirut,762.2158997078955,40.599352259579206 +2039-10-01,Beirut,511.6204476778382,30.788381647064327 +2039-11-01,Beirut,735.6993194253519,38.40666927488728 +2039-12-01,Beirut,873.5423389349199,47.19832120371406 +2040-01-01,Beirut,539.4903289191977,29.91565953265078 +2040-02-01,Beirut,522.1352859258941,32.2117241653886 +2040-03-01,Beirut,447.63960559679487,30.728684836829032 +2040-04-01,Beirut,697.0263496386401,38.05221293749602 +2040-05-01,Beirut,669.9393144606237,35.0744907917333 +2040-06-01,Beirut,665.5784221351645,35.01787454575794 +2040-07-01,Beirut,657.0778093103611,34.2641979654579 +2040-08-01,Beirut,717.1038285234594,47.05287331941771 +2040-09-01,Beirut,642.8881216416714,33.91290921391591 +2040-10-01,Beirut,587.8345460089947,32.781367488712576 +2040-11-01,Beirut,530.5191591796076,31.655969487711264 +2040-12-01,Beirut,462.46193249475596,30.314218411481114 +2041-01-01,Beirut,635.4172209275835,33.17869066097539 +2041-02-01,Beirut,608.495650776654,32.663662087073696 +2041-03-01,Beirut,669.8844713328984,34.62998451377139 +2041-04-01,Beirut,621.4651148397612,33.45830843159935 +2041-05-01,Beirut,651.712899095444,34.749586986056215 +2041-06-01,Beirut,722.4714017248937,37.57213223384289 +2041-07-01,Beirut,729.1602480743326,37.82804532355131 +2041-08-01,Beirut,864.8443052448275,43.807716425528014 +2041-09-01,Beirut,622.7140555161603,35.26310138430465 +2041-10-01,Beirut,727.4210299884005,63.51511285121528 +2041-11-01,Beirut,961.5262618896508,47.431921957935046 +2041-12-01,Beirut,801.3651842180791,42.883930042534146 +2042-01-01,Beirut,658.2909076276956,37.44445415807435 +2042-02-01,Beirut,654.4855718677366,39.51332282556103 +2042-03-01,Beirut,620.3080831844977,34.956454708055205 +2042-04-01,Beirut,523.1090753197557,33.09908331111642 +2042-05-01,Beirut,477.8417592186484,32.39577482668253 +2042-06-01,Beirut,872.7869864080482,45.25389340887526 +2042-07-01,Beirut,683.7610781543375,40.75801002112583 +2042-08-01,Beirut,625.5299838261997,36.962528596728845 +2042-09-01,Beirut,614.138303288017,35.98882663013303 +2042-10-01,Beirut,575.7784863211643,33.9040852247645 +2042-11-01,Beirut,717.636569772045,37.38275585128597 +2042-12-01,Beirut,569.2368959288456,35.830725806757684 +2043-01-01,Beirut,676.6308237965795,36.33317105885172 +2043-02-01,Beirut,748.4152959610992,38.50770134002313 +2043-03-01,Beirut,767.1183139401851,39.17066661567408 +2043-04-01,Beirut,1190.3077519080819,66.80097844456286 +2043-05-01,Beirut,882.1740858525255,52.253544558618515 +2043-06-01,Beirut,688.6894025257099,36.483283300332616 +2043-07-01,Beirut,611.9327026985947,32.69975864230052 +2043-08-01,Beirut,509.5790166085488,33.98534598481952 +2043-09-01,Beirut,671.0984333215356,34.710131397483764 +2043-10-01,Beirut,704.6675375445891,42.60441669781732 +2043-11-01,Beirut,705.251955126123,38.877421264171325 +2043-12-01,Beirut,685.2162203542705,36.68362440313681 +2044-01-01,Beirut,676.9166270251847,36.116678749080094 +2044-02-01,Beirut,673.1257577595466,36.035452797660795 +2044-03-01,Beirut,671.0854062793858,36.06524898982488 +2044-04-01,Beirut,643.4045970807218,38.057764914891116 +2044-05-01,Beirut,584.7179161403781,33.363698559751214 +2044-06-01,Beirut,668.1940506755722,35.30382748808035 +2044-07-01,Beirut,703.9485311850416,46.68710417542215 +2044-08-01,Beirut,486.58895020038966,29.806029734495617 +2044-09-01,Beirut,1034.001815041595,52.213967139821136 +2044-10-01,Beirut,739.3914422720405,46.854498904530914 +2044-11-01,Beirut,620.4597294707405,32.467863511229055 +2044-12-01,Beirut,620.6467862803964,32.836208494266884 +2045-01-01,Beirut,680.3576374405961,40.10115366104124 +2045-02-01,Beirut,742.2442205576642,42.342812396171084 +2045-03-01,Beirut,748.6869205858171,38.955775503144864 +2045-04-01,Beirut,743.3169003156918,37.91108132402725 +2045-05-01,Beirut,768.98463565284,38.5778929539237 +2045-06-01,Beirut,827.8788136236719,40.54329295177518 +2045-07-01,Beirut,938.1646728760878,44.697164089398115 +2045-08-01,Beirut,1129.886315183537,56.31832299315275 +2045-09-01,Beirut,1164.4015713187634,80.81269002267847 +2045-10-01,Beirut,693.8378191340687,52.50040740304341 +2045-11-01,Beirut,980.9051746357545,64.71388745628421 +2045-12-01,Beirut,553.9997908877342,34.07449090086182 +2046-01-01,Beirut,563.4148876769428,32.378335700194 +2046-02-01,Beirut,579.3011136746868,32.77290899023605 +2046-03-01,Beirut,577.880374381647,32.645526787871 +2046-04-01,Beirut,581.050048062775,32.55290100825814 +2046-05-01,Beirut,620.3139849383997,32.62848796069309 +2046-06-01,Beirut,683.9880077891376,35.860121699611156 +2046-07-01,Beirut,545.1192346623254,31.35155056414699 +2046-08-01,Beirut,673.4246600029101,34.875141735046704 +2046-09-01,Beirut,729.1542023752135,40.182901741996076 +2046-10-01,Beirut,722.7212906218253,37.05113397891768 +2046-11-01,Beirut,674.7131136414105,34.700332766532604 +2046-12-01,Beirut,634.662300236363,33.66280916637041 +2047-01-01,Beirut,583.7131785248343,32.559044732460166 +2047-02-01,Beirut,503.9798355527579,31.026820801648427 +2047-03-01,Beirut,698.77470824586,38.48168188483311 +2047-04-01,Beirut,603.9870706584229,32.11956830235775 +2047-05-01,Beirut,662.2414841117354,34.189690080729875 +2047-06-01,Beirut,547.7257226814454,32.9242221296488 +2047-07-01,Beirut,1168.03870709251,64.68619718658033 +2047-08-01,Beirut,624.6784039216786,32.91623354775434 +2047-09-01,Beirut,767.955067487342,40.320987599840635 +2047-10-01,Beirut,720.0203745402704,38.980332995635216 +2047-11-01,Beirut,699.0145929502014,39.71449933562219 +2047-12-01,Beirut,678.7599175030992,42.25500761260342 +2048-01-01,Beirut,624.6067192035493,38.32737520274967 +2048-02-01,Beirut,616.7420563480117,39.75484254440514 +2048-03-01,Beirut,660.5001788201547,36.22603007814956 +2048-04-01,Beirut,658.3264620963258,36.13852116798539 +2048-05-01,Beirut,653.9219543700775,36.13182050561204 +2048-06-01,Beirut,647.871936894246,36.691908858434765 +2048-07-01,Beirut,641.9537732373027,37.983048178348795 +2048-08-01,Beirut,605.9722911204246,36.64845027675621 +2048-09-01,Beirut,665.078932231735,36.429329914988784 +2048-10-01,Beirut,524.4738199233329,31.525263060636302 +2048-11-01,Beirut,664.4976094723694,39.187531399673475 +2048-12-01,Beirut,668.8293528913604,36.412378109400066 +2049-01-01,Beirut,564.3630548221558,32.97784483295346 +2049-02-01,Beirut,594.8110668748616,33.386515620456315 +2049-03-01,Beirut,626.0805742817089,33.95387897814152 +2049-04-01,Beirut,652.250822371846,34.49628454402574 +2049-05-01,Beirut,676.3913709278896,35.0242097174564 +2049-06-01,Beirut,706.5412724359262,35.75444268160862 +2049-07-01,Beirut,663.4739430607735,36.98484093221616 +2049-08-01,Beirut,741.1889581709091,36.673947602410635 +2049-09-01,Beirut,783.34914478773,39.24108448570669 +2049-10-01,Beirut,716.3017657736299,39.6014234825322 +2049-11-01,Beirut,683.8359296672435,35.84207342199771 +2049-12-01,Beirut,760.9115401229028,39.326365643185675 +2050-01-01,Beirut,708.9736587149315,37.580434093458706 +2050-02-01,Beirut,682.854871039917,36.739927371390806 +2050-03-01,Beirut,773.0517357901437,37.64646607539247 +2050-04-01,Beirut,475.7239652116732,30.447291825784045 +2050-05-01,Beirut,614.4608125469891,35.91104673364863 +2050-06-01,Beirut,594.7482347875857,35.16800419155665 +2050-07-01,Beirut,928.6154911171259,43.260750928366306 +2050-08-01,Beirut,898.4045568370277,42.452198533876285 +2050-09-01,Beirut,833.0251430263824,40.60767152351288 +2050-10-01,Beirut,763.3207512219508,38.38421770485712 +2050-11-01,Beirut,707.8977401895186,36.49715454166132 +2050-12-01,Beirut,670.0926161168634,35.34385741914194 +2051-01-01,Beirut,726.6032052372956,61.2287598278393 +2051-02-01,Beirut,642.3742372165295,34.67474841928892 +2051-03-01,Beirut,598.8929213969209,34.02083338892149 +2051-04-01,Beirut,505.70106048654924,30.96465257827804 +2051-05-01,Beirut,681.8805778377956,35.856623431722724 +2051-06-01,Beirut,926.2760934483842,40.96935065281303 +2051-07-01,Beirut,698.9516169177086,38.52682868534338 +2051-08-01,Beirut,670.1951051114575,35.035557332696435 +2051-09-01,Beirut,618.3083242555662,34.24601045330168 +2051-10-01,Beirut,666.6259834528033,35.091808087996895 +2051-11-01,Beirut,820.3687598105251,39.59712461602255 +2051-12-01,Beirut,695.9254566180558,36.606418849141534 +2052-01-01,Beirut,557.5681208476942,32.98552013712656 +2052-02-01,Beirut,576.8760686017547,35.62117781980932 +2052-03-01,Beirut,593.3346207827939,36.18706181047703 +2052-04-01,Beirut,693.4138284970223,37.284734733138734 +2052-05-01,Beirut,772.3637496248872,43.74121452701225 +2052-06-01,Beirut,907.5712761540842,43.48152470032978 +2052-07-01,Beirut,718.5143477060831,39.36329760566946 +2052-08-01,Beirut,577.4311213589949,33.72080035345607 +2052-09-01,Beirut,606.1389796818571,33.97514705455768 +2052-10-01,Beirut,624.001645483358,34.252223794775155 +2052-11-01,Beirut,641.0662790011085,34.55519815995767 +2052-12-01,Beirut,657.3833330337122,34.871834914654656 +2053-01-01,Beirut,674.1113506612128,35.251144617939765 +2053-02-01,Beirut,686.6691314033378,35.6478760433956 +2053-03-01,Beirut,587.6785813662382,33.723967939305325 +2053-04-01,Beirut,603.448139765501,38.3095009683148 +2053-05-01,Beirut,678.859023785091,34.93210606737908 +2053-06-01,Beirut,716.634351197801,35.95443569805579 +2053-07-01,Beirut,493.11952878359807,30.34415383818805 +2053-08-01,Beirut,520.740024936286,30.95318313281297 +2053-09-01,Beirut,539.1905630045317,31.009538314020553 +2053-10-01,Beirut,599.2475304393123,37.26922748593183 +2053-11-01,Beirut,663.5069784881039,43.01164292693842 +2053-12-01,Beirut,627.6841240004993,32.98329238444137 +2054-01-01,Beirut,672.3280133662311,34.79525591610209 +2054-02-01,Beirut,524.2029150247008,30.910159659080755 +2054-03-01,Beirut,648.1626342602332,33.92711113728384 +2054-04-01,Beirut,680.0322492772815,35.436430985801266 +2054-05-01,Beirut,911.450671728255,44.519692260252555 +2054-06-01,Beirut,716.158540282589,40.59900417322211 +2054-07-01,Beirut,625.0368994849323,36.6198375782061 +2054-08-01,Beirut,600.5619661895039,35.12167389743238 +2054-09-01,Beirut,602.5950484362002,32.90434639866085 +2054-10-01,Beirut,698.7885269867043,35.43357667767337 +2054-11-01,Beirut,700.2651170239889,37.983326647434424 +2054-12-01,Beirut,696.8821165310792,39.242407213863515 +2055-01-01,Beirut,741.6202900140291,36.775171115042866 +2055-02-01,Beirut,777.4088135673491,37.95575820795552 +2055-03-01,Beirut,833.9086067964969,39.81803762252886 +2055-04-01,Beirut,926.8514424812391,43.03026554704099 +2055-05-01,Beirut,1045.8719694815068,47.85865842736921 +2055-06-01,Beirut,655.8108035092129,33.88810806097558 +2055-07-01,Beirut,693.5195562590018,37.970795538580404 +2055-08-01,Beirut,1164.0417802485556,54.835770985492985 +2055-09-01,Beirut,886.4555204181307,48.178915280179595 +2055-10-01,Beirut,1139.9277895850719,60.94675766566951 +2055-11-01,Beirut,657.7207406226572,33.97264083278693 +2055-12-01,Beirut,647.6737963028713,43.387123680295886 +2056-01-01,Beirut,701.7358772799798,42.39278019272662 +2056-02-01,Beirut,566.1671202284035,34.88657637187599 +2056-03-01,Beirut,716.4009440282302,46.48510966242189 +2056-04-01,Beirut,624.2184269803505,34.1718854635664 +2056-05-01,Beirut,937.7113893873562,45.89538175629579 +2056-06-01,Beirut,697.2115351604735,38.22395874606805 +2056-07-01,Beirut,784.7847824107421,39.137685433342924 +2056-08-01,Beirut,774.3417728260325,38.85862460089024 +2056-09-01,Beirut,762.3722961863035,38.59684625606543 +2056-10-01,Beirut,753.302955808633,38.41693782242045 +2056-11-01,Beirut,755.1773384534472,38.57634396963477 +2056-12-01,Beirut,980.0596404303529,52.94207677719528 +2057-01-01,Beirut,945.3980639819172,51.76096755474704 +2057-02-01,Beirut,946.3908541444393,51.494194170698464 +2057-03-01,Beirut,699.4332576142141,37.563551905141445 +2057-04-01,Beirut,682.6095883899334,37.01186983784166 +2057-05-01,Beirut,675.3612269815229,36.877421482428375 +2057-06-01,Beirut,681.3901564830451,37.953217177549035 +2057-07-01,Beirut,730.1933428976504,41.551020359773275 +2057-08-01,Beirut,883.1974643736872,46.080633315521574 +2057-09-01,Beirut,960.6281876799978,49.046381290601545 +2057-10-01,Beirut,716.7009258607221,46.7251326099306 +2057-11-01,Beirut,663.3875759304975,34.249195443468736 +2057-12-01,Beirut,1044.0586196087543,51.80945598428508 +2058-01-01,Beirut,1037.023800929951,51.14454142503459 +2058-02-01,Beirut,783.9475250553252,39.19376214546482 +2058-03-01,Beirut,784.8530124436602,39.86454195983164 +2058-04-01,Beirut,757.7684963069433,42.013435680805785 +2058-05-01,Beirut,675.9018132444421,40.626729251561734 +2058-06-01,Beirut,628.2575297729231,33.91494551910471 +2058-07-01,Beirut,620.1151965935479,33.6676127580978 +2058-08-01,Beirut,613.9811151109146,33.54668755765614 +2058-09-01,Beirut,604.5596847321526,33.298119090081656 +2058-10-01,Beirut,600.2971069899909,33.101641745840766 +2058-11-01,Beirut,629.1589866951784,32.96604470544922 +2058-12-01,Beirut,685.161593144371,36.0019668901119 +2059-01-01,Beirut,725.4712200498121,58.467617013437504 +2059-02-01,Beirut,819.6616289313909,40.38181569073639 +2059-03-01,Beirut,1052.2887593705764,51.6360915741528 +2059-04-01,Beirut,701.047603224289,38.144194757348366 +2059-05-01,Beirut,571.6605735222149,32.50740612139077 +2059-06-01,Beirut,472.3585260352532,30.59728223703996 +2059-07-01,Beirut,687.851641362033,36.360391411973595 +2059-08-01,Beirut,624.9501724916134,32.922011781281476 +2059-09-01,Beirut,691.7270784427327,37.22216621045773 +2059-10-01,Beirut,847.4429838642175,41.734635913120925 +2059-11-01,Beirut,1034.188871851251,47.489129950717384 +2059-12-01,Beirut,1175.394595578114,55.727968531583926 +2060-01-01,Beirut,1191.2625405332828,66.46457038478503 +2060-02-01,Beirut,639.4034958254705,34.31202503091757 +2060-03-01,Beirut,1064.1989305808493,51.709241922088324 +2060-04-01,Beirut,1075.0803972969265,51.50268747781065 +2060-05-01,Beirut,1081.8032147176077,51.03329302531917 +2060-06-01,Beirut,685.1722450904383,36.00297634054738 +2060-07-01,Beirut,652.0072670644678,35.18772328368394 +2060-08-01,Beirut,1156.635582909566,58.81747861091554 +2060-09-01,Beirut,736.1764258475177,41.34721579771639 +2060-10-01,Beirut,683.9421612374829,35.85444789199114 +2060-11-01,Beirut,470.8451579949927,30.68026602456237 +2060-12-01,Beirut,550.7440379667646,32.157666354137646 +2061-01-01,Beirut,911.1930097895982,47.691994679610275 +2061-02-01,Beirut,958.0938881872667,49.54736457999597 +2061-03-01,Beirut,587.0461580547923,31.37960632452577 +2061-04-01,Beirut,985.153789691855,51.45731442116826 +2061-05-01,Beirut,640.5346893142602,34.010825906156086 +2061-06-01,Beirut,661.4199167849852,34.44779611448769 +2061-07-01,Beirut,675.3132212516114,34.727344267840245 +2061-08-01,Beirut,684.3417531602263,34.946429820972 +2061-09-01,Beirut,697.6761183487497,36.124667330974546 +2061-10-01,Beirut,695.8370742547401,37.295525410207496 +2061-11-01,Beirut,698.24268672336,38.34648514375211 +2061-12-01,Beirut,1095.9315817238014,59.18190762243648 +2062-01-01,Beirut,1054.4255541462123,59.55662258580843 +2062-02-01,Beirut,608.7957765543629,33.337574678654114 +2062-03-01,Beirut,747.9707211580036,41.247819738458716 +2062-04-01,Beirut,715.8808699587516,46.086150484280935 +2062-05-01,Beirut,832.5048530390781,42.42363804827971 +2062-06-01,Beirut,1075.6056533942215,50.21111304995034 +2062-07-01,Beirut,659.7811724606074,47.373582684492305 +2062-08-01,Beirut,846.9696200176968,51.57663842436742 +2062-09-01,Beirut,1064.399374295698,62.389505998399784 +2062-10-01,Beirut,1044.6215173803278,48.77649253365736 +2062-11-01,Beirut,967.3094049329293,46.71042596134498 +2062-12-01,Beirut,717.3067912796081,47.22528049206811 +2063-01-01,Beirut,966.3459076220922,55.11973983558019 +2063-02-01,Beirut,757.5573286734186,45.32573843297182 +2063-03-01,Beirut,786.0545951436245,42.45287730227253 +2063-04-01,Beirut,616.2987050792615,31.937327690120522 +2063-05-01,Beirut,620.1151246209395,36.01338412262339 +2063-06-01,Beirut,490.8344704343219,31.7164146836142 +2063-07-01,Beirut,610.9820884846905,32.688550261603275 +2063-08-01,Beirut,1192.2359700641011,63.65650552945188 +2063-09-01,Beirut,1135.1570852264533,52.86288713096479 +2063-10-01,Beirut,1014.258504978335,46.56015708100344 +2063-11-01,Beirut,930.7775482783675,43.45494830696848 +2063-12-01,Beirut,885.041258659862,41.94641165275442 +2064-01-01,Beirut,866.1621237076217,41.64623938274627 +2064-02-01,Beirut,838.1634834695423,40.602241376342775 +2064-03-01,Beirut,658.5645474854534,34.80916196606654 +2064-04-01,Beirut,611.9159330807993,31.301530554637868 +2064-05-01,Beirut,708.2203933937078,36.22923247263449 +2064-06-01,Beirut,583.2116014157568,33.25121445346821 +2064-07-01,Beirut,593.7000976890785,33.29453380060397 +2064-08-01,Beirut,609.442306497087,33.47479032060599 +2064-09-01,Beirut,724.7378191685518,42.13897302547841 +2064-10-01,Beirut,719.3229599632917,38.573437448553335 +2064-11-01,Beirut,695.991671417934,36.70753793586664 +2064-12-01,Beirut,673.4805827197638,35.863933245220935 +2065-01-01,Beirut,652.5990978246839,35.34547602070221 +2065-02-01,Beirut,634.9211857093652,34.982039055298955 +2065-03-01,Beirut,623.5690181332836,34.83246634767151 +2065-04-01,Beirut,624.3649632113853,35.036601591767635 +2065-05-01,Beirut,683.551206027767,35.52460126004382 +2065-06-01,Beirut,615.8702521404844,36.75874143898975 +2065-07-01,Beirut,649.9925378329552,39.76074260815726 +2065-08-01,Beirut,574.7795784869143,33.21330784918468 +2065-09-01,Beirut,816.5768829283677,43.94606334814034 +2065-10-01,Beirut,520.5433237970825,33.27665956616911 +2065-11-01,Beirut,575.280795732949,34.12886198983413 +2065-12-01,Beirut,620.7178952176571,35.40771386134405 +2066-01-01,Beirut,669.5636174439231,38.73830855157343 +2066-02-01,Beirut,852.3630313856049,44.480706588262166 +2066-03-01,Beirut,958.6878061531311,48.956331350030894 +2066-04-01,Beirut,603.5969071474012,35.061002445397335 +2066-05-01,Beirut,627.4034308271025,33.75606150142599 +2066-06-01,Beirut,644.5896260807167,34.059523187508375 +2066-07-01,Beirut,659.7690810623689,34.32500865203579 +2066-08-01,Beirut,682.066411113106,34.90843619509921 +2066-09-01,Beirut,703.8726720556159,36.388220916220334 +2066-10-01,Beirut,708.1415114147227,38.286718716245424 +2066-11-01,Beirut,700.8541408524709,39.049097455471895 +2066-12-01,Beirut,466.9171089374332,32.33329332559079 +2067-01-01,Beirut,664.117738044372,40.647388176853056 +2067-02-01,Beirut,721.4717021919491,51.60013425346877 +2067-03-01,Beirut,560.269252847075,32.99006266408611 +2067-04-01,Beirut,709.6210523289585,42.33217835796297 +2067-05-01,Beirut,985.9629057573236,60.69980779965536 +2067-06-01,Beirut,740.9344630270293,37.241833089631434 +2067-07-01,Beirut,930.111297840897,42.866003595145756 +2067-08-01,Beirut,851.8474915904661,43.76187345230357 +2067-09-01,Beirut,638.3112395179139,33.262039939172695 +2067-10-01,Beirut,492.3094051016095,298.693063760375 +2067-11-01,Beirut,480.1779900926134,293.19497013338685 +2067-12-01,Beirut,713.095673952569,333.277148957147 +2068-01-01,Beirut,452.7243264465754,288.7237486640349 +2068-02-01,Beirut,540.0018382482572,244.36567703018534 +2068-03-01,Beirut,551.9584317910533,232.82576148216785 +2068-04-01,Beirut,477.53616352268864,319.5280163224774 +2068-05-01,Beirut,496.4635201226664,218.1574720130533 +2068-06-01,Beirut,495.530755115686,302.03016766548143 +2068-07-01,Beirut,496.4651035200547,303.2394022655799 +2068-08-01,Beirut,568.6074954669594,331.81577800431415 +2068-09-01,Beirut,466.5242824398947,296.0068813429654 +2068-10-01,Beirut,464.80521668436,297.50490578919636 +2068-11-01,Beirut,448.2069656700994,303.5437863805085 +2068-12-01,Beirut,423.55159704500267,271.57755424925585 +2069-01-01,Beirut,472.1390095791352,299.36814244125156 +2069-02-01,Beirut,444.415736541419,260.99764346968396 +2069-03-01,Beirut,553.9263068543912,270.76023007856793 +2069-04-01,Beirut,531.8266135867688,318.72122176409044 +2069-05-01,Beirut,474.64300860366114,306.7794231125327 +2069-06-01,Beirut,569.5821485321238,217.71524570073012 +2069-07-01,Beirut,531.1653292592891,306.2793622519844 +2069-08-01,Beirut,456.7956009951757,304.17646814309546 +2069-09-01,Beirut,549.4193101335484,176.3460871890228 +2069-10-01,Beirut,603.9595051493432,145.9522133455506 +2069-11-01,Beirut,673.4011249599098,249.67335001554545 +2069-12-01,Beirut,530.4289055284694,315.3057636200105 +2070-01-01,Beirut,673.8434686121399,297.9062667632011 +2070-02-01,Beirut,1014.2446142648826,297.5266263778767 +2070-03-01,Beirut,477.56394494959414,268.52741273690737 +2070-04-01,Beirut,645.6605784961386,316.3011861752867 +2070-05-01,Beirut,653.1868981188203,209.87792473272896 +2070-06-01,Beirut,488.10174245978163,303.459862759822 +2070-07-01,Beirut,494.82088927742603,303.04438688403866 +2070-08-01,Beirut,453.1640071122884,320.592464402358 +2070-09-01,Beirut,459.0119974758827,304.89504021428627 +2070-10-01,Beirut,610.5813450002098,249.78257951439 +2070-11-01,Beirut,496.0571627747178,303.14651542119924 +2070-12-01,Beirut,774.260083915313,134.5095879343306 +2071-01-01,Beirut,449.4465499073854,268.7629105617743 +2071-02-01,Beirut,453.1594008653404,294.90678922012216 +2071-03-01,Beirut,453.76145173597257,302.85659429440636 +2071-04-01,Beirut,462.2690459038064,318.72160465908325 +2071-05-01,Beirut,580.0972026980053,335.7372144770123 +2071-06-01,Beirut,1009.6114495612285,283.9031007051512 +2071-07-01,Beirut,562.5182529194612,252.22922630519076 +2071-08-01,Beirut,624.1435754674447,171.2522610571207 +2071-09-01,Beirut,468.31827168094355,339.8632909190243 +2071-10-01,Beirut,558.7694156572245,240.93429393527006 +2071-11-01,Beirut,533.5030715580338,311.7114935143104 +2071-12-01,Beirut,489.83088438051516,304.3209065769563 +2072-01-01,Beirut,484.16520063441175,283.65352278714124 +2072-02-01,Beirut,555.9794694588766,254.90386965986391 +2072-03-01,Beirut,534.6861572975974,310.49576710365284 +2072-04-01,Beirut,535.3783178741508,316.75707487712435 +2072-05-01,Beirut,580.7904428636871,269.75253747920544 +2072-06-01,Beirut,489.08776719709886,301.90610968782624 +2072-07-01,Beirut,498.43161110382994,296.8850684131848 +2072-08-01,Beirut,499.25159503319173,293.5961396598951 +2072-09-01,Beirut,500.241722209197,292.4175192548998 +2072-10-01,Beirut,478.4895126957183,298.299552133722 +2072-11-01,Beirut,453.60836599755845,291.6020921548578 +2072-12-01,Beirut,485.8379880026402,363.7281611761301 +2073-01-01,Beirut,500.9518039652825,287.3101525637082 +2073-02-01,Beirut,502.33871613229735,293.55485661794813 +2073-03-01,Beirut,503.77975170095175,293.69792011069865 +2073-04-01,Beirut,545.1800515165614,309.77940538082925 +2073-05-01,Beirut,544.4236913731695,284.73366956172515 +2073-06-01,Beirut,432.22264100688386,281.4332365543347 +2073-07-01,Beirut,448.7527339608349,301.5750969665828 +2073-08-01,Beirut,463.23448647507456,291.04668556353755 +2073-09-01,Beirut,592.2010521979221,267.4785589258229 +2073-10-01,Beirut,481.6335641281977,303.19815403226863 +2073-11-01,Beirut,474.8369028111306,300.02338019977583 +2073-12-01,Beirut,503.40578202685697,279.7665468637918 +2074-01-01,Beirut,499.56323642827067,303.6370387155641 +2074-02-01,Beirut,495.64058531635357,257.2867644343697 +2074-03-01,Beirut,646.6798545786121,215.80983838651747 +2074-04-01,Beirut,626.6777310149587,304.4944450302671 +2074-05-01,Beirut,503.4619206615363,313.4774748382039 +2074-06-01,Beirut,444.74551503385607,289.3671862950549 +2074-07-01,Beirut,449.5735815614994,301.54326446922994 +2074-08-01,Beirut,608.2460497701562,252.02657042811217 +2074-09-01,Beirut,480.9978300767578,289.84570061010135 +2074-10-01,Beirut,462.9351523960598,286.3677087519761 +2074-11-01,Beirut,615.5437843880412,245.03205355213544 +2074-12-01,Beirut,466.848087205821,344.1703722667059 +2075-01-01,Beirut,530.877078961993,239.75208824079704 +2075-02-01,Beirut,454.07150973366333,296.9262122205889 +2075-03-01,Beirut,510.8690536444374,266.6802228659124 +2075-04-01,Beirut,495.40746603721686,305.05432453127554 +2075-05-01,Beirut,493.62463255049533,302.17723415133804 +2075-06-01,Beirut,493.5196964872102,298.96737321405385 +2075-07-01,Beirut,494.72012762543756,295.98898970421266 +2075-08-01,Beirut,497.04930518376307,296.24706092933485 +2075-09-01,Beirut,498.1516376565185,296.17187427621053 +2075-10-01,Beirut,529.2897230801294,317.08378873185814 +2075-11-01,Beirut,493.60196117879804,298.92835273342774 +2075-12-01,Beirut,472.2598515889128,266.94638709883617 +2076-01-01,Beirut,467.8787349604475,301.18612786688936 +2076-02-01,Beirut,462.02110026730594,303.85246936194676 +2076-03-01,Beirut,503.21958888850367,294.3589883157036 +2076-04-01,Beirut,502.8458351322344,289.65374838850215 +2076-05-01,Beirut,493.04122258548136,280.5436670602396 +2076-06-01,Beirut,462.164469703564,271.30944073273264 +2076-07-01,Beirut,482.12931145598156,321.36657365181725 +2076-08-01,Beirut,823.1736043388457,308.8742764265737 +2076-09-01,Beirut,493.34401134970705,300.02378049908646 +2076-10-01,Beirut,493.41584001305324,301.44155363569786 +2076-11-01,Beirut,494.0492709410188,301.833516278062 +2076-12-01,Beirut,494.8194498252549,302.25121990653054 +2077-01-01,Beirut,495.3433384429871,302.0698321058681 +2077-02-01,Beirut,496.01628233305394,303.34967602349553 +2077-03-01,Beirut,482.220716668857,291.0692589637927 +2077-04-01,Beirut,515.0795232179993,261.82669815060467 +2077-05-01,Beirut,483.5145682529995,302.6958654190353 +2077-06-01,Beirut,653.6823575561701,326.1570077149084 +2077-07-01,Beirut,484.6256094113912,302.1007421743747 +2077-08-01,Beirut,612.8386938951893,247.6318757443592 +2077-09-01,Beirut,484.87218756832925,249.08640680027585 +2077-10-01,Beirut,495.1463494133494,303.0085165849439 +2077-11-01,Beirut,465.8559447967758,262.20282286372276 +2077-12-01,Beirut,501.23098571389966,292.7035766231293 +2078-01-01,Beirut,458.4416865256271,307.2473904109603 +2078-02-01,Beirut,487.6280907228266,264.82493998711595 +2078-03-01,Beirut,546.5035558154318,300.83553528806146 +2078-04-01,Beirut,495.81699017994214,301.1054588536414 +2078-05-01,Beirut,495.8598138820375,300.494828361774 +2078-06-01,Beirut,661.7450890304744,329.0500230456813 +2078-07-01,Beirut,462.7876085485051,305.8925686920226 +2078-08-01,Beirut,466.3969628953461,299.89662455285355 +2078-09-01,Beirut,480.02382476507086,298.13981530446847 +2078-10-01,Beirut,487.0985882416263,298.91669184046634 +2078-11-01,Beirut,505.31240840030756,276.1355884560578 +2078-12-01,Beirut,501.7648785242223,284.9114720729099 +2079-01-01,Beirut,500.6562844345216,289.45838492060386 +2079-02-01,Beirut,481.60578270129224,286.5836615278943 +2079-03-01,Beirut,489.19399876733854,299.6631456288574 +2079-04-01,Beirut,481.23368431501996,297.79477470303567 +2079-05-01,Beirut,460.2315733279879,281.00978950097476 +2079-06-01,Beirut,531.1325097497842,319.015911673975 +2079-07-01,Beirut,474.4407655735981,299.84267116750965 +2079-08-01,Beirut,566.5553404789941,267.78118520464835 +2079-09-01,Beirut,530.5932189938194,315.08720019641436 +2079-10-01,Beirut,478.30583859866454,292.7070922953356 +2079-11-01,Beirut,450.5362871736424,289.7303796000083 +2079-12-01,Beirut,453.6488865761796,337.32532367244954 +2080-01-01,Beirut,472.48764489501576,314.6314855377552 +2080-02-01,Beirut,487.63154540803765,299.7786754907647 +2080-03-01,Beirut,468.1455374203917,292.5899960448216 +2080-04-01,Beirut,463.3009171927785,303.369029624948 +2080-05-01,Beirut,539.6886854283982,331.9775337344386 +2080-06-01,Beirut,963.6121720310325,313.8160236290776 +2080-07-01,Beirut,550.0037277150825,305.93143253378804 +2080-08-01,Beirut,501.70521323172323,320.0453770749714 +2080-09-01,Beirut,462.62178365837525,262.707495868502 +2080-10-01,Beirut,632.5249296798586,141.9269775211781 +2080-11-01,Beirut,1011.8373464262656,294.34478639233566 +2080-12-01,Beirut,539.1706265919597,294.16265020600554 +2081-01-01,Beirut,477.39991937467846,260.41950683924784 +2081-02-01,Beirut,509.20245592054556,238.94402316720686 +2081-03-01,Beirut,508.1005552834414,277.9928902357252 +2081-04-01,Beirut,661.3584521772723,157.00585225275933 +2081-05-01,Beirut,514.7126068595435,262.3869257379703 +2081-06-01,Beirut,638.1458464634354,161.31152385069495 +2081-07-01,Beirut,500.9264696070683,290.19107189357334 +2081-08-01,Beirut,547.0534265448557,222.3331159523102 +2081-09-01,Beirut,574.889048824539,209.5425783363402 +2081-10-01,Beirut,582.3138870691465,214.50914409610223 +2081-11-01,Beirut,550.8717893469645,305.2186561004422 +2081-12-01,Beirut,686.7452064505893,154.4143667287871 +2082-01-01,Beirut,506.12569887707286,246.95521327055806 +2082-02-01,Beirut,456.15439702548514,289.16834196358604 +2082-03-01,Beirut,492.00611252912387,300.1095489774653 +2082-04-01,Beirut,544.6667428722877,220.36827289263007 +2082-05-01,Beirut,459.530272230147,326.3185894018543 +2082-06-01,Beirut,567.7480705481053,202.5935041342773 +2082-07-01,Beirut,525.6556101559424,247.15316998181643 +2082-08-01,Beirut,586.6641994211469,272.7812368719593 +2082-09-01,Beirut,484.22054757039695,224.01169279194664 +2082-10-01,Beirut,535.8857967371305,257.0245509815986 +2082-11-01,Beirut,530.8503051516075,279.5559372134544 +2082-12-01,Beirut,470.4296601257565,272.226648283578 +2083-01-01,Beirut,516.0225083353957,282.4295641341392 +2083-02-01,Beirut,547.8898922015783,307.64222476577015 +2083-03-01,Beirut,501.00945402474184,318.9490442847843 +2083-04-01,Beirut,478.86650521937287,303.1715950432252 +2083-05-01,Beirut,536.2285302991089,290.79108575155055 +2083-06-01,Beirut,510.6945200686713,285.9209921256469 +2083-07-01,Beirut,660.5531506600576,334.5798621484331 +2083-08-01,Beirut,529.0502702114392,317.5141975123593 +2083-09-01,Beirut,458.7557749893973,301.63176542551173 +2083-10-01,Beirut,464.2977378213802,335.15385655122026 +2083-11-01,Beirut,529.6767197963743,316.3957960471348 +2083-12-01,Beirut,478.99267320218416,269.180596785925 +2084-01-01,Beirut,505.90596650312904,259.69943799672166 +2084-02-01,Beirut,519.3549840570936,280.90830492357475 +2084-03-01,Beirut,513.9871229652255,281.17178889154917 +2084-04-01,Beirut,510.5195546572538,279.8477206022575 +2084-05-01,Beirut,512.076682043521,270.95827381141555 +2084-06-01,Beirut,651.1289133495613,211.73439110513942 +2084-07-01,Beirut,494.400785161242,296.56479415605656 +2084-08-01,Beirut,479.6406425970796,294.7054560712004 +2084-09-01,Beirut,498.4252055416678,300.2381320777622 +2084-10-01,Beirut,526.0292199669946,343.76819328976217 +2084-11-01,Beirut,631.875664778009,249.83982231580805 +2084-12-01,Beirut,636.0564816368427,187.91997596548902 +2085-01-01,Beirut,714.6115610341294,251.87061033583265 +2085-02-01,Beirut,491.53116528521457,299.8271639203028 +2085-03-01,Beirut,495.0374548565932,301.48050449905253 +2085-04-01,Beirut,494.1185085904567,300.1867545314606 +2085-05-01,Beirut,492.3864157927724,299.78182567229607 +2085-06-01,Beirut,492.60693986541037,300.3039378035639 +2085-07-01,Beirut,492.19194580443417,300.3402954235585 +2085-08-01,Beirut,491.95774693616937,300.9731860379597 +2085-09-01,Beirut,486.39800686987115,300.9102172159681 +2085-10-01,Beirut,455.6218716947253,342.78547588651855 +2085-11-01,Beirut,469.33582042081156,292.48985159989627 +2085-12-01,Beirut,448.90531589098936,301.26437767995577 +2086-01-01,Beirut,466.34111215110096,341.217033570255 +2086-02-01,Beirut,442.70379607413213,275.80927490063465 +2086-03-01,Beirut,481.6099571125888,287.17814081279425 +2086-04-01,Beirut,495.56494210475347,293.0069512876225 +2086-05-01,Beirut,499.19279341199547,295.3241621665515 +2086-06-01,Beirut,499.6531302163663,294.71429746466964 +2086-07-01,Beirut,500.08143920992643,295.458941204004 +2086-08-01,Beirut,499.46348239280206,293.0550394178499 +2086-09-01,Beirut,437.3826452052215,333.5159710067238 +2017-01-01,Bekaa,700.5475375399911,287.5948001821916 +2017-02-01,Bekaa,601.9567233708519,258.08844212330786 +2017-03-01,Bekaa,467.0984079384042,287.4454189220605 +2017-04-01,Bekaa,461.09905917900136,328.69285163470505 +2017-05-01,Bekaa,461.64295618191426,301.34870159995285 +2017-06-01,Bekaa,546.6560657729775,306.3843625015907 +2017-07-01,Bekaa,479.0699717837813,299.11986984708057 +2017-08-01,Bekaa,776.8790951683231,301.6273969417307 +2017-09-01,Bekaa,506.7987147397481,321.50678283643987 +2017-10-01,Bekaa,530.5496755656386,319.2243457845808 +2017-11-01,Bekaa,453.72013945865706,295.7039243821008 +2017-12-01,Bekaa,475.74476529554806,297.2160289214747 +2018-01-01,Bekaa,486.9915649726928,299.1871375355819 +2018-02-01,Bekaa,490.598256333017,301.1281366798036 +2018-03-01,Bekaa,496.83266763198765,298.2226424531302 +2018-04-01,Bekaa,498.0704525540592,299.8327333020157 +2018-05-01,Bekaa,499.33083687521975,299.4554076909658 +2018-06-01,Bekaa,500.21761138532827,298.2604968444602 +2018-07-01,Bekaa,501.179021490517,297.21298316585046 +2018-08-01,Bekaa,504.26038478093756,298.5144780548869 +2018-09-01,Bekaa,502.145109815262,290.5805283141667 +2018-10-01,Bekaa,480.2955933350059,269.4628252042269 +2018-11-01,Bekaa,468.58989630566145,295.52114423601006 +2018-12-01,Bekaa,459.09361441399335,302.9529271937219 +2019-01-01,Bekaa,532.1504183526949,322.4117377475169 +2019-02-01,Bekaa,574.5114805200158,284.260324329081 +2019-03-01,Bekaa,721.7562818862085,258.6325359080238 +2019-04-01,Bekaa,534.9198523576024,317.04076525812593 +2019-05-01,Bekaa,490.2034146024388,303.91343668738523 +2019-06-01,Bekaa,493.01200170640465,304.10211689722803 +2019-07-01,Bekaa,493.3938883674414,303.514390487655 +2019-08-01,Bekaa,491.7475869191644,303.47665792655 +2019-09-01,Bekaa,485.3351873592167,299.0272788761034 +2019-10-01,Bekaa,475.76606918768283,299.5303854922759 +2019-11-01,Bekaa,463.3649008417913,297.5398710637627 +2019-12-01,Bekaa,457.87454237014805,294.2032544795562 +2020-01-01,Bekaa,456.92515169058976,291.9866405578167 +2020-02-01,Bekaa,472.74062861411574,302.3452380315716 +2020-03-01,Bekaa,555.6762488589993,301.18092397585133 +2020-04-01,Bekaa,479.8944899874825,308.2905704144247 +2020-05-01,Bekaa,494.82304845568297,304.91649973819887 +2020-06-01,Bekaa,491.2156373692731,298.4169094490038 +2020-07-01,Bekaa,553.7049191104504,302.8544709676283 +2020-08-01,Bekaa,430.1052068629514,289.05467436368906 +2020-09-01,Bekaa,536.3980257922755,270.7474205006282 +2020-10-01,Bekaa,500.7355262765499,300.96660720581133 +2020-11-01,Bekaa,803.860618502186,327.23047123143675 +2020-12-01,Bekaa,499.40079425074344,295.3322551743531 +2021-01-01,Bekaa,499.44613699413816,296.34436847045015 +2021-02-01,Bekaa,493.9578657281434,302.50145918861887 +2021-03-01,Bekaa,493.4720506203412,303.39649363851976 +2021-04-01,Bekaa,490.26408751145766,301.68763328581935 +2021-05-01,Bekaa,480.1922406691089,296.89819126884584 +2021-06-01,Bekaa,465.9697334909144,300.25282132203006 +2021-07-01,Bekaa,451.0993288904329,313.3990857905946 +2021-08-01,Bekaa,450.9531525224408,342.1640025046288 +2021-09-01,Bekaa,685.5200167350163,158.6201375422473 +2021-10-01,Bekaa,623.9405407386877,174.6680846918755 +2021-11-01,Bekaa,568.7181173663213,208.3191244085559 +2021-12-01,Bekaa,531.6070251580421,240.05222570216955 +2022-01-01,Bekaa,506.56552348800307,261.87353316994677 +2022-02-01,Bekaa,483.8764465288559,274.09185162355067 +2022-03-01,Bekaa,457.5698103454912,285.25484185982884 +2022-04-01,Bekaa,471.6357051274518,312.58073476515335 +2022-05-01,Bekaa,817.1824604568192,328.4293502624128 +2022-06-01,Bekaa,499.12866581776564,296.69062737413265 +2022-07-01,Bekaa,497.49596719250695,296.4559475522048 +2022-08-01,Bekaa,490.14734794036787,293.573914345997 +2022-09-01,Bekaa,464.68142379763117,279.72688242340513 +2022-10-01,Bekaa,449.6418115944175,307.3204537373066 +2022-11-01,Bekaa,449.90012128655115,328.7871134201961 +2022-12-01,Bekaa,514.990061265555,306.5133284968804 +2023-01-01,Bekaa,496.1380599867431,302.774672170273 +2023-02-01,Bekaa,464.7834809565739,301.04689332406656 +2023-03-01,Bekaa,463.13804317959966,300.47235938742597 +2023-04-01,Bekaa,469.97817595223887,282.71250612947307 +2023-05-01,Bekaa,455.32188986223343,301.3325677973033 +2023-06-01,Bekaa,472.60006610959175,321.19555882459514 +2023-07-01,Bekaa,848.4839237018687,312.15826235359316 +2023-08-01,Bekaa,759.510953160261,141.2433533202358 +2023-09-01,Bekaa,600.098318645139,145.55419400057366 +2023-10-01,Bekaa,456.03449065961877,281.74136259760166 +2023-11-01,Bekaa,498.3840372095695,296.2999352469718 +2023-12-01,Bekaa,469.44960911495014,296.78422779554535 +2024-01-01,Bekaa,529.3319710013559,316.9848973978182 +2024-02-01,Bekaa,535.5390327090724,254.52772754242804 +2024-03-01,Bekaa,530.076743554769,315.78984731676985 +2024-04-01,Bekaa,468.0513972483908,294.9170229590197 +2024-05-01,Bekaa,459.6978244628824,293.2803731210908 +2024-06-01,Bekaa,531.315464120752,177.8293353693966 +2024-07-01,Bekaa,635.5790873242422,168.3376469678924 +2024-08-01,Bekaa,691.3035916139461,159.68147024923223 +2024-09-01,Bekaa,528.430945914752,257.68173802372235 +2024-10-01,Bekaa,521.0113616705695,264.58133175012955 +2024-11-01,Bekaa,514.1697894457591,269.58724867255694 +2024-12-01,Bekaa,510.07397223763843,275.97017781918424 +2025-01-01,Bekaa,516.4138953807629,284.9398585153279 +2025-02-01,Bekaa,530.3295113560434,278.0077187145359 +2025-03-01,Bekaa,537.5335376375787,260.09695261648085 +2025-04-01,Bekaa,491.9198173714564,223.87043934825292 +2025-05-01,Bekaa,498.74368433456044,298.6540432797489 +2025-06-01,Bekaa,498.4330505560011,299.4500123524314 +2025-07-01,Bekaa,492.4158525896747,294.5159578584185 +2025-08-01,Bekaa,475.55288632111825,286.41113252501896 +2025-09-01,Bekaa,446.05879922231054,306.7903530241443 +2025-10-01,Bekaa,498.4950189719743,300.46755579569856 +2025-11-01,Bekaa,459.5643872466061,281.85337678730264 +2025-12-01,Bekaa,533.5678469057407,317.8285194927818 +2026-01-01,Bekaa,530.1038772281973,315.76882290080357 +2026-02-01,Bekaa,467.14504618875316,288.758505086787 +2026-03-01,Bekaa,461.8412407185061,288.1945181667653 +2026-04-01,Bekaa,453.7783652989849,313.7020253471414 +2026-05-01,Bekaa,544.9526180735012,309.9584261942638 +2026-06-01,Bekaa,460.76596994657024,334.2696475870239 +2026-07-01,Bekaa,457.7203050699971,293.7857422985841 +2026-08-01,Bekaa,479.21384502829926,300.890358889298 +2026-09-01,Bekaa,483.8790375427642,304.4453822582399 +2026-10-01,Bekaa,475.17207924920984,299.29234663700237 +2026-11-01,Bekaa,529.314841520518,317.0241615388943 +2026-12-01,Bekaa,497.2678140233613,298.57948318206735 +2027-01-01,Bekaa,496.75270606387375,298.8449512422769 +2027-02-01,Bekaa,496.13654856196325,299.70287968651553 +2027-03-01,Bekaa,495.4223643671897,301.6263700869773 +2027-04-01,Bekaa,489.77258656757874,298.5033566957789 +2027-05-01,Bekaa,470.30126099207973,286.75885339140115 +2027-06-01,Bekaa,453.89791180180856,301.6508057492427 +2027-07-01,Bekaa,445.202541098233,317.95014086593756 +2027-08-01,Bekaa,455.084164336149,271.1158699095731 +2027-09-01,Bekaa,982.719028316767,259.5506310790798 +2027-10-01,Bekaa,622.9392578083549,333.2331856502507 +2027-11-01,Bekaa,460.12116734645184,320.4602960125834 +2027-12-01,Bekaa,463.4895573998229,301.94631366206636 +2028-01-01,Bekaa,476.2238149781454,301.89780782821043 +2028-02-01,Bekaa,483.18565343186526,302.3648526977918 +2028-03-01,Bekaa,479.1179055410845,301.73821023349973 +2028-04-01,Bekaa,459.67997525595854,285.6433932558938 +2028-05-01,Bekaa,509.1424307650037,244.66765934925024 +2028-06-01,Bekaa,710.8507043462624,225.86633171098256 +2028-07-01,Bekaa,467.74904031981646,220.4044390651283 +2028-08-01,Bekaa,654.5769051080035,208.62451797391992 +2028-09-01,Bekaa,490.543053342249,303.9044386550553 +2028-10-01,Bekaa,497.9242761860672,299.34201856015443 +2028-11-01,Bekaa,497.77219806417287,299.1830475208864 +2028-12-01,Bekaa,497.4998537133695,298.451544041531 +2029-01-01,Bekaa,500.9276211688054,288.896782392128 +2029-02-01,Bekaa,480.604931606611,272.63643294742354 +2029-03-01,Bekaa,467.5223985754505,293.92708276386713 +2029-04-01,Bekaa,463.74678750282806,307.77143442150975 +2029-05-01,Bekaa,566.9206734400614,333.6891787779955 +2029-06-01,Bekaa,603.4207182016381,256.681250811951 +2029-07-01,Bekaa,443.1667238924112,282.2921396403731 +2029-08-01,Bekaa,452.40627948933405,283.96549518465366 +2029-09-01,Bekaa,466.7023426734803,295.55631836239075 +2029-10-01,Bekaa,750.8821571196063,246.66823347348233 +2029-11-01,Bekaa,475.5716711719534,302.9835761974608 +2029-12-01,Bekaa,657.937162256607,259.72805069527175 +2030-01-01,Bekaa,473.2752411505241,301.9140112481315 +2030-02-01,Bekaa,454.4433922021098,299.31063857506575 +2030-03-01,Bekaa,456.16828773893786,329.9669173188054 +2030-04-01,Bekaa,694.6583068716903,261.71052432893686 +2030-05-01,Bekaa,539.6904127710038,313.8731446002707 +2030-06-01,Bekaa,593.1063236684312,266.6103619340511 +2030-07-01,Bekaa,604.0078707422977,306.08843688513866 +2030-08-01,Bekaa,619.4155508657042,265.56634652332974 +2030-09-01,Bekaa,488.2562676503672,249.05445247269796 +2030-10-01,Bekaa,548.4956136752471,239.16794712070168 +2030-11-01,Bekaa,490.5524817539707,241.214033536119 +2030-12-01,Bekaa,430.74892987394156,281.04988904930775 +2031-01-01,Bekaa,446.1510681064889,303.69696178193146 +2031-02-01,Bekaa,461.82886142983324,294.6721093981943 +2031-03-01,Bekaa,487.8448002472108,305.1864581124144 +2031-04-01,Bekaa,509.2638485556501,212.04862606397273 +2031-05-01,Bekaa,470.01409028391214,299.8567860692883 +2031-06-01,Bekaa,529.1872340855352,319.3708553322661 +2031-07-01,Bekaa,536.0848009998081,324.2997233395589 +2031-08-01,Bekaa,490.74493650926894,298.0330920273948 +2031-09-01,Bekaa,487.0575638547452,298.1385447892652 +2031-10-01,Bekaa,528.718044650311,318.6839417152496 +2031-11-01,Bekaa,483.25071667000657,299.0541511428682 +2031-12-01,Bekaa,540.0612156503221,305.6973966716207 +2032-01-01,Bekaa,481.33602936439684,300.4817229104308 +2032-02-01,Bekaa,479.4615027743655,299.3514691047485 +2032-03-01,Bekaa,470.04251946429474,300.2658919647375 +2032-04-01,Bekaa,501.9777015277438,320.7542201324824 +2032-05-01,Bekaa,865.0179751492908,312.78725440079535 +2032-06-01,Bekaa,900.3720000647141,311.2603387869287 +2032-07-01,Bekaa,503.9047681220263,330.3890416440085 +2032-08-01,Bekaa,603.266480901487,274.3146965093386 +2032-09-01,Bekaa,514.194188160062,277.2719511773064 +2032-10-01,Bekaa,511.5781277840031,275.13177701957653 +2032-11-01,Bekaa,508.15842126072624,278.44119065497904 +2032-12-01,Bekaa,504.8072326608017,281.0677110707891 +2033-01-01,Bekaa,504.4074248202325,286.6269286620765 +2033-02-01,Bekaa,506.4804518646813,287.54834805784236 +2033-03-01,Bekaa,521.1575380385616,291.05895560762383 +2033-04-01,Bekaa,547.3794624616472,283.57262751776113 +2033-05-01,Bekaa,632.9099111630635,161.5064522106469 +2033-06-01,Bekaa,466.6379991614248,285.4131341307006 +2033-07-01,Bekaa,541.0243530981162,229.14074526318294 +2033-08-01,Bekaa,526.2875296591283,264.5981791298112 +2033-09-01,Bekaa,535.6020087415654,267.531415839142 +2033-10-01,Bekaa,549.3587091971381,261.55978553201334 +2033-11-01,Bekaa,488.88883490703006,316.32489085620233 +2033-12-01,Bekaa,621.4255299050513,299.2934083003914 +2034-01-01,Bekaa,474.40701042018185,302.1236114480334 +2034-02-01,Bekaa,456.60588119900285,308.94612145067026 +2034-03-01,Bekaa,558.1074116036591,299.08721934678863 +2034-04-01,Bekaa,481.9400954680687,312.8145443711887 +2034-05-01,Bekaa,454.99772523326436,298.32713797751876 +2034-06-01,Bekaa,466.0723664307257,343.99531963774194 +2034-07-01,Bekaa,996.4154157263638,304.18673669062866 +2034-08-01,Bekaa,529.1832755920643,319.37353559721544 +2034-09-01,Bekaa,723.5256564951288,141.70289692882258 +2034-10-01,Bekaa,588.4839548560616,183.65943376374594 +2034-11-01,Bekaa,469.98026315788746,295.3902985743923 +2034-12-01,Bekaa,479.3444753128418,285.4851357936578 +2035-01-01,Bekaa,493.70157126904945,277.39667051903996 +2035-02-01,Bekaa,505.14456827713775,289.37956076504827 +2035-03-01,Bekaa,505.1482388801745,292.31558216523564 +2035-04-01,Bekaa,503.2491696306233,291.3655500709197 +2035-05-01,Bekaa,502.39183191741705,287.3366245311624 +2035-06-01,Bekaa,503.80904455263703,286.9360641557789 +2035-07-01,Bekaa,504.58418954686385,287.2262115387038 +2035-08-01,Bekaa,504.65918500498685,284.1671068026611 +2035-09-01,Bekaa,531.0956597741999,243.150037641117 +2035-10-01,Bekaa,517.476427000983,266.931140916397 +2035-11-01,Bekaa,517.149599385497,274.42009705825546 +2035-12-01,Bekaa,526.6183877406938,282.7681825422844 +2036-01-01,Bekaa,498.03072367413233,238.72373671614326 +2036-02-01,Bekaa,455.25884185713204,278.37675987028774 +2036-03-01,Bekaa,453.0375512390427,316.90386289389534 +2036-04-01,Bekaa,635.1419256998289,258.70878422453717 +2036-05-01,Bekaa,538.5025048666666,314.7031565186733 +2036-06-01,Bekaa,538.8656786494771,280.61445042094715 +2036-07-01,Bekaa,445.2545053216157,266.55136129652993 +2036-08-01,Bekaa,529.7417110619069,319.4002686294374 +2036-09-01,Bekaa,449.04127214856544,309.24707691498185 +2036-10-01,Bekaa,515.5119346502474,206.46881916466538 +2036-11-01,Bekaa,501.8963005074587,286.23400878223043 +2036-12-01,Bekaa,546.0353739967277,309.11344656250765 +2037-01-01,Bekaa,471.6405992648341,287.96678266766065 +2037-02-01,Bekaa,461.3689564611136,307.50518316699674 +2037-03-01,Bekaa,468.85230843648316,260.0308510172757 +2037-04-01,Bekaa,503.4789061971572,272.70114220120047 +2037-05-01,Bekaa,511.4757827346261,288.399767287204 +2037-06-01,Bekaa,460.4991674866261,274.34095962497855 +2037-07-01,Bekaa,477.5872640747686,299.00804710487597 +2037-08-01,Bekaa,483.2337311343856,301.88447612073514 +2037-09-01,Bekaa,487.11982016115246,302.8665495642182 +2037-10-01,Bekaa,486.800693614783,301.5809622216992 +2037-11-01,Bekaa,485.18202964819426,303.7597391564267 +2037-12-01,Bekaa,487.1246423259262,303.97760640730877 +2038-01-01,Bekaa,480.69770429904895,294.5320046394788 +2038-02-01,Bekaa,482.4544837014705,306.83304581583735 +2038-03-01,Bekaa,505.74424405168725,314.7610084712162 +2038-04-01,Bekaa,506.94841776555995,285.16037122252357 +2038-05-01,Bekaa,506.4389236695402,284.045293982009 +2038-06-01,Bekaa,507.8325292891516,276.0416051396524 +2038-07-01,Bekaa,556.587206165585,300.4004795546936 +2038-08-01,Bekaa,516.6026795330242,259.88916246563565 +2038-09-01,Bekaa,539.5001171939624,233.5115786271596 +2038-10-01,Bekaa,502.1434544452651,294.51804637656085 +2038-11-01,Bekaa,500.6012973615794,290.22828232514274 +2038-12-01,Bekaa,560.7780991896177,331.20405104042203 +2039-01-01,Bekaa,597.5306958346431,262.35343983042134 +2039-02-01,Bekaa,504.84120373204354,294.5072556994921 +2039-03-01,Bekaa,507.3861551708418,293.25614631063956 +2039-04-01,Bekaa,458.4857337620678,309.0699357678755 +2039-05-01,Bekaa,456.47705022967443,315.026563553015 +2039-06-01,Bekaa,554.0354173289732,302.5764543942468 +2039-07-01,Bekaa,458.3466826823236,268.73297513506736 +2039-08-01,Bekaa,443.0566777739179,302.9714627922352 +2039-09-01,Bekaa,453.9291479139249,326.2428806191944 +2039-10-01,Bekaa,1065.0931902422483,289.8471799771188 +2039-11-01,Bekaa,463.0862948740428,295.34301104278615 +2039-12-01,Bekaa,437.8001583074971,299.462003927432 +2040-01-01,Bekaa,432.9045814730213,283.75467668250207 +2040-02-01,Bekaa,427.375861601014,278.75091789548844 +2040-03-01,Bekaa,693.7801690746095,147.103265311067 +2040-04-01,Bekaa,665.9138144910695,318.57276293280563 +2040-05-01,Bekaa,458.07901655107656,241.04538569612487 +2040-06-01,Bekaa,631.154787130639,230.21908198871014 +2040-07-01,Bekaa,657.9869673017328,164.60325469915887 +2040-08-01,Bekaa,558.4091207787565,293.41132320861567 +2040-09-01,Bekaa,497.7418975959677,257.9606770259501 +2040-10-01,Bekaa,424.7097082893949,287.59034467682125 +2040-11-01,Bekaa,632.6834853365234,148.21665433274984 +2040-12-01,Bekaa,529.2053711828933,280.15974521272346 +2041-01-01,Bekaa,579.6216077006192,279.4677321305761 +2041-02-01,Bekaa,451.3279138952302,291.055979469271 +2041-03-01,Bekaa,478.7150748509557,256.982867640341 +2041-04-01,Bekaa,445.67828004083646,257.0405281453875 +2041-05-01,Bekaa,570.152531454988,198.0669021255176 +2041-06-01,Bekaa,477.54271303006794,297.89330054640067 +2041-07-01,Bekaa,485.2753061488922,301.46891322336256 +2041-08-01,Bekaa,456.13338102378475,244.11066896500535 +2041-09-01,Bekaa,503.820272279573,282.53806265163394 +2041-10-01,Bekaa,496.7989124785713,294.47869521389555 +2041-11-01,Bekaa,497.3021449576461,298.1025178513098 +2041-12-01,Bekaa,496.9742377530315,298.06020795460955 +2042-01-01,Bekaa,495.48937086576217,297.3500769775774 +2042-02-01,Bekaa,493.6249204409297,298.703001625869 +2042-03-01,Bekaa,489.315848393636,299.15130204512286 +2042-04-01,Bekaa,475.55857215719476,294.7923210216039 +2042-05-01,Bekaa,439.87750370845987,284.2467141525201 +2042-06-01,Bekaa,513.9559588257174,348.17670700189024 +2042-07-01,Bekaa,462.7421218598929,267.50161964697793 +2042-08-01,Bekaa,453.7831874637586,330.7556461952611 +2042-09-01,Bekaa,532.0128067251219,318.6354880943473 +2042-10-01,Bekaa,529.8156989035101,316.1883365783288 +2042-11-01,Bekaa,480.12753729401055,299.4197114350496 +2042-12-01,Bekaa,489.29504830976134,301.5082121730743 +2043-01-01,Bekaa,499.0157407949297,292.3793863944842 +2043-02-01,Bekaa,614.0386212251567,246.47990134999662 +2043-03-01,Bekaa,458.2616110590015,292.8438728293412 +2043-04-01,Bekaa,442.4028066251203,303.3037634329998 +2043-05-01,Bekaa,546.5985596587354,267.62877559321083 +2043-06-01,Bekaa,529.1833475646729,319.36497267283187 +2043-07-01,Bekaa,417.2831427021818,253.86375281634162 +2043-08-01,Bekaa,454.8087971357856,289.40375276686376 +2043-09-01,Bekaa,540.4829031638942,305.34546396031817 +2043-10-01,Bekaa,475.39101992445956,298.44277226533313 +2043-11-01,Bekaa,489.9100542499348,304.8684986295607 +2043-12-01,Bekaa,491.7634208930483,303.59420668932825 +2044-01-01,Bekaa,495.3644264172963,303.5557431468734 +2044-02-01,Bekaa,497.04469893681505,303.3873737759648 +2044-03-01,Bekaa,496.6747597287997,302.61058426155626 +2044-04-01,Bekaa,483.47649474306957,287.33504073823775 +2044-05-01,Bekaa,457.7724132385969,283.4464288090101 +2044-06-01,Bekaa,449.5947415084172,312.29868039003003 +2044-07-01,Bekaa,421.089270160835,261.71064615916185 +2044-08-01,Bekaa,655.9698629741375,247.5858761322741 +2044-09-01,Bekaa,533.4487322385684,311.76224450516935 +2044-10-01,Bekaa,524.0945962488129,248.0195569245315 +2044-11-01,Bekaa,487.9393722548629,305.5892462404831 +2044-12-01,Bekaa,510.65126453092466,272.1217524598789 +2045-01-01,Bekaa,508.58536277472376,281.41069796271523 +2045-02-01,Bekaa,511.44404281424954,284.48195091261925 +2045-03-01,Bekaa,513.6377679232592,282.968471432135 +2045-04-01,Bekaa,483.9127207235717,251.99358924578098 +2045-05-01,Bekaa,501.62194092361534,286.698077513459 +2045-06-01,Bekaa,563.2765563232841,294.5296028436151 +2045-07-01,Bekaa,744.2900419560763,265.4760529223091 +2045-08-01,Bekaa,482.6495294706773,254.8831237129833 +2045-09-01,Bekaa,442.2182688567642,312.83292333084125 +2045-10-01,Bekaa,454.38329507395946,296.2159594133318 +2045-11-01,Bekaa,474.1664779623634,288.0231030402325 +2045-12-01,Bekaa,961.7485133048943,251.32267019687126 +2046-01-01,Bekaa,830.5881505004289,273.4525910288153 +2046-02-01,Bekaa,579.4554949200549,222.77502898691205 +2046-03-01,Bekaa,457.7729170468569,262.25214670051776 +2046-04-01,Bekaa,452.7765065877838,282.94689007799747 +2046-05-01,Bekaa,513.7906377438476,273.4927775987375 +2046-06-01,Bekaa,515.550080132786,279.15810931597383 +2046-07-01,Bekaa,546.9587105919863,300.5198905794821 +2046-08-01,Bekaa,497.1597111652991,300.4074760904705 +2046-09-01,Bekaa,497.87317563398716,300.25210774499806 +2046-10-01,Bekaa,498.3906586895574,300.14439242180674 +2046-11-01,Bekaa,516.3004665496671,248.5497620636009 +2046-12-01,Bekaa,469.5541853151926,292.56611732072747 +2047-01-01,Bekaa,486.85740803033076,303.06347942072324 +2047-02-01,Bekaa,482.17947636415033,301.4946019965134 +2047-03-01,Bekaa,482.12967131902434,302.75631061493823 +2047-04-01,Bekaa,475.9267120499961,301.95118687106515 +2047-05-01,Bekaa,455.26524741929416,295.4264473425727 +2047-06-01,Bekaa,478.4724551874887,355.97328446179785 +2047-07-01,Bekaa,454.3008864371545,311.58287560537775 +2047-08-01,Bekaa,456.28682662524164,316.2939807876956 +2047-09-01,Bekaa,463.53900258190583,290.9391616878426 +2047-10-01,Bekaa,676.6945195551581,255.91760155752132 +2047-11-01,Bekaa,690.2574697484786,297.4370637582059 +2047-12-01,Bekaa,492.1894267631346,271.2644853797187 +2048-01-01,Bekaa,570.648638645815,166.0927858382776 +2048-02-01,Bekaa,494.060930503606,306.3871123838115 +2048-03-01,Bekaa,539.7210731022517,313.8513892029546 +2048-04-01,Bekaa,494.04092211842556,318.8697850212824 +2048-05-01,Bekaa,465.89956019756517,285.1959804568505 +2048-06-01,Bekaa,496.5785323511506,238.4849146665664 +2048-07-01,Bekaa,498.0744830201389,295.0436393713992 +2048-08-01,Bekaa,494.46815152285745,294.33359541595627 +2048-09-01,Bekaa,487.7822560503691,297.3843808880654 +2048-10-01,Bekaa,458.7670746889418,276.82495608189157 +2048-11-01,Bekaa,458.82897113230615,325.14397198996517 +2048-12-01,Bekaa,439.55153976427664,251.9577711596398 +2049-01-01,Bekaa,590.6325531395019,278.7626310014034 +2049-02-01,Bekaa,501.1902492174529,290.843664195784 +2049-03-01,Bekaa,544.1246451845891,310.596050783121 +2049-04-01,Bekaa,466.8383709036649,335.85347532026935 +2049-05-01,Bekaa,457.71512304218055,293.6653044190424 +2049-06-01,Bekaa,438.2150803958646,262.1766119610363 +2049-07-01,Bekaa,479.03952737035894,297.13328879440223 +2049-08-01,Bekaa,491.2903449369617,303.1095486500797 +2049-09-01,Bekaa,509.7599557464768,275.954131038124 +2049-10-01,Bekaa,830.5127232066545,334.2943269097392 +2049-11-01,Bekaa,458.6840182986597,329.48185898024633 +2049-12-01,Bekaa,459.53782935404615,305.4200066536819 +2050-01-01,Bekaa,466.28814031119845,301.38516364585456 +2050-02-01,Bekaa,507.05882374709597,280.6413400920298 +2050-03-01,Bekaa,506.2347373790463,283.69235182027097 +2050-04-01,Bekaa,509.6352991884453,287.44199027144356 +2050-05-01,Bekaa,516.8826529803357,284.41616259113545 +2050-06-01,Bekaa,526.103135835989,279.6916908927067 +2050-07-01,Bekaa,489.2159504129501,302.9166217866809 +2050-08-01,Bekaa,504.32854284124704,303.1166496117637 +2050-09-01,Bekaa,544.7867212107627,237.1930791739383 +2050-10-01,Bekaa,554.7359267281197,227.41402808036554 +2050-11-01,Bekaa,459.65291355513875,312.8446886497098 +2050-12-01,Bekaa,554.3958561526582,329.6932518248871 +2051-01-01,Bekaa,883.1399582594452,284.226142248818 +2051-02-01,Bekaa,569.5401885013314,287.65919615824714 +2051-03-01,Bekaa,484.4616558090841,300.7450328352266 +2051-04-01,Bekaa,492.32905362374726,303.66897563882407 +2051-05-01,Bekaa,496.88470382797885,303.96390920915854 +2051-06-01,Bekaa,496.0752278994672,298.74786995729363 +2051-07-01,Bekaa,490.40450607076474,296.3230655853983 +2051-08-01,Bekaa,473.8807467063672,289.643479840969 +2051-09-01,Bekaa,448.4544074983402,292.5291679539258 +2051-10-01,Bekaa,465.52537460564463,288.5863241702687 +2051-11-01,Bekaa,440.6838848148031,329.4585720029593 +2051-12-01,Bekaa,616.066593416645,244.5371269653538 +2052-01-01,Bekaa,557.0344439551973,300.01516536174927 +2052-02-01,Bekaa,589.8209900053421,269.7556528521011 +2052-03-01,Bekaa,554.768026511539,325.9613831822423 +2052-04-01,Bekaa,452.710507705731,297.19618799912246 +2052-05-01,Bekaa,581.7644481753744,253.41687955115174 +2052-06-01,Bekaa,686.0248326114792,268.28477914172066 +2052-07-01,Bekaa,450.6855583638026,316.93588683874464 +2052-08-01,Bekaa,467.2487587176929,301.6262134481167 +2052-09-01,Bekaa,459.64060623907443,304.45934052115786 +2052-10-01,Bekaa,458.1309807744592,329.99559963462696 +2052-11-01,Bekaa,635.403474159348,265.0066062568641 +2052-12-01,Bekaa,537.7641378754156,191.9827354991523 +2053-01-01,Bekaa,485.9237073794389,297.24528557978533 +2053-02-01,Bekaa,484.10200868409316,302.8517558940432 +2053-03-01,Bekaa,569.6525377432986,240.95782457300712 +2053-04-01,Bekaa,425.0867727856579,279.22750033125317 +2053-05-01,Bekaa,437.05653731582106,289.01232965835305 +2053-06-01,Bekaa,497.75801946028594,303.58696649310144 +2053-07-01,Bekaa,492.89943654661164,296.69146278138965 +2053-08-01,Bekaa,478.2133537966608,288.49998134940074 +2053-09-01,Bekaa,685.7406847528714,234.82703177911407 +2053-10-01,Bekaa,467.3476490818589,299.02600836090016 +2053-11-01,Bekaa,449.85708166663034,297.2487664433559 +2053-12-01,Bekaa,456.411555155882,302.99555036814354 +2054-01-01,Bekaa,596.9728361456689,332.8852733363721 +2054-02-01,Bekaa,491.25198353659744,305.24749505512443 +2054-03-01,Bekaa,497.3720303605609,298.54559697520784 +2054-04-01,Bekaa,477.51378004142543,286.773177144994 +2054-05-01,Bekaa,453.7571333794587,289.14063428956433 +2054-06-01,Bekaa,640.9215420852879,221.10905287340114 +2054-07-01,Bekaa,620.7548891384586,281.04438928486627 +2054-08-01,Bekaa,654.0205568438091,160.76875279413576 +2054-09-01,Bekaa,433.5885371721983,300.77305378696974 +2054-10-01,Bekaa,460.68089832324864,237.73339622168015 +2054-11-01,Bekaa,489.67542354601835,249.00787851812373 +2054-12-01,Bekaa,463.9170027220804,282.7953332781348 +2055-01-01,Bekaa,478.07732556647613,252.37761551920417 +2055-02-01,Bekaa,464.76023380400807,289.2094683666723 +2055-03-01,Bekaa,493.9297244381952,298.2233908387979 +2055-04-01,Bekaa,508.1045857495208,272.93517806336774 +2055-05-01,Bekaa,492.1194693876109,302.1469158296383 +2055-06-01,Bekaa,572.9464361468068,324.71836680119145 +2055-07-01,Bekaa,459.3130588975031,283.1315498904163 +2055-08-01,Bekaa,461.2206209148647,324.89919766368257 +2055-09-01,Bekaa,458.2557093050996,283.9749805378835 +2055-10-01,Bekaa,437.41229791994954,265.8783015165243 +2055-11-01,Bekaa,746.5479666319243,261.0903214622504 +2055-12-01,Bekaa,544.9249805918129,309.97468182713834 +2056-01-01,Bekaa,470.1780438862194,317.96270678342734 +2056-02-01,Bekaa,751.6298805499706,331.7348479262984 +2056-03-01,Bekaa,453.089443489817,291.17577338905215 +2056-04-01,Bekaa,715.6807861069459,145.68181986338863 +2056-05-01,Bekaa,597.898763754836,188.12647819681317 +2056-06-01,Bekaa,567.0306475859462,221.14781228925943 +2056-07-01,Bekaa,565.9321296614444,240.67437785245556 +2056-08-01,Bekaa,524.0886225223021,199.71655298888257 +2056-09-01,Bekaa,518.2980663003416,332.71516353367826 +2056-10-01,Bekaa,449.89681054655745,308.6548775957206 +2056-11-01,Bekaa,463.91721863990614,292.1814470875437 +2056-12-01,Bekaa,483.0981347398521,296.8305058767161 +2057-01-01,Bekaa,491.08083267343386,298.4918176330425 +2057-02-01,Bekaa,494.09231056093984,298.87473003012315 +2057-03-01,Bekaa,495.1848547589306,297.42888372881504 +2057-04-01,Bekaa,485.0937912300957,296.7538572608921 +2057-05-01,Bekaa,496.3728346358767,298.960742168952 +2057-06-01,Bekaa,493.8202541005704,298.2282466434789 +2057-07-01,Bekaa,497.31207717762777,295.77328058874446 +2057-08-01,Bekaa,762.6301740427859,139.0334922738231 +2057-09-01,Bekaa,584.5712359641261,281.10455601168354 +2057-10-01,Bekaa,454.62569881960064,284.9897044816584 +2057-11-01,Bekaa,469.0476420961241,295.1250741746327 +2057-12-01,Bekaa,477.7235801953876,299.99805691729995 +2058-01-01,Bekaa,965.6101316447498,287.20189770666343 +2058-02-01,Bekaa,492.8964856696604,305.0726338736568 +2058-03-01,Bekaa,570.9417830804931,286.9919494204044 +2058-04-01,Bekaa,476.82061184835226,300.8974946596176 +2058-05-01,Bekaa,452.65328948192325,291.8493378942755 +2058-06-01,Bekaa,466.79345999592135,345.00835536268517 +2058-07-01,Bekaa,963.9855659242589,309.18828512927496 +2058-08-01,Bekaa,468.6237234316861,344.12682666343807 +2058-09-01,Bekaa,531.810563695059,234.8468378928306 +2058-10-01,Bekaa,508.7951629286858,267.9230652037848 +2058-11-01,Bekaa,500.8944417962576,280.8995505516948 +2058-12-01,Bekaa,498.3329366574895,289.59868112681573 +2059-01-01,Bekaa,496.67677496183944,293.6143097677335 +2059-02-01,Bekaa,493.98938973069426,295.9284748910384 +2059-03-01,Bekaa,484.2934558228716,292.9071201204184 +2059-04-01,Bekaa,498.3413574526916,293.8056180295721 +2059-05-01,Bekaa,496.79812077987725,298.5965220092453 +2059-06-01,Bekaa,622.2352937239972,175.9061582466562 +2059-07-01,Bekaa,454.3901324717729,270.71059296405156 +2059-08-01,Bekaa,594.9545802563368,267.3126435637316 +2059-09-01,Bekaa,602.5169581559087,245.0527124774268 +2059-10-01,Bekaa,736.2502697439039,147.82681501716374 +2059-11-01,Bekaa,589.4483158382013,147.848901096519 +2059-12-01,Bekaa,461.55630116120403,297.41066140802315 +2060-01-01,Bekaa,532.5738332088729,287.58033719405586 +2060-02-01,Bekaa,544.1800640931829,310.5505210876179 +2060-03-01,Bekaa,522.7273326039358,247.22828701766937 +2060-04-01,Bekaa,613.9179231605962,161.16802524999815 +2060-05-01,Bekaa,766.3876480180503,281.7838465374805 +2060-06-01,Bekaa,551.9568483936649,231.27106857700807 +2060-07-01,Bekaa,614.5343685529407,173.69027530626644 +2060-08-01,Bekaa,587.3890355619878,302.8748862324697 +2060-09-01,Bekaa,1108.7717110093204,289.6710482804479 +2060-10-01,Bekaa,490.79466958178637,301.98599550677085 +2060-11-01,Bekaa,484.08185635369546,300.114195930332 +2060-12-01,Bekaa,474.4198935171147,300.727593708738 +2061-01-01,Bekaa,464.1219087386602,301.97419537926663 +2061-02-01,Bekaa,456.4509241727661,307.6002455511091 +2061-03-01,Bekaa,602.300392576742,325.8373600132229 +2061-04-01,Bekaa,611.0552846275992,249.3248807634956 +2061-05-01,Bekaa,529.0632972535893,317.51280516693106 +2061-06-01,Bekaa,616.8054642161558,243.82386321110815 +2061-07-01,Bekaa,433.03485189452067,297.26705838141925 +2061-08-01,Bekaa,499.71984882450437,291.50088604654354 +2061-09-01,Bekaa,502.1576330491522,286.56489967324893 +2061-10-01,Bekaa,534.7127871627656,317.1662155812093 +2061-11-01,Bekaa,478.1418130237489,298.14026781673266 +2061-12-01,Bekaa,531.7988321598632,313.57758447449345 +2062-01-01,Bekaa,488.6986832752059,301.8250925882212 +2062-02-01,Bekaa,572.3287672201166,286.35180120545857 +2062-03-01,Bekaa,445.2579600068266,346.7559229182903 +2062-04-01,Bekaa,446.4935137780328,291.99193147044394 +2062-05-01,Bekaa,473.2044920763061,289.84154097813445 +2062-06-01,Bekaa,489.5701995922988,293.1332544222806 +2062-07-01,Bekaa,496.29985441079344,293.93352236147274 +2062-08-01,Bekaa,530.2941008326302,319.2946592287063 +2062-09-01,Bekaa,481.1566016512486,311.0781851962807 +2062-10-01,Bekaa,468.20462693202217,298.05049634524767 +2062-11-01,Bekaa,475.9574443538527,286.70122769499034 +2062-12-01,Bekaa,491.156475885034,274.9697428203665 +2063-01-01,Bekaa,505.06446276380694,293.1828393238433 +2063-02-01,Bekaa,503.84891737778133,293.83811189100334 +2063-03-01,Bekaa,502.4761118420448,294.86152058938694 +2063-04-01,Bekaa,501.58343557803414,296.2543185298795 +2063-05-01,Bekaa,499.7816013226517,292.1491794822445 +2063-06-01,Bekaa,500.3108159134178,288.64219203057644 +2063-07-01,Bekaa,498.9128199646843,293.81068268606725 +2063-08-01,Bekaa,584.4939373825289,206.85987678250112 +2063-09-01,Bekaa,484.2755346433394,303.9689564613359 +2063-10-01,Bekaa,457.3799466041012,278.1312545626554 +2063-11-01,Bekaa,547.2184597362912,216.10223092644543 +2063-12-01,Bekaa,507.0042685098051,252.4809449542966 +2064-01-01,Bekaa,474.42363609276,266.29339449731486 +2064-02-01,Bekaa,464.5595021987251,284.83273493894353 +2064-03-01,Bekaa,638.3187966418132,304.4220082593635 +2064-04-01,Bekaa,480.1301283079188,299.83868557872137 +2064-05-01,Bekaa,450.0574534088706,285.59869896764775 +2064-06-01,Bekaa,458.86603702571637,336.11840384662554 +2064-07-01,Bekaa,493.7800933849922,303.59834891697716 +2064-08-01,Bekaa,465.8270118081333,348.31782121104123 +2064-09-01,Bekaa,452.1380375772185,316.01686923884245 +2064-10-01,Bekaa,544.6763872018353,223.09203123228394 +2064-11-01,Bekaa,499.1915698776497,301.83826765683585 +2064-12-01,Bekaa,532.911528688252,318.18527320012964 +2065-01-01,Bekaa,596.825148352897,265.60933518842626 +2065-02-01,Bekaa,464.63658486249636,300.9953069259507 +2065-03-01,Bekaa,471.41813193176506,301.8325242319444 +2065-04-01,Bekaa,475.26585955816785,245.18477644129428 +2065-05-01,Bekaa,621.8708964068413,238.9996821757003 +2065-06-01,Bekaa,463.5518137062302,276.0131316756451 +2065-07-01,Bekaa,443.1820540580354,309.9873521705352 +2065-08-01,Bekaa,457.62004722626824,304.1645983983198 +2065-09-01,Bekaa,470.61786849714963,299.94130143678177 +2065-10-01,Bekaa,482.1089432077581,300.9634918329156 +2065-11-01,Bekaa,488.62843800924804,303.06238294869854 +2065-12-01,Bekaa,627.7777603642401,167.37092413275556 +2066-01-01,Bekaa,488.79908506415165,304.763306932458 +2066-02-01,Bekaa,774.1350674942387,134.57085113317265 +2066-03-01,Bekaa,487.215831620976,250.9915530497207 +2066-04-01,Bekaa,449.86600627009216,278.362418712377 +2066-05-01,Bekaa,608.0271810675154,252.23665794891392 +2066-06-01,Bekaa,559.1842657729833,290.37701962551324 +2066-07-01,Bekaa,504.2377134092402,315.0762702848028 +2066-08-01,Bekaa,567.1489705544243,267.26361560034013 +2066-09-01,Bekaa,622.1191299337761,238.7523842233291 +2066-10-01,Bekaa,547.5339876522328,307.925880338136 +2066-11-01,Bekaa,460.2094777371588,274.2490126137619 +2066-12-01,Bekaa,459.65190593861894,327.625270777611 +2067-01-01,Bekaa,599.5174277214246,189.32408671258594 +2067-02-01,Bekaa,570.4952650169664,212.65365236549152 +2067-03-01,Bekaa,537.2116761320838,217.39034189505304 +2067-04-01,Bekaa,494.7827437948876,240.94428401371758 +2067-05-01,Bekaa,563.0258757276582,291.47698991813155 +2067-06-01,Bekaa,611.1077526592419,249.28081303069223 +2067-07-01,Bekaa,500.65405328365614,221.62825848358744 +2067-08-01,Bekaa,548.1191969324609,240.12053764974198 +2067-09-01,Bekaa,564.3529786569568,217.06141769195193 +2067-10-01,Bekaa,627.7532896773286,168.9194385050776 +2067-11-01,Bekaa,461.0728611494842,302.35404461640513 +2067-12-01,Bekaa,472.58351240962213,302.2556231989473 +2068-01-01,Bekaa,460.5378167774248,291.15972660799184 +2068-02-01,Bekaa,492.3531644476161,301.0674652277686 +2068-03-01,Bekaa,491.8633908463427,302.10300473569555 +2068-04-01,Bekaa,491.06794957650123,302.2703994648043 +2068-05-01,Bekaa,488.88674770138175,303.72531341571374 +2068-06-01,Bekaa,485.62408540999,303.1558267312505 +2068-07-01,Bekaa,500.412297291492,291.67407641349723 +2068-08-01,Bekaa,502.9519227572568,294.8360058594146 +2068-09-01,Bekaa,598.133610376578,261.77558166907085 +2068-10-01,Bekaa,547.9587699879735,333.4943896525863 +2068-11-01,Bekaa,565.4652433496942,161.2756361472823 +2068-12-01,Bekaa,519.113156092321,261.9409574973087 +2069-01-01,Bekaa,521.6922945201869,292.18543267633197 +2069-02-01,Bekaa,508.98855332789526,295.30774989481625 +2069-03-01,Bekaa,501.5203156003242,298.62609194527727 +2069-04-01,Bekaa,556.4910507605446,317.9228160869086 +2069-05-01,Bekaa,533.3818696852131,181.27218790977693 +2069-06-01,Bekaa,530.3336137947315,319.2816407989524 +2069-07-01,Bekaa,499.17314488985767,298.7061518074004 +2069-08-01,Bekaa,497.1750413309231,300.8342995814939 +2069-09-01,Bekaa,493.6821386647375,300.7315444888906 +2069-10-01,Bekaa,489.07574777146885,356.82233670393157 +2069-11-01,Bekaa,456.08040918388224,272.1481896186974 +2069-12-01,Bekaa,528.7983660814676,318.24176761588 +2070-01-01,Bekaa,722.0666277743335,146.4229653348346 +2070-02-01,Bekaa,507.4787119454543,280.08318361848876 +2070-03-01,Bekaa,536.1961426252553,309.05834449218554 +2070-04-01,Bekaa,579.1537137723491,251.15879113996877 +2070-05-01,Bekaa,529.8154110130758,316.2017379030755 +2070-06-01,Bekaa,472.6341091534422,250.62367798326494 +2070-07-01,Bekaa,465.4980250143904,332.0473598576643 +2070-08-01,Bekaa,489.3141210510306,292.55114960737404 +2070-09-01,Bekaa,461.77574564471354,299.6441053051264 +2070-10-01,Bekaa,609.7481900834812,250.58314332698563 +2070-11-01,Bekaa,461.41717810885126,307.8586648625882 +2070-12-01,Bekaa,474.99423493344995,243.21600000577936 +2071-01-01,Bekaa,499.4335417876396,297.5628795719642 +2071-02-01,Bekaa,496.50382478346177,293.1168421505454 +2071-03-01,Bekaa,757.4358389101636,86.00175258187141 +2071-04-01,Bekaa,718.4515875914158,89.62225099457578 +2071-05-01,Bekaa,1111.1324845428053,260.6678838593259 +2071-06-01,Bekaa,774.1840088680618,64.35648978917587 +2071-07-01,Bekaa,712.7793543379332,83.0550101218867 +2071-08-01,Bekaa,730.3973132703187,74.66026366169432 +2071-09-01,Bekaa,682.7369799070904,101.51404704094229 +2071-10-01,Bekaa,735.5017546148456,92.77739275653055 +2071-11-01,Bekaa,687.938656245786,99.0061196469816 +2071-12-01,Bekaa,700.240358446643,93.93162971221406 +2072-01-01,Bekaa,1050.352840145441,79.22061264277072 +2072-02-01,Bekaa,752.1231088364548,67.8197401900797 +2072-03-01,Bekaa,814.3641570506975,93.53954523962491 +2072-04-01,Bekaa,711.2459779124922,100.81373209917915 +2072-05-01,Bekaa,695.9283355223985,97.50243879744853 +2072-06-01,Bekaa,705.998383049533,99.22344736401026 +2072-07-01,Bekaa,758.9821704051462,100.59257543222292 +2072-08-01,Bekaa,740.2893725364763,119.8168279943149 +2072-09-01,Bekaa,739.3686989277345,123.85320258211333 +2072-10-01,Bekaa,834.8392126252203,55.482062924640914 +2072-11-01,Bekaa,734.950876268902,90.78197031038295 +2072-12-01,Bekaa,902.0388137064315,57.91499511297364 +2073-01-01,Bekaa,700.7919565186724,91.3643361900573 +2073-02-01,Bekaa,778.5194228900893,62.71014574620287 +2073-03-01,Bekaa,707.8113730592428,99.48247582661428 +2073-04-01,Bekaa,683.9409377031373,103.16030406232596 +2073-05-01,Bekaa,858.7183566669618,72.40983315036665 +2073-06-01,Bekaa,675.6453748401309,104.19920260359858 +2073-07-01,Bekaa,676.7231646533662,103.09463757106715 +2073-08-01,Bekaa,677.7055907602554,102.50866899759725 +2073-09-01,Bekaa,680.1374012583924,102.35453635869233 +2073-10-01,Bekaa,675.2573705073662,105.51676167801325 +2073-11-01,Bekaa,679.1171175593989,102.03448835769618 +2073-12-01,Bekaa,740.4970135121816,117.14164510578836 +2074-01-01,Bekaa,1042.3461753332076,93.32844826838766 +2074-02-01,Bekaa,895.7964854205193,53.918076113747674 +2074-03-01,Bekaa,810.5019629299734,59.06543792736518 +2074-04-01,Bekaa,850.1192133410354,56.200687208785325 +2074-05-01,Bekaa,955.5336785554529,47.641922457147615 +2074-06-01,Bekaa,722.3252253569016,147.30715689471322 +2074-07-01,Bekaa,785.3912236104966,102.64169019894659 +2074-08-01,Bekaa,930.8540551612704,51.24745315649854 +2074-09-01,Bekaa,1101.3953823028846,253.30115824174806 +2074-10-01,Bekaa,687.1594807854798,102.90841137004158 +2074-11-01,Bekaa,871.9851395760443,132.97926107416478 +2074-12-01,Bekaa,733.5940486522666,85.97289622287134 +2075-01-01,Bekaa,688.9706714799753,115.31856021501963 +2075-02-01,Bekaa,679.0451449508358,104.40918569849329 +2075-03-01,Bekaa,911.790670331108,52.85623868154504 +2075-04-01,Bekaa,681.4015281551982,103.00979152153445 +2075-05-01,Bekaa,895.3264323139922,55.437542679573355 +2075-06-01,Bekaa,741.2615785329497,70.07351233043514 +2075-07-01,Bekaa,698.8022017823312,88.57912320406497 +2075-08-01,Bekaa,689.9872845759319,95.0691411184409 +2075-09-01,Bekaa,686.7072049132678,99.67160854872124 +2075-10-01,Bekaa,693.4705429125701,103.96121596127863 +2075-11-01,Bekaa,772.195693583892,107.13095994591194 +2075-12-01,Bekaa,917.5183944657929,144.14242535362155 +2076-01-01,Bekaa,706.4075473292154,162.6229914138611 +2076-02-01,Bekaa,713.2658171992126,80.63829875779284 +2076-03-01,Bekaa,673.7185961362826,105.48047367529 +2076-04-01,Bekaa,687.9292998066729,93.40638480373272 +2076-05-01,Bekaa,698.1516413735274,88.12401769653067 +2076-06-01,Bekaa,698.1142156170746,88.84605322697418 +2076-07-01,Bekaa,695.3121060478794,91.45456017380651 +2076-08-01,Bekaa,693.2002857674148,94.18265218860577 +2076-09-01,Bekaa,693.5605086732743,96.07518030760734 +2076-10-01,Bekaa,696.6261819350282,97.12077951125332 +2076-11-01,Bekaa,677.2992334123071,100.47629718464793 +2076-12-01,Bekaa,710.826377604568,95.55077080638297 +2077-01-01,Bekaa,730.67627910111,73.5492242229216 +2077-02-01,Bekaa,768.8548690396003,64.69780586658818 +2077-03-01,Bekaa,682.515376245324,99.70944553573335 +2077-04-01,Bekaa,684.5196694485949,99.6059072488267 +2077-05-01,Bekaa,686.3771385303965,100.16124422287561 +2077-06-01,Bekaa,690.2183166494202,100.16319350647511 +2077-07-01,Bekaa,697.3757766532151,99.52468129740745 +2077-08-01,Bekaa,717.4995339253404,97.48762772295575 +2077-09-01,Bekaa,794.0385166115517,95.50941814716455 +2077-10-01,Bekaa,749.5352617229528,68.24048957417247 +2077-11-01,Bekaa,733.7279177041943,86.45633595987012 +2077-12-01,Bekaa,863.3416611232427,106.8131222932831 +2078-01-01,Bekaa,707.6978722555383,104.89220773186351 +2078-02-01,Bekaa,674.9434259888129,106.35187306154677 +2078-03-01,Bekaa,1103.4315593717488,268.1658902464678 +2078-04-01,Bekaa,844.5011034891925,126.6304966034826 +2078-05-01,Bekaa,725.5295898353568,143.96336973155132 +2078-06-01,Bekaa,789.2208861121499,62.214540391025025 +2078-07-01,Bekaa,780.2046615195992,133.79740324779178 +2078-08-01,Bekaa,767.12507936539,91.78452863597876 +2078-09-01,Bekaa,740.4942785530561,114.90438966307528 +2078-10-01,Bekaa,933.813640798002,107.3325367552837 +2078-11-01,Bekaa,697.2206756817611,87.94007146114386 +2078-12-01,Bekaa,925.0191638124347,52.80390389776147 +2079-01-01,Bekaa,895.664487656414,55.364479353227026 +2079-02-01,Bekaa,893.623128559733,58.618321001725334 +2079-03-01,Bekaa,909.2937246222212,54.813180180919986 +2079-04-01,Bekaa,736.9045727283527,97.77941111175888 +2079-05-01,Bekaa,681.8361707383119,97.9234318419912 +2079-06-01,Bekaa,687.9843588522237,93.72763370266073 +2079-07-01,Bekaa,684.5755921654485,96.46347063890452 +2079-08-01,Bekaa,685.0649339310705,97.9684394079587 +2079-09-01,Bekaa,684.4638187043496,100.082541897545 +2079-10-01,Bekaa,688.5387638559868,101.62821936605702 +2079-11-01,Bekaa,699.1159303830584,108.35197726919684 +2079-12-01,Bekaa,797.1245581215292,116.50019156700355 +2080-01-01,Bekaa,1031.4495223967233,125.40164733716395 +2080-02-01,Bekaa,1032.6557833162442,131.77333329445835 +2080-03-01,Bekaa,685.7213241211678,96.44361231223444 +2080-04-01,Bekaa,682.492273037975,97.89648995795503 +2080-05-01,Bekaa,678.808930849531,101.41040432812851 +2080-06-01,Bekaa,678.043862020503,104.49157773920865 +2080-07-01,Bekaa,905.3843164702798,48.49083546473845 +2080-08-01,Bekaa,846.6741004869357,54.38101356431578 +2080-09-01,Bekaa,791.6861638732688,60.205490363998564 +2080-10-01,Bekaa,755.0196464680849,67.46968714510521 +2080-11-01,Bekaa,726.7382978235692,78.13794224209819 +2080-12-01,Bekaa,705.654785816252,90.8190415074095 +2081-01-01,Bekaa,713.8105059008199,94.18726433283678 +2081-02-01,Bekaa,761.3678464611942,101.97393873588611 +2081-03-01,Bekaa,737.82747748796,127.60365903622495 +2081-04-01,Bekaa,697.034626488625,171.01345641186165 +2081-05-01,Bekaa,678.922143762801,100.87087047469005 +2081-06-01,Bekaa,676.4151218887155,104.01697939567916 +2081-07-01,Bekaa,709.5146048408934,103.01814559410386 +2081-08-01,Bekaa,866.5360933817165,105.84067343757273 +2081-09-01,Bekaa,824.9638510042495,137.20395038113105 +2081-10-01,Bekaa,814.4128825066947,112.94001651997714 +2081-11-01,Bekaa,695.2949045944329,108.2519372501786 +2081-12-01,Bekaa,680.7788211459084,100.15233321213495 +2082-01-01,Bekaa,680.0056913847216,100.25474021838116 +2082-02-01,Bekaa,680.1889336461237,99.79176795917734 +2082-03-01,Bekaa,679.9211235696597,99.665482228837 +2082-04-01,Bekaa,962.09088700383,229.59854843998443 +2082-05-01,Bekaa,609.5350072169166,215.34388998896085 +2082-06-01,Bekaa,661.9419341148948,203.64561255280023 +2082-07-01,Bekaa,738.5902431935141,197.4310875857171 +2082-08-01,Bekaa,834.0943680991986,182.80040884748254 +2082-09-01,Bekaa,671.4621828852146,193.53902960155457 +2082-10-01,Bekaa,867.9915234720837,159.63310364991915 +2082-11-01,Bekaa,715.7652819493992,153.84555881272007 +2082-12-01,Bekaa,815.4375565348104,136.97299508322368 +2083-01-01,Bekaa,976.4253115883402,53.60843589482754 +2083-02-01,Bekaa,962.5186202165215,55.73686213800673 +2083-03-01,Bekaa,961.0048923132181,57.658420659186845 +2083-04-01,Bekaa,976.2230685582775,59.269155467832874 +2083-05-01,Bekaa,1008.3697061456857,59.8566556212738 +2083-06-01,Bekaa,862.5410378255846,155.92833353017122 +2083-07-01,Bekaa,990.5144535228669,249.94057591185825 +2083-08-01,Bekaa,782.4068793964191,132.20085295819587 +2083-09-01,Bekaa,989.9403280243574,142.01217165706782 +2083-10-01,Bekaa,740.0882810681506,121.1055829226831 +2083-11-01,Bekaa,760.4506275376634,95.75093786600866 +2083-12-01,Bekaa,722.324649576033,76.29567779305565 +2084-01-01,Bekaa,701.5298197016633,86.3187026142897 +2084-02-01,Bekaa,686.4427775494063,96.140394286602 +2084-03-01,Bekaa,681.7419585937027,102.0153958210116 +2084-04-01,Bekaa,694.2808825123844,107.25985632393018 +2084-05-01,Bekaa,782.0239851188625,119.02696783719884 +2084-06-01,Bekaa,854.923241017419,145.13300950853463 +2084-07-01,Bekaa,676.4347704108532,102.93152430415019 +2084-08-01,Bekaa,677.4005708451641,102.39489697179314 +2084-09-01,Bekaa,677.6130339856429,102.69801057151845 +2084-10-01,Bekaa,677.7555397505984,103.17083367462696 +2084-11-01,Bekaa,678.3693221564263,103.28620689767354 +2084-12-01,Bekaa,679.9689133817457,102.74580282834238 +2085-01-01,Bekaa,682.72848713928,101.8695476374047 +2085-02-01,Bekaa,686.7935720435439,101.0317907975575 +2085-03-01,Bekaa,691.2973299970012,100.98821038565397 +2085-04-01,Bekaa,703.7647851153796,99.9569871485545 +2085-05-01,Bekaa,726.9889784191951,142.312100266626 +2085-06-01,Bekaa,758.1686640105553,66.56541100242445 +2085-07-01,Bekaa,817.463657438476,119.81068427011287 +2085-08-01,Bekaa,691.8312947799324,103.32308664720374 +2085-09-01,Bekaa,680.9825036281427,104.86328175559211 +2085-10-01,Bekaa,684.6848465852477,102.72657105711497 +2085-11-01,Bekaa,689.5528579106439,102.04202442732648 +2085-12-01,Bekaa,888.1889087227693,58.49113024685667 +2086-01-01,Bekaa,707.9708643598188,99.64212563427849 +2086-02-01,Bekaa,768.27476981458,106.32030162896164 +2086-03-01,Bekaa,736.5578806729035,129.8844078692523 +2086-04-01,Bekaa,682.2107161932755,109.71142853668329 +2086-05-01,Bekaa,682.7239528649403,102.30025229130929 +2086-06-01,Bekaa,695.0458073961952,99.01381235547258 +2086-07-01,Bekaa,708.8197812778232,98.65094973255843 +2086-08-01,Bekaa,781.1688065839131,93.69204187265164 +2086-09-01,Bekaa,996.2821224553045,81.94884389211282 +2017-01-01,Kesrouan,740.1678827732215,120.72449797897703 +2017-02-01,Kesrouan,715.1003989914913,154.45267363238125 +2017-03-01,Kesrouan,928.1979060422417,50.50486312667077 +2017-04-01,Kesrouan,688.1288798502187,100.24929266689318 +2017-05-01,Kesrouan,729.558544490122,127.94363498116265 +2017-06-01,Kesrouan,965.4647469754518,181.69518245087272 +2017-07-01,Kesrouan,681.8543798082785,96.82031136784161 +2017-08-01,Kesrouan,687.0830458751853,100.22647560618807 +2017-09-01,Kesrouan,1041.6861865126818,175.47460078117683 +2017-10-01,Kesrouan,985.1080870854173,78.77046736582447 +2017-11-01,Kesrouan,688.2805261364617,96.81764850721014 +2017-12-01,Kesrouan,845.3523955032792,54.43153829904263 +2018-01-01,Kesrouan,787.7088855514521,60.39758182014053 +2018-02-01,Kesrouan,748.5164174761306,67.62026930316812 +2018-03-01,Kesrouan,716.3862616160832,79.00626106409497 +2018-04-01,Kesrouan,688.9422422995927,94.72993096348878 +2018-05-01,Kesrouan,700.0251603470388,102.13322305287545 +2018-06-01,Kesrouan,838.350900142241,103.9292616337008 +2018-07-01,Kesrouan,813.775852948301,129.90195142164794 +2018-08-01,Kesrouan,692.6987806309459,92.55755881773115 +2018-09-01,Kesrouan,698.2578009711583,88.38241960369197 +2018-10-01,Kesrouan,700.6356320128727,86.48038872714274 +2018-11-01,Kesrouan,698.7528285728569,87.1292216966972 +2018-12-01,Kesrouan,690.7230605532744,91.31784925707233 +2019-01-01,Kesrouan,724.5637894010459,107.18813313005856 +2019-02-01,Kesrouan,895.4879388476082,54.63147910253622 +2019-03-01,Kesrouan,707.7352980119913,86.87311715949241 +2019-04-01,Kesrouan,781.8036769640502,61.18610184478197 +2019-05-01,Kesrouan,684.2335783295558,104.05753145627635 +2019-06-01,Kesrouan,680.5892452949528,102.74092961934355 +2019-07-01,Kesrouan,680.822580491915,100.8762832175423 +2019-08-01,Kesrouan,682.9007175915718,98.39341804128975 +2019-09-01,Kesrouan,684.484690760833,96.55428636946074 +2019-10-01,Kesrouan,684.7429284803583,95.86651994086947 +2019-11-01,Kesrouan,995.1926011068732,54.06235790874784 +2019-12-01,Kesrouan,1016.8308779809963,58.8431325754307 +2020-01-01,Kesrouan,700.0799315021554,106.29396889605033 +2020-02-01,Kesrouan,683.5969086342046,96.33540966814321 +2020-03-01,Kesrouan,762.0645413120868,99.73901547176534 +2020-04-01,Kesrouan,945.5146596077896,56.963466247322344 +2020-05-01,Kesrouan,924.4949873042682,55.96668615525367 +2020-06-01,Kesrouan,897.7831453346921,55.7486448611931 +2020-07-01,Kesrouan,867.8252667463023,56.52252785452026 +2020-08-01,Kesrouan,839.1390002060093,57.49165248552079 +2020-09-01,Kesrouan,811.0342723429077,59.53307454375354 +2020-10-01,Kesrouan,786.8711963603838,62.48978967786793 +2020-11-01,Kesrouan,736.4497778148412,130.06717061102515 +2020-12-01,Kesrouan,730.6418042216085,116.96956861517717 +2021-01-01,Kesrouan,761.3433038016741,128.6945094662883 +2021-02-01,Kesrouan,761.3638879677233,103.39188591567606 +2021-03-01,Kesrouan,704.2598846896866,84.23820786247735 +2021-04-01,Kesrouan,721.5063210166682,76.43759260082784 +2021-05-01,Kesrouan,676.7202137764153,102.160478214633 +2021-06-01,Kesrouan,677.456781452452,101.8881528531894 +2021-07-01,Kesrouan,677.753308599733,102.73041741136046 +2021-08-01,Kesrouan,681.6536482029956,104.84961936607758 +2021-09-01,Kesrouan,711.5154433589531,110.06261286231823 +2021-10-01,Kesrouan,801.4680330757159,131.84930314188605 +2021-11-01,Kesrouan,866.945905414876,168.31951166868967 +2021-12-01,Kesrouan,768.8000259118751,192.9757736628827 +2022-01-01,Kesrouan,678.4215742702434,201.00386335886898 +2022-02-01,Kesrouan,1071.5177531730428,236.97246204083552 +2022-03-01,Kesrouan,736.2076619596345,130.524573488516 +2022-04-01,Kesrouan,740.1552155941145,120.91239499451646 +2022-05-01,Kesrouan,804.1356978121147,77.97702191923067 +2022-06-01,Kesrouan,794.2293159968531,65.63904878038839 +2022-07-01,Kesrouan,821.8124583656966,57.76453478513571 +2022-08-01,Kesrouan,887.4678151575737,50.14114769218182 +2022-09-01,Kesrouan,739.8120501964845,122.3996635723143 +2022-10-01,Kesrouan,765.4317078311125,67.69256683952888 +2022-11-01,Kesrouan,691.2318349232085,91.88288043616522 +2022-12-01,Kesrouan,748.4884921040081,75.8458631981486 +2023-01-01,Kesrouan,832.7401314964716,77.34538441571488 +2023-02-01,Kesrouan,699.7207881854247,168.62589728017136 +2023-03-01,Kesrouan,880.4376027257188,113.93559571411399 +2023-04-01,Kesrouan,907.8508177657441,52.84342910360533 +2023-05-01,Kesrouan,860.4153268316674,55.41528255703952 +2023-06-01,Kesrouan,820.9401503499095,58.47426546285726 +2023-07-01,Kesrouan,792.3812753267732,61.69159285250028 +2023-08-01,Kesrouan,771.280633838618,65.47494346735385 +2023-09-01,Kesrouan,753.8016540133681,71.40542996707839 +2023-10-01,Kesrouan,732.1557480427374,80.62794318867041 +2023-11-01,Kesrouan,750.1983453656464,77.62609865836356 +2023-12-01,Kesrouan,740.2027894883747,120.43433319173421 +2024-01-01,Kesrouan,1098.0582283616297,227.73426752885808 +2024-02-01,Kesrouan,814.7562638221502,100.15111490988524 +2024-03-01,Kesrouan,1043.6223936282518,81.83498484471946 +2024-04-01,Kesrouan,640.035343356048,258.25035449229296 +2024-05-01,Kesrouan,705.88682550626,229.60272547626911 +2024-06-01,Kesrouan,742.2409817902789,223.06136482422724 +2024-07-01,Kesrouan,779.0766348255866,218.05074873597962 +2024-08-01,Kesrouan,779.1767487240982,86.92005660474159 +2024-09-01,Kesrouan,862.5729216911781,71.77450593146601 +2024-10-01,Kesrouan,834.8225869526422,63.59733084875218 +2024-11-01,Kesrouan,846.5816876575406,57.04486624192016 +2024-12-01,Kesrouan,733.4595318468618,85.49027448881172 +2025-01-01,Kesrouan,708.5435504061574,96.75100737415153 +2025-02-01,Kesrouan,691.2231262375725,99.7557410212219 +2025-03-01,Kesrouan,689.139951055316,98.49747845773196 +2025-04-01,Kesrouan,686.5649150661383,98.1827561779988 +2025-05-01,Kesrouan,685.9658150724573,97.27691364671125 +2025-06-01,Kesrouan,685.0963859610127,96.90517482169213 +2025-07-01,Kesrouan,682.6930766158666,97.8843939570473 +2025-08-01,Kesrouan,681.8000404888131,98.26339038261105 +2025-09-01,Kesrouan,681.6096729391633,98.22720680579496 +2025-10-01,Kesrouan,682.543373590055,97.44147147200998 +2025-11-01,Kesrouan,990.5772136375341,68.68257665195283 +2025-12-01,Kesrouan,837.7827483702423,86.89607345474036 +2026-01-01,Kesrouan,723.075683746391,99.46811726438563 +2026-02-01,Kesrouan,695.2447396862642,104.35925271057343 +2026-03-01,Kesrouan,740.5126315682397,116.76285753203878 +2026-04-01,Kesrouan,1044.1576539181372,188.40611337175497 +2026-05-01,Kesrouan,926.6293350112128,51.84379470340873 +2026-06-01,Kesrouan,883.147371438127,53.29139884081992 +2026-07-01,Kesrouan,754.759753378563,82.91854286560248 +2026-08-01,Kesrouan,830.7174852780171,211.2863517506534 +2026-09-01,Kesrouan,682.3406987243407,98.22235100111403 +2026-10-01,Kesrouan,679.0159240717591,105.8672150222983 +2026-11-01,Kesrouan,676.9046075995544,104.35679870175619 +2026-12-01,Kesrouan,677.2741149719184,102.55665270191757 +2027-01-01,Kesrouan,882.9313096672199,132.66018771496843 +2027-02-01,Kesrouan,813.5425177513387,116.74219860674748 +2027-03-01,Kesrouan,695.3380161869622,109.65326330641906 +2027-04-01,Kesrouan,724.0939522123446,145.45617288242636 +2027-05-01,Kesrouan,708.676267896348,81.85421661594688 +2027-06-01,Kesrouan,700.9209314332176,85.79352732307981 +2027-07-01,Kesrouan,680.3526713306053,106.41150025451061 +2027-08-01,Kesrouan,692.3303528477103,90.81597834746742 +2027-09-01,Kesrouan,681.9085751825266,98.94508270427168 +2027-10-01,Kesrouan,678.3186534399977,103.59534239137594 +2027-11-01,Kesrouan,693.2949297476755,107.28329994007801 +2027-12-01,Kesrouan,816.9791378376278,107.13424936198612 +2028-01-01,Kesrouan,826.6285774403186,127.02994310252349 +2028-02-01,Kesrouan,680.208006387393,103.1815199257886 +2028-03-01,Kesrouan,681.836818491789,98.88763105103936 +2028-04-01,Kesrouan,687.8735930076447,93.96252237640287 +2028-05-01,Kesrouan,686.2925707153348,95.04179893509409 +2028-06-01,Kesrouan,699.5583460078973,110.45749943008164 +2028-07-01,Kesrouan,762.4654287417845,123.72789149357276 +2028-08-01,Kesrouan,862.8227386155013,149.56813442265968 +2028-09-01,Kesrouan,1059.3777734236278,181.89574980980905 +2028-10-01,Kesrouan,1056.1119443374591,84.73846017052192 +2028-11-01,Kesrouan,711.4475012164695,80.69488019513247 +2028-12-01,Kesrouan,700.0290468679012,86.40683807989659 +2029-01-01,Kesrouan,691.7872475434914,91.41139746553141 +2029-02-01,Kesrouan,685.2674648515675,95.95449876761565 +2029-03-01,Kesrouan,681.9377240889947,98.95952828808952 +2029-04-01,Kesrouan,679.9503444487364,101.72900777074291 +2029-05-01,Kesrouan,681.9260645264076,104.39917821572789 +2029-06-01,Kesrouan,700.9531751618541,108.45132111550093 +2029-07-01,Kesrouan,766.5028041917515,124.76863489253773 +2029-08-01,Kesrouan,907.9579130072864,150.22304149914478 +2029-09-01,Kesrouan,917.2753429666745,180.693442128216 +2029-10-01,Kesrouan,693.5443148363474,174.13927189823437 +2029-11-01,Kesrouan,930.2302685628522,98.21479752716587 +2029-12-01,Kesrouan,935.8558635659856,156.81391743547806 +2030-01-01,Kesrouan,715.1238620618828,154.46738028096692 +2030-02-01,Kesrouan,724.0309042072431,180.88828346657866 +2030-03-01,Kesrouan,840.8411523985314,169.56994228914587 +2030-04-01,Kesrouan,696.8058255660021,88.18569859900119 +2030-05-01,Kesrouan,678.953451847526,101.967568755552 +2030-06-01,Kesrouan,880.449910041783,114.79084389340328 +2030-07-01,Kesrouan,678.6772929484687,105.2135262480629 +2030-08-01,Kesrouan,690.1628977408263,106.95141700294191 +2030-09-01,Kesrouan,717.6023827829774,113.31528842152036 +2030-10-01,Kesrouan,760.9089491089945,122.25546879890338 +2030-11-01,Kesrouan,775.1950081005502,129.0320836153623 +2030-12-01,Kesrouan,730.0692621204873,116.99722407624535 +2031-01-01,Kesrouan,791.0755482622177,92.60693486747968 +2031-02-01,Kesrouan,734.2076151402687,88.1221380302025 +2031-03-01,Kesrouan,793.3390148289251,63.00091968457053 +2031-04-01,Kesrouan,681.0441841536814,104.29555290723196 +2031-05-01,Kesrouan,1074.8043103704777,218.73950721068852 +2031-06-01,Kesrouan,946.3217604402186,166.78577356222473 +2031-07-01,Kesrouan,734.0916672678733,109.67919574001984 +2031-08-01,Kesrouan,852.0055434388712,94.17441994626134 +2031-09-01,Kesrouan,1077.5904420205716,78.10969503422298 +2031-10-01,Kesrouan,734.4244686098699,88.94134186721857 +2031-11-01,Kesrouan,800.8212152425575,133.5760899419749 +2031-12-01,Kesrouan,842.9895347641459,112.94370623536194 +2032-01-01,Kesrouan,704.746995304443,110.13323958416507 +2032-02-01,Kesrouan,739.7161107092697,122.74425166148293 +2032-03-01,Kesrouan,679.4199782962332,102.36981734976713 +2032-04-01,Kesrouan,680.1707965487658,100.52739626186398 +2032-05-01,Kesrouan,681.662140970806,98.72545761728652 +2032-06-01,Kesrouan,660.7659016909706,203.05988763978024 +2032-07-01,Kesrouan,734.1245587499867,133.6199488229641 +2032-08-01,Kesrouan,767.9778108316481,104.26506054235375 +2032-09-01,Kesrouan,708.6284780842618,98.12211953459942 +2032-10-01,Kesrouan,695.2462511110441,97.0687580051911 +2032-11-01,Kesrouan,697.0149059938786,92.99331072381308 +2032-12-01,Kesrouan,702.4772671207905,88.00436301129224 +2033-01-01,Kesrouan,713.5165697674471,81.43371089230399 +2033-02-01,Kesrouan,730.130294892549,74.23805231490192 +2033-03-01,Kesrouan,749.665100308801,68.35300848909115 +2033-04-01,Kesrouan,767.0782971698238,65.15237184026903 +2033-05-01,Kesrouan,782.1725365829369,63.518785162282214 +2033-06-01,Kesrouan,902.5164959094664,50.22197334429049 +2033-07-01,Kesrouan,842.3149355040822,56.47583206972105 +2033-08-01,Kesrouan,813.8063693343317,63.53401394040348 +2033-09-01,Kesrouan,828.9750284246994,71.59941849386634 +2033-10-01,Kesrouan,901.9826030991437,63.09213571443736 +2033-11-01,Kesrouan,731.5942897233352,78.46657057179578 +2033-12-01,Kesrouan,682.137304132541,97.86394388357022 +2034-01-01,Kesrouan,747.1210125413053,102.50370876700914 +2034-02-01,Kesrouan,875.9217533740227,195.90761802678531 +2034-03-01,Kesrouan,881.7428979546228,184.0557126769376 +2034-04-01,Kesrouan,905.2733347078752,167.6960715988826 +2034-05-01,Kesrouan,723.8292369580487,77.26332305703868 +2034-06-01,Kesrouan,730.5750136408616,74.58121325000663 +2034-07-01,Kesrouan,734.9253979654707,73.28838571126086 +2034-08-01,Kesrouan,738.6129145652113,72.344027424565 +2034-09-01,Kesrouan,787.1751366863466,65.88664260616312 +2034-10-01,Kesrouan,793.4769863195411,64.28612413209677 +2034-11-01,Kesrouan,793.8486528701618,63.21372227895742 +2034-12-01,Kesrouan,787.2997212717698,63.64834290437891 +2035-01-01,Kesrouan,714.805599186816,81.8851266844535 +2035-02-01,Kesrouan,778.0735525800397,65.82938240042725 +2035-03-01,Kesrouan,788.9854637095394,74.85225069192919 +2035-04-01,Kesrouan,880.9540061921605,77.76839636112851 +2035-05-01,Kesrouan,1067.9056638670763,74.22915870847912 +2035-06-01,Kesrouan,700.8509740576941,167.61474122155616 +2035-07-01,Kesrouan,1072.5083841573082,221.27190507555022 +2035-08-01,Kesrouan,736.0050590665285,126.77618814822887 +2035-09-01,Kesrouan,691.3577150155859,105.98091743083101 +2035-10-01,Kesrouan,703.4963992580468,100.84495544540714 +2035-11-01,Kesrouan,772.4183048621782,69.99498404828303 +2035-12-01,Kesrouan,736.2423527569617,95.44389089044859 +2036-01-01,Kesrouan,704.2090720280409,91.32374932082445 +2036-02-01,Kesrouan,706.4203584535396,94.44364733912714 +2036-03-01,Kesrouan,824.7077724629811,87.10163585290043 +2036-04-01,Kesrouan,733.4391635986383,89.83286064491321 +2036-05-01,Kesrouan,715.3915281931297,88.71656510214895 +2036-06-01,Kesrouan,713.8973048667472,85.74434272082766 +2036-07-01,Kesrouan,714.6597107092581,83.26990123441591 +2036-08-01,Kesrouan,717.1000859478143,80.92745409460018 +2036-09-01,Kesrouan,722.9133135414721,77.80607670927994 +2036-10-01,Kesrouan,725.4388323759587,76.57902008770012 +2036-11-01,Kesrouan,670.4654342292214,194.4133877218463 +2036-12-01,Kesrouan,728.6024603579673,73.92294714017595 +2037-01-01,Kesrouan,714.0511823038555,79.53350746912933 +2037-02-01,Kesrouan,698.0108629511776,87.95331614702985 +2037-03-01,Kesrouan,685.2933749906502,96.95453346712279 +2037-04-01,Kesrouan,679.9905051643146,105.27049058039535 +2037-05-01,Kesrouan,742.1027943818374,106.26283257141154 +2037-06-01,Kesrouan,891.2731509175328,117.48889605558851 +2037-07-01,Kesrouan,947.8769445660542,80.12991863331096 +2037-08-01,Kesrouan,804.6917581858751,96.15296020409176 +2037-09-01,Kesrouan,723.463328216113,96.16966834923049 +2037-10-01,Kesrouan,781.564368040577,85.76820404060396 +2037-11-01,Kesrouan,1049.2785050174164,78.39697070470221 +2037-12-01,Kesrouan,740.4877290456768,117.86643051845265 +2038-01-01,Kesrouan,732.1099734636911,136.31859273195633 +2038-02-01,Kesrouan,1039.2359510267527,186.36573557259342 +2038-03-01,Kesrouan,740.0144371717647,110.77408397182509 +2038-04-01,Kesrouan,1032.193503251442,197.50164469029258 +2038-05-01,Kesrouan,922.2898185504971,52.40242109353184 +2038-06-01,Kesrouan,876.3491986962803,54.16935965490721 +2038-07-01,Kesrouan,831.4269192806255,57.16591327258675 +2038-08-01,Kesrouan,797.0474754577579,60.9370982692612 +2038-09-01,Kesrouan,773.2874460831886,65.23318008805984 +2038-10-01,Kesrouan,730.9224254223966,137.74271844458403 +2038-11-01,Kesrouan,756.1956069194008,71.02672941491815 +2038-12-01,Kesrouan,784.314297468564,84.73325627948392 +2039-01-01,Kesrouan,740.4165481358077,113.90197057202225 +2039-02-01,Kesrouan,695.013563667559,176.7791240215197 +2039-03-01,Kesrouan,836.3405612398509,133.51501819062918 +2039-04-01,Kesrouan,721.4421934224383,106.10313055079378 +2039-05-01,Kesrouan,689.9349604895065,96.9158262642181 +2039-06-01,Kesrouan,711.096994612766,81.70781149416864 +2039-07-01,Kesrouan,743.7967416969835,68.90449910889457 +2039-08-01,Kesrouan,751.7984403992259,77.63847312835698 +2039-09-01,Kesrouan,674.7163524087956,106.60373094519544 +2039-10-01,Kesrouan,676.253831272925,102.06313586488201 +2039-11-01,Kesrouan,684.142389034506,96.3401088339635 +2039-12-01,Kesrouan,1094.5745381893403,224.36498304004178 +2040-01-01,Kesrouan,807.5482070745354,96.45967649761259 +2040-02-01,Kesrouan,732.2551422151635,80.96884156245427 +2040-03-01,Kesrouan,730.5742219421675,74.5431674111803 +2040-04-01,Kesrouan,702.009301219912,166.58518879897056 +2040-05-01,Kesrouan,722.1318349576917,147.50469590234312 +2040-06-01,Kesrouan,789.4440731713048,99.18493160860187 +2040-07-01,Kesrouan,969.2250278824503,176.23671845563547 +2040-08-01,Kesrouan,702.3478603705938,108.65493423006144 +2040-09-01,Kesrouan,725.1583551203875,101.9508954190489 +2040-10-01,Kesrouan,841.6315555857735,95.23493465030722 +2040-11-01,Kesrouan,1065.108376462655,84.33292216023254 +2040-12-01,Kesrouan,763.3747306783732,73.72709635137777 +2041-01-01,Kesrouan,752.5459479117643,71.31793846123209 +2041-02-01,Kesrouan,752.9492104375445,70.23460669648118 +2041-03-01,Kesrouan,737.6981427103718,75.2275922107438 +2041-04-01,Kesrouan,715.1995772460916,82.83860483370434 +2041-05-01,Kesrouan,702.0200971111964,87.44723339250454 +2041-06-01,Kesrouan,692.9755153108716,91.40466199452239 +2041-07-01,Kesrouan,960.548873865361,158.01356225643963 +2041-08-01,Kesrouan,927.6113292824506,208.41122805863324 +2041-09-01,Kesrouan,883.1580233841945,159.1402133683263 +2041-10-01,Kesrouan,737.160003516144,128.8702756722843 +2041-11-01,Kesrouan,788.8775047966943,62.55522991299463 +2041-12-01,Kesrouan,769.8014527874249,67.6961347246887 +2042-01-01,Kesrouan,766.6276046950005,73.51166570499515 +2042-02-01,Kesrouan,812.1841067373148,75.74453525960932 +2042-03-01,Kesrouan,739.4789609640536,123.47930562168041 +2042-04-01,Kesrouan,736.1624631614567,130.5524203970806 +2042-05-01,Kesrouan,949.8727450015148,51.28911909343826 +2042-06-01,Kesrouan,923.3987005306318,55.819671882350576 +2042-07-01,Kesrouan,815.8311747310431,58.86612367931431 +2042-08-01,Kesrouan,938.8828875369411,60.31090831723333 +2042-09-01,Kesrouan,737.9440011412239,101.71847815844191 +2042-10-01,Kesrouan,774.5985710933865,104.17675103356837 +2042-11-01,Kesrouan,710.8510642093054,101.07371779926505 +2042-12-01,Kesrouan,702.4748200520993,95.14577232994706 +2043-01-01,Kesrouan,718.0001753905069,82.95089749249095 +2043-02-01,Kesrouan,752.6129544103369,68.24941798923095 +2043-03-01,Kesrouan,796.6779680853938,59.11495321165657 +2043-04-01,Kesrouan,866.0646008230183,51.42095680117367 +2043-05-01,Kesrouan,949.8007723929516,62.279823987291095 +2043-06-01,Kesrouan,858.4566642622258,54.92265334021444 +2043-07-01,Kesrouan,916.1047084883924,49.982089631324584 +2043-08-01,Kesrouan,1062.004629690971,258.64266522101417 +2043-09-01,Kesrouan,893.89280992402,167.1945487756347 +2043-10-01,Kesrouan,674.317984020398,191.02375758546003 +2043-11-01,Kesrouan,738.0033785432888,101.74554187270313 +2043-12-01,Kesrouan,948.293809914853,44.103363572894466 +2044-01-01,Kesrouan,1000.7354995827674,203.78726629580464 +2044-02-01,Kesrouan,753.6043770932961,68.22181474111638 +2044-03-01,Kesrouan,743.8166061369467,69.96929527513221 +2044-04-01,Kesrouan,730.3023094270152,73.78735009978439 +2044-05-01,Kesrouan,715.8234358171183,79.52731153197371 +2044-06-01,Kesrouan,702.0265026733584,86.83287837661663 +2044-07-01,Kesrouan,692.1789944519015,93.68220843306476 +2044-08-01,Kesrouan,686.9503283849947,98.81571640967142 +2044-09-01,Kesrouan,687.7599482587233,101.26897684125625 +2044-10-01,Kesrouan,694.335509722284,102.59015601378431 +2044-11-01,Kesrouan,709.7931388360334,106.10889138000304 +2044-12-01,Kesrouan,766.3120048064502,104.78837357155342 +2045-01-01,Kesrouan,740.1696820884357,111.75427774898002 +2045-02-01,Kesrouan,736.3761498362811,95.93987914061923 +2045-03-01,Kesrouan,939.1679710394604,153.08039538263716 +2045-04-01,Kesrouan,703.7098700150457,165.0402597161262 +2045-05-01,Kesrouan,736.2874076099224,95.60333184629857 +2045-06-01,Kesrouan,795.3389177030735,111.7452275036965 +2045-07-01,Kesrouan,850.82584041191,140.8873654028735 +2045-08-01,Kesrouan,901.8345554433291,149.10462262960246 +2045-09-01,Kesrouan,809.2189792097238,136.94379063786658 +2045-10-01,Kesrouan,745.1819265213927,122.00458555705451 +2045-11-01,Kesrouan,727.4958815013064,121.5584780818501 +2045-12-01,Kesrouan,672.6508824882461,195.00746670743567 +2046-01-01,Kesrouan,743.6244392720829,127.16214630093373 +2046-02-01,Kesrouan,809.3118238747707,141.63287935810052 +2046-03-01,Kesrouan,666.6441925227698,197.81191146465542 +2046-04-01,Kesrouan,697.8617357062345,87.86114287968114 +2046-05-01,Kesrouan,711.719197813796,81.84173772004634 +2046-06-01,Kesrouan,722.5821675694723,77.71381642034197 +2046-07-01,Kesrouan,728.2125127647712,75.63269511308683 +2046-08-01,Kesrouan,728.929791781713,75.24978271600618 +2046-09-01,Kesrouan,724.4518000221215,77.07855881871278 +2046-10-01,Kesrouan,716.7730424145025,81.05363539903338 +2046-11-01,Kesrouan,708.7549339575077,86.45983422775853 +2046-12-01,Kesrouan,704.6531430228764,91.25862236341904 +2047-01-01,Kesrouan,715.4605499247422,92.48432144820637 +2047-02-01,Kesrouan,763.373291226202,96.97688061124589 +2047-03-01,Kesrouan,858.9416876713337,172.69041464993776 +2047-04-01,Kesrouan,930.874567354711,51.71508977288691 +2047-05-01,Kesrouan,663.4808524311957,200.6105083710766 +2047-06-01,Kesrouan,687.3679854324874,93.83599298561259 +2047-07-01,Kesrouan,810.0961813628935,130.36551542765878 +2047-08-01,Kesrouan,729.1105869744241,112.49549283769736 +2047-09-01,Kesrouan,691.2344259371167,104.77979324285197 +2047-10-01,Kesrouan,682.4191488676748,102.12050049652501 +2047-11-01,Kesrouan,684.4700083486862,98.26915121182037 +2047-12-01,Kesrouan,693.4816266942888,91.42464215141744 +2048-01-01,Kesrouan,711.4214471321696,81.31671906769716 +2048-02-01,Kesrouan,735.5500482351915,71.67711136876143 +2048-03-01,Kesrouan,762.8221249898241,64.90606593401544 +2048-04-01,Kesrouan,739.1061428516957,106.17286965243014 +2048-05-01,Kesrouan,773.0986619309269,106.47352924333823 +2048-06-01,Kesrouan,715.7297994533774,108.44731812239476 +2048-07-01,Kesrouan,697.8058129893808,105.47563527492693 +2048-08-01,Kesrouan,688.6592460027219,102.78461445715426 +2048-09-01,Kesrouan,684.589194988467,101.28605047706986 +2048-10-01,Kesrouan,684.2386883847637,99.3590444044018 +2048-11-01,Kesrouan,686.8301341286939,96.30014852017335 +2048-12-01,Kesrouan,689.4650513281966,93.6346946453265 +2049-01-01,Kesrouan,689.4762790551325,92.92094357018088 +2049-02-01,Kesrouan,680.2314694577847,98.28845260031913 +2049-03-01,Kesrouan,808.1940172911739,80.38753734616891 +2049-04-01,Kesrouan,778.308543146999,62.24818293743458 +2049-05-01,Kesrouan,876.1667481335722,51.55081041667381 +2049-06-01,Kesrouan,716.1829389968921,91.07431063735733 +2049-07-01,Kesrouan,753.5480225407913,79.99747177445076 +2049-08-01,Kesrouan,848.8571736498778,90.41360792302724 +2049-09-01,Kesrouan,729.1451338265344,69.24555412153912 +2049-10-01,Kesrouan,809.806707531252,139.9678082691179 +2049-11-01,Kesrouan,785.2513088594495,98.33551387579328 +2049-12-01,Kesrouan,1005.190604052836,84.35250201781705 +2050-01-01,Kesrouan,702.5900481984091,88.23007960952596 +2050-02-01,Kesrouan,716.7020774224592,83.2103262544056 +2050-03-01,Kesrouan,737.2233394116797,76.76181763810867 +2050-04-01,Kesrouan,754.0417546355354,72.92950867713503 +2050-05-01,Kesrouan,1004.2900108018833,76.47113072133025 +2050-06-01,Kesrouan,805.2972637417181,91.3025334573618 +2050-07-01,Kesrouan,713.7507686357122,99.96509756067395 +2050-08-01,Kesrouan,713.2224177162491,117.17826379055077 +2050-09-01,Kesrouan,1112.7826005393363,253.78301418582225 +2050-10-01,Kesrouan,767.9612571316784,72.13119002154245 +2050-11-01,Kesrouan,684.1276346497506,110.77773887857417 +2050-12-01,Kesrouan,899.9913369380229,51.61665095111114 +2051-01-01,Kesrouan,843.1665873812118,56.00464497249072 +2051-02-01,Kesrouan,803.081874877531,59.96562405535052 +2051-03-01,Kesrouan,775.9325114204986,64.27592520183501 +2051-04-01,Kesrouan,756.9539103232239,69.42323480249892 +2051-05-01,Kesrouan,725.9291817581002,81.23796452941295 +2051-06-01,Kesrouan,744.9042561975556,75.49133724348596 +2051-07-01,Kesrouan,789.288108528548,85.58102060209649 +2051-08-01,Kesrouan,929.7086110959854,84.65721681478482 +2051-09-01,Kesrouan,1105.6908515271593,65.3975464658622 +2051-10-01,Kesrouan,974.8623544207795,69.1546687737115 +2051-11-01,Kesrouan,858.6553806344691,71.38033294073458 +2051-12-01,Kesrouan,794.416372806509,72.31816460823568 +2052-01-01,Kesrouan,745.7264712777828,81.48804717264063 +2052-02-01,Kesrouan,686.8196981004523,112.886446029626 +2052-03-01,Kesrouan,748.9021186854213,70.43439086111405 +2052-04-01,Kesrouan,806.3615227045436,59.22571429047211 +2052-05-01,Kesrouan,692.3867074002153,92.11900481647494 +2052-06-01,Kesrouan,694.1206714857224,90.52642271134947 +2052-07-01,Kesrouan,697.8718838440419,88.01565841357875 +2052-08-01,Kesrouan,706.1739962144276,83.49788039397048 +2052-09-01,Kesrouan,690.5417615523035,92.77474730021694 +2052-10-01,Kesrouan,681.9180035942484,99.81181773334386 +2052-11-01,Kesrouan,1014.6876056705895,76.81813801068053 +2052-12-01,Kesrouan,858.5703090111473,87.08524098548304 +2053-01-01,Kesrouan,742.2069387464287,88.5680540579105 +2053-02-01,Kesrouan,713.0775368552111,86.19335671711346 +2053-03-01,Kesrouan,707.3377213222876,85.2444384991401 +2053-04-01,Kesrouan,701.4715938613355,86.97548935710289 +2053-05-01,Kesrouan,681.1201152557156,105.50684121683712 +2053-06-01,Kesrouan,946.9967195633251,96.55915957845951 +2053-07-01,Kesrouan,739.8739466398491,106.9227346871204 +2053-08-01,Kesrouan,854.4808253925802,129.77500432722925 +2053-09-01,Kesrouan,675.2872391399197,104.03147719245064 +2053-10-01,Kesrouan,838.516868977588,57.20084373851745 +2053-11-01,Kesrouan,864.901883331678,57.17332751199207 +2053-12-01,Kesrouan,874.8788702759404,59.6940470795746 +2054-01-01,Kesrouan,719.4682006873726,150.22855866790414 +2054-02-01,Kesrouan,860.3478884974437,64.54015755547704 +2054-03-01,Kesrouan,732.0577213498742,136.39917472361503 +2054-04-01,Kesrouan,775.6233890667193,63.357534157375525 +2054-05-01,Kesrouan,666.556170022497,197.8750891384613 +2054-06-01,Kesrouan,870.9991148387271,120.52624539431515 +2054-07-01,Kesrouan,723.787996653342,109.54272848373562 +2054-08-01,Kesrouan,679.076740925995,107.12276251220324 +2054-09-01,Kesrouan,677.1758003886209,104.01259350758025 +2054-10-01,Kesrouan,676.2058255430135,103.48130930080401 +2054-11-01,Kesrouan,675.9162077661545,103.40521762315132 +2054-12-01,Kesrouan,755.3916728817486,147.65355503293856 +2055-01-01,Kesrouan,725.9467430745897,115.25364210942853 +2055-02-01,Kesrouan,869.1011971509126,120.70973911743782 +2055-03-01,Kesrouan,801.7914060059909,139.4495076834599 +2055-04-01,Kesrouan,677.9484983141565,101.24088627224172 +2055-05-01,Kesrouan,735.2561840744276,132.01859494164077 +2055-06-01,Kesrouan,763.779360683716,99.88627340511835 +2055-07-01,Kesrouan,707.1670022947756,108.74564553471055 +2055-08-01,Kesrouan,696.2892061817348,109.8383582267842 +2055-09-01,Kesrouan,705.7603696330143,115.6658633777734 +2055-10-01,Kesrouan,711.5815142136144,117.39181477060531 +2055-11-01,Kesrouan,712.075966034444,117.50036550105354 +2055-12-01,Kesrouan,730.934084984984,124.3526891001724 +2056-01-01,Kesrouan,844.6037364290038,151.03343875132722 +2056-02-01,Kesrouan,1014.8248574351198,244.9686148135618 +2056-03-01,Kesrouan,736.2665355534392,95.56968929988903 +2056-04-01,Kesrouan,906.8842976053477,144.68051464867824 +2056-05-01,Kesrouan,738.0878743857421,127.15377482404652 +2056-06-01,Kesrouan,839.619777231212,68.59224824229649 +2056-07-01,Kesrouan,813.8488331733842,63.2064820827306 +2056-08-01,Kesrouan,824.5259696537502,58.72567083424178 +2056-09-01,Kesrouan,1074.1243131647716,216.12165414516923 +2056-10-01,Kesrouan,740.0151568978503,121.24725407000535 +2056-11-01,Kesrouan,874.4349432263222,111.20656386615066 +2056-12-01,Kesrouan,716.406270001264,105.41404139404568 +2057-01-01,Kesrouan,883.5001811653044,50.701305662275985 +2057-02-01,Kesrouan,817.1921047863667,57.09967243883881 +2057-03-01,Kesrouan,678.1621130163726,101.99792188588735 +2057-04-01,Kesrouan,774.176883579814,64.36338189904559 +2057-05-01,Kesrouan,728.5327189002693,90.29313523484977 +2057-06-01,Kesrouan,792.3177235134118,89.5834219614461 +2057-07-01,Kesrouan,734.4709629150017,89.21726992245773 +2057-08-01,Kesrouan,676.1486073192054,106.0280309192587 +2057-09-01,Kesrouan,912.4908918398204,51.19746795562514 +2057-10-01,Kesrouan,859.4160591343747,54.95257136260351 +2057-11-01,Kesrouan,741.7020508973569,76.68076572986794 +2057-12-01,Kesrouan,679.1119355315824,104.7242908732192 +2058-01-01,Kesrouan,706.440078948286,109.25517434417073 +2058-02-01,Kesrouan,847.3310664579017,118.45675017138575 +2058-03-01,Kesrouan,887.6515612272358,58.60424090858238 +2058-04-01,Kesrouan,737.8595772713793,101.23418560986838 +2058-05-01,Kesrouan,676.695383226461,106.96387849452452 +2058-06-01,Kesrouan,676.8381768818506,106.05742681211218 +2058-07-01,Kesrouan,677.6915561015857,105.8282293503079 +2058-08-01,Kesrouan,678.7500572557262,106.23336706128667 +2058-09-01,Kesrouan,797.7951988881222,75.2657424754773 +2058-10-01,Kesrouan,679.94213957136,106.41743512689847 +2058-11-01,Kesrouan,685.4680525116333,105.90198884936828 +2058-12-01,Kesrouan,689.8809090604752,105.3904933519908 +2059-01-01,Kesrouan,695.9179714667652,103.74517616377115 +2059-02-01,Kesrouan,709.8666948419851,103.5435645457637 +2059-03-01,Kesrouan,786.1106618056953,90.1518469825203 +2059-04-01,Kesrouan,735.430789622802,92.55989099632345 +2059-05-01,Kesrouan,682.2066857271958,105.60320892478838 +2059-06-01,Kesrouan,692.6263761867311,92.86645065098364 +2059-07-01,Kesrouan,748.0671644534785,79.57280641884107 +2059-08-01,Kesrouan,738.6378890603829,75.26962363835845 +2059-09-01,Kesrouan,831.4868724635587,139.54373466031527 +2059-10-01,Kesrouan,979.0789416660695,170.0085310990378 +2059-11-01,Kesrouan,731.3648410472355,77.5847459991452 +2059-12-01,Kesrouan,716.2820452788835,153.3432701994867 +2060-01-01,Kesrouan,685.3148948006109,181.34002994076735 +2060-02-01,Kesrouan,739.7502257257289,109.22111409413272 +2060-03-01,Kesrouan,738.186764749908,77.87315295028483 +2060-04-01,Kesrouan,922.2617492331574,51.17914120892607 +2060-05-01,Kesrouan,712.2515072267299,84.88815470837434 +2060-06-01,Kesrouan,750.028490009437,72.83119168558423 +2060-07-01,Kesrouan,769.1133226769513,67.21951748028833 +2060-08-01,Kesrouan,770.007150502699,65.83201045242305 +2060-09-01,Kesrouan,760.3184858283412,67.4274294613585 +2060-10-01,Kesrouan,747.4266802098734,71.21887308401365 +2060-11-01,Kesrouan,963.1229022380189,48.37520117692405 +2060-12-01,Kesrouan,693.8211934614905,93.5325835124838 +2061-01-01,Kesrouan,694.9438941824695,94.85155233664454 +2061-02-01,Kesrouan,697.8927559005251,95.98528700589735 +2061-03-01,Kesrouan,946.535950923303,155.14849826013835 +2061-04-01,Kesrouan,763.1329746862091,114.84728609620005 +2061-05-01,Kesrouan,892.3728204037715,127.40446661839901 +2061-06-01,Kesrouan,878.5293929548799,162.51451030068424 +2061-07-01,Kesrouan,680.7123184555959,108.13464955216821 +2061-08-01,Kesrouan,681.7197910302651,103.09204432770709 +2061-09-01,Kesrouan,686.8297742656513,100.40379079647299 +2061-10-01,Kesrouan,731.3585794302903,77.51843554812581 +2061-11-01,Kesrouan,848.3363798543139,119.19100353296199 +2061-12-01,Kesrouan,1145.7700221399812,270.3579292713992 +2062-01-01,Kesrouan,695.4756278145352,97.19093631651816 +2062-02-01,Kesrouan,709.0261987191826,94.22346531397072 +2062-03-01,Kesrouan,744.527263673901,92.15303025787723 +2062-04-01,Kesrouan,885.7694775133054,85.69599352583245 +2062-05-01,Kesrouan,1118.697597401503,73.99329539293723 +2062-06-01,Kesrouan,695.9733184027504,171.94618861423186 +2062-07-01,Kesrouan,856.3282183091831,120.81940372422865 +2062-08-01,Kesrouan,870.7543359970031,53.059521114066385 +2062-09-01,Kesrouan,818.0177745518049,57.92669081457075 +2062-10-01,Kesrouan,785.1627105783082,63.78235615184586 +2062-11-01,Kesrouan,773.8491203204165,70.69688278297083 +2062-12-01,Kesrouan,805.0448558034865,79.60206307715175 +2063-01-01,Kesrouan,736.6054545671636,129.88637455716966 +2063-02-01,Kesrouan,737.0819852084614,98.478786220358 +2063-03-01,Kesrouan,907.4666279812332,51.320081374898535 +2063-04-01,Kesrouan,989.7224669382364,166.68239191417877 +2063-05-01,Kesrouan,895.2844722832,48.99524740474989 +2063-06-01,Kesrouan,829.062619089321,55.79133765288617 +2063-07-01,Kesrouan,744.4634239701054,70.91622940087035 +2063-08-01,Kesrouan,716.5654734114061,84.70097126986687 +2063-09-01,Kesrouan,749.5780134524393,88.75443689779674 +2063-10-01,Kesrouan,738.5949933856791,125.9609002827297 +2063-11-01,Kesrouan,687.807306235158,111.0047259920111 +2063-12-01,Kesrouan,679.3706770593675,107.17563682984022 +2064-01-01,Kesrouan,677.0612919683967,107.09260082936426 +2064-02-01,Kesrouan,721.3676297999667,148.29654015169444 +2064-03-01,Kesrouan,913.576742585215,163.52575338088866 +2064-04-01,Kesrouan,705.2949947460438,104.64202066272875 +2064-05-01,Kesrouan,743.7626986531329,99.22973032275512 +2064-06-01,Kesrouan,884.3203810124917,92.34943798484673 +2064-07-01,Kesrouan,982.9444465267871,68.63725580826397 +2064-08-01,Kesrouan,1045.3215229712146,173.6363045166047 +2064-09-01,Kesrouan,1128.9220981466142,69.95803468148145 +2064-10-01,Kesrouan,746.3999909487181,96.32686414807745 +2064-11-01,Kesrouan,699.5859834895854,102.04292945185485 +2064-12-01,Kesrouan,705.2821116491111,115.74141552157263 +2065-01-01,Kesrouan,954.221761846561,173.63278884439848 +2065-02-01,Kesrouan,740.4648417561539,114.92677161583404 +2065-03-01,Kesrouan,895.6558509433864,55.765387814967525 +2065-04-01,Kesrouan,913.1218037264862,84.92872417328932 +2065-05-01,Kesrouan,924.4230866683132,48.558955964814544 +2065-06-01,Kesrouan,988.64021482327,79.61184430378505 +2065-07-01,Kesrouan,726.8021375273646,75.25918104764672 +2065-08-01,Kesrouan,677.1367912347796,107.9007877331794 +2065-09-01,Kesrouan,678.0232058818453,108.4878701829919 +2065-10-01,Kesrouan,681.895836030811,111.60091090006065 +2065-11-01,Kesrouan,679.6771364266301,186.30405467012292 +2065-12-01,Kesrouan,682.7563405387938,183.59434161497626 +2066-01-01,Kesrouan,908.1499359269333,139.74804394758996 +2066-02-01,Kesrouan,718.974684510454,78.58545946704865 +2066-03-01,Kesrouan,772.8191203192672,108.54707967232731 +2066-04-01,Kesrouan,685.1751959673893,100.81334920418634 +2066-05-01,Kesrouan,685.4279637686637,98.04731577646784 +2066-06-01,Kesrouan,690.3180706848888,93.65803383556715 +2066-07-01,Kesrouan,700.3568101272984,87.08078548011268 +2066-08-01,Kesrouan,714.243421141328,79.86606917466169 +2066-09-01,Kesrouan,723.7766969537975,75.96828516992561 +2066-10-01,Kesrouan,691.8063202847607,105.19521690568176 +2066-11-01,Kesrouan,947.2917352858261,46.16715017956807 +2066-12-01,Kesrouan,851.390321580872,54.82158646644292 +2067-01-01,Kesrouan,772.2378695325099,64.71407890378059 +2067-02-01,Kesrouan,676.7425252850699,104.25654983092372 +2067-03-01,Kesrouan,675.9285870548274,104.1598688452511 +2067-04-01,Kesrouan,675.2251987513382,104.97846353114231 +2067-05-01,Kesrouan,675.2513248082467,106.00035805387267 +2067-06-01,Kesrouan,739.345091912126,107.16106941579739 +2067-07-01,Kesrouan,764.4957040567468,95.51733711178761 +2067-08-01,Kesrouan,722.3221305347333,90.19779438165186 +2067-09-01,Kesrouan,723.7915233111618,82.72981044280613 +2067-10-01,Kesrouan,752.4146698737449,69.53871245145261 +2067-11-01,Kesrouan,786.1485193977996,61.28560232994674 +2067-12-01,Kesrouan,837.3940962840005,55.09077905067305 +2068-01-01,Kesrouan,901.9407870135685,49.2034378549057 +2068-02-01,Kesrouan,676.9731255229067,101.80040028257532 +2068-03-01,Kesrouan,680.6997232490975,98.55536521891055 +2068-04-01,Kesrouan,689.7915910532481,92.92099578313446 +2068-05-01,Kesrouan,703.5371357544939,86.23201170706469 +2068-06-01,Kesrouan,720.1963475682074,79.29574708294146 +2068-07-01,Kesrouan,705.4333260997026,96.45894551626276 +2068-08-01,Kesrouan,732.4629991086941,95.56472906930095 +2068-09-01,Kesrouan,839.453808395865,91.68861344029165 +2068-10-01,Kesrouan,965.6543228264075,74.65664356358091 +2068-11-01,Kesrouan,720.3502250053158,76.94994090978015 +2068-12-01,Kesrouan,732.9896226855519,72.70407054798702 +2069-01-01,Kesrouan,679.4780601913438,105.25124140485006 +2069-02-01,Kesrouan,737.3957857817975,72.101672298464 +2069-03-01,Kesrouan,831.4293663493166,72.87719129766933 +2069-04-01,Kesrouan,726.4677527879794,93.6279765786353 +2069-05-01,Kesrouan,711.2669939141925,91.21702604375072 +2069-06-01,Kesrouan,714.7478051821396,85.58063770710375 +2069-07-01,Kesrouan,722.8057144916701,79.67721492164037 +2069-08-01,Kesrouan,727.2613227699985,76.83181780451287 +2069-09-01,Kesrouan,736.6638963253171,96.8974647088833 +2069-10-01,Kesrouan,692.1032792676931,108.39755917765348 +2069-11-01,Kesrouan,732.3659080597422,118.37641184017698 +2069-12-01,Kesrouan,811.6824576556287,134.0945819751293 +2070-01-01,Kesrouan,722.9786646700478,78.49236377085371 +2070-02-01,Kesrouan,746.6077038970318,69.30892324284135 +2070-03-01,Kesrouan,774.1440640703091,63.190696366438075 +2070-04-01,Kesrouan,810.3296605050729,58.60060340615111 +2070-05-01,Kesrouan,857.3764993529078,55.00269579801976 +2070-06-01,Kesrouan,910.0303642708666,51.76989596980556 +2070-07-01,Kesrouan,709.4933009487586,89.63018736351671 +2070-08-01,Kesrouan,736.8322402567468,97.57703370376586 +2070-09-01,Kesrouan,728.2938418124476,66.33243680364613 +2070-10-01,Kesrouan,870.5094132100622,84.06287676442764 +2070-11-01,Kesrouan,747.2147928502632,95.10506363048921 +2070-12-01,Kesrouan,661.1502354206984,202.69648548301265 +2071-01-01,Kesrouan,730.4347390267718,85.2395130771878 +2071-02-01,Kesrouan,747.1486500229935,73.41555906181168 +2071-03-01,Kesrouan,935.3881135829328,152.166825334223 +2071-04-01,Kesrouan,805.1576368811052,59.07666371238028 +2071-05-01,Kesrouan,801.0035218600484,87.25703900700853 +2071-06-01,Kesrouan,731.7655125591073,79.10905096533394 +2071-07-01,Kesrouan,854.4143227022676,159.38754612933323 +2071-08-01,Kesrouan,869.1220692073961,192.2335839323655 +2071-09-01,Kesrouan,1032.2944808212565,219.7938085732609 +2071-10-01,Kesrouan,729.0294018719648,140.02747027071754 +2071-11-01,Kesrouan,675.8565424736555,104.83425135341353 +2071-12-01,Kesrouan,678.7084570879766,101.86455259818092 +2072-01-01,Kesrouan,887.0467034248697,128.19370022007246 +2072-02-01,Kesrouan,682.137304132541,99.93883444503395 +2072-03-01,Kesrouan,688.6859478404988,98.1657347551387 +2072-04-01,Kesrouan,693.5919607032165,97.52955472466329 +2072-05-01,Kesrouan,700.0847536669291,97.51794604465542 +2072-06-01,Kesrouan,718.5647285320773,97.18139875033476 +2072-07-01,Kesrouan,813.2387213705931,91.57344906905932 +2072-08-01,Kesrouan,1042.1758881413466,83.14512967972881 +2072-09-01,Kesrouan,684.9619411282165,99.02136582942074 +2072-10-01,Kesrouan,737.6493452817657,100.5139427241637 +2072-11-01,Kesrouan,735.697951945789,96.68776008307428 +2072-12-01,Kesrouan,773.1659563199337,108.51420291590328 +2073-01-01,Kesrouan,811.2851688563593,58.643296197844165 +2073-02-01,Kesrouan,778.6737321628492,64.2747243039031 +2073-03-01,Kesrouan,757.1890448354002,71.86283284456927 +2073-04-01,Kesrouan,735.3794011802879,92.40213825930519 +2073-05-01,Kesrouan,790.6488946386544,88.12145926180627 +2073-06-01,Kesrouan,685.8712430648052,105.42979230170249 +2073-07-01,Kesrouan,684.3886793010097,98.6945649530977 +2073-08-01,Kesrouan,699.8128411517771,109.23496793114356 +2073-09-01,Kesrouan,763.5520711858733,114.05716487431616 +2073-10-01,Kesrouan,892.8584915663565,47.61205664771208 +2073-11-01,Kesrouan,856.1907506268273,57.125221977446785 +2073-12-01,Kesrouan,1106.9713162061093,249.21850557277898 +2074-01-01,Kesrouan,682.4576542132561,98.1543175226272 +2074-02-01,Kesrouan,678.8023813421516,102.20505067265417 +2074-03-01,Kesrouan,735.9810202152686,94.49049976278707 +2074-04-01,Kesrouan,690.5411857714349,93.51277739876724 +2074-05-01,Kesrouan,944.6600568537091,42.96494714213921 +2074-06-01,Kesrouan,678.9490615184036,103.36363870780086 +2074-07-01,Kesrouan,915.0991072015458,135.10805280801887 +2074-08-01,Kesrouan,675.9778882916933,108.76487730593797 +2074-09-01,Kesrouan,686.061610614455,111.20755591226826 +2074-10-01,Kesrouan,700.6986800179743,222.4133498576119 +2074-11-01,Kesrouan,725.6564775442539,220.15068411083365 +2074-12-01,Kesrouan,738.6689092546735,71.47969419135651 +2075-01-01,Kesrouan,679.6160316819598,100.76214570106329 +2075-02-01,Kesrouan,861.5652331986834,53.83946081000637 +2075-03-01,Kesrouan,1004.4648322680836,74.86488622669032 +2075-04-01,Kesrouan,683.0673341803958,101.6131298224786 +2075-05-01,Kesrouan,729.5928034517983,70.77161692383096 +2075-06-01,Kesrouan,775.4708791091736,62.325579938926225 +2075-07-01,Kesrouan,832.3157090237738,55.15888214643128 +2075-08-01,Kesrouan,736.8827650279582,129.37023210692544 +2075-09-01,Kesrouan,1015.7453870986444,176.36813845974234 +2075-10-01,Kesrouan,711.2628195028959,83.85428601496122 +2075-11-01,Kesrouan,919.1513809814855,49.33374398267004 +2075-12-01,Kesrouan,733.003297481179,83.7790993618369 +2076-01-01,Kesrouan,739.2218748062656,124.39407656802649 +2076-02-01,Kesrouan,878.394876149475,139.1958919637081 +2076-03-01,Kesrouan,760.1620173773244,113.01511615151222 +2076-04-01,Kesrouan,615.8498838922609,242.77319935096702 +2076-05-01,Kesrouan,669.4051337598667,234.09432740182675 +2076-06-01,Kesrouan,697.0870945202677,96.9570222845758 +2076-07-01,Kesrouan,791.1187318273558,95.08309938135893 +2076-08-01,Kesrouan,735.9455377192469,94.40396549442265 +2076-09-01,Kesrouan,878.7419280679673,126.97047254842023 +2076-10-01,Kesrouan,687.1990657201894,94.4836946745066 +2076-11-01,Kesrouan,934.330116237052,51.57940571090606 +2076-12-01,Kesrouan,890.6934115555553,54.49339324469166 +2077-01-01,Kesrouan,680.9057088548057,104.13602492979273 +2077-02-01,Kesrouan,698.3818817483213,221.70200057833003 +2077-03-01,Kesrouan,931.6317191967968,50.7735335813653 +2077-04-01,Kesrouan,701.0466675803779,105.88830905553594 +2077-05-01,Kesrouan,685.9350827686008,103.73489021192012 +2077-06-01,Kesrouan,761.7336112579129,104.20374513055813 +2077-07-01,Kesrouan,843.5391176031355,100.9173225990393 +2077-08-01,Kesrouan,797.1496045893092,126.5095888073588 +2077-09-01,Kesrouan,873.6505137655905,109.23173072802291 +2077-10-01,Kesrouan,928.6383784066489,148.89930389189234 +2077-11-01,Kesrouan,1091.8041685405215,235.19050355315312 +2077-12-01,Kesrouan,814.7346000669727,89.4948861965286 +2078-01-01,Kesrouan,714.713474247855,97.99123906434595 +2078-02-01,Kesrouan,740.3201768129414,119.82147494718164 +2078-03-01,Kesrouan,910.1057915646411,206.7895633383756 +2078-04-01,Kesrouan,758.7702110729274,219.74739125754732 +2078-05-01,Kesrouan,709.5639060777592,229.6611343669833 +2078-06-01,Kesrouan,725.8182719683042,209.16305978124083 +2078-07-01,Kesrouan,846.5998247548983,173.42915832552004 +2078-08-01,Kesrouan,814.2846992908435,57.92312292941094 +2078-09-01,Kesrouan,803.6117372217741,132.09512172723976 +2078-10-01,Kesrouan,714.6140081028205,112.06546695218903 +2078-11-01,Kesrouan,856.4870618562823,91.88427278159345 +2078-12-01,Kesrouan,844.7800693199838,140.4303454203754 +2079-01-01,Kesrouan,740.5201167195305,116.64633562401396 +2079-02-01,Kesrouan,683.4931241326564,108.74162513728653 +2079-03-01,Kesrouan,679.8704548532311,109.71041908624782 +2079-04-01,Kesrouan,697.4538669335061,118.9889568070082 +2079-05-01,Kesrouan,858.2795396725516,124.69421402939896 +2079-06-01,Kesrouan,767.8871253448583,135.3872702793322 +2079-07-01,Kesrouan,697.838056718017,118.3898131649237 +2079-08-01,Kesrouan,681.086288129691,110.96391286664617 +2079-09-01,Kesrouan,678.4888686592499,108.20592023377564 +2079-10-01,Kesrouan,679.5285129899468,107.98197887596298 +2079-11-01,Kesrouan,715.7927035132617,107.0836202013522 +2079-12-01,Kesrouan,680.0757207328536,185.94326316103317 +2080-01-01,Kesrouan,739.3970561355086,107.50711946766572 +2080-02-01,Kesrouan,870.8913718437078,122.64402019496838 +2080-03-01,Kesrouan,760.586511822631,76.58594700620557 +2080-04-01,Kesrouan,776.8615338518338,65.96024546636285 +2080-05-01,Kesrouan,900.4459879063171,226.69486426236773 +2080-06-01,Kesrouan,699.1837285803252,102.29511801754272 +2080-07-01,Kesrouan,752.1747851694034,67.34032085050495 +2080-08-01,Kesrouan,683.4065410845546,103.56135175860932 +2080-09-01,Kesrouan,689.2613688459625,94.13285843522874 +2080-10-01,Kesrouan,708.4061546964099,82.48084167592103 +2080-11-01,Kesrouan,752.5546565974006,67.0503997237121 +2080-12-01,Kesrouan,729.4243875477601,139.55697934620127 +2081-01-01,Kesrouan,731.7429131600184,72.69507251565709 +2081-02-01,Kesrouan,783.5315233778293,61.61696313754726 +2081-03-01,Kesrouan,722.5787128842614,147.04715379030938 +2081-04-01,Kesrouan,999.7315536659179,234.28882065383243 +2081-05-01,Kesrouan,835.013170420118,59.56455895474936 +2081-06-01,Kesrouan,704.1152197464742,85.09458732242705 +2081-07-01,Kesrouan,827.8928482823417,61.01174538853206 +2081-08-01,Kesrouan,840.4228475975615,62.27361064581761 +2081-09-01,Kesrouan,726.19670394413,74.99409588242993 +2081-10-01,Kesrouan,879.766961959126,58.8184532527153 +2081-11-01,Kesrouan,950.7415263594825,181.43248167720176 +2081-12-01,Kesrouan,987.6124459729859,167.75916225109918 +2082-01-01,Kesrouan,593.8826921970035,30.688045754642587 +2082-02-01,Kesrouan,593.4022750348436,32.662043485513365 +2082-03-01,Kesrouan,588.019947448654,32.52543699468635 +2082-04-01,Kesrouan,588.9453712495608,34.47369373945274 +2082-05-01,Kesrouan,585.3840226326315,32.414936980638565 +2082-06-01,Kesrouan,594.124232271342,30.119377073118418 +2082-07-01,Kesrouan,590.591168889578,30.059210346301114 +2082-08-01,Kesrouan,588.8887288066214,30.311538146531788 +2082-09-01,Kesrouan,595.9914176552995,31.399325416653067 +2082-10-01,Kesrouan,487.8948212101621,29.840942796108454 +2082-11-01,Kesrouan,565.6998020810021,31.422368733490277 +2082-12-01,Kesrouan,489.34096683402464,29.09535922360999 +2083-01-01,Kesrouan,532.5815342779892,32.15587370939881 +2083-02-01,Kesrouan,533.7513050849686,32.11781046625464 +2083-03-01,Kesrouan,535.6164752358867,32.02407081029912 +2083-04-01,Kesrouan,543.835891079033,32.3537085904322 +2083-05-01,Kesrouan,526.7996867416648,32.85368242939114 +2083-06-01,Kesrouan,471.2943390450362,29.650174068123306 +2083-07-01,Kesrouan,532.0067610260027,32.19108264441515 +2083-08-01,Kesrouan,563.7625873489121,35.62027279528097 +2083-09-01,Kesrouan,519.2457296372945,33.767635372798125 +2083-10-01,Kesrouan,571.3618152240686,36.13954802273872 +2083-11-01,Kesrouan,550.0664878297498,35.00229768127965 +2083-12-01,Kesrouan,546.8468651582789,34.958578034833266 +2084-01-01,Kesrouan,544.9829185417063,34.87844855543875 +2084-02-01,Kesrouan,544.2505252769663,34.811772613744466 +2084-03-01,Kesrouan,543.96479402097,34.7421205336973 +2084-04-01,Kesrouan,543.887495439373,34.66691647625511 +2084-05-01,Kesrouan,543.8866317680702,34.587135083217625 +2084-06-01,Kesrouan,543.9370125940645,34.50359435752395 +2084-07-01,Kesrouan,543.8677749446265,34.423081983136626 +2084-08-01,Kesrouan,541.9768385998428,33.58631718940711 +2084-09-01,Kesrouan,542.2332770041539,33.63604132551268 +2084-10-01,Kesrouan,531.9740854617148,32.17367832656229 +2084-11-01,Kesrouan,603.6592354264171,32.63149890768164 +2084-12-01,Kesrouan,531.6573340114278,32.174914033129866 +2085-01-01,Kesrouan,535.5786896163909,32.27410124057323 +2085-02-01,Kesrouan,590.0134447606404,33.54496453018869 +2085-03-01,Kesrouan,603.3633560326132,31.76740933492307 +2085-04-01,Kesrouan,602.02495340377,30.64328184912506 +2085-05-01,Kesrouan,589.6050721796521,30.1416371956522 +2085-06-01,Kesrouan,587.9163068923228,32.75635748395801 +2085-07-01,Kesrouan,481.90670017769537,30.973528780382985 +2085-08-01,Kesrouan,571.0448478559557,36.00229757215112 +2085-09-01,Kesrouan,559.290425370614,34.276694265676255 +2085-10-01,Kesrouan,576.1817488469444,33.18718396808758 +2085-11-01,Kesrouan,596.4561447887929,31.68849815777827 +2085-12-01,Kesrouan,606.7615427459297,30.514350662471138 +2086-01-01,Kesrouan,595.0233860701233,30.42353493191492 +2086-02-01,Kesrouan,569.5437871317596,31.42839062746732 +2086-03-01,Kesrouan,576.698872039472,30.09816120965578 +2086-04-01,Kesrouan,570.6392822067015,30.670693649743313 +2086-05-01,Kesrouan,564.2099690837415,31.829333897843547 +2086-06-01,Kesrouan,563.3421233696854,31.90805362749203 +2086-07-01,Kesrouan,562.4497349961091,31.878118200785096 +2086-08-01,Kesrouan,488.19271583700566,30.220513564161394 +2086-09-01,Kesrouan,471.71523485991435,29.97565221628957 +2017-01-01,Tripoli,540.5409130863964,33.524914756022234 +2017-02-01,Tripoli,532.7003610547272,32.18694041676614 +2017-03-01,Tripoli,432.84815494790746,29.63377920070592 +2017-04-01,Tripoli,488.25612370515,29.521295094422918 +2017-05-01,Tripoli,557.2585666582636,30.45465385223584 +2017-06-01,Tripoli,544.4103044679769,34.62439772774063 +2017-07-01,Tripoli,492.7984589767971,29.464069697322767 +2017-08-01,Tripoli,591.3439304025414,32.03371280238963 +2017-09-01,Tripoli,603.1363544252046,30.752198070248248 +2017-10-01,Tripoli,593.0904896945472,30.016430533018802 +2017-11-01,Tripoli,585.3468127940042,29.71406531896114 +2017-12-01,Tripoli,578.0238877631223,29.53809026115092 +2018-01-01,Tripoli,571.9006021717736,29.408932818364896 +2018-02-01,Tripoli,571.6453873018081,29.3910237752943 +2018-03-01,Tripoli,570.3008670012371,29.466541110457854 +2018-04-01,Tripoli,564.1123742265298,30.224708004763926 +2018-05-01,Tripoli,544.6441434731989,34.525488989382836 +2018-06-01,Tripoli,594.8890851825442,32.646797303074294 +2018-07-01,Tripoli,565.5721226734107,36.23337470028349 +2018-08-01,Tripoli,548.5164857317302,34.87040776059071 +2018-09-01,Tripoli,546.7933175375078,34.684251176836575 +2018-10-01,Tripoli,545.6747912278255,34.54002159478999 +2018-11-01,Tripoli,545.6824203243332,34.41587659554554 +2018-12-01,Tripoli,545.8820003678792,34.29122687108341 +2019-01-01,Tripoli,546.5921540965733,34.1523926275712 +2019-02-01,Tripoli,547.5696140934716,33.99150711333941 +2019-03-01,Tripoli,548.9423476565994,33.80583785048515 +2019-04-01,Tripoli,552.1984604406118,33.53619275399087 +2019-05-01,Tripoli,544.3909438362732,34.713177153108035 +2019-06-01,Tripoli,478.0293198365646,30.813287225911765 +2019-07-01,Tripoli,545.1738618722247,34.407748779108296 +2019-08-01,Tripoli,546.3341322948739,34.25314622362137 +2019-09-01,Tripoli,542.6487748733898,34.69187426805614 +2019-10-01,Tripoli,560.3060308500509,32.33458124511195 +2019-11-01,Tripoli,550.8524287152609,32.44078239265002 +2019-12-01,Tripoli,472.25675676674456,29.37873632689019 +2020-01-01,Tripoli,562.4105818970504,36.3789966277583 +2020-02-01,Tripoli,526.7656436978143,34.16361841258626 +2020-03-01,Tripoli,571.5827711323581,36.09067669820792 +2020-04-01,Tripoli,568.8142007987533,34.207738358343256 +2020-05-01,Tripoli,503.4764591284661,32.757993489836196 +2020-06-01,Tripoli,571.1498558918497,36.15618655060608 +2020-07-01,Tripoli,549.258667271235,34.90145706364024 +2020-08-01,Tripoli,546.5833734383286,34.85850320717935 +2020-09-01,Tripoli,544.7867212107627,34.77799083279203 +2020-10-01,Tripoli,544.0333119443222,34.71674503826786 +2020-11-01,Tripoli,543.6735208741143,34.655098944433064 +2020-12-01,Tripoli,543.5414511374006,34.5875527868461 +2021-01-01,Tripoli,543.6629409006553,34.50620500520188 +2021-02-01,Tripoli,544.2162663152902,34.39760206180006 +2021-03-01,Tripoli,545.7416537811807,34.232765767415685 +2021-04-01,Tripoli,550.6195973265586,35.00684020823921 +2021-05-01,Tripoli,547.0173682679651,34.96324239201786 +2021-06-01,Tripoli,544.9418941548251,34.897889178480355 +2021-07-01,Tripoli,543.987537365276,34.85328191182348 +2021-08-01,Tripoli,543.4660958162349,34.813112746219105 +2021-09-01,Tripoli,543.1296958438099,34.77336128424321 +2021-10-01,Tripoli,542.8771439603613,34.7326873934211 +2021-11-01,Tripoli,544.555977027709,34.79435089157375 +2021-12-01,Tripoli,545.2714567294367,34.867153153152245 +2022-01-01,Tripoli,547.1894547750403,34.95196439404917 +2022-02-01,Tripoli,550.6361510265283,35.00814553207818 +2022-03-01,Tripoli,451.4889885931946,30.013228138533876 +2022-04-01,Tripoli,481.6002408104327,29.684669426107668 +2022-05-01,Tripoli,556.3318473504024,32.23020755094832 +2022-06-01,Tripoli,546.821962635716,31.555912064375214 +2022-07-01,Tripoli,541.5499690584538,31.664010282559303 +2022-08-01,Tripoli,539.2673577778687,31.77337901594664 +2022-09-01,Tripoli,538.2817648762029,31.810310978430362 +2022-10-01,Tripoli,538.4888300710394,31.785266165040134 +2022-11-01,Tripoli,515.0666401210664,28.029797267386822 +2022-12-01,Tripoli,655.5018970732592,31.61148405127937 +2023-01-01,Tripoli,577.2257115341554,33.233618688118966 +2023-02-01,Tripoli,494.37192414520825,31.34916617260116 +2023-03-01,Tripoli,578.0711737669483,35.544442182396054 +2023-04-01,Tripoli,558.4291291639372,34.10660186730034 +2023-05-01,Tripoli,555.1340791986919,33.96472186816386 +2023-06-01,Tripoli,551.6524762320505,33.918635234489514 +2023-07-01,Tripoli,549.342443387603,33.92171579874945 +2023-08-01,Tripoli,547.5627766956579,33.8428046216046 +2023-09-01,Tripoli,547.212054174129,33.77021121184033 +2023-10-01,Tripoli,547.8573605825076,33.654194029033235 +2023-11-01,Tripoli,549.4709144938884,33.47475551197026 +2023-12-01,Tripoli,581.3948688304017,32.98663401346914 +2024-01-01,Tripoli,511.92129318163296,29.23763952205708 +2024-02-01,Tripoli,706.072874699396,31.904416125060763 +2024-03-01,Tripoli,550.3230701792779,29.926867913348023 +2024-04-01,Tripoli,583.1571181510742,32.90880190403115 +2024-05-01,Tripoli,501.30518947332826,29.681971756840476 +2024-06-01,Tripoli,485.64423774038767,31.17273860252673 +2024-07-01,Tripoli,557.809445004207,34.29382011444348 +2024-08-01,Tripoli,571.611776093609,36.11194477462409 +2024-09-01,Tripoli,525.4524314819682,34.122474605182134 +2024-10-01,Tripoli,562.5774144037003,36.26245731541561 +2024-11-01,Tripoli,617.7793255826258,31.486468836142286 +2024-12-01,Tripoli,633.2863279058497,31.05642554631614 +2025-01-01,Tripoli,542.5331868640374,34.51120004442565 +2025-02-01,Tripoli,542.4535851589661,34.64999947930218 +2025-03-01,Tripoli,542.6514378599067,34.568529867432915 +2025-04-01,Tripoli,525.5465716539691,30.395618406078928 +2025-05-01,Tripoli,504.88460321500713,28.90177099613273 +2025-06-01,Tripoli,542.7966066113788,34.62276172186244 +2025-07-01,Tripoli,542.9951070657967,34.67347790408567 +2025-08-01,Tripoli,543.2758722118022,34.721339778181004 +2025-09-01,Tripoli,543.7265646866255,34.76744381617323 +2025-10-01,Tripoli,544.5744739881097,34.815967054347 +2025-11-01,Tripoli,523.1972417652456,28.57631025228433 +2025-12-01,Tripoli,546.4345340838197,34.889395871368166 +2026-01-01,Tripoli,549.0974486280534,34.9285903951728 +2026-02-01,Tripoli,571.0585946241915,36.191517315847335 +2026-03-01,Tripoli,502.7355730959155,32.770298342558114 +2026-04-01,Tripoli,568.954187522409,34.182519501774465 +2026-05-01,Tripoli,611.7528431497949,31.564300945580282 +2026-06-01,Tripoli,609.2537382626513,30.800616882514845 +2026-07-01,Tripoli,586.8934321794211,32.27888742798281 +2026-08-01,Tripoli,567.7906783323747,33.544529422242405 +2026-09-01,Tripoli,572.9412541189903,35.91877425077526 +2026-10-01,Tripoli,548.2522023130857,33.89752379693399 +2026-11-01,Tripoli,566.9236243170126,31.933742400642842 +2026-12-01,Tripoli,543.6573990097961,33.67443525069608 +2027-01-01,Tripoli,554.6111981974796,33.112815317902346 +2027-02-01,Tripoli,555.7359141514983,32.97157927852639 +2027-03-01,Tripoli,448.2084051222709,28.51048712216481 +2027-04-01,Tripoli,548.0365723778302,35.69370161230212 +2027-05-01,Tripoli,550.7097070324801,34.985032597969635 +2027-06-01,Tripoli,545.8034782519367,34.54002159478999 +2027-07-01,Tripoli,544.2523245921805,34.4456205747561 +2027-08-01,Tripoli,543.5166205874464,34.377012753780136 +2027-09-01,Tripoli,543.1874178758776,34.310458642310834 +2027-10-01,Tripoli,543.2376547566547,34.231721508344485 +2027-11-01,Tripoli,543.6083136907558,34.13258651385465 +2027-12-01,Tripoli,545.1181550731969,33.97727038133575 +2028-01-01,Tripoli,555.1924489842368,33.17045841863097 +2028-02-01,Tripoli,548.5346228290882,33.71343832700433 +2028-03-01,Tripoli,502.6093331404954,31.599544689232285 +2028-04-01,Tripoli,540.5892786793509,30.848182883206743 +2028-05-01,Tripoli,554.7932888971446,29.816472325207354 +2028-06-01,Tripoli,558.9446689590761,29.38280893726774 +2028-07-01,Tripoli,568.2996686201342,29.46333871597293 +2028-08-01,Tripoli,585.0641043875676,29.70820006384475 +2028-09-01,Tripoli,597.3014630763689,30.189620899972574 +2028-10-01,Tripoli,587.651735583244,31.192910206918235 +2028-11-01,Tripoli,574.4544062414253,32.60826414334805 +2028-12-01,Tripoli,558.3850099548879,34.49983502486776 +2029-01-01,Tripoli,481.69128616026535,30.52787381744276 +2029-02-01,Tripoli,595.016188809267,33.52416637035453 +2029-03-01,Tripoli,511.72344048069243,29.18523512100213 +2029-04-01,Tripoli,556.7079762027544,33.196791151542364 +2029-05-01,Tripoli,558.393214832264,33.227109473241995 +2029-06-01,Tripoli,560.5782312556373,33.3401157090606 +2029-07-01,Tripoli,526.7301612017927,29.47806276887646 +2029-08-01,Tripoli,498.5212889740998,29.501401959117104 +2029-09-01,Tripoli,597.1283689527743,32.059854087804595 +2029-10-01,Tripoli,600.5816866842501,30.85408294695886 +2029-11-01,Tripoli,584.7694485281094,30.391215113662152 +2029-12-01,Tripoli,574.1533448198049,30.642846741178715 +2030-01-01,Tripoli,567.1878357630485,31.215849097848267 +2030-02-01,Tripoli,562.2345368965048,31.69747878579033 +2030-03-01,Tripoli,559.4869825646006,31.943454010004743 +2030-04-01,Tripoli,560.7456395431554,31.921942273138605 +2030-05-01,Tripoli,560.4388203128501,31.806969349402646 +2030-06-01,Tripoli,586.6790977511196,32.78975636991764 +2030-07-01,Tripoli,482.7573444383051,29.957899812079624 +2030-08-01,Tripoli,543.6155109516124,33.07422994522257 +2030-09-01,Tripoli,549.0242524851444,30.362637223747775 +2030-10-01,Tripoli,567.2571453850946,29.041318816676903 +2030-11-01,Tripoli,447.67069776369436,29.899978242265362 +2030-12-01,Tripoli,455.3571564404295,28.31341803111693 +2031-01-01,Tripoli,517.3935865285264,28.653637636504588 +2031-02-01,Tripoli,533.879776191254,30.60943045090128 +2031-03-01,Tripoli,514.1302045110492,28.253477560431726 +2031-04-01,Tripoli,570.4803666869939,33.934229503285664 +2031-05-01,Tripoli,500.38537953588946,32.478445336483645 +2031-06-01,Tripoli,573.2163334289194,36.02876953960531 +2031-07-01,Tripoli,554.6644579278162,34.541901261118085 +2031-08-01,Tripoli,557.9756297573797,34.12398878083534 +2031-09-01,Tripoli,560.4920080705784,33.648903116405975 +2031-10-01,Tripoli,598.8828452317218,31.272639387002133 +2031-11-01,Tripoli,497.7413218150992,29.585430005710712 +2031-12-01,Tripoli,602.4498796847279,30.250501203821855 +2032-01-01,Tripoli,564.621292541681,29.521068838290816 +2032-02-01,Tripoli,579.8298244571927,33.067912177841976 +2032-03-01,Tripoli,566.1570440632048,31.69746138147247 +2032-04-01,Tripoli,560.9866038366256,32.03907333228829 +2032-05-01,Tripoli,559.4773382350531,32.217606824822916 +2032-06-01,Tripoli,559.8530352517535,32.30548122566198 +2032-07-01,Tripoli,562.0797957880934,32.284265362199335 +2032-08-01,Tripoli,520.5341113031864,28.713177807879177 +2032-09-01,Tripoli,571.7207426229738,32.449484551576454 +2032-10-01,Tripoli,548.6846857179428,31.471831804828074 +2032-11-01,Tripoli,480.9911366241616,28.939607983144803 +2032-12-01,Tripoli,612.4832931541039,33.72523845450857 +2033-01-01,Tripoli,548.7157778848423,33.32633148932115 +2033-02-01,Tripoli,608.281388320961,30.14553576285124 +2033-03-01,Tripoli,625.034308471024,30.133927082843435 +2033-04-01,Tripoli,500.0288272330667,28.327411102670624 +2033-05-01,Tripoli,608.9824735009761,34.34136871081751 +2033-06-01,Tripoli,619.2636886616355,30.782638222172857 +2033-07-01,Tripoli,606.3186952854397,31.791148824474387 +2033-08-01,Tripoli,571.3585764566833,33.6671602458336 +2033-09-01,Tripoli,578.7818313039025,35.65974578817122 +2033-10-01,Tripoli,499.17983834245393,32.05529415652717 +2033-11-01,Tripoli,572.33761985097,33.68865457838187 +2033-12-01,Tripoli,601.6637948539994,33.513393097603625 +2034-01-01,Tripoli,632.1681614592103,30.572724744549603 +2034-02-01,Tripoli,595.7300851136064,30.665716014837415 +2034-03-01,Tripoli,494.1376533043346,28.450738098975982 +2034-04-01,Tripoli,570.340739826381,29.4648877002618 +2034-05-01,Tripoli,571.6194771627252,33.777346982160026 +2034-06-01,Tripoli,499.1219723651691,32.255043512524374 +2034-07-01,Tripoli,575.1922694244163,35.88922171906113 +2034-08-01,Tripoli,554.7960958288786,29.19322370289664 +2034-09-01,Tripoli,650.806907898849,38.00882397308886 +2034-10-01,Tripoli,561.4572327240211,37.31606250527383 +2034-11-01,Tripoli,535.0045641178815,34.5796512265409 +2034-12-01,Tripoli,572.1300508478732,36.01787443662942 +2035-01-01,Tripoli,552.2330072927223,34.93553471799611 +2035-02-01,Tripoli,549.4804868508272,34.786971460804146 +2035-03-01,Tripoli,549.1585533727236,34.57754530408071 +2035-04-01,Tripoli,550.4460713673127,34.34290029078852 +2035-05-01,Tripoli,553.9218445526601,34.02407059204208 +2035-06-01,Tripoli,560.7988273008839,33.52742097779305 +2035-07-01,Tripoli,575.821885804128,32.633900703545336 +2035-08-01,Tripoli,606.1538060392211,31.06270850506101 +2035-09-01,Tripoli,618.6965445061567,31.818038495557047 +2035-10-01,Tripoli,557.2813819751782,29.123658644438734 +2035-11-01,Tripoli,565.7521981400361,29.315262779680836 +2035-12-01,Tripoli,572.2575863102475,29.507824152404822 +2036-01-01,Tripoli,548.5868029702967,33.523104706965526 +2036-02-01,Tripoli,548.6363201249883,33.43319400093766 +2036-03-01,Tripoli,435.498906121294,28.459388044948824 +2036-04-01,Tripoli,569.6576477985068,29.716258263010594 +2036-05-01,Tripoli,502.2689027019911,28.8964626791876 +2036-06-01,Tripoli,426.48433689874037,29.37629972239077 +2036-07-01,Tripoli,418.9190081222172,31.2609958983586 +2036-08-01,Tripoli,627.0689741151087,30.84148222083339 +2036-09-01,Tripoli,592.3432700724429,32.55330130756876 +2036-10-01,Tripoli,563.2058072490663,34.11441640601629 +2036-11-01,Tripoli,588.3053188416075,29.88163409124843 +2036-12-01,Tripoli,642.5963446865559,31.818821689860414 +2037-01-01,Tripoli,628.3975164965786,31.869102764137306 +2037-02-01,Tripoli,549.1800012100755,33.58325402946497 +2037-03-01,Tripoli,594.9311171859451,34.04718352615068 +2037-04-01,Tripoli,564.7543698949144,35.22559507933174 +2037-05-01,Tripoli,516.3900724473283,33.429834967592086 +2037-06-01,Tripoli,574.655857572794,35.89524361303823 +2037-07-01,Tripoli,564.6299292547087,34.17889940366111 +2037-08-01,Tripoli,602.2811039176468,32.25041396397549 +2037-09-01,Tripoli,628.0522638933005,31.12868827404118 +2037-10-01,Tripoli,631.4582236483418,37.219120454833444 +2037-11-01,Tripoli,490.63971255554947,29.69586040248705 +2037-12-01,Tripoli,591.8506175668272,32.682685006486885 +2038-01-01,Tripoli,527.8820828018484,31.151313887249913 +2038-02-01,Tripoli,510.4459986513023,29.45663805359958 +2038-03-01,Tripoli,595.5472027152471,32.052335422492206 +2038-04-01,Tripoli,487.1980543866608,29.030562948243862 +2038-05-01,Tripoli,509.53885589297033,29.202743864762105 +2038-06-01,Tripoli,505.6891130335278,31.98553765057294 +2038-07-01,Tripoli,582.4925230836006,34.03268572937925 +2038-08-01,Tripoli,570.8327445785196,32.55084729875147 +2038-09-01,Tripoli,563.5399040980174,32.4383283838328 +2038-10-01,Tripoli,557.245323698288,32.62763514911827 +2038-11-01,Tripoli,552.8279328751065,32.825400412880256 +2038-12-01,Tripoli,550.1416272330896,32.94167866045518 +2039-01-01,Tripoli,548.4568204392315,32.98245697718441 +2039-02-01,Tripoli,546.9645403732799,32.99148981815007 +2039-03-01,Tripoli,546.3322610070512,32.96708896452036 +2039-04-01,Tripoli,573.574037293479,33.55135191484068 +2039-05-01,Tripoli,476.78980757188725,29.524862979582736 +2039-06-01,Tripoli,595.8777009337698,31.076336085939815 +2039-07-01,Tripoli,586.7376834544901,30.6942416917982 +2039-08-01,Tripoli,578.3168882525835,30.79207136244913 +2039-09-01,Tripoli,545.3365199675778,33.64117559927929 +2039-10-01,Tripoli,547.9681983996952,33.58261006970445 +2039-11-01,Tripoli,551.5570405530957,33.514472165310494 +2039-12-01,Tripoli,556.8959686563217,33.49553626748662 +2040-01-01,Tripoli,571.2611975172972,34.36183618861246 +2040-02-01,Tripoli,502.7373724111295,30.97982914344572 +2040-03-01,Tripoli,508.2778238183327,28.979463871027875 +2040-04-01,Tripoli,581.9200529550881,30.841325581972683 +2040-05-01,Tripoli,574.1252755024652,31.387455671877436 +2040-06-01,Tripoli,569.1405246059795,31.748560458688456 +2040-07-01,Tripoli,551.1621988225176,32.18930740399417 +2040-08-01,Tripoli,531.4790578600164,32.186748969269765 +2040-09-01,Tripoli,531.198148768794,32.18208461208522 +2040-10-01,Tripoli,531.0058379587128,32.17352168770158 +2040-11-01,Tripoli,543.6349435559243,34.30130397112019 +2040-12-01,Tripoli,567.7166185181629,32.02340944622074 +2041-01-01,Tripoli,569.1467142503158,32.15190552492838 +2041-02-01,Tripoli,570.28568078083,32.42087185302635 +2041-03-01,Tripoli,569.2360322575429,32.93731017667413 +2041-04-01,Tripoli,572.3662649491782,34.34112505036755 +2041-05-01,Tripoli,523.3957422196632,33.54604359789556 +2041-06-01,Tripoli,498.25131971937884,29.336583069050597 +2041-07-01,Tripoli,587.5036159548208,30.64107150075774 +2041-08-01,Tripoli,576.340880284478,31.232365795490637 +2041-09-01,Tripoli,572.7999718883806,31.525576338357663 +2041-10-01,Tripoli,569.8427613477317,31.549750935855265 +2041-11-01,Tripoli,571.9321981469327,31.2031787544514 +2041-12-01,Tripoli,494.62519575474244,32.13135102554412 +2042-01-01,Tripoli,571.6089691618749,36.126390358441995 +2042-02-01,Tripoli,550.972550998953,34.7247858331159 +2042-03-01,Tripoli,552.2439471292239,34.46191101626636 +2042-04-01,Tripoli,587.6772138866754,32.660129010549554 +2042-05-01,Tripoli,615.8942190191358,30.936614222217067 +2042-06-01,Tripoli,608.117866554305,30.977671008031933 +2042-07-01,Tripoli,597.2552566616714,34.42163742475487 +2042-08-01,Tripoli,561.2018019362298,37.77670258588535 +2042-09-01,Tripoli,538.1381075495106,34.80188696120399 +2042-10-01,Tripoli,571.9753097394622,36.06202919102209 +2042-11-01,Tripoli,551.6318920660015,35.04117892736292 +2042-12-01,Tripoli,547.7590459992101,34.96364269132848 +2043-01-01,Tripoli,545.8108194580101,34.86659621498092 +2043-02-01,Tripoli,545.053667615924,34.78437821744407 +2043-03-01,Tripoli,544.7702394834017,34.70263013648918 +2043-04-01,Tripoli,544.8576142301977,34.61026542164409 +2043-05-01,Tripoli,545.1203862240623,34.504847468409324 +2043-06-01,Tripoli,545.5694953014973,34.386271850877826 +2043-07-01,Tripoli,545.9679356625036,34.26224868185841 +2043-08-01,Tripoli,480.9584610598737,30.02760410508032 +2043-09-01,Tripoli,567.6995610099334,35.52872608337496 +2043-10-01,Tripoli,559.4600648089979,34.20434451636196 +2043-11-01,Tripoli,557.2602940008692,33.78975626078912 +2043-12-01,Tripoli,554.431482593897,33.64566591328532 +2044-01-01,Tripoli,552.1737738358747,33.61083987326174 +2044-02-01,Tripoli,578.4618410862299,30.116139869997824 +2044-03-01,Tripoli,572.9370797076937,29.93228065620021 +2044-04-01,Tripoli,500.5304043421445,28.504064928877153 +2044-05-01,Tripoli,453.01092137387445,29.06867840434157 +2044-06-01,Tripoli,550.0703743506119,33.609882635779854 +2044-07-01,Tripoli,587.1450484189583,34.78484813402609 +2044-08-01,Tripoli,542.800205241807,33.66837854808331 +2044-09-01,Tripoli,494.59359977958326,30.509790731193654 +2044-10-01,Tripoli,604.9928158904864,32.637625227565806 +2044-11-01,Tripoli,558.2630883559815,33.93731006754561 +2044-12-01,Tripoli,573.8562418916556,32.98924466114708 +2045-01-01,Tripoli,599.7483878223042,31.466157997208057 +2045-02-01,Tripoli,611.5004352115634,30.470770250567536 +2045-03-01,Tripoli,595.8324301629835,32.4354044584335 +2045-04-01,Tripoli,552.884215455003,30.098439678741467 +2045-05-01,Tripoli,547.0460133661734,29.021582320231744 +2045-06-01,Tripoli,543.8557555189966,34.36904157620354 +2045-07-01,Tripoli,544.0438199451725,34.43836297421142 +2045-08-01,Tripoli,515.5908886018415,28.723028651783864 +2045-09-01,Tripoli,576.8603785730879,30.521817114829993 +2045-10-01,Tripoli,574.3792668380852,30.785144443943672 +2045-11-01,Tripoli,572.9616223672137,30.936718648124188 +2045-12-01,Tripoli,573.9998272457394,30.947056812928807 +2046-01-01,Tripoli,581.8122379874603,31.0767711938861 +2046-02-01,Tripoli,576.2663886346149,31.282629465449666 +2046-03-01,Tripoli,487.24965874700075,29.09694301653465 +2046-04-01,Tripoli,467.192188247362,29.70339647211736 +2046-05-01,Tripoli,544.2703177443211,34.50813688448356 +2046-06-01,Tripoli,544.530930559929,34.580538846751395 +2046-07-01,Tripoli,544.8810053279808,34.65288859606575 +2046-08-01,Tripoli,545.7108495047157,34.7221577811201 +2046-09-01,Tripoli,547.6803799380505,34.805541867953124 +2046-10-01,Tripoli,551.1566569316581,34.86864992448759 +2046-11-01,Tripoli,571.923921296948,35.98980127193278 +2046-12-01,Tripoli,523.6563550352711,33.825487325340994 +2047-01-01,Tripoli,563.1601046426287,35.9154674303832 +2047-02-01,Tripoli,581.9132155572747,32.96223315983944 +2047-03-01,Tripoli,548.5389411856021,32.279879474100426 +2047-04-01,Tripoli,564.0843768817988,35.48121229563667 +2047-05-01,Tripoli,487.26865951566134,30.133352740354248 +2047-06-01,Tripoli,564.732202331477,31.724838373454997 +2047-07-01,Tripoli,559.6659064694888,33.065788851063914 +2047-08-01,Tripoli,567.5199173789595,31.540056730811227 +2047-09-01,Tripoli,571.166121701385,31.18191067803523 +2047-10-01,Tripoli,572.6237109700089,30.508485407354684 +2047-11-01,Tripoli,575.6179154314596,29.827384832501103 +2047-12-01,Tripoli,593.7129807860113,29.91059487615556 +2048-01-01,Tripoli,617.121208049923,30.509164175750932 +2048-02-01,Tripoli,547.3552796651701,29.702108552596254 +2048-03-01,Tripoli,501.56537045328474,28.608421218722857 +2048-04-01,Tripoli,589.9440631659852,31.330787212948554 +2048-05-01,Tripoli,592.6197168619346,30.68543510696465 +2048-06-01,Tripoli,590.1144223304548,30.236682175446678 +2048-07-01,Tripoli,585.5416426453852,29.94933688769604 +2048-08-01,Tripoli,579.0936886168072,29.773257403978704 +2048-09-01,Tripoli,577.8751923538305,29.743130529775392 +2048-10-01,Tripoli,557.8311807319933,33.322432922122104 +2048-11-01,Tripoli,556.3424992964698,33.57709290094508 +2048-12-01,Tripoli,554.642434309596,33.85188967552378 +2049-01-01,Tripoli,552.8141861068709,34.12619912920266 +2049-02-01,Tripoli,552.4657667088159,34.38239068799665 +2049-03-01,Tripoli,553.5652922498375,34.58569052483587 +2049-04-01,Tripoli,435.9784596121513,28.749518023555964 +2049-05-01,Tripoli,512.4789369527812,28.456655567045964 +2049-06-01,Tripoli,576.0050560929217,29.175767172090193 +2049-07-01,Tripoli,561.7539757891276,31.836974393380974 +2049-08-01,Tripoli,560.7171383901646,31.87239218021149 +2049-09-01,Tripoli,561.7582941456412,32.792175570099204 +2049-10-01,Tripoli,583.4725021217987,32.14879015203271 +2049-11-01,Tripoli,569.3251343469444,36.12183042716451 +2049-12-01,Tripoli,550.9820513832833,34.67417407679979 +2050-01-01,Tripoli,543.4090935102527,32.99960023026951 +2050-02-01,Tripoli,542.7614120057914,32.95687262994072 +2050-03-01,Tripoli,543.2848687878725,32.87190475018309 +2050-04-01,Tripoli,544.2942126503642,32.745810467339155 +2050-05-01,Tripoli,546.529393981906,32.56278666079855 +2050-06-01,Tripoli,550.0310773063364,34.455071119350166 +2050-07-01,Tripoli,549.2162754047913,34.260856336430194 +2050-08-01,Tripoli,548.8202821124761,34.12203949723579 +2050-09-01,Tripoli,548.5999019850553,34.006718487142805 +2050-10-01,Tripoli,548.6132169176393,33.893921103138446 +2050-11-01,Tripoli,573.1492549577383,35.881581223523696 +2050-12-01,Tripoli,548.6910193074964,33.77853047577401 +2051-01-01,Tripoli,549.6517096865994,33.50956414767598 +2051-02-01,Tripoli,511.29412387061217,28.537550836426043 +2051-03-01,Tripoli,567.0277686816037,32.39864653912829 +2051-04-01,Tripoli,443.6503078493482,29.739214558258546 +2051-05-01,Tripoli,465.586767240749,28.172547482415926 +2051-06-01,Tripoli,553.4495602952678,28.704858543945498 +2051-07-01,Tripoli,566.1897196274924,29.96500077376359 +2051-08-01,Tripoli,569.3730681042473,34.109525792699586 +2051-09-01,Tripoli,505.9495099313099,32.372522658031144 +2051-10-01,Tripoli,581.887305418192,35.462119758952085 +2051-11-01,Tripoli,567.3335083227805,33.732722311185285 +2051-12-01,Tripoli,574.166011998912,33.0180488071935 +2052-01-01,Tripoli,549.1318515349467,33.65010401433783 +2052-02-01,Tripoli,440.1724474583522,29.153942157502698 +2052-03-01,Tripoli,501.9329345652174,28.5549551542789 +2052-04-01,Tripoli,487.7976581886017,29.0721070549586 +2052-05-01,Tripoli,543.8800102880823,34.29827561981384 +2052-06-01,Tripoli,541.7314839772507,33.793828871166674 +2052-07-01,Tripoli,543.3188398591144,34.240301837045934 +2052-08-01,Tripoli,543.0672236195769,34.17914306411102 +2052-09-01,Tripoli,541.9845396689593,33.84611144199664 +2052-10-01,Tripoli,542.366426329996,33.88541039170839 +2052-11-01,Tripoli,543.0986036769106,33.898968355315745 +2052-12-01,Tripoli,544.4632043352708,33.873488433979176 +2053-01-01,Tripoli,546.7365311493513,33.772264921347 +2053-02-01,Tripoli,551.1449973690708,33.50533489843778 +2053-03-01,Tripoli,560.2318270906223,33.07005290893784 +2053-04-01,Tripoli,575.730264673427,32.95046784097087 +2053-05-01,Tripoli,544.7751336207841,34.37327082544174 +2053-06-01,Tripoli,573.2179168263078,32.65480328928662 +2053-07-01,Tripoli,542.939472239377,34.11062226472437 +2053-08-01,Tripoli,542.8747688642786,34.037680768603025 +2053-09-01,Tripoli,493.91900051951944,28.933934175524787 +2053-10-01,Tripoli,570.3303037981395,30.880293849645213 +2053-11-01,Tripoli,597.649522611381,31.06100288191143 +2053-12-01,Tripoli,584.2406657729948,30.72922437068243 +2054-01-01,Tripoli,580.1654327309235,30.78721555776815 +2054-02-01,Tripoli,577.6220646895133,30.84357073897573 +2054-03-01,Tripoli,575.5894142784687,30.867327632844855 +2054-04-01,Tripoli,575.9638877608234,30.81360050363307 +2054-05-01,Tripoli,576.5452824927979,30.673008424017755 +2054-06-01,Tripoli,575.1268463232323,30.55055164360502 +2054-07-01,Tripoli,494.2870684397121,28.467602882975378 +2054-08-01,Tripoli,481.744905753645,31.065719452049564 +2054-09-01,Tripoli,546.1331127991566,34.490401884591485 +2054-10-01,Tripoli,542.6065989247719,35.59303503784122 +2054-11-01,Tripoli,571.6560392478755,34.07610950242214 +2054-12-01,Tripoli,585.9262642655474,32.88572377855827 +2055-01-01,Tripoli,594.6802926451021,31.57815478259113 +2055-02-01,Tripoli,599.9383955089113,30.63590241835546 +2055-03-01,Tripoli,592.7410626799724,30.077902583675076 +2055-04-01,Tripoli,448.4924810082701,28.78326499587262 +2055-05-01,Tripoli,518.9294819952676,28.613242214768107 +2055-06-01,Tripoli,582.2429940497118,29.389057087376948 +2055-07-01,Tripoli,580.5414896106665,29.74607185949255 +2055-08-01,Tripoli,485.5613252953227,29.8821214121483 +2055-09-01,Tripoli,543.49488485966,35.439250485293385 +2055-10-01,Tripoli,553.7504057990625,34.90667835899605 +2055-11-01,Tripoli,551.4486498045994,35.050385811507084 +2055-12-01,Tripoli,548.627971302395,34.29533429009669 +2056-01-01,Tripoli,546.7525090684525,34.034165096396734 +2056-02-01,Tripoli,546.4952789654471,33.93720564163849 +2056-03-01,Tripoli,546.5110409667225,33.83603434195985 +2056-04-01,Tripoli,546.1807586660254,33.74666316978545 +2056-05-01,Tripoli,545.9798111429167,33.66510653632699 +2056-06-01,Tripoli,546.2381928076591,33.56600635047282 +2056-07-01,Tripoli,576.2750973202511,29.620360471641355 +2056-08-01,Tripoli,576.5906972088012,29.597734858432688 +2056-09-01,Tripoli,575.5047025181896,29.555233514236008 +2056-10-01,Tripoli,571.1402115623023,29.50333383839879 +2056-11-01,Tripoli,509.9537060087293,32.78857287630366 +2056-12-01,Tripoli,484.9476148621036,29.970726794337196 +2057-01-01,Tripoli,547.427971999819,34.14276803979856 +2057-02-01,Tripoli,542.6132204047597,33.97142253053722 +2057-03-01,Tripoli,587.2115511092709,32.774388357253585 +2057-04-01,Tripoli,547.7740882743999,32.99869520574116 +2057-05-01,Tripoli,437.9213601803179,30.076875728921742 +2057-06-01,Tripoli,550.7140253889938,30.544930048938596 +2057-07-01,Tripoli,548.0020255257198,30.6718771433573 +2057-08-01,Tripoli,576.1833322443329,31.34119499502451 +2057-09-01,Tripoli,595.4326942950229,30.17674170476141 +2057-10-01,Tripoli,602.5638123240835,30.52977088808872 +2057-11-01,Tripoli,589.4331296177943,31.65717038564311 +2057-12-01,Tripoli,571.2711297372789,32.809475462044944 +2058-01-01,Tripoli,559.4450945064168,33.60568819517732 +2058-02-01,Tripoli,552.341182123393,34.122230944732166 +2058-03-01,Tripoli,549.9586728621217,34.46201544217348 +2058-04-01,Tripoli,550.2405895698643,34.74295594095426 +2058-05-01,Tripoli,566.3610864084817,36.122631025785736 +2058-06-01,Tripoli,479.10610203328,30.720435190166747 +2058-07-01,Tripoli,594.4631512850665,32.650661061637614 +2058-08-01,Tripoli,551.3597636330237,33.89637511195568 +2058-09-01,Tripoli,547.3363508691177,34.205493201340275 +2058-10-01,Tripoli,545.5302702298304,34.401256968549184 +2058-11-01,Tripoli,544.5305706968859,34.53936023071155 +2058-12-01,Tripoli,544.3289034476918,34.63807752157297 +2059-01-01,Tripoli,544.4146228244904,34.721339778181004 +2059-02-01,Tripoli,545.0985785236677,34.79468157361297 +2059-03-01,Tripoli,546.8397398700312,34.88372206374815 +2059-04-01,Tripoli,549.7136781025724,34.932471558053976 +2059-05-01,Tripoli,571.3350414136833,36.13841674207828 +2059-06-01,Tripoli,448.6266379506322,28.20497172657581 +2059-07-01,Tripoli,530.724640977056,28.37760515535826 +2059-08-01,Tripoli,540.8395274393257,34.94745667572528 +2059-09-01,Tripoli,561.0790886386294,38.150216651325465 +2059-10-01,Tripoli,521.6193862677123,29.529614358356596 +2059-11-01,Tripoli,611.7608321093454,30.38601122262415 +2059-12-01,Tripoli,595.107665994751,29.73420211471692 +2060-01-01,Tripoli,572.6690537134039,29.410708058785872 +2060-02-01,Tripoli,563.7203394276856,29.250988633850252 +2060-03-01,Tripoli,560.9208928450071,29.19158769701845 +2060-04-01,Tripoli,561.1741644545415,29.20269165180858 +2060-05-01,Tripoli,560.3690788551525,29.19083931135075 +2060-06-01,Tripoli,560.2387364610443,29.181493192663797 +2060-07-01,Tripoli,611.4519976460002,30.697548512190245 +2060-08-01,Tripoli,578.343806008186,32.32189349739717 +2060-09-01,Tripoli,559.8821841582215,33.32326832937906 +2060-10-01,Tripoli,577.8715217507938,33.189533550997695 +2060-11-01,Tripoli,552.4305721032285,33.77926145712385 +2060-12-01,Tripoli,550.0288461554712,34.13521456585045 +2061-01-01,Tripoli,550.5139415371877,34.266634569957326 +2061-02-01,Tripoli,551.9275555419797,34.435682709262096 +2061-03-01,Tripoli,553.9763997899513,34.610509082094055 +2061-04-01,Tripoli,573.6427711346566,35.87237433937953 +2061-05-01,Tripoli,517.7119933488107,33.357607048502715 +2061-06-01,Tripoli,564.6991669041464,35.24432212534143 +2061-07-01,Tripoli,434.8672745085424,30.067338162738416 +2061-08-01,Tripoli,478.27863295262785,28.687924142674706 +2061-09-01,Tripoli,561.3615091546319,30.557182688706977 +2061-10-01,Tripoli,558.6713169917525,30.319335280929867 +2061-11-01,Tripoli,553.353116999793,30.3997954423636 +2061-12-01,Tripoli,550.4051189530401,33.99237732923203 +2062-01-01,Tripoli,489.58869655269956,31.659955076499557 +2062-02-01,Tripoli,571.3836948970718,36.083227650166876 +2062-03-01,Tripoli,550.9957981515192,34.67361713862846 +2062-04-01,Tripoli,544.6238471975842,34.47534714964879 +2062-05-01,Tripoli,544.1386078706504,34.58522060825386 +2062-06-01,Tripoli,504.2885260708858,29.135284728764457 +2062-07-01,Tripoli,506.6949302382,32.55290100825814 +2062-08-01,Tripoli,569.8219612638568,34.68355500412247 +2062-09-01,Tripoli,556.722874532727,33.488087219445575 +2062-10-01,Tripoli,555.7372096584522,33.311955522774696 +2062-11-01,Tripoli,556.210141669322,33.11459055832332 +2062-12-01,Tripoli,557.4284939870815,32.89315542228147 +2063-01-01,Tripoli,558.885003666577,32.66279187118107 +2063-02-01,Tripoli,560.4152132972415,32.430513845116856 +2063-03-01,Tripoli,560.7731330796269,32.23951886099961 +2063-04-01,Tripoli,590.5568379552933,32.70275218497121 +2063-05-01,Tripoli,561.1653837962969,32.08387204644154 +2063-06-01,Tripoli,543.9239855519145,34.75493011163701 +2063-07-01,Tripoli,544.0312967112825,34.82700139186568 +2063-08-01,Tripoli,544.3672648480558,34.89207613631749 +2063-09-01,Tripoli,545.2217956295281,34.95189477677778 +2063-10-01,Tripoli,547.3311688413014,35.02248668998895 +2063-11-01,Tripoli,551.3352209735035,35.074177514011936 +2063-12-01,Tripoli,571.8394974271034,36.08623859715542 +2064-01-01,Tripoli,536.8131637984687,34.745966887942814 +2064-02-01,Tripoli,561.2775171204385,37.61694835231401 +2064-03-01,Tripoli,492.21037079222657,30.087718618944095 +2064-04-01,Tripoli,493.89553744912774,32.143812517126804 +2064-05-01,Tripoli,563.0931701166649,34.17480938896564 +2064-06-01,Tripoli,543.9539981296855,34.6754097833673 +2064-07-01,Tripoli,544.8222037067846,33.017770338107866 +2064-08-01,Tripoli,480.69698457296323,30.848043648663896 +2064-09-01,Tripoli,579.5486994481445,33.40195325039182 +2064-10-01,Tripoli,549.8693548548947,34.50618760088402 +2064-11-01,Tripoli,548.8900955427825,34.325983293835534 +2064-12-01,Tripoli,548.6306342889118,34.187236071912594 +2065-01-01,Tripoli,548.4270237792862,34.068347176659735 +2065-02-01,Tripoli,549.0302262116552,33.932506475818215 +2065-03-01,Tripoli,550.8310528505176,33.73463678614911 +2065-04-01,Tripoli,554.2005224930173,33.44306224916022 +2065-05-01,Tripoli,560.8021380408778,32.984162600334 +2065-06-01,Tripoli,510.8951797013459,33.236472996246874 +2065-07-01,Tripoli,566.0482934516655,34.824373339869936 +2065-08-01,Tripoli,572.2002241412226,36.04556470633331 +2065-09-01,Tripoli,552.3536333846743,35.008772087520896 +2065-10-01,Tripoli,574.3489663698799,35.83836630229511 +2065-11-01,Tripoli,550.154798220457,34.820701028802944 +2065-12-01,Tripoli,569.2820947270234,33.50834584542627 +2066-01-01,Tripoli,542.8877239338201,30.804236980628254 +2066-02-01,Tripoli,542.0700431279324,30.820666656681368 +2066-03-01,Tripoli,543.8800822606909,30.73595984169151 +2066-04-01,Tripoli,553.6302835153703,31.286145137655954 +2066-05-01,Tripoli,495.04976217265727,29.946708835700246 +2066-06-01,Tripoli,438.0414104914014,29.83885427796612 +2066-07-01,Tripoli,599.3089950470253,31.835669069542007 +2066-08-01,Tripoli,616.738385744975,30.626469278079192 +2066-09-01,Tripoli,615.106550791019,34.15495106229555 +2066-10-01,Tripoli,644.7504848608556,36.053031158692164 +2066-11-01,Tripoli,629.9390977993962,30.97692262236429 +2066-12-01,Tripoli,554.4493318008206,34.39711474090018 +2067-01-01,Tripoli,567.3100452523888,34.509825103315286 +2067-02-01,Tripoli,505.44087950659303,28.93560499003864 +2067-03-01,Tripoli,517.1971732797572,30.800547265243452 +2067-04-01,Tripoli,504.64946870283075,32.92848618752272 +2067-05-01,Tripoli,568.0561852853646,34.35243785697191 +2067-06-01,Tripoli,572.8910172382132,32.30149563687362 +2067-07-01,Tripoli,566.2525517147683,32.853804259616126 +2067-08-01,Tripoli,561.5611611707864,33.312860547303046 +2067-09-01,Tripoli,557.8005204007452,33.72175759093801 +2067-10-01,Tripoli,555.7534034953792,34.11845420775811 +2067-11-01,Tripoli,554.1420087622553,34.50241086390996 +2067-12-01,Tripoli,570.7640827099506,36.06079348445458 +2068-01-01,Tripoli,430.8541538276611,29.70959240927297 +2068-02-01,Tripoli,476.92835484337166,28.217659474290535 +2068-03-01,Tripoli,482.31528867650917,31.09427993764608 +2068-04-01,Tripoli,486.3892981842351,29.27735617539731 +2068-05-01,Tripoli,560.2124664589186,34.54959396960905 +2068-06-01,Tripoli,577.7328305340923,30.075030871229373 +2068-07-01,Tripoli,577.516624817968,30.132639163322274 +2068-08-01,Tripoli,574.3247835734028,30.005048109143043 +2068-09-01,Tripoli,570.4736732343974,29.661660917906186 +2068-10-01,Tripoli,573.6397482850971,29.534365737130393 +2068-11-01,Tripoli,585.6665870938511,29.75954280151064 +2068-12-01,Tripoli,598.0023323385585,30.17950899130006 +2069-01-01,Tripoli,601.8761140492611,31.09417551173896 +2069-02-01,Tripoli,590.666812101178,32.741616026736615 +2069-03-01,Tripoli,492.4932951164889,29.76631308115539 +2069-04-01,Tripoli,574.4283521571253,33.635658430519925 +2069-05-01,Tripoli,571.0346277455399,36.20951338050719 +2069-06-01,Tripoli,549.0349044312118,34.96731500239542 +2069-07-01,Tripoli,546.2877099623506,34.93912000747379 +2069-08-01,Tripoli,544.4290893188117,34.87392343279699 +2069-09-01,Tripoli,600.3955655185055,30.509860348465047 +2069-10-01,Tripoli,585.1462971065469,31.503612089227378 +2069-11-01,Tripoli,524.7250762998274,29.434082057662245 +2069-12-01,Tripoli,511.1937220816664,28.666917131026302 +2070-01-01,Tripoli,623.1072418767417,30.416747247952312 +2070-02-01,Tripoli,690.9381147076617,32.25018770784345 +2070-03-01,Tripoli,550.5168924141387,29.85557982742273 +2070-04-01,Tripoli,568.4090669851504,34.280749471736 +2070-05-01,Tripoli,546.69802580377,33.87945811500275 +2070-06-01,Tripoli,547.0803443004581,33.95642000854806 +2070-07-01,Tripoli,547.4906601418776,34.04062209832018 +2070-08-01,Tripoli,547.7189572562405,34.13848657760677 +2070-09-01,Tripoli,586.2659749779662,32.26183119648698 +2070-10-01,Tripoli,547.8998963941685,34.260281993941064 +2070-11-01,Tripoli,547.2038492967529,34.57759751703429 +2070-12-01,Tripoli,547.9055102576365,34.75092711853085 +2071-01-01,Tripoli,549.5285645533477,34.86026104328252 +2071-02-01,Tripoli,571.2380223373398,36.1994362804704 +2071-03-01,Tripoli,497.7303819785976,32.4687511314396 +2071-04-01,Tripoli,571.2718494633643,33.8225459956239 +2071-05-01,Tripoli,542.5298041514347,34.59674226667241 +2071-06-01,Tripoli,542.569317113536,34.65459421921533 +2071-07-01,Tripoli,542.7084401658889,34.703935460328154 +2071-08-01,Tripoli,542.8970803729333,34.749082260838485 +2071-09-01,Tripoli,543.167913298957,34.790765602096066 +2071-10-01,Tripoli,543.6082417181473,34.831039193607566 +2071-11-01,Tripoli,547.5162823905262,34.414519058753044 +2071-12-01,Tripoli,608.7672754013719,30.81572383041113 +2072-01-01,Tripoli,605.4838849987138,30.678525592777063 +2072-02-01,Tripoli,588.6455333622862,33.52085954996248 +2072-03-01,Tripoli,547.895218174612,31.124685280935022 +2072-04-01,Tripoli,517.7127850475047,33.69309267943437 +2072-05-01,Tripoli,571.527208278547,36.1398090875065 +2072-06-01,Tripoli,550.2722575176322,34.96818521828804 +2072-07-01,Tripoli,547.5239834596423,34.88784688707929 +2072-08-01,Tripoli,546.1393744161015,34.75811510180408 +2072-09-01,Tripoli,546.066754054061,34.630941751253275 +2072-10-01,Tripoli,546.3876079430364,34.49621492675435 +2072-11-01,Tripoli,546.7254473676327,34.36359402471557 +2072-12-01,Tripoli,547.472307126694,34.21845941814063 +2073-01-01,Tripoli,549.2845774103181,34.02081598460362 +2073-02-01,Tripoli,551.6024552690992,33.7700023600261 +2073-03-01,Tripoli,546.2804407288857,29.795935230140962 +2073-04-01,Tripoli,543.3013505152335,34.82841114161177 +2073-05-01,Tripoli,543.0405217818,34.724211490626715 +2073-06-01,Tripoli,543.0442643574452,34.65791844392518 +2073-07-01,Tripoli,546.4353977551225,33.60762007445901 +2073-08-01,Tripoli,545.3331372549756,33.75540013734755 +2073-09-01,Tripoli,544.7888803890196,33.85709356656179 +2073-10-01,Tripoli,545.0918130984628,33.909497967616744 +2073-11-01,Tripoli,546.0825880279451,33.9208803914925 +2073-12-01,Tripoli,547.8644138981467,33.879649562499125 +2074-01-01,Tripoli,551.0866995561346,33.763284293334934 +2074-02-01,Tripoli,556.9281404123493,33.635484387341414 +2074-03-01,Tripoli,564.0295337540736,33.760865093153384 +2074-04-01,Tripoli,578.3285478151707,35.12264853923213 +2074-05-01,Tripoli,543.1173885277456,34.78065369342355 +2074-06-01,Tripoli,600.8736795571913,30.530066761492215 +2074-07-01,Tripoli,553.1452601062621,29.56665074674749 +2074-08-01,Tripoli,572.4506888190228,29.830256544946806 +2074-09-01,Tripoli,597.3763865618832,32.63035022270333 +2074-10-01,Tripoli,586.4320877585303,32.79694435319087 +2074-11-01,Tripoli,594.450556078568,32.65144425594099 +2074-12-01,Tripoli,555.2013016150901,30.53956951903988 +2075-01-01,Tripoli,551.0783507335411,30.771551671700596 +2075-02-01,Tripoli,548.6839659918571,30.87190496844014 +2075-03-01,Tripoli,549.0536892820469,30.767966382222916 +2075-04-01,Tripoli,557.4283500418643,30.743843997678844 +2075-05-01,Tripoli,549.5644788850207,30.788973393871316 +2075-06-01,Tripoli,467.2268790446896,28.613364044993034 +2075-07-01,Tripoli,445.52440260372794,30.11342479641277 +2075-08-01,Tripoli,561.6755976184021,37.03385149128981 +2075-09-01,Tripoli,557.1655060753912,29.5542414681184 +2075-10-01,Tripoli,532.1419255848846,34.49898221329293 +2075-11-01,Tripoli,550.9548457372466,35.06255142968621 +2075-12-01,Tripoli,547.11532298822,35.021042131607146 +2076-01-01,Tripoli,545.0073892286179,34.95937863345449 +2076-02-01,Tripoli,544.0762076190259,34.914649536572696 +2076-03-01,Tripoli,543.5937032512177,34.87202636215103 +2076-04-01,Tripoli,572.8841798403996,33.62582499093304 +2076-05-01,Tripoli,500.68579320403273,31.786884766600462 +2076-06-01,Tripoli,583.2737137769468,35.32894191874203 +2076-07-01,Tripoli,578.8527962959458,33.214073639170245 +2076-08-01,Tripoli,596.5189768760688,31.82376451613065 +2076-09-01,Tripoli,606.7823428298045,30.632299724559914 +2076-10-01,Tripoli,593.9155836791168,30.107977244924797 +2076-11-01,Tripoli,571.6928172508514,36.10400840568323 +2076-12-01,Tripoli,586.8289447221483,32.78653657111485 +2077-01-01,Tripoli,483.7347324625947,30.901979629689862 +2077-02-01,Tripoli,533.3634446974211,31.65147917370523 +2077-03-01,Tripoli,498.1920862625311,28.93856372407366 +2077-04-01,Tripoli,605.7463691021442,30.221540418914664 +2077-05-01,Tripoli,597.688603737831,32.63012396657122 +2077-06-01,Tripoli,511.95202548548946,28.027778366515882 +2077-07-01,Tripoli,675.7683760281654,32.30943200581454 +2077-08-01,Tripoli,592.1681607158084,30.933864339996347 +2077-09-01,Tripoli,577.6497021712016,31.818943520085398 +2077-10-01,Tripoli,569.1125992338568,32.36281104866924 +2077-11-01,Tripoli,566.4363697570388,32.70381384836021 +2077-12-01,Tripoli,564.3385121626359,33.07334232501202 +2078-01-01,Tripoli,560.8902325137592,33.50375110551312 +2078-02-01,Tripoli,558.0153586373067,33.94834440506435 +2078-03-01,Tripoli,455.83210368433885,29.70879181065174 +2078-04-01,Tripoli,556.0165353522866,34.36013056546287 +2078-05-01,Tripoli,484.19427756827145,30.96726322595598 +2078-06-01,Tripoli,585.8601214382776,32.81346105083323 +2078-07-01,Tripoli,518.7178825260912,32.79922431882957 +2078-08-01,Tripoli,571.3572809497292,34.42202031974762 +2078-09-01,Tripoli,562.3332113428451,33.28167200971073 +2078-10-01,Tripoli,563.3753027422331,32.943436496558355 +2078-11-01,Tripoli,564.2179580432921,32.649077268713015 +2078-12-01,Tripoli,561.5370503469178,32.52406205357593 +2079-01-01,Tripoli,558.8015874132523,32.53812474240108 +2079-02-01,Tripoli,557.2261070118016,32.5513520239692 +2079-03-01,Tripoli,558.0601255998331,32.4590395220777 +2079-04-01,Tripoli,558.2084611460821,32.32071000378318 +2079-05-01,Tripoli,572.2109480598986,35.893503181252925 +2079-06-01,Tripoli,480.1397726374663,30.038655846916857 +2079-07-01,Tripoli,477.4703085858532,28.289382668162176 +2079-08-01,Tripoli,576.888375917819,29.151261892553364 +2079-09-01,Tripoli,592.6837724835561,33.012757894566235 +2079-10-01,Tripoli,583.7208076213421,31.830691434636044 +2079-11-01,Tripoli,582.8892361020016,31.39206781610845 +2079-12-01,Tripoli,584.0449002777026,31.040552808434292 +2080-01-01,Tripoli,586.06841016746,30.668013384793987 +2080-02-01,Tripoli,591.5026300044235,30.21539669471264 +2080-03-01,Tripoli,595.3572670012484,30.016012829390323 +2080-04-01,Tripoli,555.2188629315797,31.149103538882592 +2080-05-01,Tripoli,553.6239499258168,31.312895574195764 +2080-06-01,Tripoli,555.515102188426,31.50932070548312 +2080-07-01,Tripoli,577.6480468012046,31.57425621539209 +2080-08-01,Tripoli,590.2819025905815,32.707503563745064 +2080-09-01,Tripoli,561.8086749716357,28.945664685757627 +2080-10-01,Tripoli,480.14049236355174,30.932646037746636 +2080-11-01,Tripoli,554.2419787155497,34.53426076558066 +2080-12-01,Tripoli,562.4205860896409,33.862367074871244 +2081-01-01,Tripoli,586.6171293351464,32.474424939059624 +2081-02-01,Tripoli,617.6545250793771,30.73797874256245 +2081-03-01,Tripoli,618.9706161995658,33.39718446730009 +2081-04-01,Tripoli,559.1211457952733,32.33590397326873 +2081-05-01,Tripoli,478.0565974552099,29.615139176285545 +2081-06-01,Tripoli,450.0581731349563,29.969926195715967 +2081-07-01,Tripoli,566.6207635801782,29.526916689089404 +2081-08-01,Tripoli,572.5741938153174,29.249213393429272 +2081-09-01,Tripoli,571.4034873644268,29.19238829563968 +2081-10-01,Tripoli,570.0825021068559,29.12602563166676 +2081-11-01,Tripoli,568.9641917149993,36.110273960110234 +2081-12-01,Tripoli,590.7549065740595,32.69977604661838 +2082-01-01,Tripoli,558.5470202967638,35.800163824608084 +2082-02-01,Tripoli,548.5445550490701,34.392345957808516 +2082-03-01,Tripoli,460.4151754524327,29.321963442054187 +2082-04-01,Tripoli,523.698243093455,32.106010338750394 +2082-05-01,Tripoli,541.86125059049,31.867414545305586 +2082-06-01,Tripoli,534.8497510368618,31.582627692279356 +2082-07-01,Tripoli,533.7413008923783,31.64968652896639 +2082-08-01,Tripoli,542.1443908325782,34.211027774417445 +2082-09-01,Tripoli,542.26803977409,34.26929743058879 +2082-10-01,Tripoli,562.6642133696275,36.20596289966524 +2082-11-01,Tripoli,525.3126606761383,34.06472707854638 +2082-12-01,Tripoli,571.8902381161404,36.06340413213251 +2083-01-01,Tripoli,551.5627263891722,34.912247740709 +2083-02-01,Tripoli,549.2071348835038,34.77052438043317 +2083-03-01,Tripoli,449.3467238993079,29.283778368685027 +2083-04-01,Tripoli,547.9638080705727,34.602015774981865 +2083-05-01,Tripoli,546.7411373962993,34.384601036363975 +2083-06-01,Tripoli,545.8915007522095,34.325217503850034 +2083-07-01,Tripoli,545.3491151740766,34.27105526669196 +2083-08-01,Tripoli,544.7680803051451,34.216649369083925 +2083-09-01,Tripoli,544.2816174438656,34.16314849600425 +2083-10-01,Tripoli,542.5113791636427,34.31905637533014 +2083-11-01,Tripoli,542.8904588929456,34.35910371070953 +2083-12-01,Tripoli,543.5060406139874,34.385871551567206 +2084-01-01,Tripoli,544.5589998772687,34.40393723349851 +2084-02-01,Tripoli,546.0869063844591,34.437423141047404 +2084-03-01,Tripoli,548.2046284188256,34.529022065906986 +2084-04-01,Tripoli,550.5738227475123,34.67718502378833 +2084-05-01,Tripoli,547.40638021725,34.47555600146297 +2084-06-01,Tripoli,551.9581439006189,34.73477591156343 +2084-07-01,Tripoli,513.738961410899,30.170110659659514 +2084-08-01,Tripoli,551.0920975017766,31.149660477053857 +2084-09-01,Tripoli,547.2366688062577,34.257166621045386 +2084-10-01,Tripoli,546.7292619158864,34.14978197989328 +2084-11-01,Tripoli,547.0490362157332,34.02843907582319 +2084-12-01,Tripoli,547.7951762487089,33.88144220723796 +2085-01-01,Tripoli,548.9108236540487,33.71065363614788 +2085-02-01,Tripoli,550.3365290570792,33.51682174822066 +2085-03-01,Tripoli,552.7120569753196,33.27699024820833 +2085-04-01,Tripoli,598.931138852068,30.749918104609478 +2085-05-01,Tripoli,598.2289021103159,30.27324864725551 +2085-06-01,Tripoli,589.4029011221977,30.951512318299113 +2085-07-01,Tripoli,582.962504217519,31.620360253384312 +2085-08-01,Tripoli,576.5835719205536,32.30936238854315 +2085-09-01,Tripoli,565.1089069646972,31.481038688972237 +2085-10-01,Tripoli,569.0238570074982,33.01197470026287 +2085-11-01,Tripoli,559.4361699029547,34.19534648403203 +2085-12-01,Tripoli,571.6712974408908,35.75465153342286 +2086-01-01,Tripoli,483.1792478697031,30.59702117227219 +2086-02-01,Tripoli,590.3726600499797,32.70607640968112 +2086-03-01,Tripoli,451.1944766789536,28.43827660739336 +2086-04-01,Tripoli,533.9523965532944,28.64448296531395 +2086-05-01,Tripoli,577.7396679319058,29.12106540107866 +2086-06-01,Tripoli,570.5050532917311,29.135110685585943 +2086-07-01,Tripoli,557.3367289111634,29.658093032746372 +2086-08-01,Tripoli,539.0639631860687,31.320988581997394 +2086-09-01,Tripoli,543.1738870254678,31.538664385383004 +,,546.0752468218718,31.385019067378018 +,,562.5992940767035,33.640409809293786 +,,568.7384856145447,36.014062891019634 diff --git a/final_usable_synthetic_data_COMBINED.csv b/final_usable_synthetic_data_COMBINED.csv new file mode 100644 index 00000000..85bd7bd1 --- /dev/null +++ b/final_usable_synthetic_data_COMBINED.csv @@ -0,0 +1,5881 @@ +date,city,transaction_number,transaction_value +2017-01-01,Baabda,1562.0364115827408,241.93073488676526 +2017-02-01,Baabda,1543.6815947295129,240.36779241153425 +2017-03-01,Baabda,1624.2310619321254,246.3427411087199 +2017-04-01,Baabda,1550.0879501698598,237.65433601398377 +2017-05-01,Baabda,1618.6308670609355,240.8356405325493 +2017-06-01,Baabda,1815.780055332747,255.33362085785402 +2017-07-01,Baabda,1991.269451778268,255.4923458205439 +2017-08-01,Baabda,2064.4671312948417,257.90767076113013 +2017-09-01,Baabda,1929.2208737569679,285.828270481108 +2017-10-01,Baabda,1709.1876346996237,274.29788354119614 +2017-11-01,Baabda,1493.2170765422054,249.50117698687004 +2017-12-01,Baabda,1493.480318429287,209.9369721144721 +2018-01-01,Baabda,1413.6075160559,206.4886577766045 +2018-02-01,Baabda,1161.8292606038458,209.24097242040932 +2018-03-01,Baabda,791.8696367163739,195.07332407316983 +2018-04-01,Baabda,887.0434800365543,203.41644036131095 +2018-05-01,Baabda,1251.5185201291865,207.4955511043795 +2018-06-01,Baabda,1386.613888210795,284.3537042356114 +2018-07-01,Baabda,1257.8395840646772,300.4042992630564 +2018-08-01,Baabda,1295.9748751924237,303.0306888449607 +2018-09-01,Baabda,1341.6860921468776,309.323087467526 +2018-10-01,Baabda,1450.314882878506,271.04742904905186 +2018-11-01,Baabda,1454.7588253059541,294.243653517207 +2018-12-01,Baabda,1402.9041405976332,270.665605745148 +2019-01-01,Baabda,1560.2433064573888,244.25225229551845 +2019-02-01,Baabda,1266.7605512557598,210.78763021057028 +2019-03-01,Baabda,774.293565305742,198.990731397559 +2019-04-01,Baabda,974.9898600818448,191.77952981894794 +2019-05-01,Baabda,1198.1620957103592,191.94425779974682 +2019-06-01,Baabda,1270.4721485194166,208.6530086098574 +2019-07-01,Baabda,1184.297550723264,208.66575234415342 +2019-08-01,Baabda,1137.4063498847634,199.50277685466722 +2019-09-01,Baabda,1209.2076997898562,200.43199057483756 +2019-10-01,Baabda,1262.7829493403292,206.43369004857368 +2019-11-01,Baabda,1276.6535865777712,213.7242402766907 +2019-12-01,Baabda,1280.9615159742195,220.2421163167714 +2020-01-01,Baabda,1317.3151780761045,228.99880458984475 +2020-02-01,Baabda,1419.4001126938592,254.05702511279253 +2020-03-01,Baabda,1391.0425291722556,329.46967730279783 +2020-04-01,Baabda,1604.3261215662178,332.141103352359 +2020-05-01,Baabda,1706.319601588649,289.3329449521285 +2020-06-01,Baabda,1606.3600831006324,297.34930709788216 +2020-07-01,Baabda,1425.818227594178,280.18437301761355 +2020-08-01,Baabda,515.1424118117959,208.65429958149377 +2020-09-01,Baabda,688.4951993885695,144.59809434585335 +2020-10-01,Baabda,1282.8379999211788,162.7995218892734 +2020-11-01,Baabda,1325.4199254009457,184.34641943727343 +2020-12-01,Baabda,1266.6709385035642,210.30348818325928 +2021-01-01,Baabda,1497.7171243449413,232.5197176398054 +2021-02-01,Baabda,1493.2029085181432,232.24114440313198 +2021-03-01,Baabda,1648.306076820353,253.59726400695666 +2021-04-01,Baabda,1547.6544503568823,249.47670385313512 +2021-05-01,Baabda,1440.734748367915,233.06450767034718 +2021-06-01,Baabda,1675.7954438274057,232.53795722478193 +2021-07-01,Baabda,1735.3357148686782,272.80386050889456 +2021-08-01,Baabda,1730.0615262311667,254.67391590922472 +2021-09-01,Baabda,1542.6231016518022,244.92646223260476 +2021-10-01,Baabda,1093.630059976527,220.82045316740647 +2021-11-01,Baabda,973.4851450862855,186.35444282658972 +2021-12-01,Baabda,1105.4221772438782,179.59014796480682 +2022-01-01,Baabda,924.6223928593657,208.81018440658363 +2022-02-01,Baabda,1187.6613938363066,212.24486055123575 +2022-03-01,Baabda,1343.729971298136,286.5203419329059 +2022-04-01,Baabda,1458.722188357202,323.2391162216139 +2022-05-01,Baabda,1437.950023238428,342.4684338243517 +2022-06-01,Baabda,1630.8139509522914,298.7524088420805 +2022-07-01,Baabda,1595.3715053179867,290.5016246896167 +2022-08-01,Baabda,1390.0310739344327,276.1961835626483 +2022-09-01,Baabda,784.2344885490851,231.88548171731617 +2022-10-01,Baabda,893.5761434114189,181.98158070889454 +2022-11-01,Baabda,1232.1255413127778,200.89177012312538 +2022-12-01,Baabda,1074.3910167415575,279.55946897581003 +2023-01-01,Baabda,1609.5405211421858,251.05110831225176 +2023-02-01,Baabda,1502.0114524382893,233.61134481305518 +2023-03-01,Baabda,1613.5172021360522,244.59649910357842 +2023-04-01,Baabda,1663.098202342821,251.43128101670635 +2023-05-01,Baabda,1550.5460023878009,233.1571994338375 +2023-06-01,Baabda,1344.5607842291618,232.51613058290155 +2023-07-01,Baabda,1002.033501051891,218.5822034291982 +2023-08-01,Baabda,1049.1199372619728,183.5606326659021 +2023-09-01,Baabda,838.3776633441037,200.72005245303825 +2023-10-01,Baabda,1054.094897231284,182.73474278276998 +2023-11-01,Baabda,1344.7272585118963,205.6217426591142 +2023-12-01,Baabda,1345.466262646997,238.34249766596872 +2024-01-01,Baabda,1273.4492045755524,240.7344099138071 +2024-02-01,Baabda,1277.7052790039315,240.23923930023125 +2024-03-01,Baabda,1252.228054774237,242.98269234587508 +2024-04-01,Baabda,1253.2507027510694,226.6966056495071 +2024-05-01,Baabda,1152.8838535712557,221.793163410496 +2024-06-01,Baabda,1165.186869786301,231.36409515829632 +2024-07-01,Baabda,1142.1651766470009,254.8992826720284 +2024-08-01,Baabda,1245.4224444158085,263.86132764754194 +2024-09-01,Baabda,1178.8814693247662,297.87995176777986 +2024-10-01,Baabda,1214.531051470865,325.7857421988435 +2024-11-01,Baabda,1313.1484330394392,277.4804237040422 +2024-12-01,Baabda,1177.1776227510081,254.62374321870038 +2025-01-01,Baabda,1671.1160288400386,257.0498016663204 +2025-02-01,Baabda,1791.569877494963,274.2039100272955 +2025-03-01,Baabda,2148.6385121687954,257.5900179687791 +2025-04-01,Baabda,2225.1761616778667,256.35452122788354 +2025-05-01,Baabda,1964.664169472716,316.57145058681215 +2025-06-01,Baabda,2008.2705139323225,298.1532873481001 +2025-07-01,Baabda,2150.33244112571,284.1652869252854 +2025-08-01,Baabda,2188.5179578987577,295.67100708571684 +2025-09-01,Baabda,2203.0952961764383,311.66391412346866 +2025-10-01,Baabda,2172.2845192884097,307.32147283026165 +2025-11-01,Baabda,2080.1536841763764,306.8518173489557 +2025-12-01,Baabda,1968.973232311089,290.6544019615533 +2026-01-01,Baabda,1915.2173404538191,282.6376156394048 +2026-02-01,Baabda,1827.4122864485525,257.5991838673972 +2026-03-01,Baabda,1636.0911148748562,235.68314220120743 +2026-04-01,Baabda,872.9337573930575,186.02088341943352 +2026-05-01,Baabda,669.4888659488269,143.58730043949134 +2026-06-01,Baabda,1192.255658999058,187.4403251760577 +2026-07-01,Baabda,1607.2607443902864,248.1503411514921 +2026-08-01,Baabda,1084.8766296699837,297.01992490609217 +2026-09-01,Baabda,1257.5798841836113,277.0442781579257 +2026-10-01,Baabda,1422.8246657900095,227.1221467857535 +2026-11-01,Baabda,1312.4479659297886,214.90269451371134 +2026-12-01,Baabda,1269.497742664517,199.9524683817395 +2027-01-01,Baabda,1599.2467432595658,248.67631065982107 +2027-02-01,Baabda,1495.2487711927702,234.7644498998734 +2027-03-01,Baabda,840.1497289537227,230.21509351703654 +2027-04-01,Baabda,806.9614159477643,174.30115704659835 +2027-05-01,Baabda,1125.7237514434155,190.42546655447913 +2027-06-01,Baabda,1243.1216281481763,182.55131415569593 +2027-07-01,Baabda,1195.809070274057,190.22365080281295 +2027-08-01,Baabda,1175.4071156240361,181.65128561573317 +2027-09-01,Baabda,1230.5999284817262,182.178693635314 +2027-10-01,Baabda,1274.8436923439053,185.75309901714962 +2027-11-01,Baabda,1301.501963059451,191.02548250737897 +2027-12-01,Baabda,1281.2980773858242,194.61546253988462 +2028-01-01,Baabda,1269.926042031927,193.5011603719649 +2028-02-01,Baabda,1281.9201953224094,193.8858791408246 +2028-03-01,Baabda,1279.7867034189555,194.4048036325094 +2028-04-01,Baabda,1305.9714787703322,198.11343317962206 +2028-05-01,Baabda,1320.4538912867938,206.42236638307764 +2028-06-01,Baabda,1306.9450345437876,213.5719978358606 +2028-07-01,Baabda,1246.3994713551594,215.81185206738832 +2028-08-01,Baabda,1198.3855962899454,210.34064972393432 +2028-09-01,Baabda,1201.142764612631,203.78755782185908 +2028-10-01,Baabda,1199.655122086067,199.4992727887971 +2028-11-01,Baabda,1224.0496967570243,197.42779814355396 +2028-12-01,Baabda,1220.3857040542175,196.85954009290842 +2029-01-01,Baabda,1566.0096922508321,241.04549719326477 +2029-02-01,Baabda,1686.020223432841,261.9574118994717 +2029-03-01,Baabda,1988.8965911082778,281.5039396757138 +2029-04-01,Baabda,2261.2113974389467,239.84315998097156 +2029-05-01,Baabda,2127.1008487099234,313.1189866972562 +2029-06-01,Baabda,2151.705747698089,311.63158450520393 +2029-07-01,Baabda,2218.9282047465385,304.68042149905864 +2029-08-01,Baabda,2261.5029753741533,325.7940413022201 +2029-09-01,Baabda,2223.878087313259,318.9328774615807 +2029-10-01,Baabda,2057.3281473302222,316.12316990731387 +2029-11-01,Baabda,1919.01366250137,301.4694984026647 +2029-12-01,Baabda,1868.4431674940752,279.1170437748052 +2030-01-01,Baabda,1784.5198687214559,262.2315773901296 +2030-02-01,Baabda,1800.4029320967377,254.59662359311096 +2030-03-01,Baabda,1976.9977177796159,255.46302232194665 +2030-04-01,Baabda,2174.8408558700094,256.22712076982725 +2030-05-01,Baabda,2266.00557342122,288.8930740307185 +2030-06-01,Baabda,2294.0664785189547,322.86925284779824 +2030-07-01,Baabda,2280.2005167294533,333.3550408669274 +2030-08-01,Baabda,2249.788286358304,335.50395536789995 +2030-09-01,Baabda,2227.1616685699873,327.2462184110518 +2030-10-01,Baabda,2210.8631987291924,319.6571309920277 +2030-11-01,Baabda,2195.0672687018955,313.80327543433214 +2030-12-01,Baabda,2199.949428113597,311.90438525441766 +2031-01-01,Baabda,1499.8987166900872,231.9077233143654 +2031-02-01,Baabda,1537.386174917575,236.25763380061136 +2031-03-01,Baabda,1664.9780157754353,254.8158121345121 +2031-04-01,Baabda,1751.8897758635605,276.16426889955244 +2031-05-01,Baabda,1836.6302862641055,249.83249563611454 +2031-06-01,Baabda,1816.825797188801,271.3368003413408 +2031-07-01,Baabda,1968.60854737172,266.0918038922541 +2031-08-01,Baabda,2171.260312828931,268.0069418723347 +2031-09-01,Baabda,2252.94662228232,291.5380536041863 +2031-10-01,Baabda,2167.3590057230767,316.1236678535165 +2031-11-01,Baabda,1825.724874782707,302.5178411411928 +2031-12-01,Baabda,1318.7746970749045,270.46142935963246 +2032-01-01,Baabda,399.489327270334,169.28339926918807 +2032-02-01,Baabda,760.5077945324346,142.16995190116327 +2032-03-01,Baabda,1450.6340884606345,178.96837913983438 +2032-04-01,Baabda,1371.6321945263703,221.2769684016995 +2032-05-01,Baabda,1175.7083278156053,250.93610118190452 +2032-06-01,Baabda,1377.225305385529,289.6484030926978 +2032-07-01,Baabda,1275.6448941046406,257.12124772516665 +2032-08-01,Baabda,1248.9197503155199,235.37600160646667 +2032-09-01,Baabda,1243.6399653085036,213.99903281071482 +2032-10-01,Baabda,1225.413935794004,221.79553326557132 +2032-11-01,Baabda,1130.465505736658,245.71741289052153 +2032-12-01,Baabda,1073.9585378070497,231.1330112353888 +2033-01-01,Baabda,1580.117077170359,244.20704984579407 +2033-02-01,Baabda,1664.607663626441,259.787989391933 +2033-03-01,Baabda,1980.712290328326,285.20511847223946 +2033-04-01,Baabda,2320.3753657611187,239.615995079103 +2033-05-01,Baabda,2307.4746714509965,328.82887586741515 +2033-06-01,Baabda,2357.5746463791747,354.58859193510625 +2033-07-01,Baabda,2340.622322227896,344.4885093560159 +2033-08-01,Baabda,2247.887362569836,354.14689521095335 +2033-09-01,Baabda,2167.4352296925335,333.4147575263348 +2033-10-01,Baabda,2159.2996669153563,318.58774541582716 +2033-11-01,Baabda,2149.25368777359,304.3800308417308 +2033-12-01,Baabda,2112.7762679815187,299.53066187183106 +2034-01-01,Baabda,2087.9248453746654,292.6163837695816 +2034-02-01,Baabda,2084.559656299337,286.28964530148926 +2034-03-01,Baabda,2086.029447115582,282.63375194572177 +2034-04-01,Baabda,2099.91269389444,282.7181814907393 +2034-05-01,Baabda,2121.7410852070743,282.6414793330879 +2034-06-01,Baabda,2139.0221075166046,286.8586133865348 +2034-07-01,Baabda,2150.424533282116,289.5543650302153 +2034-08-01,Baabda,2157.3053758483165,293.8589255271213 +2034-09-01,Baabda,2171.8240585063786,296.40276669410673 +2034-10-01,Baabda,2189.115565153714,299.62693147099924 +2034-11-01,Baabda,2201.736866029324,303.23252303907884 +2034-12-01,Baabda,2209.3229928333567,306.7193267741618 +2035-01-01,Baabda,1517.059735835808,234.0709122731456 +2035-02-01,Baabda,1396.476249760711,221.7160186339978 +2035-03-01,Baabda,894.9120464002732,228.68923881267284 +2035-04-01,Baabda,1056.0704156664408,205.05934930818816 +2035-05-01,Baabda,1109.9327093844201,228.75920025413728 +2035-06-01,Baabda,1355.0721829613817,230.97575244762882 +2035-07-01,Baabda,1325.7612331006117,286.17135541469526 +2035-08-01,Baabda,1313.0700838663736,289.3269142703415 +2035-09-01,Baabda,1483.5439997937644,256.8677838868203 +2035-10-01,Baabda,1585.5814006907895,275.77016292265114 +2035-11-01,Baabda,1915.6426645361757,285.280363676187 +2035-12-01,Baabda,2288.6746952817243,256.9370168514329 +2036-01-01,Baabda,2336.25602057231,340.64637489925224 +2036-02-01,Baabda,2319.0248697074803,350.580899587206 +2036-03-01,Baabda,2258.026708990175,352.54170107830964 +2036-04-01,Baabda,2170.94294908993,343.2264185994115 +2036-05-01,Baabda,2088.589467383438,321.9262533947968 +2036-06-01,Baabda,2025.150722841124,309.09528630106524 +2036-07-01,Baabda,2030.501843849295,297.510862976946 +2036-08-01,Baabda,2062.613245346262,288.94744237906093 +2036-09-01,Baabda,2082.83781633502,289.62341357030834 +2036-10-01,Baabda,2122.227898513863,293.8212107128878 +2036-11-01,Baabda,2158.523542557212,296.0384913832313 +2036-12-01,Baabda,2110.8475748658884,298.05644603292154 +2037-01-01,Baabda,1490.6764664673153,233.89245388687146 +2037-02-01,Baabda,1282.7284810951758,216.0926752831994 +2037-03-01,Baabda,1170.8950958409675,230.85388472515695 +2037-04-01,Baabda,1328.5886039825268,217.44614838920586 +2037-05-01,Baabda,1167.9009673158364,219.58018905268239 +2037-06-01,Baabda,886.8243007043073,198.6001110440759 +2037-07-01,Baabda,1068.5546409092456,192.3287460379572 +2037-08-01,Baabda,1185.0505103620662,193.73928931151653 +2037-09-01,Baabda,1171.3416011192976,193.65087619687816 +2037-10-01,Baabda,1173.2122761763917,188.60815656075633 +2037-11-01,Baabda,1237.5804430972069,188.63641039714057 +2037-12-01,Baabda,1291.772426735121,194.4758162937349 +2038-01-01,Baabda,1290.6841099667588,198.3140132870077 +2038-02-01,Baabda,1248.729190391879,195.40113865654422 +2038-03-01,Baabda,1264.4950133680434,191.1821972428065 +2038-04-01,Baabda,1302.3966029388785,193.28449844648063 +2038-05-01,Baabda,1269.3449405250028,193.62611720513806 +2038-06-01,Baabda,1234.4972685408427,189.54196245146173 +2038-07-01,Baabda,1254.919058424551,188.11542035083758 +2038-08-01,Baabda,1286.6465064694237,191.26845259056694 +2038-09-01,Baabda,1305.1461205285705,197.46545763043162 +2038-10-01,Baabda,1295.7011489675358,203.87310313521954 +2038-11-01,Baabda,1282.8798664322837,208.58029002182673 +2038-12-01,Baabda,1282.718563478332,213.79151834139674 +2039-01-01,Baabda,1527.596778691581,236.7723073071222 +2039-02-01,Baabda,1468.6986025008214,228.37583700549573 +2039-03-01,Baabda,1475.0440354377,240.05668668962468 +2039-04-01,Baabda,1530.8830518728812,242.40487188389454 +2039-05-01,Baabda,1261.0245558739305,223.40560542675524 +2039-06-01,Baabda,804.0529331280909,204.10595753351407 +2039-07-01,Baabda,969.1381827835451,189.60209406603792 +2039-08-01,Baabda,1038.0051932250508,195.2787914303217 +2039-09-01,Baabda,1175.0750879801312,194.70315639889702 +2039-10-01,Baabda,1241.2777306565606,203.85053879526126 +2039-11-01,Baabda,1314.267706940378,219.5581042164747 +2039-12-01,Baabda,1308.3305256168612,237.913848976569 +2040-01-01,Baabda,1251.6368939702288,232.1535427563793 +2040-02-01,Baabda,1106.025664228821,224.83998556945724 +2040-03-01,Baabda,1169.9750951984684,202.14876154176625 +2040-04-01,Baabda,1277.7244766765364,220.0679089156713 +2040-05-01,Baabda,1341.8576669182748,246.85300686921516 +2040-06-01,Baabda,1276.4018207901804,258.3186423603378 +2040-07-01,Baabda,1158.1149714156172,268.2343373048527 +2040-08-01,Baabda,1096.4830749819957,229.07431720934557 +2040-09-01,Baabda,1034.269226960006,208.92423252942962 +2040-10-01,Baabda,1047.5148418159306,223.35973904876073 +2040-11-01,Baabda,1042.0849465939718,227.75004772599866 +2040-12-01,Baabda,1058.5918989088464,220.26320526057384 +2041-01-01,Baabda,1568.7074257125755,245.14081885159555 +2041-02-01,Baabda,1571.2617787708064,246.43924123853745 +2041-03-01,Baabda,1656.0419596387264,245.7274916905111 +2041-04-01,Baabda,1303.245267580223,222.73708498609483 +2041-05-01,Baabda,867.193440763889,215.35160223657584 +2041-06-01,Baabda,1189.4958695919208,202.12357837363135 +2041-07-01,Baabda,1122.5919805645174,224.3868821887746 +2041-08-01,Baabda,1198.7365382459739,220.9423762172342 +2041-09-01,Baabda,1231.9407902790026,237.81887957026314 +2041-10-01,Baabda,1340.4636750307639,235.27551790702836 +2041-11-01,Baabda,1226.1562694147592,243.3649029412699 +2041-12-01,Baabda,1046.9577551097925,210.7026105070903 +2042-01-01,Baabda,1027.1840106467039,195.40881993778058 +2042-02-01,Baabda,1159.3717459900824,201.4809880204097 +2042-03-01,Baabda,1246.9902779585664,210.63263984439988 +2042-04-01,Baabda,1293.5117642091554,232.11464762522115 +2042-05-01,Baabda,1296.2406673238363,261.2359892853986 +2042-06-01,Baabda,1319.801453778715,249.69206558575706 +2042-07-01,Baabda,1304.1851742965302,262.90445947067565 +2042-08-01,Baabda,1274.3339976782565,258.17006996744533 +2042-09-01,Baabda,1245.122082305683,216.9408713119625 +2042-10-01,Baabda,1039.3118392442161,241.58451473634682 +2042-11-01,Baabda,1154.711741195681,229.2548780351417 +2042-12-01,Baabda,1021.128597162385,267.97565425260507 +2043-01-01,Baabda,1553.0214395520036,240.38759038370037 +2043-02-01,Baabda,1351.7628159008596,217.159912313748 +2043-03-01,Baabda,577.0655319800226,201.00232340132723 +2043-04-01,Baabda,930.5225247999593,178.9784026124681 +2043-05-01,Baabda,1179.8137961482,176.77452038346476 +2043-06-01,Baabda,1287.3771514703274,188.10317456274413 +2043-07-01,Baabda,1348.3361376011,202.96684104649836 +2043-08-01,Baabda,1197.3266073313928,196.38437953969606 +2043-09-01,Baabda,1267.0642428515396,201.10657858218883 +2043-10-01,Baabda,1346.1823145831165,217.02537462678794 +2043-11-01,Baabda,1380.2333185742416,235.66363930827254 +2043-12-01,Baabda,1475.3069939643,269.2658513059782 +2044-01-01,Baabda,1434.743799393081,346.91184754197366 +2044-02-01,Baabda,1752.7672015937521,317.3058290233786 +2044-03-01,Baabda,2002.4106191800665,276.9444952716615 +2044-04-01,Baabda,2211.3317352849404,305.08268826094684 +2044-05-01,Baabda,2173.169595751595,316.4659044343142 +2044-06-01,Baabda,1999.5006487178669,322.85746812100354 +2044-07-01,Baabda,1646.064270372941,300.7680950701812 +2044-08-01,Baabda,999.2838417819582,245.30165547503344 +2044-09-01,Baabda,243.79719420784545,153.40857925125886 +2044-10-01,Baabda,803.9593533291579,142.44833149209126 +2044-11-01,Baabda,1429.4564344931912,159.2802502175361 +2044-12-01,Baabda,1613.191054222133,177.64090066984855 +2045-01-01,Baabda,1494.7326300761729,230.0596974169233 +2045-02-01,Baabda,1228.3511088624036,208.57521834754107 +2045-03-01,Baabda,1001.1280226340556,219.9334542197449 +2045-04-01,Baabda,1056.5279720035396,215.14646684355904 +2045-05-01,Baabda,1188.8390399963826,220.07416090688162 +2045-06-01,Baabda,1232.6847532225252,226.72380826613028 +2045-07-01,Baabda,1091.402421553178,214.88356969104134 +2045-08-01,Baabda,999.6576650968478,195.4760242326788 +2045-09-01,Baabda,1155.0336387023813,186.21109886882445 +2045-10-01,Baabda,1267.6051780102464,191.47740557113696 +2045-11-01,Baabda,1260.1336705208794,195.61261825303112 +2045-12-01,Baabda,1267.2611783860089,199.71816625096707 +2046-01-01,Baabda,1252.9058530453879,200.63050512760506 +2046-02-01,Baabda,1258.2698669554557,198.3646654812827 +2046-03-01,Baabda,1277.9685917311335,198.43561359392638 +2046-04-01,Baabda,1303.6968733472156,201.59566318662195 +2046-05-01,Baabda,1313.2991808154645,208.06439931348737 +2046-06-01,Baabda,1349.7744754039263,219.48819810236608 +2046-07-01,Baabda,1403.5099653065463,242.83557690668644 +2046-08-01,Baabda,1421.0787401847858,296.39365612284445 +2046-09-01,Baabda,1482.0121530321255,343.77404876755327 +2046-10-01,Baabda,1751.9978778871575,305.83281655147687 +2046-11-01,Baabda,1780.7797937294333,283.75592904062324 +2046-12-01,Baabda,1711.0956425001225,305.6112673762264 +2047-01-01,Baabda,1495.7846058628145,233.50791032130525 +2047-02-01,Baabda,1497.1353852769346,234.51485897643613 +2047-03-01,Baabda,1634.7999828420393,248.9017143075286 +2047-04-01,Baabda,1581.2012143716224,250.05295670670006 +2047-05-01,Baabda,1589.7484999280562,235.87089558326332 +2047-06-01,Baabda,1804.3617613802853,247.84488804110458 +2047-07-01,Baabda,2051.4855375673224,263.0388219543423 +2047-08-01,Baabda,2253.1031789482104,254.72979653862694 +2047-09-01,Baabda,2110.715245521145,314.31083015439106 +2047-10-01,Baabda,2003.4573527978052,306.8954706327164 +2047-11-01,Baabda,1851.0777037611326,289.45566102738997 +2047-12-01,Baabda,1651.7204289391782,280.6262633875119 +2048-01-01,Baabda,1565.1118645659906,239.93543678929302 +2048-02-01,Baabda,1575.2996656286227,210.36555625529002 +2048-03-01,Baabda,1505.059136094377,208.16902334338795 +2048-04-01,Baabda,1331.8541918486958,222.26488444642007 +2048-05-01,Baabda,966.7486038451616,226.05025303608804 +2048-06-01,Baabda,792.2883726675415,202.33313073388967 +2048-07-01,Baabda,937.2009063023065,202.18789642479976 +2048-08-01,Baabda,1433.31807113167,223.36139886943607 +2048-09-01,Baabda,1359.1657501537638,258.3614749549869 +2048-10-01,Baabda,1169.0796760777173,254.37388487970986 +2048-11-01,Baabda,1301.7785937292715,215.62189481232468 +2048-12-01,Baabda,1437.3816021130397,196.34995670313526 +2049-01-01,Baabda,1441.7819070263756,224.0727611259715 +2049-02-01,Baabda,1128.730843710564,206.96863180977527 +2049-03-01,Baabda,768.8154988019709,199.38592547912515 +2049-04-01,Baabda,962.8824334389826,191.45332895011896 +2049-05-01,Baabda,1177.3253952419802,177.33730102588174 +2049-06-01,Baabda,1345.2605429376092,197.36709481296737 +2049-07-01,Baabda,1318.6963479018389,209.5784139637005 +2049-08-01,Baabda,1276.359175037752,215.74083018493684 +2049-09-01,Baabda,1323.2247317526997,223.96712276121377 +2049-10-01,Baabda,1384.3508297272892,239.66841774876497 +2049-11-01,Baabda,1422.5726166419374,283.804884529319 +2049-12-01,Baabda,1542.5267590881774,347.6648712974594 +2050-01-01,Baabda,1986.6321158223661,314.6286673712616 +2050-02-01,Baabda,2241.3328095977954,276.71717360895127 +2050-03-01,Baabda,2293.79799446297,349.5434563377792 +2050-04-01,Baabda,2203.3119252643537,341.754674049063 +2050-05-01,Baabda,2162.472595904156,341.1342884079866 +2050-06-01,Baabda,2132.023386990204,327.92844159350955 +2050-07-01,Baabda,2072.032289423262,319.3044006560716 +2050-08-01,Baabda,1973.1690926372028,307.2779117587606 +2050-09-01,Baabda,1823.8031239988675,294.1718570517737 +2050-10-01,Baabda,1570.6403692354245,273.15387980441426 +2050-11-01,Baabda,1218.9728686947037,218.02972289619413 +2050-12-01,Baabda,987.1605469521461,181.62304100057491 +2051-01-01,Baabda,1469.377959254619,227.4190149347593 +2051-02-01,Baabda,1190.0994274169836,208.26739538207818 +2051-03-01,Baabda,837.3287336826354,206.83802236508006 +2051-04-01,Baabda,996.0682670407301,202.09861651491983 +2051-05-01,Baabda,1169.989546583012,192.206278935797 +2051-06-01,Baabda,1302.3995782239317,215.50655571784233 +2051-07-01,Baabda,1206.044475897539,213.75904118351647 +2051-08-01,Baabda,1099.612578977044,202.47388352715623 +2051-09-01,Baabda,1129.206110077741,191.80140256695813 +2051-10-01,Baabda,1195.2308023719452,187.7013873046066 +2051-11-01,Baabda,1252.5871433441016,188.80715061727446 +2051-12-01,Baabda,1262.6222131073398,190.84529975184773 +2052-01-01,Baabda,1251.8251870100196,190.1160483169228 +2052-02-01,Baabda,1262.8650530397713,189.19188782858618 +2052-03-01,Baabda,1268.3319976446535,188.07953133934691 +2052-04-01,Baabda,1280.7368819527082,187.50503051871704 +2052-05-01,Baabda,1276.1470797175364,187.35871732618813 +2052-06-01,Baabda,1286.0521578600012,187.86521160526004 +2052-07-01,Baabda,1256.0963503840253,187.37878271390747 +2052-08-01,Baabda,1286.4103255083014,188.24732076716916 +2052-09-01,Baabda,1292.1501462566273,193.5879597720578 +2052-10-01,Baabda,1260.2374512971376,194.37801597105505 +2052-11-01,Baabda,1228.2883445158066,192.69922723391312 +2052-12-01,Baabda,1232.781237466391,190.57323670071187 +2053-01-01,Baabda,1521.7297999272937,234.39241031672782 +2053-02-01,Baabda,1529.9384697086332,235.88772432066582 +2053-03-01,Baabda,1623.9804295864596,247.38437079473886 +2053-04-01,Baabda,1612.0202087136067,252.2686882110799 +2053-05-01,Baabda,1482.311381700326,230.3297225771189 +2053-06-01,Baabda,1159.5602515502344,238.486192030321 +2053-07-01,Baabda,1323.098352978062,220.78288589278856 +2053-08-01,Baabda,1428.5863761355124,219.31066183868938 +2053-09-01,Baabda,1078.5843976634603,228.15333804396994 +2053-10-01,Baabda,999.0832934013533,209.22957498510547 +2053-11-01,Baabda,1092.9667130899202,221.90263780525888 +2053-12-01,Baabda,1216.1851682801632,236.82520025930882 +2054-01-01,Baabda,1207.2712142609917,251.83713483549843 +2054-02-01,Baabda,1213.4318253239744,247.21412852080755 +2054-03-01,Baabda,1117.6180123568906,241.48753510277865 +2054-04-01,Baabda,1225.568508936526,225.07267398568425 +2054-05-01,Baabda,1235.3465707432701,245.64414102893244 +2054-06-01,Baabda,1181.052789852467,236.1962480993027 +2054-07-01,Baabda,1165.1367149811197,235.03008575650534 +2054-08-01,Baabda,1154.168964193846,239.27433943554166 +2054-09-01,Baabda,1236.5036024283354,243.2708003302056 +2054-10-01,Baabda,1177.0405471182034,242.17026545266495 +2054-11-01,Baabda,1115.2218452873176,226.15218446800424 +2054-12-01,Baabda,1047.9207557053214,212.43030862679817 +2055-01-01,Baabda,1622.1734397975265,250.4039350097211 +2055-02-01,Baabda,1679.2085208240653,264.8606042426625 +2055-03-01,Baabda,1766.6086527016255,256.7156613219278 +2055-04-01,Baabda,1690.306192391992,255.24723641292996 +2055-05-01,Baabda,1633.5084257685005,242.0220434663595 +2055-06-01,Baabda,1769.4001784826628,229.47521922978962 +2055-07-01,Baabda,1834.6648979661534,235.33978063084092 +2055-08-01,Baabda,1829.1305844068543,247.622674937584 +2055-09-01,Baabda,1785.9730829495481,244.0770305595612 +2055-10-01,Baabda,1649.1691928462412,232.76813746754402 +2055-11-01,Baabda,1727.5209161562766,229.40272195118231 +2055-12-01,Baabda,1927.7258638578912,253.0778692327472 +2056-01-01,Baabda,2125.729525660913,252.64596545057867 +2056-02-01,Baabda,2126.5094753855547,272.6604888874514 +2056-03-01,Baabda,2118.4881068823215,306.3631845845954 +2056-04-01,Baabda,2177.228592965265,291.8003052708858 +2056-05-01,Baabda,2081.614974178184,301.27173999042714 +2056-06-01,Baabda,1947.1394571493108,297.8691813758423 +2056-07-01,Baabda,1924.4048790176378,286.63156836060386 +2056-08-01,Baabda,1841.8415688747793,266.9932617222429 +2056-09-01,Baabda,1564.3415490977118,249.77787831467074 +2056-10-01,Baabda,512.4641593831386,186.13293053624318 +2056-11-01,Baabda,624.2762926012531,139.34211541663169 +2056-12-01,Baabda,1386.632731682798,197.70011938901706 +2057-01-01,Baabda,1568.3338149180472,244.38261276711236 +2057-02-01,Baabda,1532.6030499940705,241.11638997855258 +2057-03-01,Baabda,1607.8266152713431,242.3640034103779 +2057-04-01,Baabda,1577.4614227400814,239.00590954743956 +2057-05-01,Baabda,1529.625639737333,234.33017626262955 +2057-06-01,Baabda,1519.9562466751483,227.94965038343105 +2057-07-01,Baabda,1393.8551653091458,228.72233379269338 +2057-08-01,Baabda,1082.1920724706188,227.81464241394627 +2057-09-01,Baabda,1196.6724696604265,205.90421647437466 +2057-10-01,Baabda,1045.7578651519382,233.79129703793708 +2057-11-01,Baabda,1133.6337592775176,222.59063347517633 +2057-12-01,Baabda,1238.2523616383714,251.70335328906816 +2058-01-01,Baabda,1405.519274479092,290.7836097799005 +2058-02-01,Baabda,1288.4437203217533,340.51467734989217 +2058-03-01,Baabda,1368.2963332608515,227.20539601384647 +2058-04-01,Baabda,622.7509631306827,246.3353088005849 +2058-05-01,Baabda,989.8812326128708,185.82342930765304 +2058-06-01,Baabda,1156.928966121344,211.0453819189945 +2058-07-01,Baabda,1225.4365337923837,243.47530867985614 +2058-08-01,Baabda,1136.8183060460487,270.0629156367157 +2058-09-01,Baabda,1249.5832388823674,261.1437124770772 +2058-10-01,Baabda,1170.8266642847457,293.5134799596847 +2058-11-01,Baabda,1174.4186125851948,274.59732441224867 +2058-12-01,Baabda,1197.1915152219567,232.3582539730013 +2059-01-01,Baabda,1504.1586164849634,234.66475922586886 +2059-02-01,Baabda,1491.9814831637136,235.06086620880643 +2059-03-01,Baabda,1240.238506091575,232.8030951352113 +2059-04-01,Baabda,714.9388953796883,198.55228054494893 +2059-05-01,Baabda,931.1462720593115,188.16784302049956 +2059-06-01,Baabda,1138.7486993245666,176.66144971057201 +2059-07-01,Baabda,1214.0470717688893,180.91360598026802 +2059-08-01,Baabda,1276.737815480823,183.79664994470568 +2059-09-01,Baabda,1233.8637453448875,182.54241567263105 +2059-10-01,Baabda,1261.3910118163074,183.91920925912564 +2059-11-01,Baabda,1299.7492368026774,188.04465666271335 +2059-12-01,Baabda,1289.092899184298,191.5485104446222 +2060-01-01,Baabda,1245.2316011316864,188.80131358123293 +2060-02-01,Baabda,1245.5011477894757,185.37752770445604 +2060-03-01,Baabda,1285.718075852607,186.96958159008688 +2060-04-01,Baabda,1300.8515799148613,191.60585724895427 +2060-05-01,Baabda,1271.108221959703,193.53115702005817 +2060-06-01,Baabda,1267.2538110134963,194.40195427368343 +2060-07-01,Baabda,1210.864579363847,191.8610638990097 +2060-08-01,Baabda,1220.9439242022806,186.8566861204876 +2060-09-01,Baabda,1223.2298640446468,184.81765174822087 +2060-10-01,Baabda,1234.0353201162843,181.71557600322365 +2060-11-01,Baabda,1241.8589738437252,180.35652405550292 +2060-12-01,Baabda,1252.314621401259,179.18936582030042 +2061-01-01,Baabda,1581.812989650642,246.7658755049872 +2061-02-01,Baabda,1355.8708344777858,217.88328060650161 +2061-03-01,Baabda,762.0644353361828,212.0660609796006 +2061-04-01,Baabda,1009.3513563202998,193.33395188137897 +2061-05-01,Baabda,992.2634441787419,194.78427552378997 +2061-06-01,Baabda,1116.4876165570627,185.40706329125067 +2061-07-01,Baabda,1291.197913359386,193.8557349531157 +2061-08-01,Baabda,1291.4046956705783,202.4241534554787 +2061-09-01,Baabda,1313.586650023693,217.91761123080266 +2061-10-01,Baabda,1203.8838522280055,214.18972776385638 +2061-11-01,Baabda,1131.172206776896,203.73297738531917 +2061-12-01,Baabda,1241.9442653485814,199.56987049485377 +2062-01-01,Baabda,1266.2063689945544,206.43254661655294 +2062-02-01,Baabda,1178.8484578287005,200.99327737864678 +2062-03-01,Baabda,1183.7942316684432,193.177762755832 +2062-04-01,Baabda,1247.3247850066823,191.62719516585804 +2062-05-01,Baabda,1274.0402236993202,192.66896317026658 +2062-06-01,Baabda,1276.8981975132106,192.82694121365256 +2062-07-01,Baabda,1295.9813924834923,194.42271125335088 +2062-08-01,Baabda,1278.963612061044,194.19929939045363 +2062-09-01,Baabda,1289.4441953409278,193.24053164103677 +2062-10-01,Baabda,1278.9796927683549,194.09121740081287 +2062-11-01,Baabda,1261.2506066978478,192.62656397323832 +2062-12-01,Baabda,1220.7863049345851,188.98203116787067 +2063-01-01,Baabda,1526.135205329292,237.2282600466308 +2063-02-01,Baabda,1428.9291006375845,227.25661992413183 +2063-03-01,Baabda,1348.4795180046126,238.7166212461844 +2063-04-01,Baabda,1243.7791661449178,221.15876150593925 +2063-05-01,Baabda,1132.426643627391,208.0150104271708 +2063-06-01,Baabda,1024.6280282657058,215.38565622409766 +2063-07-01,Baabda,1122.241747009692,217.1443007781741 +2063-08-01,Baabda,1203.9505127812197,230.20740301457428 +2063-09-01,Baabda,1260.5807425201724,239.35648211651772 +2063-10-01,Baabda,1343.2659685100887,254.30503920658828 +2063-11-01,Baabda,1345.629903324919,311.32623282830207 +2063-12-01,Baabda,1534.4702538852691,327.54773405794845 +2064-01-01,Baabda,1756.5670656473183,294.0725075631302 +2064-02-01,Baabda,1598.2966355659335,277.86318757299546 +2064-03-01,Baabda,1127.351728248319,266.57482092999635 +2064-04-01,Baabda,369.06023695055023,178.20675198051487 +2064-05-01,Baabda,837.4755852520435,145.4480885136814 +2064-06-01,Baabda,1352.6094970188353,162.48332605062618 +2064-07-01,Baabda,1548.2009110449735,188.9941386375745 +2064-08-01,Baabda,1452.9376674929588,226.2086552558688 +2064-09-01,Baabda,1245.2061695284942,236.28105571458525 +2064-10-01,Baabda,1265.8614484487525,209.66527791237525 +2064-11-01,Baabda,1393.2078282897296,193.23256450179525 +2064-12-01,Baabda,1412.1295077856987,192.88272963079498 +2065-01-01,Baabda,1472.0810765655062,229.94255096215008 +2065-02-01,Baabda,1047.9700604290592,202.8804104954444 +2065-03-01,Baabda,1141.3097113541066,230.97748603811192 +2065-04-01,Baabda,1373.7062515688817,241.3330703464888 +2065-05-01,Baabda,1576.6535620080367,247.57901243259727 +2065-06-01,Baabda,1443.1237605853362,316.35757347157204 +2065-07-01,Baabda,1770.7234719301016,275.00710647330567 +2065-08-01,Baabda,1861.0498674975331,272.65346231325924 +2065-09-01,Baabda,1858.0276862847584,270.79750616147953 +2065-10-01,Baabda,1702.529371791445,283.90873397623784 +2065-11-01,Baabda,1712.2492030192923,257.02444329489197 +2065-12-01,Baabda,1695.7084599670288,237.44009927093066 +2066-01-01,Baabda,1696.4580901201766,232.49536438200818 +2066-02-01,Baabda,1535.2823650245325,214.82442474764434 +2066-03-01,Baabda,922.9178378844047,219.1771384865864 +2066-04-01,Baabda,924.6826069616314,183.18999470910458 +2066-05-01,Baabda,1032.067870221293,199.28459342689726 +2066-06-01,Baabda,1096.585651476208,219.40228393996668 +2066-07-01,Baabda,1308.3197579185735,288.64164808331236 +2066-08-01,Baabda,1293.7130918310838,319.0843822043329 +2066-09-01,Baabda,1173.3571442224309,328.2828317501409 +2066-10-01,Baabda,1311.243896404836,261.6563112077438 +2066-11-01,Baabda,1310.7853483060526,266.9321618789394 +2066-12-01,Baabda,1350.8409025751116,274.12620275601296 +2067-01-01,Baabda,1639.8445078094974,251.05503655451668 +2067-02-01,Baabda,1851.760885881427,286.6863424428892 +2067-03-01,Baabda,2327.4766627817326,251.40094318325202 +2067-04-01,Baabda,2382.3947576528503,285.7729800101681 +2067-05-01,Baabda,2354.2413353579873,381.1316142643816 +2067-06-01,Baabda,2338.929810073388,355.4487110090537 +2067-07-01,Baabda,2315.3131307635826,357.1025932148399 +2067-08-01,Baabda,2209.141925485838,339.73773373422983 +2067-09-01,Baabda,2134.7352884760094,323.8472929595007 +2067-10-01,Baabda,2087.8262359271903,301.06431773336874 +2067-11-01,Baabda,2041.670497217775,290.09415715627915 +2067-12-01,Baabda,2006.1869643136893,279.13661121632197 +2068-01-01,Baabda,1980.7777465994948,271.41247894290916 +2068-02-01,Baabda,1967.3852801741625,265.32570443833725 +2068-03-01,Baabda,1917.3877400599558,257.84775123475134 +2068-04-01,Baabda,1723.9587915464792,242.14809762542356 +2068-05-01,Baabda,1462.7544080053938,211.8616079573059 +2068-06-01,Baabda,788.9731258770335,196.4387663304905 +2068-07-01,Baabda,1151.6705039905419,199.00854680614069 +2068-08-01,Baabda,1315.251109490557,315.2237315258135 +2068-09-01,Baabda,1479.6877470044294,342.5608858359666 +2068-10-01,Baabda,1542.67013949169,351.6014679931004 +2068-11-01,Baabda,1988.4561072401746,312.77433415525337 +2068-12-01,Baabda,1976.1708718953275,293.4548882898461 +2069-01-01,Baabda,1404.801522380085,217.7779188785231 +2069-02-01,Baabda,1112.6638085428308,202.79901473377225 +2069-03-01,Baabda,1069.6381405494262,228.39318213155275 +2069-04-01,Baabda,986.2107226189952,221.04240807659977 +2069-05-01,Baabda,1113.153030413709,208.18706006139303 +2069-06-01,Baabda,1275.0072621817071,218.72952173535825 +2069-07-01,Baabda,1259.149913770099,219.45592381145724 +2069-08-01,Baabda,1172.516342834441,221.17923262760144 +2069-09-01,Baabda,1225.2097745672631,214.99570902011072 +2069-10-01,Baabda,1262.4092677056803,221.84322544630865 +2069-11-01,Baabda,1284.1668897381228,226.3106512363668 +2069-12-01,Baabda,1276.3006610983741,232.709711779773 +2070-01-01,Baabda,1243.5291005202143,233.95679038049184 +2070-02-01,Baabda,1138.7426070742194,223.9336128260244 +2070-03-01,Baabda,1097.8885429689972,208.32998906398944 +2070-04-01,Baabda,1117.6006565274138,202.26399920276285 +2070-05-01,Baabda,1203.4199202800785,201.91151783990813 +2070-06-01,Baabda,1223.8518403009914,203.93705233734897 +2070-07-01,Baabda,1227.4505184128702,202.11470755424438 +2070-08-01,Baabda,1248.554002774346,199.98075910302765 +2070-09-01,Baabda,1274.942868512343,197.7286406409545 +2070-10-01,Baabda,1316.538628677238,199.24137354075728 +2070-11-01,Baabda,1294.3743135140812,199.8514590724207 +2070-12-01,Baabda,1330.0226913781346,202.80335793120597 +2071-01-01,Baabda,1644.6133230286991,252.84092061012024 +2071-02-01,Baabda,1683.2087207378756,261.51701536818115 +2071-03-01,Baabda,1958.9757078116165,277.5490111828366 +2071-04-01,Baabda,2178.5727134080757,241.8136806442518 +2071-05-01,Baabda,2037.4450257213707,299.0073941827125 +2071-06-01,Baabda,2229.765184671715,310.2366343247666 +2071-07-01,Baabda,2354.1808378952405,303.1766792945805 +2071-08-01,Baabda,2270.151137261912,340.83244079695487 +2071-09-01,Baabda,2122.245183503219,332.9493622514289 +2071-10-01,Baabda,1973.7931940971564,305.34693171245675 +2071-11-01,Baabda,1709.2478488018894,280.7366137987423 +2071-12-01,Baabda,1330.5014289112069,218.4132890118071 +2072-01-01,Baabda,507.40312866764765,154.79876205786763 +2072-02-01,Baabda,813.8810080597758,144.00474533933271 +2072-03-01,Baabda,1266.0447118400011,169.90144271886703 +2072-04-01,Baabda,1592.5312415341746,208.8864900515182 +2072-05-01,Baabda,1450.8208230177784,271.38433576123657 +2072-06-01,Baabda,1176.5932625985497,308.3946022242076 +2072-07-01,Baabda,1440.2293749496052,250.41620846149243 +2072-08-01,Baabda,1404.1751540362814,290.19470540429927 +2072-09-01,Baabda,1460.4096000230475,260.70270734487235 +2072-10-01,Baabda,1425.2632660916495,256.5115587062201 +2072-11-01,Baabda,1294.7052077160613,269.59143435266685 +2072-12-01,Baabda,1183.7732629928305,266.6062745317936 +2073-01-01,Baabda,1587.589718101651,245.5181421972242 +2073-02-01,Baabda,1429.1641481567815,224.3285210495854 +2073-03-01,Baabda,498.64495207304356,209.30188783919328 +2073-04-01,Baabda,850.9802624279508,165.99147692383883 +2073-05-01,Baabda,1255.697591346786,175.85207504315932 +2073-06-01,Baabda,1304.3121197921305,184.11158247539447 +2073-07-01,Baabda,1263.4275235950533,188.1568144342347 +2073-08-01,Baabda,1240.8436932394052,183.87484594096492 +2073-09-01,Baabda,1234.0669856500642,186.09974334396287 +2073-10-01,Baabda,1272.2247330959494,187.37713211445813 +2073-11-01,Baabda,1255.5447892072718,190.20021044638713 +2073-12-01,Baabda,1272.3974413092717,191.1283268406666 +2074-01-01,Baabda,1304.2647277516414,197.95127792086993 +2074-02-01,Baabda,1297.6896311447097,203.00255485469555 +2074-03-01,Baabda,1321.0520652627129,209.89485877544905 +2074-04-01,Baabda,1339.7265127387911,221.64544859161907 +2074-05-01,Baabda,1337.7734506217737,232.22947033104893 +2074-06-01,Baabda,1390.8926314776743,254.24174471150297 +2074-07-01,Baabda,1388.5695005721436,334.62627907969807 +2074-08-01,Baabda,1669.877176816012,333.41451777445957 +2074-09-01,Baabda,1802.7417895089775,284.4774991943119 +2074-10-01,Baabda,1675.224614137927,301.23173831215206 +2074-11-01,Baabda,1630.4284390175505,297.32570075938884 +2074-12-01,Baabda,1790.0337803261052,279.2114967924565 +2075-01-01,Baabda,1662.85097032293,255.14602423663973 +2075-02-01,Baabda,1683.640562111301,261.5942984630689 +2075-03-01,Baabda,1909.9447102989545,274.1044959900702 +2075-04-01,Baabda,2181.5650000900787,245.439936979739 +2075-05-01,Baabda,2121.308110391724,278.3239261287846 +2075-06-01,Baabda,2115.6553521512624,315.762232680241 +2075-07-01,Baabda,2212.8331207948445,288.9450817452116 +2075-08-01,Baabda,2228.368925900354,322.4089845745338 +2075-09-01,Baabda,2217.774219186647,314.9996741770981 +2075-10-01,Baabda,2119.9944512006477,314.2774493163653 +2075-11-01,Baabda,1964.9568808498477,299.84399913042637 +2075-12-01,Baabda,1706.7233902744306,275.4790857035571 +2076-01-01,Baabda,1331.5213849634672,212.40401891154642 +2076-02-01,Baabda,686.4866694573473,158.47052514353635 +2076-03-01,Baabda,908.6047332554903,150.00723783850256 +2076-04-01,Baabda,1274.4497504348471,195.86823063702943 +2076-05-01,Baabda,1527.125833571743,297.03110103197264 +2076-06-01,Baabda,1046.4229122014326,331.60689928923534 +2076-07-01,Baabda,1102.1232945211623,252.99194584912178 +2076-08-01,Baabda,1196.1670254019964,241.3369985887537 +2076-09-01,Baabda,1289.7786315489236,207.81990772801367 +2076-10-01,Baabda,1175.9057592309166,237.35986538373118 +2076-11-01,Baabda,1216.4021515686807,236.4927197355916 +2076-12-01,Baabda,1162.2937592727355,232.0601225160371 +2077-01-01,Baabda,1461.46171748993,228.30941651480526 +2077-02-01,Baabda,788.2573573013952,189.59223657547176 +2077-03-01,Baabda,653.9522107618737,165.66248202353978 +2077-04-01,Baabda,1101.8531811424104,168.26973756154814 +2077-05-01,Baabda,1460.0334389841876,181.41949165842564 +2077-06-01,Baabda,1418.1776955777455,204.40340661975625 +2077-07-01,Baabda,1343.3831380690856,207.96462564844907 +2077-08-01,Baabda,1331.3621363730047,218.47750562948983 +2077-09-01,Baabda,1346.1952074850135,222.47195629689142 +2077-10-01,Baabda,1215.3282861848625,226.72551419293544 +2077-11-01,Baabda,1179.7669708286735,210.42811305229736 +2077-12-01,Baabda,1113.0515873614218,202.43455499837728 +2078-01-01,Baabda,1189.1491780431109,197.86794570174317 +2078-02-01,Baabda,1268.5719331321523,208.2298096650083 +2078-03-01,Baabda,1279.2024849467377,222.09404279280045 +2078-04-01,Baabda,1310.85958875214,238.26198714199006 +2078-05-01,Baabda,1281.1935882083635,248.21177295893068 +2078-06-01,Baabda,1201.1375932838482,245.6620947559037 +2078-07-01,Baabda,1173.4326597906843,222.2586140127578 +2078-08-01,Baabda,1201.2187052216061,224.8357253630573 +2078-09-01,Baabda,1194.4378180651663,249.13902255796856 +2078-10-01,Baabda,1254.2111531022672,276.69033984136706 +2078-11-01,Baabda,1133.7007740313334,311.52710801491895 +2078-12-01,Baabda,1211.6110217115806,263.4541367509836 +2079-01-01,Baabda,1492.1539080165546,231.48078055177086 +2079-02-01,Baabda,1566.4562683692827,242.0234819776114 +2079-03-01,Baabda,1718.637281708599,267.79951039405046 +2079-04-01,Baabda,1754.719838670048,262.2465803247892 +2079-05-01,Baabda,1720.821140937595,257.02899858052314 +2079-06-01,Baabda,1668.109574133973,248.96864196564763 +2079-07-01,Baabda,1698.366948002119,227.92468852471956 +2079-08-01,Baabda,1684.0620608271608,218.62314567252258 +2079-09-01,Baabda,1545.9265181422184,219.02629767210425 +2079-10-01,Baabda,1229.7854796184927,223.96103675207098 +2079-11-01,Baabda,1231.6072749925709,218.65914533872495 +2079-12-01,Baabda,1119.4430663765033,210.64767044273745 +2080-01-01,Baabda,842.4509702620766,212.34155432679876 +2080-02-01,Baabda,964.5842964893718,198.20020491603705 +2080-03-01,Baabda,1286.0046241392713,215.74459244513423 +2080-04-01,Baabda,1360.6213729459466,272.9099138288211 +2080-05-01,Baabda,1262.7551091730463,282.3621038497547 +2080-06-01,Baabda,1215.4349714060534,278.0348130308229 +2080-07-01,Baabda,1183.908425942387,253.02244044341768 +2080-08-01,Baabda,1184.4164204451483,211.75161717388846 +2080-09-01,Baabda,1149.2362957763614,239.2963966080714 +2080-10-01,Baabda,1102.6826481111502,252.31496032301726 +2080-11-01,Baabda,1142.89695508983,257.8898737950004 +2080-12-01,Baabda,1197.054935469994,283.53160427635464 +2081-01-01,Baabda,1581.9463107570703,246.23899309528684 +2081-02-01,Baabda,1428.9435520221282,225.15951949190705 +2081-03-01,Baabda,700.9930967745947,222.93541511434285 +2081-04-01,Baabda,863.8657969523263,176.6816810803589 +2081-05-01,Baabda,1116.0982792558248,188.62824961215358 +2081-06-01,Baabda,1306.5346577268172,194.77368033514588 +2081-07-01,Baabda,1295.1310276792603,219.14813773089827 +2081-08-01,Baabda,1293.461609403974,214.2792658680636 +2081-09-01,Baabda,1284.977867435461,230.9369864136343 +2081-10-01,Baabda,1310.106699953458,232.5322216222261 +2081-11-01,Baabda,1256.3886367204352,230.06771988352068 +2081-12-01,Baabda,1316.4194047547521,230.91772327257468 +2082-01-01,Baabda,1327.5580219122196,277.5927105727272 +2082-02-01,Baabda,1388.7740868396063,337.9984260910208 +2082-03-01,Baabda,1677.8364893738512,319.9189584823324 +2082-04-01,Baabda,1924.9557317931885,284.06862081340034 +2082-05-01,Baabda,2037.5240832956395,287.9468102637222 +2082-06-01,Baabda,1736.2766133466698,300.43528258232885 +2082-07-01,Baabda,1484.8046705748473,297.64058718394773 +2082-08-01,Baabda,1520.9973130832618,249.17465337513198 +2082-09-01,Baabda,1506.3389337079439,231.13760340592387 +2082-10-01,Baabda,1485.9706989551921,238.10823242010017 +2082-11-01,Baabda,1417.5647868568012,246.7761756144001 +2082-12-01,Baabda,1494.1415401122847,272.5184635650004 +2083-01-01,Baabda,1573.1617107975894,244.70604726814912 +2083-02-01,Baabda,1678.816633278496,265.10395239611535 +2083-03-01,Baabda,1980.6466923769167,277.08668657617994 +2083-04-01,Baabda,2092.361420429601,239.7586935510501 +2083-05-01,Baabda,1548.3903375266893,298.54240464174944 +2083-06-01,Baabda,1199.028257861421,229.4602808437118 +2083-07-01,Baabda,708.5027870888101,162.86630200777682 +2083-08-01,Baabda,1161.5068672163034,166.2721341575824 +2083-09-01,Baabda,1138.6408098213305,203.44950767765357 +2083-10-01,Baabda,1084.9975537553573,200.59017148519496 +2083-11-01,Baabda,1072.0914755960912,200.2044383814781 +2083-12-01,Baabda,1199.4575489905153,195.65723976551914 +2084-01-01,Baabda,1345.1335974420092,213.7330557687218 +2084-02-01,Baabda,1376.0366081666841,239.7811748999746 +2084-03-01,Baabda,1259.64876989734,239.46049754550404 +2084-04-01,Baabda,1249.291235906439,218.15297380256214 +2084-05-01,Baabda,1292.0325516569087,210.98094399188844 +2084-06-01,Baabda,1313.615694473021,209.23223069818596 +2084-07-01,Baabda,1256.8469722988575,209.18986838606156 +2084-08-01,Baabda,1209.079124971489,204.06177863987278 +2084-09-01,Baabda,1205.3827583336993,201.05531778699958 +2084-10-01,Baabda,1220.1304671007313,198.95489771342415 +2084-11-01,Baabda,1210.0200234494805,195.2720507141347 +2084-12-01,Baabda,1217.753001822921,190.74714902258086 +2085-01-01,Baabda,1575.1652110802697,243.7353472523219 +2085-02-01,Baabda,1656.7667957497645,261.1815932733782 +2085-03-01,Baabda,1739.904619268358,256.4188946064078 +2085-04-01,Baabda,1472.1931456358407,236.0489482355946 +2085-05-01,Baabda,463.8108813919834,225.16341084926805 +2085-06-01,Baabda,930.8337962886127,162.3121063267416 +2085-07-01,Baabda,1352.1075239263007,188.1991398614552 +2085-08-01,Baabda,1421.5066145114738,232.78425617054648 +2085-09-01,Baabda,1371.6280857993922,277.96360672385197 +2085-10-01,Baabda,1367.224947281244,326.87688986834263 +2085-11-01,Baabda,1572.6988414514672,291.08580779751924 +2085-12-01,Baabda,1718.538247220402,278.10540151565357 +2086-01-01,Baabda,1818.5449452285466,267.06665345976967 +2086-02-01,Baabda,1594.8579144457206,269.5119197210934 +2086-03-01,Baabda,1556.769023596779,246.35716310614316 +2086-04-01,Baabda,1763.2716579941816,227.24169075928 +2086-05-01,Baabda,1750.93555944295,242.17498672036362 +2086-06-01,Baabda,1580.4464837298126,234.89943942690627 +2086-07-01,Baabda,936.1550227660118,232.31131793279383 +2086-08-01,Baabda,788.2132239064406,184.01001989251722 +2086-09-01,Baabda,1003.2649148632843,182.3208664973806 +2086-10-01,Baabda,1116.8454300047615,209.46986169153502 +2086-11-01,Baabda,1324.7302259895823,246.85344948806193 +2086-12-01,Baabda,1209.0310245297967,263.8628122649237 +2087-01-01,Baabda,1430.2482853580452,223.17118342004514 +2087-02-01,Baabda,1000.2160269251514,199.4081117488185 +2087-03-01,Baabda,977.6960943580256,213.82491762187445 +2087-04-01,Baabda,1173.7325260199673,220.85270901586335 +2087-05-01,Baabda,1477.7733635931024,245.91974503084225 +2087-06-01,Baabda,1369.453010745315,316.79945462024443 +2087-07-01,Baabda,1508.9727693811653,263.1049012596717 +2087-08-01,Baabda,1365.8264216260334,221.33591969935102 +2087-09-01,Baabda,549.9983012499126,225.55120950760312 +2087-10-01,Baabda,1000.3533859184374,173.58353357762655 +2087-11-01,Baabda,1051.123437544653,190.52647586379794 +2087-12-01,Baabda,1133.1360365922014,181.6725220991512 +2088-01-01,Baabda,1248.964875472159,183.35603210399177 +2088-02-01,Baabda,1329.5500460954092,191.3356292217873 +2088-03-01,Baabda,1383.8944776722358,212.77260975617767 +2088-04-01,Baabda,1297.67610068173,221.20259921421945 +2088-05-01,Baabda,1274.3657340521565,209.99630148238862 +2088-06-01,Baabda,1349.16794229381,203.40074583470323 +2088-07-01,Baabda,1393.287452584961,210.56805437767824 +2088-08-01,Baabda,1370.1448353602875,221.41763820393228 +2088-09-01,Baabda,1353.1490153751358,232.79817100054123 +2088-10-01,Baabda,1294.7091039226784,249.05626205485225 +2088-11-01,Baabda,1240.5626704821254,263.2331777341955 +2088-12-01,Baabda,1166.8591925065198,249.53339595042303 +2089-01-01,Baabda,1691.7786751328092,258.7934156220593 +2089-02-01,Baabda,1828.5396361232067,276.48268705365933 +2089-03-01,Baabda,1922.1654811343167,248.10034366426132 +2089-04-01,Baabda,1675.4742547219084,278.3214456189976 +2089-05-01,Baabda,1568.6741308560286,249.04184927865498 +2089-06-01,Baabda,1502.2850369829366,210.6610043354958 +2089-07-01,Baabda,1279.4305901341445,207.73093211859089 +2089-08-01,Baabda,1092.9373852801107,192.10307497469637 +2089-09-01,Baabda,968.6772261206712,198.0957007620741 +2089-10-01,Baabda,951.369638766024,207.45644388502393 +2089-11-01,Baabda,1171.4586998381744,206.32251894823156 +2089-12-01,Baabda,1328.9130517335584,244.63373441406134 +2090-01-01,Baabda,1457.3453397788069,279.74419779574646 +2090-02-01,Baabda,1319.1634676551798,331.69936974330227 +2090-03-01,Baabda,1478.5739986328751,278.5319662079832 +2090-04-01,Baabda,1382.1900643775155,251.81395267339988 +2090-05-01,Baabda,1192.5504955797987,256.57537881118594 +2090-06-01,Baabda,1381.0397625038797,252.23099183929838 +2090-07-01,Baabda,1527.5318891413747,307.4592748312165 +2090-08-01,Baabda,1799.9047843706996,298.8726905136849 +2090-09-01,Baabda,2131.78451410451,257.3752095097156 +2090-10-01,Baabda,2195.9707635963623,305.385457994576 +2090-11-01,Baabda,2250.4740187229295,333.90119563891335 +2090-12-01,Baabda,2167.879822287615,317.75101137094964 +2091-01-01,Baabda,1623.4139919844401,250.6016196521509 +2091-02-01,Baabda,1646.5955712752857,257.4426074503593 +2091-03-01,Baabda,1789.2075011627794,264.8763172117221 +2091-04-01,Baabda,1942.5201145839687,257.9921925184075 +2091-05-01,Baabda,2011.7294953269447,256.0229536055377 +2091-06-01,Baabda,2135.8038408508046,289.885609909652 +2091-07-01,Baabda,2352.1107478994663,293.23171617882423 +2091-08-01,Baabda,2341.912462499028,332.55054422805495 +2091-09-01,Baabda,2232.573287040905,351.350521549445 +2091-10-01,Baabda,2058.6647587202797,320.686607102213 +2091-11-01,Baabda,1883.7801952219875,303.29764333690696 +2091-12-01,Baabda,1762.1872374324364,276.3558583116135 +2092-01-01,Baabda,1487.3916100884217,223.293419991556 +2092-02-01,Baabda,318.4281110385833,163.5751745332993 +2092-03-01,Baabda,671.6973066995714,139.68794827555922 +2092-04-01,Baabda,1389.9192882245795,168.10621756135183 +2092-05-01,Baabda,1793.5796117082307,208.8733313620533 +2092-06-01,Baabda,1421.7701397590365,242.68794507884326 +2092-07-01,Baabda,1230.207332534954,271.66871837027367 +2092-08-01,Baabda,1383.4202739068635,215.58855085920283 +2092-09-01,Baabda,1542.6637638808618,189.73716658410456 +2092-10-01,Baabda,1502.8578501957843,196.42170706243866 +2092-11-01,Baabda,1419.7621057086562,218.95394793311257 +2092-12-01,Baabda,1331.169167885273,233.4820355612223 +2093-01-01,Baabda,1553.5377223488415,240.48113049998028 +2093-02-01,Baabda,1604.223970112727,249.5222290457686 +2093-03-01,Baabda,1539.792047083631,230.72445559738634 +2093-04-01,Baabda,1320.5223228430157,245.1306478393463 +2093-05-01,Baabda,1094.1066014658697,228.4459367653498 +2093-06-01,Baabda,1270.7877412554092,204.7537209945071 +2093-07-01,Baabda,1169.038376287575,236.01006232566237 +2093-08-01,Baabda,1252.8001595858814,225.37004008089264 +2093-09-01,Baabda,1202.39358861699,242.86082462340318 +2093-10-01,Baabda,1124.304611313194,215.89996088156954 +2093-11-01,Baabda,1009.8327149378238,209.28029172796226 +2093-12-01,Baabda,1092.1844964814286,203.92898376462176 +2094-01-01,Baabda,1258.9844312490486,218.38252700195795 +2094-02-01,Baabda,1318.3570237255415,254.11721205472458 +2094-03-01,Baabda,1254.7382035973928,259.76003063478004 +2094-04-01,Baabda,1150.4155712592049,249.42195743452768 +2094-05-01,Baabda,1121.7941082894367,226.0417326232881 +2094-06-01,Baabda,1211.8676046273526,215.00099278259376 +2094-07-01,Baabda,1155.9928139314134,240.68373927708018 +2094-08-01,Baabda,1117.4778197587918,225.43297494816494 +2094-09-01,Baabda,1103.4202354438446,222.84189344051487 +2094-10-01,Baabda,1128.2411967989635,213.89000103479867 +2094-11-01,Baabda,1191.3848214000554,211.75022476876637 +2094-12-01,Baabda,1177.1405025279644,206.46577069373708 +2095-01-01,Baabda,1557.7481757397395,241.09097627976834 +2095-02-01,Baabda,1548.5535531638895,238.95724913797494 +2095-03-01,Baabda,1759.8231609373654,273.4976378874977 +2095-04-01,Baabda,1973.2929211675091,268.0003394745373 +2095-05-01,Baabda,2001.5516118811563,246.67749927525273 +2095-06-01,Baabda,1711.1068352391317,293.23601327012807 +2095-07-01,Baabda,1772.6062606477687,268.30715732636907 +2095-08-01,Baabda,1940.754495425298,262.29978679865894 +2095-09-01,Baabda,2182.833746644877,267.06360123397224 +2095-10-01,Baabda,2341.805635597597,296.6144860424689 +2095-11-01,Baabda,2332.9171840217377,338.8644467495916 +2095-12-01,Baabda,2220.9472898556874,344.74865858319345 +2096-01-01,Baabda,2080.4537629260203,324.45545125493555 +2096-02-01,Baabda,1999.0970017123257,303.83334123863835 +2096-03-01,Baabda,2001.267117957981,286.5991649725313 +2096-04-01,Baabda,2004.2473618195309,275.51964987661654 +2096-05-01,Baabda,1951.620094759081,271.0675497641271 +2096-06-01,Baabda,1893.7809783669943,269.6767952415079 +2096-07-01,Baabda,1861.7575602994557,262.7550479462195 +2096-08-01,Baabda,1824.0068601848864,261.1574336613264 +2096-09-01,Baabda,1801.6195403229856,263.00509070972953 +2096-10-01,Baabda,1972.1273178278861,288.9041026169833 +2096-11-01,Baabda,2180.4613110156088,259.1441080670751 +2096-12-01,Baabda,1845.0509096854203,295.09731773297267 +2097-01-01,Baabda,1529.224542976123,237.48774534553814 +2097-02-01,Baabda,1437.763713722006,224.7180348559516 +2097-03-01,Baabda,1612.7675719829044,249.20842150464864 +2097-04-01,Baabda,1611.5037842365282,282.12730377277967 +2097-05-01,Baabda,1498.4231169839766,219.95138950426426 +2097-06-01,Baabda,1282.003290783536,242.50524492862115 +2097-07-01,Baabda,1622.338355597614,231.15528971734187 +2097-08-01,Baabda,1626.5427167381652,297.9112486087355 +2097-09-01,Baabda,1753.2637908371432,262.8635356698032 +2097-10-01,Baabda,1756.108305028174,259.3428070443621 +2097-11-01,Baabda,1773.4839697384418,262.3707533537546 +2097-12-01,Baabda,1587.9719713908576,230.00692434067435 +2098-01-01,Baabda,1151.0326595472475,219.04180777419248 +2098-02-01,Baabda,1114.6242380323606,198.20362599087338 +2098-03-01,Baabda,1149.6667203473805,185.86550576177225 +2098-04-01,Baabda,862.7738673378283,224.06903575067804 +2098-05-01,Baabda,1078.5161786275994,214.96365603862523 +2098-06-01,Baabda,1264.689823698903,263.94472441525045 +2098-07-01,Baabda,1188.5059497506727,269.38827230200855 +2098-08-01,Baabda,1233.2443901729946,250.90034126757746 +2098-09-01,Baabda,1234.619538588502,252.6731496247499 +2098-10-01,Baabda,1235.2153040003311,228.65508339166527 +2098-11-01,Baabda,1218.0773787338326,218.20192007003192 +2098-12-01,Baabda,1144.8237355222116,228.57498782285543 +2099-01-01,Baabda,1447.7744144838566,225.7867103977522 +2099-02-01,Baabda,1015.7667084559265,199.32646701404502 +2099-03-01,Baabda,954.3602961252599,210.28237157577888 +2099-04-01,Baabda,1099.59578986853,212.4877660858419 +2099-05-01,Baabda,1192.57344777878,203.6587004100989 +2099-06-01,Baabda,1233.8394471836202,214.09370713778952 +2099-07-01,Baabda,1187.0554274471529,207.57696530850365 +2099-08-01,Baabda,1127.6617246148066,204.16170906575263 +2099-09-01,Baabda,1144.1236226131623,194.86776450375822 +2099-10-01,Baabda,1240.605387074674,196.28340711528114 +2099-11-01,Baabda,1258.6210922719656,201.09503360726944 +2099-12-01,Baabda,1257.9337305845727,203.83303690836266 +2100-01-01,Baabda,1327.6906346174446,215.43203899074672 +2100-02-01,Baabda,1366.29254961769,232.89503997939772 +2100-03-01,Baabda,1349.9928046547298,238.3276514921506 +2100-04-01,Baabda,1297.1317651972483,248.91133204621946 +2100-05-01,Baabda,1293.2291121291082,271.77329629404437 +2100-06-01,Baabda,1382.2563707301279,313.17448003516756 +2100-07-01,Baabda,1633.5140929781255,316.4605930081532 +2100-08-01,Baabda,1975.1405731855016,281.49629527938134 +2100-09-01,Baabda,2161.100281093461,293.43574502472416 +2100-10-01,Baabda,2187.624097260654,329.5517093290622 +2100-11-01,Baabda,2153.4100193125687,319.1897439323114 +2100-12-01,Baabda,2054.657049753716,328.17687986370004 +2101-01-01,Baabda,1527.3831248887182,235.2326945336053 +2101-02-01,Baabda,1461.1629138624512,227.40559805096723 +2101-03-01,Baabda,1307.0487444799255,237.45347926981884 +2101-04-01,Baabda,1444.8219399494692,235.1139067006087 +2101-05-01,Baabda,1506.5432366149253,247.42361633248402 +2101-06-01,Baabda,1543.2976412774187,228.16200599638546 +2101-07-01,Baabda,1372.5875443889058,219.08696411778698 +2101-08-01,Baabda,1083.0900418357007,222.9040813884833 +2101-09-01,Baabda,1248.1989520913394,208.83579175111333 +2101-10-01,Baabda,1168.113912717496,262.760211832765 +2101-11-01,Baabda,1353.7660328230586,272.1423297575224 +2101-12-01,Baabda,1362.301983960242,353.37725480626244 +2102-01-01,Baabda,1831.0133731245216,319.3236914608092 +2102-02-01,Baabda,2122.0737504120625,275.1636736691176 +2102-03-01,Baabda,2276.3521980335927,311.79749280292754 +2102-04-01,Baabda,2267.190161913087,342.60380142164945 +2102-05-01,Baabda,2158.4779215197304,328.2945242646759 +2102-06-01,Baabda,1953.2062050528793,323.38881360407527 +2102-07-01,Baabda,1806.0936606416872,303.4850370911498 +2102-08-01,Baabda,1594.8549391606678,275.0823885621571 +2102-09-01,Baabda,850.5556467467973,199.54098039387736 +2102-10-01,Baabda,310.02923553420453,140.42691888266074 +2102-11-01,Baabda,1011.2274152265377,159.29804718366586 +2102-12-01,Baabda,1750.391365638709,198.60858535074598 +2103-01-01,Baabda,1554.5199914570958,242.1138684346082 +2103-02-01,Baabda,1588.7214598637647,250.3716238339083 +2103-03-01,Baabda,1543.7617857457067,230.0466401609442 +2103-04-01,Baabda,1426.447571223035,242.81358428273853 +2103-05-01,Baabda,1410.1153814849717,230.13794874053838 +2103-06-01,Baabda,1283.2251411786872,226.02170412047263 +2103-07-01,Baabda,940.1595439271613,209.15984407429036 +2103-08-01,Baabda,1018.0878558380883,205.64422400803875 +2103-09-01,Baabda,1074.7665402193345,219.43898441934306 +2103-10-01,Baabda,1140.0092284254083,213.02938401464866 +2103-11-01,Baabda,1169.3902391651677,217.9325127319766 +2103-12-01,Baabda,1217.0351788837938,219.06941612475856 +2104-01-01,Baabda,1342.599079617466,241.7353555508289 +2104-02-01,Baabda,1420.6236632518978,276.66207678375685 +2104-03-01,Baabda,1374.0365082097792,340.24390527039264 +2104-04-01,Baabda,1721.179450266136,331.9065153635814 +2104-05-01,Baabda,2008.6791197462856,282.87164113339804 +2104-06-01,Baabda,1995.5416777540784,295.8397555210404 +2104-07-01,Baabda,1705.4610193304604,313.7938144564829 +2104-08-01,Baabda,1467.7830647859018,286.4952233133528 +2104-09-01,Baabda,1176.0458101487743,233.70558574250913 +2104-10-01,Baabda,871.9878292665236,198.286275839278 +2104-11-01,Baabda,1168.967394487022,187.30739198241704 +2104-12-01,Baabda,1020.9186978858988,230.6642686554543 +2105-01-01,Baabda,1587.8457342964605,244.8633060559091 +2105-02-01,Baabda,1705.4220572642887,267.05634412913076 +2105-03-01,Baabda,2153.803890381507,283.9845140112918 +2105-04-01,Baabda,2356.054417397268,243.0921114132821 +2105-05-01,Baabda,2274.3264539531347,373.3530859789484 +2105-06-01,Baabda,2271.344509928698,325.8520796985001 +2105-07-01,Baabda,2308.937944976173,345.01721756845916 +2105-08-01,Baabda,2253.534595280914,334.1833467112647 +2105-09-01,Baabda,2218.5683369353505,335.5894914600344 +2105-10-01,Baabda,2159.751060161988,315.2875424095533 +2105-11-01,Baabda,2104.8423161867513,308.4501140045709 +2105-12-01,Baabda,2072.5035179035813,293.0501502393969 +2106-01-01,Baabda,2075.0750142709276,288.272725274546 +2106-02-01,Baabda,2089.293193138623,279.6697825021365 +2106-03-01,Baabda,2083.2176610601355,281.62944056121944 +2106-04-01,Baabda,2099.0730967884956,281.3977388161717 +2106-05-01,Baabda,2119.2069924232533,281.70628103726045 +2106-06-01,Baabda,2132.878568922617,285.97215849120573 +2106-07-01,Baabda,2139.5545418608735,287.74855390528205 +2106-08-01,Baabda,2146.7365966186435,292.1685457089301 +2106-09-01,Baabda,2151.263280306617,291.6113807931313 +2106-10-01,Baabda,2146.3291242466057,294.9863310571501 +2106-11-01,Baabda,2151.661968503736,295.0050132609733 +2106-12-01,Baabda,2156.1260295253533,295.800583753103 +2107-01-01,Baabda,1401.5282837809223,217.30806053024574 +2107-02-01,Baabda,419.6380284902371,167.17737269022047 +2107-03-01,Baabda,871.0442388639602,168.17450073968905 +2107-04-01,Baabda,1352.163770981829,172.59358886319168 +2107-05-01,Baabda,1570.1089266528395,217.31505944075997 +2107-06-01,Baabda,1485.923802795545,270.15283181118775 +2107-07-01,Baabda,1546.252807736378,220.9864352349378 +2107-08-01,Baabda,1331.5645974368579,279.081698815647 +2107-09-01,Baabda,1534.7241448764696,227.39970568756985 +2107-10-01,Baabda,1518.4443768274373,256.31769165134347 +2107-11-01,Baabda,1452.7446990052272,258.88674365014174 +2107-12-01,Baabda,1491.6071639679822,252.9067417211224 +2108-01-01,Baabda,1704.782370977866,266.1959484184041 +2108-02-01,Baabda,1884.4163395023943,275.11124177822967 +2108-03-01,Baabda,2048.1676696923632,256.94737228820156 +2108-04-01,Baabda,1862.5869564280754,287.03379823758814 +2108-05-01,Baabda,1729.2786012214722,290.4552234805157 +2108-06-01,Baabda,1645.3404260235875,263.77278543573993 +2108-07-01,Baabda,1400.416802293218,231.32800327983423 +2108-08-01,Baabda,1263.5867721855157,217.03648620408654 +2108-09-01,Baabda,1413.3947123344813,219.57629769532133 +2108-10-01,Baabda,1465.987267735978,258.8891780537989 +2108-11-01,Baabda,1501.080329896901,314.91223851241296 +2108-12-01,Baabda,1629.3588948810711,274.3202173505051 +2109-01-01,Baabda,1604.5230571006869,248.65252911803418 +2109-02-01,Baabda,1543.2092328072686,240.47518280922705 +2109-03-01,Baabda,1455.8544386067085,233.9990143742266 +2109-04-01,Baabda,1095.2163119505663,240.60236195785996 +2109-05-01,Baabda,1205.374540879743,209.77067652525764 +2109-06-01,Baabda,1322.5262481664176,226.1180659319006 +2109-07-01,Baabda,1288.3523365665503,230.6878565514957 +2109-08-01,Baabda,1146.9850675929479,219.78817380452512 +2109-09-01,Baabda,1235.9295140933223,216.66166181069684 +2109-10-01,Baabda,1239.244265002988,244.76812456140584 +2109-11-01,Baabda,1228.1773380472769,234.53376248968272 +2109-12-01,Baabda,1011.9724407718649,222.53834912390394 +2110-01-01,Baabda,1041.9074920925889,205.17421812014584 +2110-02-01,Baabda,1246.1425342387859,221.5025656951525 +2110-03-01,Baabda,1302.508246968491,255.22392515366778 +2110-04-01,Baabda,1258.3395027937229,261.6382468260608 +2110-05-01,Baabda,1243.9214839466258,281.2727819829985 +2110-06-01,Baabda,1209.9746857724806,303.3168234869328 +2110-07-01,Baabda,1305.086260626906,241.8375451770724 +2110-08-01,Baabda,1015.348468385601,246.26407482993602 +2110-09-01,Baabda,777.0755985106575,211.64009566695933 +2110-10-01,Baabda,906.241294321502,194.62728415158324 +2110-11-01,Baabda,1026.6169354836015,194.17214287996035 +2110-12-01,Baabda,1221.3835579889403,196.57934392046357 +2111-01-01,Baabda,1544.8328883648328,238.04221766335255 +2111-02-01,Baabda,1621.6259873477509,250.8378582403779 +2111-03-01,Baabda,1853.7897469271793,287.29529376375785 +2111-04-01,Baabda,1965.7882605018358,243.89196055426373 +2111-05-01,Baabda,1759.0665884524271,291.37990957873285 +2111-06-01,Baabda,1945.6205032895687,272.74857003795466 +2111-07-01,Baabda,2076.350844837757,254.7858892562266 +2111-08-01,Baabda,2038.836892405272,283.41701210117617 +2111-09-01,Baabda,2055.2071941280637,287.05000915285035 +2111-10-01,Baabda,2013.2545414370338,282.8131416758192 +2111-11-01,Baabda,1839.3657066698552,284.19292293952935 +2111-12-01,Baabda,1602.7934247231349,263.7072594039689 +2112-01-01,Baabda,1255.9098991873627,206.52560722908214 +2112-02-01,Baabda,705.4001314993601,161.23831300452548 +2112-03-01,Baabda,891.0713784374069,147.8007183388707 +2112-04-01,Baabda,1047.6621892661808,168.67581268976357 +2112-05-01,Baabda,1392.235476798319,184.3520904912474 +2112-06-01,Baabda,1587.5146275741197,247.6024620102491 +2112-07-01,Baabda,1195.5254972724454,293.48570562705106 +2112-08-01,Baabda,1147.2893259096907,246.87502715684099 +2112-09-01,Baabda,1433.7099586772392,202.96320788346463 +2112-10-01,Baabda,1465.1122505698772,192.38369532353605 +2112-11-01,Baabda,1350.520421870818,207.08554773389915 +2112-12-01,Baabda,1219.5430608230997,223.1373415207207 +2113-01-01,Baabda,1576.0144424425766,243.70574711694547 +2113-02-01,Baabda,1637.0742340645538,256.99665051980645 +2113-03-01,Baabda,1778.0253881714402,265.0101725279602 +2113-04-01,Baabda,1973.4959489523249,260.30210040365944 +2113-05-01,Baabda,2174.7001673910686,253.393133727571 +2113-06-01,Baabda,2332.370581653406,311.77215287395103 +2113-07-01,Baabda,2376.9278838880887,328.2391231390243 +2113-08-01,Baabda,2341.835246767887,364.71709433264823 +2113-09-01,Baabda,2287.0357382581724,356.75082188638515 +2113-10-01,Baabda,2238.0444112128857,342.1510023414239 +2113-11-01,Baabda,2155.203691158883,323.0427594357243 +2113-12-01,Baabda,2083.2831173313043,307.65767872927233 +2114-01-01,Baabda,2056.0193052673267,292.5330607716809 +2114-02-01,Baabda,2058.1719948433856,283.4093861472957 +2114-03-01,Baabda,2070.622571029042,279.0521540076264 +2114-04-01,Baabda,2089.2855424056297,279.01173737418253 +2114-05-01,Baabda,2103.9041096333312,279.97696920300723 +2114-06-01,Baabda,2101.3915522460857,282.576626450813 +2114-07-01,Baabda,2064.4858330866045,281.0902478148438 +2114-08-01,Baabda,1937.7896947099764,275.65925001663635 +2114-09-01,Baabda,1796.3144653930178,272.12506762249916 +2114-10-01,Baabda,1418.5250955277584,220.12273832531247 +2114-11-01,Baabda,245.15831627953122,172.98566617037864 +2114-12-01,Baabda,923.8054645919212,164.12849419786698 +2017-01-01,Beirut,288.9748918969635,484.20768100261256 +2017-02-01,Beirut,736.6858323253173,302.34490056297835 +2017-03-01,Beirut,390.85251261198226,261.0728259631015 +2017-04-01,Beirut,493.48005971517784,148.99236021659178 +2017-05-01,Beirut,697.7284964404921,100.72465130899056 +2017-06-01,Beirut,288.0179500242392,262.5707728238114 +2017-07-01,Beirut,402.0753289587577,473.8670967353541 +2017-08-01,Beirut,625.0673473345412,507.8368720979313 +2017-09-01,Beirut,785.9787165502192,511.75114077758843 +2017-10-01,Beirut,629.3185076576685,475.1078179608781 +2017-11-01,Beirut,686.0400559997612,340.69352577521437 +2017-12-01,Beirut,452.6847637661543,225.0908764885523 +2018-01-01,Beirut,436.1137001899457,301.074557118195 +2018-02-01,Beirut,623.449339615212,213.33814467977675 +2018-03-01,Beirut,319.6146496160293,97.76840897006957 +2018-04-01,Beirut,299.75970678991314,113.58160777624326 +2018-05-01,Beirut,302.45872678791244,156.4811984437011 +2018-06-01,Beirut,395.9784670307628,287.56953059747696 +2018-07-01,Beirut,539.6827060845266,334.36884593467056 +2018-08-01,Beirut,709.0737371513433,259.2202396187625 +2018-09-01,Beirut,478.65853289146725,342.01827139928906 +2018-10-01,Beirut,471.320941184611,367.42624315826737 +2018-11-01,Beirut,525.8963852805743,382.6904228221466 +2018-12-01,Beirut,538.5035742787663,449.85631493422983 +2019-01-01,Beirut,317.0946623907888,448.6855910645125 +2019-02-01,Beirut,624.440642611971,328.0976549647383 +2019-03-01,Beirut,790.3905202720896,150.76331744363475 +2019-04-01,Beirut,354.2635737839389,113.61536573292105 +2019-05-01,Beirut,327.9112407479472,157.10519505894342 +2019-06-01,Beirut,768.2732729315891,265.7853608934693 +2019-07-01,Beirut,893.6170465801089,225.374415753063 +2019-08-01,Beirut,392.9823107558376,350.35278176726774 +2019-09-01,Beirut,613.7582166672116,356.28859889704523 +2019-10-01,Beirut,858.5736896291181,247.73334956479468 +2019-11-01,Beirut,386.3234026874754,350.62153577050765 +2019-12-01,Beirut,391.0234437724124,448.8706653139865 +2020-01-01,Beirut,686.3025996780144,461.0910800958277 +2020-02-01,Beirut,739.2970205579135,324.41812384805456 +2020-03-01,Beirut,335.0898865367387,233.03788549266488 +2020-04-01,Beirut,343.0476245180896,135.14337820057574 +2020-05-01,Beirut,308.6660278376177,183.78747367773101 +2020-06-01,Beirut,535.7402300508189,234.5440004347763 +2020-07-01,Beirut,523.8788008973205,186.63055190154063 +2020-08-01,Beirut,556.0800093658411,190.3321402844559 +2020-09-01,Beirut,385.120609029835,379.33954497231286 +2020-10-01,Beirut,474.1595661087034,516.7509371361435 +2020-11-01,Beirut,808.4580416632951,506.1622430882588 +2020-12-01,Beirut,692.840523668937,382.3497069878263 +2021-01-01,Beirut,663.8515916289821,241.86942533714063 +2021-02-01,Beirut,302.5740783158284,395.2680274590248 +2021-03-01,Beirut,522.3054677831171,456.9545499944093 +2021-04-01,Beirut,543.3798190019983,420.67792922879823 +2021-05-01,Beirut,554.0252861628969,470.025892750089 +2021-06-01,Beirut,615.147527444238,414.4426847099276 +2021-07-01,Beirut,598.2884322601964,348.9058595669574 +2021-08-01,Beirut,495.93883475838044,325.2465120529627 +2021-09-01,Beirut,481.67768231376294,384.53378991849036 +2021-10-01,Beirut,647.3609526297619,386.1817089573356 +2021-11-01,Beirut,542.3763507270444,284.92546750468927 +2021-12-01,Beirut,414.61482448504887,189.72205008628296 +2022-01-01,Beirut,326.8283509527693,232.81312539621337 +2022-02-01,Beirut,518.8393922737323,247.16416870258556 +2022-03-01,Beirut,398.68528000823994,290.1125438393415 +2022-04-01,Beirut,487.4156813947097,328.8061412489909 +2022-05-01,Beirut,558.8882082347441,378.72356134831864 +2022-06-01,Beirut,594.3933570884619,227.0284005401219 +2022-07-01,Beirut,351.3135324007759,83.45269175414637 +2022-08-01,Beirut,271.1140001992422,111.09816638544312 +2022-09-01,Beirut,372.9321576517098,188.17185507618703 +2022-10-01,Beirut,355.6631723226524,273.07890615323333 +2022-11-01,Beirut,501.6201482724316,308.8951159507396 +2022-12-01,Beirut,545.648321892799,412.11526401323715 +2023-01-01,Beirut,427.55597994700645,358.1297258022873 +2023-02-01,Beirut,541.8076946997932,302.968569765675 +2023-03-01,Beirut,786.622267482552,152.16512564160593 +2023-04-01,Beirut,363.3514738254198,121.53952478779686 +2023-05-01,Beirut,694.3832764115257,159.78043127252246 +2023-06-01,Beirut,582.043747923509,238.88342292104628 +2023-07-01,Beirut,649.574055923878,263.8282093214015 +2023-08-01,Beirut,379.5264585766773,377.677564426245 +2023-09-01,Beirut,550.0794408872368,369.9370148805075 +2023-10-01,Beirut,444.52857486186036,393.0350738978665 +2023-11-01,Beirut,681.1339767676368,422.32981168266946 +2023-12-01,Beirut,501.5837810348679,259.60538016585224 +2024-01-01,Beirut,322.29816081328534,141.00230507884922 +2024-02-01,Beirut,305.06075891260707,184.57071341582144 +2024-03-01,Beirut,436.7410478976214,280.5726038718094 +2024-04-01,Beirut,522.8451380418151,458.417429248259 +2024-05-01,Beirut,698.0651634417004,474.28980356399444 +2024-06-01,Beirut,564.3856280086393,427.93383927805473 +2024-07-01,Beirut,595.6655674180854,397.41557804249277 +2024-08-01,Beirut,588.6064911395016,275.4211638079124 +2024-09-01,Beirut,426.47558493403767,311.1825233879069 +2024-10-01,Beirut,589.9511015919978,347.16078516325797 +2024-11-01,Beirut,536.2538979918529,200.95347219346758 +2024-12-01,Beirut,300.2544195300387,124.55427057894914 +2025-01-01,Beirut,590.9813694861465,277.52985569188655 +2025-02-01,Beirut,611.9571639480657,237.00541902382335 +2025-03-01,Beirut,290.38405805404585,417.65918555814153 +2025-04-01,Beirut,637.20916943282,488.6733468735796 +2025-05-01,Beirut,827.468333535501,289.03280619282924 +2025-06-01,Beirut,408.1061177373175,178.01057225825605 +2025-07-01,Beirut,261.8128091385848,108.00360086211549 +2025-08-01,Beirut,530.8331992007386,301.63141692934505 +2025-09-01,Beirut,633.3433115042767,275.6903658493726 +2025-10-01,Beirut,467.65572032836917,270.22671207486394 +2025-11-01,Beirut,368.1466767059619,326.65131866056225 +2025-12-01,Beirut,599.8236749367534,406.6886595531018 +2026-01-01,Beirut,560.6737521531468,443.194262313779 +2026-02-01,Beirut,485.6282856792034,469.1377431394847 +2026-03-01,Beirut,566.9172404045862,375.91012257600767 +2026-04-01,Beirut,674.0635839511974,326.3998313610442 +2026-05-01,Beirut,564.666895413163,162.51196521170968 +2026-06-01,Beirut,264.1612993765023,97.46818889797129 +2026-07-01,Beirut,357.39614577883435,256.80608906196005 +2026-08-01,Beirut,469.1437164593784,353.5137603406394 +2026-09-01,Beirut,677.729010562673,415.0905135120436 +2026-10-01,Beirut,460.5179683922837,291.9732638006033 +2026-11-01,Beirut,483.6536012621844,205.8225620173616 +2026-12-01,Beirut,324.61342158095374,232.52789737225683 +2027-01-01,Beirut,560.3874951842049,292.0869104184134 +2027-02-01,Beirut,484.66617420623135,297.0492438888535 +2027-03-01,Beirut,350.2134106047722,455.3156951134061 +2027-04-01,Beirut,630.663992569908,492.01116268606694 +2027-05-01,Beirut,720.929405158297,401.7200190830987 +2027-06-01,Beirut,588.7046106665919,360.4434296365401 +2027-07-01,Beirut,505.1066192693611,189.67845252099718 +2027-08-01,Beirut,314.13741957444483,119.06276950582321 +2027-09-01,Beirut,324.30098225851833,141.1141423115388 +2027-10-01,Beirut,309.4805870885933,179.00597532591112 +2027-11-01,Beirut,603.3700464261058,268.54463873783834 +2027-12-01,Beirut,386.62277655256827,429.56714537802156 +2028-01-01,Beirut,663.1909372928446,499.95429443634976 +2028-02-01,Beirut,555.2761236676157,456.05468246111957 +2028-03-01,Beirut,591.0457708743073,520.4241267887857 +2028-04-01,Beirut,613.4332005561137,412.22930697254986 +2028-05-01,Beirut,589.207682213088,394.58032325529956 +2028-06-01,Beirut,647.7765267631098,367.5743025578465 +2028-07-01,Beirut,550.94569614069,230.99519308499293 +2028-08-01,Beirut,299.7141320056396,145.8996557751024 +2028-09-01,Beirut,329.4358613105623,155.94500008740386 +2028-10-01,Beirut,306.01085942380945,144.50089768347735 +2028-11-01,Beirut,338.15718268372973,195.87582057801083 +2028-12-01,Beirut,412.59883470485653,287.6231573260024 +2029-01-01,Beirut,366.9577972460033,399.68099714238554 +2029-02-01,Beirut,434.94498474289367,422.60738859240195 +2029-03-01,Beirut,657.8945661017183,353.1208997503686 +2029-04-01,Beirut,760.465170443976,211.8813311741407 +2029-05-01,Beirut,269.11910033050816,179.62805916259742 +2029-06-01,Beirut,377.3797627842511,311.72726893486896 +2029-07-01,Beirut,577.3937825185837,323.63960574351677 +2029-08-01,Beirut,721.8496968800112,276.0971673211913 +2029-09-01,Beirut,540.9068468476676,114.11904685376604 +2029-10-01,Beirut,263.2674729217281,106.41870012218334 +2029-11-01,Beirut,451.2022715876476,230.24929560934285 +2029-12-01,Beirut,347.7041998098989,335.19099606897265 +2030-01-01,Beirut,507.7863754336014,435.86670061374843 +2030-02-01,Beirut,714.9920292558554,448.69055394941455 +2030-03-01,Beirut,748.5929905795147,456.3028611707028 +2030-04-01,Beirut,442.35886020265923,341.5156759095164 +2030-05-01,Beirut,501.4193568837047,355.4607965882713 +2030-06-01,Beirut,554.3602042446186,379.6605126604602 +2030-07-01,Beirut,684.5094942547717,341.4829691194325 +2030-08-01,Beirut,352.9415706877501,262.04910124519637 +2030-09-01,Beirut,386.6204875255929,294.4984072103725 +2030-10-01,Beirut,519.2287326147782,324.66650934450877 +2030-11-01,Beirut,543.0890096985097,416.9637613112353 +2030-12-01,Beirut,525.9866089505697,431.1041232606178 +2031-01-01,Beirut,738.2409303819303,207.32915946217182 +2031-02-01,Beirut,287.47401034444124,387.0649301475162 +2031-03-01,Beirut,547.5747052686974,443.2653625328972 +2031-04-01,Beirut,810.3398275922801,181.6325476958668 +2031-05-01,Beirut,307.39417757965316,174.86589538320862 +2031-06-01,Beirut,301.8851326350515,243.45534277918804 +2031-07-01,Beirut,800.0187849961823,249.20463815139516 +2031-08-01,Beirut,650.1081450718607,263.1554971658181 +2031-09-01,Beirut,724.3442218950763,261.7506043970224 +2031-10-01,Beirut,319.2557867689811,410.3918333020274 +2031-11-01,Beirut,487.9547858265148,533.6408407147226 +2031-12-01,Beirut,923.3900346576373,452.31152991714924 +2032-01-01,Beirut,890.0043447472793,171.69147566322712 +2032-02-01,Beirut,263.9768655288579,103.81887218753334 +2032-03-01,Beirut,319.2132468744052,157.01138274850246 +2032-04-01,Beirut,362.1688699000902,248.06991242945728 +2032-05-01,Beirut,621.3563973776005,304.90692096472833 +2032-06-01,Beirut,571.611340307149,297.35608114082123 +2032-07-01,Beirut,450.8894979129574,501.85628561059946 +2032-08-01,Beirut,645.8394183956528,517.6944022347191 +2032-09-01,Beirut,682.298679987631,368.02713134068426 +2032-10-01,Beirut,560.0690632405867,209.10380438841287 +2032-11-01,Beirut,291.56756215852295,194.94391831196762 +2032-12-01,Beirut,517.8784638933543,233.11448279610178 +2033-01-01,Beirut,646.6742702565562,250.93244585137268 +2033-02-01,Beirut,330.9681976944428,367.6765586655168 +2033-03-01,Beirut,468.86579257740306,437.1776604464285 +2033-04-01,Beirut,583.359244010431,414.287939201522 +2033-05-01,Beirut,754.5427117959807,326.2157565814463 +2033-06-01,Beirut,602.1280563964378,105.74676341736591 +2033-07-01,Beirut,270.2884330432614,95.1323933330085 +2033-08-01,Beirut,418.9278656947238,216.01246758467587 +2033-09-01,Beirut,679.3216589494436,214.48059044489565 +2033-10-01,Beirut,395.6509304180516,393.7333931609656 +2033-11-01,Beirut,463.0470345672131,455.4804353205729 +2033-12-01,Beirut,754.0602157728586,421.32089853944757 +2034-01-01,Beirut,467.0413352004191,412.6822736133016 +2034-02-01,Beirut,536.5618878573587,348.7320207374701 +2034-03-01,Beirut,523.6076154992501,165.86215377197374 +2034-04-01,Beirut,294.3472382081486,174.92741447730748 +2034-05-01,Beirut,425.0967933933364,226.84251637540348 +2034-06-01,Beirut,374.52141107712384,291.393588504695 +2034-07-01,Beirut,503.5727397212276,397.46734368917987 +2034-08-01,Beirut,597.6285752255897,446.4556703774611 +2034-09-01,Beirut,656.3365360330245,328.1555552885961 +2034-10-01,Beirut,478.8431210555369,176.52573913161024 +2034-11-01,Beirut,303.24797814513795,89.46607119275839 +2034-12-01,Beirut,280.4882858066859,116.25189833715943 +2035-01-01,Beirut,704.1970294788355,220.93707968341207 +2035-02-01,Beirut,870.1126488925362,119.854883847124 +2035-03-01,Beirut,268.42228451204073,263.8432358340217 +2035-04-01,Beirut,424.74225140619683,436.3953512492571 +2035-05-01,Beirut,901.0305105294069,181.84350476868437 +2035-06-01,Beirut,351.4323046094528,361.10256278759965 +2035-07-01,Beirut,418.4462184119408,426.4035130398064 +2035-08-01,Beirut,594.6287153564572,498.5598961012533 +2035-09-01,Beirut,899.365950688444,395.4087803891647 +2035-10-01,Beirut,364.7897543480765,358.78265534721925 +2035-11-01,Beirut,476.54632682009674,338.80445878039717 +2035-12-01,Beirut,466.31494206710147,327.8788399908258 +2036-01-01,Beirut,579.2368864636254,380.9570318766542 +2036-02-01,Beirut,600.0501085714851,279.4376713630006 +2036-03-01,Beirut,375.5255223371832,229.7939164550971 +2036-04-01,Beirut,470.2227740633279,176.89795549926743 +2036-05-01,Beirut,305.83051496143565,96.71589826156193 +2036-06-01,Beirut,294.13680204284015,120.31522588627188 +2036-07-01,Beirut,365.58780174154435,269.19069261931224 +2036-08-01,Beirut,494.5452545602539,429.7312307600971 +2036-09-01,Beirut,591.533642252911,486.3159420806056 +2036-10-01,Beirut,741.3239668043026,461.1602847686291 +2036-11-01,Beirut,670.8272855990924,413.1427190458849 +2036-12-01,Beirut,536.7268778354146,261.78636129345244 +2037-01-01,Beirut,768.1654057503005,191.44179309829462 +2037-02-01,Beirut,623.2047738005068,179.85678267407488 +2037-03-01,Beirut,277.21258532731963,397.50394496533283 +2037-04-01,Beirut,513.0492342410321,517.7865257857142 +2037-05-01,Beirut,914.1603178213006,315.49837217089197 +2037-06-01,Beirut,363.20927123950065,390.78547399359917 +2037-07-01,Beirut,573.963894210933,218.99829767837772 +2037-08-01,Beirut,332.9125074950807,92.31283711576606 +2037-09-01,Beirut,315.88163241026984,147.59727259192553 +2037-10-01,Beirut,375.65507097622725,245.18721728762708 +2037-11-01,Beirut,706.2873997760253,260.2202092298171 +2037-12-01,Beirut,410.0368991313371,378.3101943933483 +2038-01-01,Beirut,489.49285763753585,558.1904746369876 +2038-02-01,Beirut,883.725878106104,484.722511382248 +2038-03-01,Beirut,779.3466595398602,248.05271465469235 +2038-04-01,Beirut,276.91146254273997,110.03826304630002 +2038-05-01,Beirut,297.67157408089037,195.26745360376225 +2038-06-01,Beirut,499.212323368984,299.4382698408391 +2038-07-01,Beirut,600.2761564151538,404.1658941923482 +2038-08-01,Beirut,600.4703893558051,225.16373439607338 +2038-09-01,Beirut,345.26579453483663,293.6405863408366 +2038-10-01,Beirut,490.9875922524501,367.44888632063316 +2038-11-01,Beirut,636.4509099576767,332.81966762669003 +2038-12-01,Beirut,563.2323442041179,149.99339822647943 +2039-01-01,Beirut,749.9310168645311,198.32011032124996 +2039-02-01,Beirut,748.6646448396649,144.2216147820597 +2039-03-01,Beirut,290.18619867739983,276.56186911686774 +2039-04-01,Beirut,550.844541723902,314.47712074437186 +2039-05-01,Beirut,368.7405377493463,417.5875683718459 +2039-06-01,Beirut,642.1991196420979,462.144349022862 +2039-07-01,Beirut,595.3308036527892,419.87838779238353 +2039-08-01,Beirut,508.6032237115524,452.53124096750247 +2039-09-01,Beirut,714.0048670831754,284.32178769951486 +2039-10-01,Beirut,334.6954537536575,144.74578503536515 +2039-11-01,Beirut,279.3960084289687,117.21878204886671 +2039-12-01,Beirut,324.10672359846285,164.74629735200742 +2040-01-01,Beirut,415.932120930266,200.59717841487128 +2040-02-01,Beirut,357.25841836924906,321.6574157278284 +2040-03-01,Beirut,586.9880976291091,402.4700005994494 +2040-04-01,Beirut,654.1278821958381,453.5550772299091 +2040-05-01,Beirut,829.3329389024686,441.4307149496106 +2040-06-01,Beirut,385.25031198530445,265.74410691272067 +2040-07-01,Beirut,373.6679640869712,284.17035078104396 +2040-08-01,Beirut,531.5940048968995,342.25531808232114 +2040-09-01,Beirut,765.2831349972508,364.22015058255647 +2040-10-01,Beirut,366.3546514976964,339.3601984959964 +2040-11-01,Beirut,395.2431235447773,276.1164674291439 +2040-12-01,Beirut,496.00555089292084,313.86385981417817 +2041-01-01,Beirut,401.94004489257304,375.35210820482826 +2041-02-01,Beirut,411.4013135250808,423.61554351709714 +2041-03-01,Beirut,568.3971606426712,423.29354189459514 +2041-04-01,Beirut,628.2331230802815,396.01728522132726 +2041-05-01,Beirut,591.8262004758863,378.90505129203 +2041-06-01,Beirut,674.1025745679913,192.90101911742474 +2041-07-01,Beirut,265.06453913322025,148.4946931472427 +2041-08-01,Beirut,483.8660949798302,282.4662891067438 +2041-09-01,Beirut,402.6570504433514,106.4828385166472 +2041-10-01,Beirut,285.58327406278846,183.34457066469741 +2041-11-01,Beirut,506.48919156248246,303.8097098276233 +2041-12-01,Beirut,512.511544376459,477.4894512822283 +2042-01-01,Beirut,749.9650179169068,441.550961515051 +2042-02-01,Beirut,590.1438170878004,323.8804435191824 +2042-03-01,Beirut,490.68513205885114,301.8816807398768 +2042-04-01,Beirut,598.1487244564864,176.0944851123052 +2042-05-01,Beirut,301.2070148234502,82.71582397185986 +2042-06-01,Beirut,281.7207596567934,127.94199095628534 +2042-07-01,Beirut,344.08496524839813,260.36023840590883 +2042-08-01,Beirut,505.15386581490884,428.2480519284187 +2042-09-01,Beirut,632.0611220458165,484.40516246434174 +2042-10-01,Beirut,653.3795246913185,459.6365757102502 +2042-11-01,Beirut,602.4673982156849,438.8418122546409 +2042-12-01,Beirut,613.2158201516665,394.57735931014975 +2043-01-01,Beirut,609.3204363470815,266.45057702498184 +2043-02-01,Beirut,615.9314806041946,223.947689737146 +2043-03-01,Beirut,373.3059891920127,249.3581601708145 +2043-04-01,Beirut,616.5194519040132,203.32535206740604 +2043-05-01,Beirut,792.2284288974794,152.43499974039662 +2043-06-01,Beirut,688.1601579282265,219.7568780821109 +2043-07-01,Beirut,579.1823098878756,337.39741198169605 +2043-08-01,Beirut,706.7051343393275,322.45047784228757 +2043-09-01,Beirut,759.2155160318513,278.8031286173413 +2043-10-01,Beirut,899.5983512249541,223.54412792630507 +2043-11-01,Beirut,936.724568407103,150.60715889161116 +2043-12-01,Beirut,487.1179021326783,307.5040779022956 +2044-01-01,Beirut,396.3177831306055,453.9955332649701 +2044-02-01,Beirut,544.3471000752179,370.59459713003514 +2044-03-01,Beirut,655.5297440421225,352.7980365159045 +2044-04-01,Beirut,428.26634989149665,472.7938039463189 +2044-05-01,Beirut,566.8146714205665,505.0279826367805 +2044-06-01,Beirut,624.0178927648462,403.65089149032036 +2044-07-01,Beirut,530.7616735376096,377.8922091982607 +2044-08-01,Beirut,537.8441801934355,377.72822720962057 +2044-09-01,Beirut,580.0523458937487,346.88589648284744 +2044-10-01,Beirut,540.6506558622559,244.82540919247288 +2044-11-01,Beirut,362.9325304501193,131.76311938283195 +2044-12-01,Beirut,285.3825855516786,125.16563596282606 +2045-01-01,Beirut,388.5076230906552,385.6084268221865 +2045-02-01,Beirut,441.61747265668276,405.21451041478684 +2045-03-01,Beirut,736.3400606550158,266.62458817686155 +2045-04-01,Beirut,336.0990130806204,333.04623710826206 +2045-05-01,Beirut,461.0447275100644,383.20004906553055 +2045-06-01,Beirut,550.1358435406861,424.6157026827833 +2045-07-01,Beirut,590.0785412398959,445.36659285727893 +2045-08-01,Beirut,541.0438026751261,395.4166382902597 +2045-09-01,Beirut,678.2218457862907,295.5803161190293 +2045-10-01,Beirut,341.7843388217295,244.81234715512642 +2045-11-01,Beirut,402.832533938328,304.45886551216097 +2045-12-01,Beirut,656.268765402911,207.94055931052725 +2046-01-01,Beirut,295.06421803952264,147.7156753077669 +2046-02-01,Beirut,348.67937674021346,166.89277953664234 +2046-03-01,Beirut,336.87195833557195,189.63928364119695 +2046-04-01,Beirut,363.1235741846476,197.56023749957356 +2046-05-01,Beirut,404.12465108681613,188.05658862788798 +2046-06-01,Beirut,431.17747781607846,264.19797871108614 +2046-07-01,Beirut,423.1452050013048,418.33686059862697 +2046-08-01,Beirut,579.622626088081,490.2942457612912 +2046-09-01,Beirut,715.216559654675,400.7430889759125 +2046-10-01,Beirut,515.1538530881585,331.09141188849213 +2046-11-01,Beirut,574.233253531304,264.7324883079375 +2046-12-01,Beirut,368.6690635250256,171.54083142776142 +2047-01-01,Beirut,296.1214141498872,473.7225871770591 +2047-02-01,Beirut,640.4912997632407,349.4483304583392 +2047-03-01,Beirut,760.9839822658535,170.08536203678636 +2047-04-01,Beirut,276.9572173628431,141.4925622853236 +2047-05-01,Beirut,304.06431203500455,203.33610498469392 +2047-06-01,Beirut,464.9760156029373,342.81743372644047 +2047-07-01,Beirut,786.8272511341663,439.8079549800608 +2047-08-01,Beirut,989.6546393376497,88.34097829255752 +2047-09-01,Beirut,289.19270953128233,174.23441997613466 +2047-10-01,Beirut,394.2328139083015,179.77127630294925 +2047-11-01,Beirut,482.93631279795966,290.1856946949297 +2047-12-01,Beirut,487.9770331111631,404.0966550550683 +2048-01-01,Beirut,567.3656324977159,478.80606328938006 +2048-02-01,Beirut,667.7065702495414,528.2778921463523 +2048-03-01,Beirut,615.9988654432448,487.52040667476155 +2048-04-01,Beirut,694.5188691105608,381.9620160693286 +2048-05-01,Beirut,522.8779045627883,245.51947209247888 +2048-06-01,Beirut,465.47710675530885,235.2120081890462 +2048-07-01,Beirut,385.06196878821896,230.85070075893714 +2048-08-01,Beirut,433.0866034717467,260.82590520698295 +2048-09-01,Beirut,517.4917469315384,242.3745884305605 +2048-10-01,Beirut,398.47654132360987,298.4913065976972 +2048-11-01,Beirut,486.57769176649185,376.3658463750383 +2048-12-01,Beirut,575.8924894555939,417.2152141462749 +2049-01-01,Beirut,346.8639211547056,419.3565611236152 +2049-02-01,Beirut,395.8954962327568,479.04304104345516 +2049-03-01,Beirut,772.4417710895609,365.18794760294367 +2049-04-01,Beirut,677.7730679020978,299.0928840696838 +2049-05-01,Beirut,504.0980071135637,154.48925498060092 +2049-06-01,Beirut,273.8703744686467,89.68311124602886 +2049-07-01,Beirut,315.2909091342,188.7700894937605 +2049-08-01,Beirut,584.3121993755015,257.15306019912566 +2049-09-01,Beirut,825.2194802695225,239.75854495878252 +2049-10-01,Beirut,885.7389358742156,200.2925641217659 +2049-11-01,Beirut,372.8095018129961,414.82355166168503 +2049-12-01,Beirut,471.34938684567567,486.6763715966203 +2050-01-01,Beirut,650.2054158586117,478.7896581976204 +2050-02-01,Beirut,587.319029203177,473.62405323306535 +2050-03-01,Beirut,675.2150159586151,420.33397373350016 +2050-04-01,Beirut,616.2777923819847,182.1178764819176 +2050-05-01,Beirut,276.9007632705855,99.80874056096526 +2050-06-01,Beirut,299.3862096018652,199.39574669482224 +2050-07-01,Beirut,457.6494318010862,288.5068782511211 +2050-08-01,Beirut,468.8613174010692,392.2332233413931 +2050-09-01,Beirut,597.2277640302625,423.8886400446263 +2050-10-01,Beirut,569.7447802654608,390.3562878430033 +2050-11-01,Beirut,542.5927023553228,385.363349915667 +2050-12-01,Beirut,524.4973011299453,355.2474614664382 +2051-01-01,Beirut,567.5581165188804,288.617112885561 +2051-02-01,Beirut,427.14925328870936,324.4135400724158 +2051-03-01,Beirut,405.2585167411533,420.3232208162123 +2051-04-01,Beirut,581.3701824464544,452.721450424271 +2051-05-01,Beirut,589.0855407624587,440.3329523808498 +2051-06-01,Beirut,637.5461707862833,430.6138315896649 +2051-07-01,Beirut,561.574908638123,316.20737542232195 +2051-08-01,Beirut,640.8838293104097,191.41908100697182 +2051-09-01,Beirut,264.83687096708604,126.21321825091016 +2051-10-01,Beirut,363.076224761483,247.84959825073054 +2051-11-01,Beirut,368.7568438516203,214.391551464725 +2051-12-01,Beirut,347.91746510967124,253.08680316934183 +2052-01-01,Beirut,472.9953258379853,347.80644270322927 +2052-02-01,Beirut,666.7999098120625,433.8157884279574 +2052-03-01,Beirut,482.48501441215353,366.43387296471906 +2052-04-01,Beirut,605.2102440784709,307.3416295829481 +2052-05-01,Beirut,385.62558381224346,189.33918419477337 +2052-06-01,Beirut,334.18206872607,165.8440254562897 +2052-07-01,Beirut,323.8087128617934,171.56876488757496 +2052-08-01,Beirut,355.61394538297986,184.09163993261603 +2052-09-01,Beirut,323.8682018437488,253.5197114836143 +2052-10-01,Beirut,476.2959484200384,406.0802236498962 +2052-11-01,Beirut,682.8988165656444,461.52026624642343 +2052-12-01,Beirut,595.4885150394515,397.4923993650398 +2053-01-01,Beirut,778.9366922366316,185.75870398926062 +2053-02-01,Beirut,426.0106295445919,249.37165301414208 +2053-03-01,Beirut,528.783491281617,256.40685254316924 +2053-04-01,Beirut,869.5896705271756,125.29019058807727 +2053-05-01,Beirut,811.0571932147175,103.91516594042537 +2053-06-01,Beirut,611.3267299118838,207.0916992053979 +2053-07-01,Beirut,358.57885258178067,412.02121045144673 +2053-08-01,Beirut,520.3124197114869,360.61347737339383 +2053-09-01,Beirut,567.1415136093636,311.11414586258917 +2053-10-01,Beirut,619.1912607723502,334.630982758041 +2053-11-01,Beirut,371.8074223858699,379.0852315855589 +2053-12-01,Beirut,519.7241912176262,409.0486491819623 +2054-01-01,Beirut,675.8411034154842,292.59241815661824 +2054-02-01,Beirut,398.5977568756874,190.531172647717 +2054-03-01,Beirut,296.0178163896986,106.33426214989075 +2054-04-01,Beirut,295.51062973852754,140.7914858639456 +2054-05-01,Beirut,377.1399550593262,264.7520468994788 +2054-06-01,Beirut,501.7934456180499,431.66775534179055 +2054-07-01,Beirut,636.8748943362039,486.8486939890542 +2054-08-01,Beirut,668.9018795605543,450.3885498755011 +2054-09-01,Beirut,649.3344025153784,428.20011183884355 +2054-10-01,Beirut,605.7647287139981,273.7660933897812 +2054-11-01,Beirut,452.11412734477847,242.44966929694394 +2054-12-01,Beirut,547.6660863118825,187.416617726867 +2055-01-01,Beirut,394.22532956167424,381.9255871155681 +2055-02-01,Beirut,378.66593875036483,468.28412693632424 +2055-03-01,Beirut,682.915765653024,418.13059069488367 +2055-04-01,Beirut,675.3506600964588,336.7496176440586 +2055-05-01,Beirut,453.0983060665692,366.4266354242369 +2055-06-01,Beirut,643.7390946890309,253.7042170691932 +2055-07-01,Beirut,457.79173726462227,79.5647884005316 +2055-08-01,Beirut,262.2700744261695,104.43347723238803 +2055-09-01,Beirut,504.2985155888441,267.90590855804294 +2055-10-01,Beirut,429.0222431814519,299.8144151590438 +2055-11-01,Beirut,544.3110157511007,328.4916184183206 +2055-12-01,Beirut,686.0332660770478,293.9866786338008 +2056-01-01,Beirut,771.5059962865078,315.9236293709404 +2056-02-01,Beirut,298.8561069615362,400.3019091868033 +2056-03-01,Beirut,519.666271119328,504.00228529253553 +2056-04-01,Beirut,805.4853414850163,458.0780919930782 +2056-05-01,Beirut,607.8608344383283,326.12935413388 +2056-06-01,Beirut,301.1748141293698,107.47155547547587 +2056-07-01,Beirut,277.3129938813852,119.32557838652411 +2056-08-01,Beirut,372.79941980654274,178.413289689374 +2056-09-01,Beirut,452.7624363668915,211.34123833177443 +2056-10-01,Beirut,357.9333469747273,348.2732295998541 +2056-11-01,Beirut,551.5829972577978,482.1213048684586 +2056-12-01,Beirut,775.1990969769215,498.9457259379127 +2057-01-01,Beirut,690.7080764264472,228.44120290673033 +2057-02-01,Beirut,873.9053351160806,124.09237763826937 +2057-03-01,Beirut,363.35036789103845,165.2825474050224 +2057-04-01,Beirut,454.23417783443523,283.2263170185734 +2057-05-01,Beirut,776.8689550151535,222.8977466322856 +2057-06-01,Beirut,322.1213913480978,408.1141793122718 +2057-07-01,Beirut,747.5433816933944,337.54354137048 +2057-08-01,Beirut,637.2834470722005,298.15403721122556 +2057-09-01,Beirut,639.6487063616679,314.76352056059693 +2057-10-01,Beirut,368.5408008561924,332.9153754834478 +2057-11-01,Beirut,464.63996586743013,423.3934888822068 +2057-12-01,Beirut,573.4819640147035,497.6318021600829 +2058-01-01,Beirut,577.9974940937835,512.9435428042739 +2058-02-01,Beirut,617.4665689643264,435.26722547494944 +2058-03-01,Beirut,605.7610765585991,336.59387266577687 +2058-04-01,Beirut,551.5070992959517,284.3038834029409 +2058-05-01,Beirut,522.9230163977861,155.95309923984826 +2058-06-01,Beirut,275.67646819101924,90.82672880341629 +2058-07-01,Beirut,303.0638272109399,166.17135184071788 +2058-08-01,Beirut,427.9875001109694,340.6101906662334 +2058-09-01,Beirut,582.9722698545729,458.094359226924 +2058-10-01,Beirut,640.9687547831363,443.6748005373201 +2058-11-01,Beirut,519.5689746131729,403.67997951016315 +2058-12-01,Beirut,579.7461306671339,414.016841613745 +2059-01-01,Beirut,322.17661090895297,442.821425585509 +2059-02-01,Beirut,433.19467640826906,466.28691040801556 +2059-03-01,Beirut,792.4798617931106,314.1505698107096 +2059-04-01,Beirut,530.6779311574769,332.23066968935103 +2059-05-01,Beirut,427.5124369956661,349.00198099745705 +2059-06-01,Beirut,579.0544844489143,317.94593603958737 +2059-07-01,Beirut,473.4211362942119,308.10005489652815 +2059-08-01,Beirut,475.594168756557,371.1316226338161 +2059-09-01,Beirut,519.9880208660902,412.84063789194835 +2059-10-01,Beirut,578.5470920425095,424.7787196660258 +2059-11-01,Beirut,587.7984388977932,377.15363542428906 +2059-12-01,Beirut,489.9822978997967,337.88897883835295 +2060-01-01,Beirut,557.9901123588696,343.54229063797436 +2060-02-01,Beirut,603.3421923113381,228.9140038548512 +2060-03-01,Beirut,311.1552289360098,115.86794681457751 +2060-04-01,Beirut,282.6569974091225,121.72346170948082 +2060-05-01,Beirut,305.045147234247,184.7379006009608 +2060-06-01,Beirut,470.165574108348,347.5488551910191 +2060-07-01,Beirut,539.8029185798396,380.2866977700864 +2060-08-01,Beirut,492.9536349496519,368.4205778270893 +2060-09-01,Beirut,604.2153660845256,304.1391557774784 +2060-10-01,Beirut,523.5387389347553,184.83677918973942 +2060-11-01,Beirut,281.59900399722727,127.0171883728104 +2060-12-01,Beirut,348.2743732819989,216.25601082190263 +2061-01-01,Beirut,723.36153489873,214.11247535017839 +2061-02-01,Beirut,563.826179528098,214.76152764128057 +2061-03-01,Beirut,294.28098502288407,394.39600722435233 +2061-04-01,Beirut,791.8002008172563,283.2519241260891 +2061-05-01,Beirut,273.7376109040754,398.4289715679179 +2061-06-01,Beirut,436.18738628302907,475.8102729613955 +2061-07-01,Beirut,773.4166908258334,451.97415713724223 +2061-08-01,Beirut,803.0495081503758,322.8759762936853 +2061-09-01,Beirut,326.116900793302,138.9274228482706 +2061-10-01,Beirut,271.854590443688,96.00172533835892 +2061-11-01,Beirut,354.3343021455373,177.72251814706357 +2061-12-01,Beirut,368.3589903877782,278.92694225630504 +2062-01-01,Beirut,517.8129822902163,415.1943549857242 +2062-02-01,Beirut,725.0603015473027,467.1986337219048 +2062-03-01,Beirut,679.2931361301663,462.9876948114334 +2062-04-01,Beirut,675.0434418130795,321.1959363608904 +2062-05-01,Beirut,441.3949998102005,90.09989018436943 +2062-06-01,Beirut,267.4813401087398,91.50990092822045 +2062-07-01,Beirut,334.2804711666065,199.00016341075107 +2062-08-01,Beirut,513.0369403658162,256.64205537660223 +2062-09-01,Beirut,490.3466646993475,295.12683251110036 +2062-10-01,Beirut,583.8087163185378,327.359529228987 +2062-11-01,Beirut,502.8004374513815,464.53449507039846 +2062-12-01,Beirut,630.2224675577046,537.9513130390637 +2063-01-01,Beirut,687.6144436095374,228.4951742800406 +2063-02-01,Beirut,771.7163810130077,152.83397777559875 +2063-03-01,Beirut,278.60076445056046,273.76412891450747 +2063-04-01,Beirut,407.54808382400836,424.5367790270486 +2063-05-01,Beirut,931.0531311442714,168.55636268095978 +2063-06-01,Beirut,296.8212134192438,376.3976226242031 +2063-07-01,Beirut,420.6868414685697,422.7697852150316 +2063-08-01,Beirut,714.632780617744,396.57316279484047 +2063-09-01,Beirut,576.4982843025352,380.0323843833325 +2063-10-01,Beirut,442.4822876234996,325.05364883135076 +2063-11-01,Beirut,433.1099052519679,343.13540300495947 +2063-12-01,Beirut,608.5502687877854,406.844438995862 +2064-01-01,Beirut,606.4684630522001,383.5711625698762 +2064-02-01,Beirut,463.5768028552872,329.5068040966271 +2064-03-01,Beirut,545.8575749655134,269.7662838745199 +2064-04-01,Beirut,442.88320169644356,193.46906265184379 +2064-05-01,Beirut,346.4656561803962,246.96231025208854 +2064-06-01,Beirut,504.5989182301057,260.7563731216359 +2064-07-01,Beirut,529.3201523700214,197.8115869411776 +2064-08-01,Beirut,324.58479588405953,86.73932781608086 +2064-09-01,Beirut,295.07406857133805,135.17960036746535 +2064-10-01,Beirut,515.2313970918746,217.45506449293615 +2064-11-01,Beirut,358.8261446533329,247.56123395923166 +2064-12-01,Beirut,386.15488915104174,410.24143031791107 +2065-01-01,Beirut,586.0616846891911,280.1509137452844 +2065-02-01,Beirut,311.86099510714496,434.47109602190494 +2065-03-01,Beirut,516.9837886982407,497.79033876112203 +2065-04-01,Beirut,684.6151495672976,413.302875477413 +2065-05-01,Beirut,681.628380874912,390.36449038888315 +2065-06-01,Beirut,458.56223917617314,292.3442739115135 +2065-07-01,Beirut,600.3173074619018,183.51292964210538 +2065-08-01,Beirut,302.33319037592634,90.68516595803185 +2065-09-01,Beirut,329.7533930750329,146.03213723040557 +2065-10-01,Beirut,307.38839071370415,208.82169539975936 +2065-11-01,Beirut,663.072679472252,279.2443601031683 +2065-12-01,Beirut,756.1002789153986,241.6933463165516 +2066-01-01,Beirut,807.5964416220055,267.87933644512964 +2066-02-01,Beirut,824.6702681118597,257.0094122527928 +2066-03-01,Beirut,315.3584997284838,412.9287980279175 +2066-04-01,Beirut,546.5199267823293,471.3379554460805 +2066-05-01,Beirut,803.0984778960062,336.21786520548613 +2066-06-01,Beirut,359.84406723345705,385.8562608869849 +2066-07-01,Beirut,426.4477822580785,397.95112157369874 +2066-08-01,Beirut,663.4955064775894,395.9079638955672 +2066-09-01,Beirut,554.3803168187167,385.8712873996052 +2066-10-01,Beirut,580.8785560348349,229.758297416581 +2066-11-01,Beirut,272.8458677210428,107.12734149658917 +2066-12-01,Beirut,306.3355411826525,166.22942448696807 +2067-01-01,Beirut,530.4583903230755,305.5357081424803 +2067-02-01,Beirut,525.0507312698996,284.48564906248026 +2067-03-01,Beirut,409.1140611886053,305.8447166565927 +2067-04-01,Beirut,739.4940826330287,167.13637447058682 +2067-05-01,Beirut,275.38653334727417,210.9469991623642 +2067-06-01,Beirut,600.357172538439,254.51490776439837 +2067-07-01,Beirut,351.54865919413317,450.7317126877939 +2067-08-01,Beirut,662.1880091253793,465.20224434107973 +2067-09-01,Beirut,895.9624504895204,240.96321633980926 +2067-10-01,Beirut,285.13601362344434,365.7711555078969 +2067-11-01,Beirut,461.70540756560615,466.2842911076506 +2067-12-01,Beirut,603.2898790431595,472.85863163035253 +2068-01-01,Beirut,575.689074687637,480.3158831629288 +2068-02-01,Beirut,569.3300291530478,392.3646019333848 +2068-03-01,Beirut,597.3422668178393,337.0773403699894 +2068-04-01,Beirut,631.9272782662681,217.95717748000993 +2068-05-01,Beirut,275.6890449796816,118.7696318840539 +2068-06-01,Beirut,311.83206077740016,220.29490305576797 +2068-07-01,Beirut,441.107971259132,266.88341641029723 +2068-08-01,Beirut,459.1011635721487,340.1970994270909 +2068-09-01,Beirut,531.5480700409669,386.6858208841616 +2068-10-01,Beirut,682.368173817827,277.46242593972727 +2068-11-01,Beirut,484.37667659235797,100.60213008797004 +2068-12-01,Beirut,264.01621621731084,86.3018357261697 +2069-01-01,Beirut,471.58204457622816,334.0624222564447 +2069-02-01,Beirut,565.0885650453106,279.5854722789911 +2069-03-01,Beirut,546.421318586559,213.21484800799033 +2069-04-01,Beirut,506.8979757731171,154.36807787424144 +2069-05-01,Beirut,501.33355695123487,184.96698598946244 +2069-06-01,Beirut,406.75559182185134,354.2255552148268 +2069-07-01,Beirut,601.368433792871,412.36968079342654 +2069-08-01,Beirut,657.6615740189111,394.539000345594 +2069-09-01,Beirut,612.6924302758384,433.8772041286208 +2069-10-01,Beirut,469.08728808652506,324.3190729368836 +2069-11-01,Beirut,443.73399958796176,306.6637305233525 +2069-12-01,Beirut,547.5952036338588,367.8771763947883 +2070-01-01,Beirut,577.3037131650137,364.4835625916309 +2070-02-01,Beirut,437.2587537851175,368.07896591632834 +2070-03-01,Beirut,556.2364347822925,389.32466260845865 +2070-04-01,Beirut,529.9907601155911,378.87134503206994 +2070-05-01,Beirut,491.03116092319476,398.8257611087362 +2070-06-01,Beirut,615.040920513756,376.0159285249621 +2070-07-01,Beirut,568.5454330079857,268.731315585562 +2070-08-01,Beirut,394.7158243195081,130.2630184922165 +2070-09-01,Beirut,275.22789606206004,96.08924788147613 +2070-10-01,Beirut,302.33519648945526,151.00141529326066 +2070-11-01,Beirut,401.50484685380707,272.96076192098064 +2070-12-01,Beirut,463.1197176035321,341.26873792115873 +2071-01-01,Beirut,725.4956281830898,210.93638410299025 +2071-02-01,Beirut,698.1072918258089,165.91516013988638 +2071-03-01,Beirut,304.92259427315014,273.3208467922105 +2071-04-01,Beirut,390.3151570996639,409.5374244158617 +2071-05-01,Beirut,583.8647846197321,455.1253477987237 +2071-06-01,Beirut,652.8670655622827,490.37389317107414 +2071-07-01,Beirut,848.911218097416,334.53610204876696 +2071-08-01,Beirut,334.2626476194837,193.94653353679956 +2071-09-01,Beirut,326.63095452539926,144.19659357067835 +2071-10-01,Beirut,313.9610359003205,161.66601735501254 +2071-11-01,Beirut,433.7998282701051,202.84310785217983 +2071-12-01,Beirut,510.970514833953,218.83002486216606 +2072-01-01,Beirut,463.1683272775033,338.2597132334352 +2072-02-01,Beirut,548.8788590983593,449.4550794756868 +2072-03-01,Beirut,686.6412213539434,482.1216495132434 +2072-04-01,Beirut,537.9691764979331,478.3477546544629 +2072-05-01,Beirut,588.2894480437113,435.3129943023799 +2072-06-01,Beirut,650.297285570477,353.9249904979436 +2072-07-01,Beirut,645.2666987025353,236.68586437929395 +2072-08-01,Beirut,300.98289593509804,88.37580464806847 +2072-09-01,Beirut,269.8349485080966,110.87071805966961 +2072-10-01,Beirut,347.0604174029281,238.98445553973025 +2072-11-01,Beirut,516.1141642028352,356.7937447582259 +2072-12-01,Beirut,578.2982053678957,352.0438158686999 +2073-01-01,Beirut,287.3522804042792,486.71655717853594 +2073-02-01,Beirut,499.3775705410821,463.077371384456 +2073-03-01,Beirut,759.7522285590642,304.8320813496943 +2073-04-01,Beirut,639.1051524729331,331.2228938739192 +2073-05-01,Beirut,448.6124561799563,233.40980891225496 +2073-06-01,Beirut,307.3552384016677,193.60750646192514 +2073-07-01,Beirut,516.1625681215728,248.1738572965734 +2073-08-01,Beirut,413.9407446199098,306.84937343672146 +2073-09-01,Beirut,454.2892430788651,377.3447754219767 +2073-10-01,Beirut,564.6788549361243,431.9161063737663 +2073-11-01,Beirut,567.2743543321476,443.0133238017234 +2073-12-01,Beirut,588.9561464398399,378.760541733735 +2074-01-01,Beirut,554.1118576774934,278.9108818093302 +2074-02-01,Beirut,479.4068646765826,223.5950147287908 +2074-03-01,Beirut,383.3199163823482,235.41798514472242 +2074-04-01,Beirut,454.9911770587719,257.47016786568247 +2074-05-01,Beirut,508.3819339576641,176.6574451361475 +2074-06-01,Beirut,328.1410179052273,106.93937223092232 +2074-07-01,Beirut,286.54083320121396,136.4153242436087 +2074-08-01,Beirut,489.52950778854597,261.2460271997368 +2074-09-01,Beirut,390.59984518494855,364.26137009882666 +2074-10-01,Beirut,563.9683049558046,335.11272723832917 +2074-11-01,Beirut,550.964034075897,293.23783444524014 +2074-12-01,Beirut,528.3306240121535,318.66321076585416 +2075-01-01,Beirut,599.5404014187008,270.15092468667154 +2075-02-01,Beirut,357.45794950716925,355.43860146412584 +2075-03-01,Beirut,461.19140527231735,415.95136725568625 +2075-04-01,Beirut,551.7881609452415,429.52223816255326 +2075-05-01,Beirut,782.2497115715177,341.0477516851015 +2075-06-01,Beirut,716.106811112263,90.37307287309484 +2075-07-01,Beirut,259.23369300304796,96.86521561460587 +2075-08-01,Beirut,416.64856065415154,355.0763108662729 +2075-09-01,Beirut,630.2516076426831,426.885429842487 +2075-10-01,Beirut,612.0860696020043,333.08538875582303 +2075-11-01,Beirut,409.3441212593318,423.39135208454064 +2075-12-01,Beirut,676.8343610869638,451.933075478886 +2076-01-01,Beirut,628.6782488090755,257.7956504005116 +2076-02-01,Beirut,341.13723861161463,112.49023836824173 +2076-03-01,Beirut,272.77555086991185,94.88767830351318 +2076-04-01,Beirut,331.7273059099253,148.5000006769297 +2076-05-01,Beirut,303.1249622347652,269.9489283782606 +2076-06-01,Beirut,514.5861229594591,381.7623978099332 +2076-07-01,Beirut,691.5768264621095,402.6653452635125 +2076-08-01,Beirut,719.8682739790872,439.7298929362882 +2076-09-01,Beirut,510.17586240184175,321.09137113316154 +2076-10-01,Beirut,426.0476912060695,288.5243517417139 +2076-11-01,Beirut,538.8914743331762,366.8546153180857 +2076-12-01,Beirut,750.8397348543474,295.6225695696541 +2077-01-01,Beirut,522.7055331157219,309.9258795733221 +2077-02-01,Beirut,430.35317091090434,340.51096743266993 +2077-03-01,Beirut,462.0153263864282,384.49960115583144 +2077-04-01,Beirut,537.1048244803922,406.76268925289133 +2077-05-01,Beirut,609.9241222028769,408.04735268848594 +2077-06-01,Beirut,631.6625741580606,316.02598887204607 +2077-07-01,Beirut,410.9383385297598,250.9833154216192 +2077-08-01,Beirut,533.9937539074228,182.62834710502452 +2077-09-01,Beirut,278.1735908659103,133.46023646471698 +2077-10-01,Beirut,356.41952856188357,182.8554507860131 +2077-11-01,Beirut,361.09667937706695,194.0272665776548 +2077-12-01,Beirut,439.08066494108385,204.60732727367866 +2078-01-01,Beirut,380.89102728684645,393.3775129561111 +2078-02-01,Beirut,628.8980725569234,536.3632243348715 +2078-03-01,Beirut,872.7360281227316,425.8342632486403 +2078-04-01,Beirut,564.8128273126938,382.82207712996615 +2078-05-01,Beirut,449.936799741929,266.9544304682193 +2078-06-01,Beirut,531.0023042834694,329.3559530742905 +2078-07-01,Beirut,606.5482189246788,288.04891426098874 +2078-08-01,Beirut,408.0360066414204,265.5866042460361 +2078-09-01,Beirut,427.8415424920346,305.7155782557027 +2078-10-01,Beirut,511.8264051675064,338.5984645924817 +2078-11-01,Beirut,550.2643376841572,408.7502212627453 +2078-12-01,Beirut,558.0799502378017,375.12195441749355 +2079-01-01,Beirut,309.7635262543912,457.9278268668759 +2079-02-01,Beirut,436.3970765856152,474.95724265436934 +2079-03-01,Beirut,756.3724930896376,345.2745787201552 +2079-04-01,Beirut,533.4388063226195,398.42893710343947 +2079-05-01,Beirut,580.8174467304138,438.0841451595877 +2079-06-01,Beirut,550.8762794687066,280.3085887343614 +2079-07-01,Beirut,460.58517319550435,270.31357979288987 +2079-08-01,Beirut,627.1493588253602,214.3934470110418 +2079-09-01,Beirut,303.47698372029146,97.18787206219908 +2079-10-01,Beirut,279.69281035363974,138.44571283246088 +2079-11-01,Beirut,372.7184036832574,270.77378397412383 +2079-12-01,Beirut,508.7339811625947,426.2898836542355 +2080-01-01,Beirut,603.2519172025343,473.5686688161371 +2080-02-01,Beirut,658.033656639727,450.07750795715793 +2080-03-01,Beirut,605.2982301602992,430.2367557305411 +2080-04-01,Beirut,611.3366833213161,367.1081360218344 +2080-05-01,Beirut,721.4752223546029,228.37847755588442 +2080-06-01,Beirut,273.0929797567655,130.54243925154805 +2080-07-01,Beirut,305.290638947504,167.80326212930598 +2080-08-01,Beirut,301.0705476646716,160.86575216454955 +2080-09-01,Beirut,360.6443779344962,274.74857227800373 +2080-10-01,Beirut,495.68205222667194,426.75574000994123 +2080-11-01,Beirut,725.6448007275519,468.84700079897027 +2080-12-01,Beirut,619.5793665819938,309.0369545119519 +2081-01-01,Beirut,580.6642362394896,281.7346943896658 +2081-02-01,Beirut,645.4777264141408,225.11522564260326 +2081-03-01,Beirut,407.2034438074924,225.94699136640307 +2081-04-01,Beirut,438.2508026445988,239.6114677968402 +2081-05-01,Beirut,432.4376771839324,350.94015987411785 +2081-06-01,Beirut,805.9244231538192,282.7017676560047 +2081-07-01,Beirut,836.1487353365582,214.1159390302663 +2081-08-01,Beirut,649.08567015719,187.20052544675497 +2081-09-01,Beirut,381.12435372190845,287.45857220898876 +2081-10-01,Beirut,472.8597845777585,417.82082396224445 +2081-11-01,Beirut,563.5723290084703,446.13380661287306 +2081-12-01,Beirut,636.7508239302581,483.7196984517183 +2082-01-01,Beirut,556.7738931722276,448.36503695010697 +2082-02-01,Beirut,646.0431160770563,354.7770902640506 +2082-03-01,Beirut,512.4403530655848,157.402813062916 +2082-04-01,Beirut,271.3130169490779,109.42088361092715 +2082-05-01,Beirut,338.1693994007331,218.7823777206581 +2082-06-01,Beirut,454.49054885567637,284.3228044016302 +2082-07-01,Beirut,642.2424825576087,182.50234497167682 +2082-08-01,Beirut,280.5700992315021,281.32127573797766 +2082-09-01,Beirut,434.02654481828324,395.16608153166084 +2082-10-01,Beirut,731.7350013298545,377.20281623508964 +2082-11-01,Beirut,438.7965941215005,305.04477887867546 +2082-12-01,Beirut,401.3760955162938,188.37309316607133 +2083-01-01,Beirut,350.1480318792511,415.0023533760744 +2083-02-01,Beirut,484.9202819199012,394.08775692876657 +2083-03-01,Beirut,752.8033599275528,234.93475869185934 +2083-04-01,Beirut,339.6558780868935,241.2297990809045 +2083-05-01,Beirut,370.6063004895037,182.13011137178046 +2083-06-01,Beirut,448.78019813426346,190.16667632324086 +2083-07-01,Beirut,448.9429505241525,206.1533176173992 +2083-08-01,Beirut,416.8106957783392,358.0656908012589 +2083-09-01,Beirut,583.9054212783959,505.9671741400237 +2083-10-01,Beirut,846.1389749556093,442.32630888756796 +2083-11-01,Beirut,539.5915307965752,414.3459429188153 +2083-12-01,Beirut,529.395510224379,334.26145461970583 +2084-01-01,Beirut,520.4894463707167,301.0792959839869 +2084-02-01,Beirut,519.2351110270242,360.4935065237813 +2084-03-01,Beirut,532.8021996294256,377.11434591881414 +2084-04-01,Beirut,573.4110556172757,312.52305374312857 +2084-05-01,Beirut,522.6141520725369,192.0601203068259 +2084-06-01,Beirut,303.24805530335055,111.7815280648789 +2084-07-01,Beirut,297.7555479356609,128.52066678231756 +2084-08-01,Beirut,306.37458323825484,170.5405688686397 +2084-09-01,Beirut,428.0650955534939,244.95685671342147 +2084-10-01,Beirut,433.64571760003315,306.3528436951625 +2084-11-01,Beirut,527.1632202547165,399.9175268582403 +2084-12-01,Beirut,654.7811036241566,463.7456031578361 +2085-01-01,Beirut,655.5089627635148,247.2363028560584 +2085-02-01,Beirut,362.9270264976167,335.415532146314 +2085-03-01,Beirut,397.289513660755,458.1218618807564 +2085-04-01,Beirut,715.6798175634425,411.22597707484283 +2085-05-01,Beirut,553.23657491316,381.3044682842794 +2085-06-01,Beirut,539.5656056371238,388.8368868444353 +2085-07-01,Beirut,622.8509776760895,216.19807603356642 +2085-08-01,Beirut,307.2409670887289,213.05607015560173 +2085-09-01,Beirut,535.60821234897,213.32752962040277 +2085-10-01,Beirut,320.2752525133584,84.29610647167476 +2085-11-01,Beirut,293.4256090774151,136.8457683476693 +2085-12-01,Beirut,493.98192244967584,240.02971147551645 +2086-01-01,Beirut,375.24839575673855,446.5787085656589 +2086-02-01,Beirut,679.6149630351413,513.6383466905672 +2086-03-01,Beirut,772.0775843258397,418.3068765023435 +2086-04-01,Beirut,590.4576452580635,478.8379084675019 +2086-05-01,Beirut,661.7035584275366,308.99180604513424 +2086-06-01,Beirut,453.8692452079917,204.29983519661965 +2086-07-01,Beirut,419.23842750065126,178.61423483119114 +2086-08-01,Beirut,301.34697982120235,129.5761586682143 +2086-09-01,Beirut,324.7156304933145,133.6288194612351 +2086-10-01,Beirut,299.65330561466493,174.99718781400404 +2086-11-01,Beirut,422.10958747107895,278.7155371452672 +2086-12-01,Beirut,475.0434905928539,368.31291079629665 +2087-01-01,Beirut,285.7005545460207,490.02049440867074 +2087-02-01,Beirut,564.2708937464247,433.1700619590291 +2087-03-01,Beirut,890.0399918415249,174.34379299861246 +2087-04-01,Beirut,281.46708917299514,213.73045383839167 +2087-05-01,Beirut,309.0970078940921,148.6563660158242 +2087-06-01,Beirut,355.1626212777694,252.67383255587401 +2087-07-01,Beirut,595.3583748541105,345.51286612441277 +2087-08-01,Beirut,606.0122008213798,401.2044994138935 +2087-09-01,Beirut,720.6891859229045,279.3008473834081 +2087-10-01,Beirut,307.1641946671394,265.2934493920275 +2087-11-01,Beirut,408.926438134838,371.57569743911824 +2087-12-01,Beirut,705.6775927020259,355.28309773719354 +2088-01-01,Beirut,430.70488376358,388.4854525573056 +2088-02-01,Beirut,540.6300803388818,323.9770129879023 +2088-03-01,Beirut,504.65380343870606,210.42823983218125 +2088-04-01,Beirut,356.36855270272423,237.45404314028573 +2088-05-01,Beirut,441.3532572171554,304.62422607994057 +2088-06-01,Beirut,526.7230069321281,374.12486259039264 +2088-07-01,Beirut,565.3218657609684,463.2784371519479 +2088-08-01,Beirut,682.8023687998285,351.875387962335 +2088-09-01,Beirut,428.8103152906989,241.9526053559684 +2088-10-01,Beirut,402.0797269768789,190.2189934015838 +2088-11-01,Beirut,331.38112272915635,218.22617273459926 +2088-12-01,Beirut,477.2431426385643,259.2962510260651 +2089-01-01,Beirut,454.8098038202294,344.30860831712783 +2089-02-01,Beirut,603.5503394496711,270.4398059453477 +2089-03-01,Beirut,363.5959367625081,314.4915613608578 +2089-04-01,Beirut,547.150798048383,266.70737185418676 +2089-05-01,Beirut,510.4341623783992,228.21404752902401 +2089-06-01,Beirut,640.9073111264604,156.2903858585591 +2089-07-01,Beirut,310.9465931289966,218.9627475688186 +2089-08-01,Beirut,383.4883527605692,355.4658284021304 +2089-09-01,Beirut,612.3760044457492,513.117795207503 +2089-10-01,Beirut,795.9167457787087,478.8099577754491 +2089-11-01,Beirut,548.4909847633536,474.2153258259845 +2089-12-01,Beirut,701.3287500816803,369.43407474595 +2090-01-01,Beirut,542.9007179402328,112.99607351899213 +2090-02-01,Beirut,268.10038044885323,94.01198760188191 +2090-03-01,Beirut,325.82650300028115,227.35608880157417 +2090-04-01,Beirut,506.72246655873613,318.2104853764519 +2090-05-01,Beirut,500.22811123855814,332.7175493769337 +2090-06-01,Beirut,453.84861824580923,369.3260286058939 +2090-07-01,Beirut,536.6525230378214,415.54072299451633 +2090-08-01,Beirut,559.987764203855,410.94764194658364 +2090-09-01,Beirut,551.7595095289432,394.3598195219412 +2090-10-01,Beirut,540.2889638807437,391.1829183595087 +2090-11-01,Beirut,572.861714862592,402.63181132594485 +2090-12-01,Beirut,558.6911461596287,371.5566730469935 +2091-01-01,Beirut,560.405601644774,287.4066687043877 +2091-02-01,Beirut,452.08750776141324,302.18810441810274 +2091-03-01,Beirut,405.388271135431,361.8027775970155 +2091-04-01,Beirut,466.590525483293,456.8705945248155 +2091-05-01,Beirut,809.7675708484385,409.30489257951143 +2091-06-01,Beirut,598.0568033058128,310.0454196169535 +2091-07-01,Beirut,352.14900152738045,264.834968434718 +2091-08-01,Beirut,553.7800002048737,270.1155985962226 +2091-09-01,Beirut,369.3868920967389,173.2351741191283 +2091-10-01,Beirut,341.06946798150125,240.17794319748805 +2091-11-01,Beirut,522.8045013831513,244.21581872923807 +2091-12-01,Beirut,423.32668111746426,219.17651349663282 +2092-01-01,Beirut,349.9302914031449,305.5859918165925 +2092-02-01,Beirut,514.2913271483169,408.4571008732152 +2092-03-01,Beirut,806.5444665506972,288.65741909315136 +2092-04-01,Beirut,299.04828234985007,312.07725571390216 +2092-05-01,Beirut,462.2910126802367,268.7416204646295 +2092-06-01,Beirut,379.5658349845345,224.60951111752752 +2092-07-01,Beirut,414.17448256543935,259.63348594805825 +2092-08-01,Beirut,531.5117542422115,230.51520629310755 +2092-09-01,Beirut,399.13030285941704,150.83284952898185 +2092-10-01,Beirut,300.8696019595195,118.33575856438387 +2092-11-01,Beirut,371.04805697634526,204.02139667492497 +2092-12-01,Beirut,429.1475223993959,416.61339542293877 +2093-01-01,Beirut,681.3712382715444,233.10607346335098 +2093-02-01,Beirut,398.2574377190801,297.39700770902425 +2093-03-01,Beirut,510.8193618953662,273.59608011740596 +2093-04-01,Beirut,580.226260505068,191.6633996949646 +2093-05-01,Beirut,331.5222193806942,335.4072262069987 +2093-06-01,Beirut,646.5385232410957,394.10099128850555 +2093-07-01,Beirut,738.4640719329223,334.4152351227138 +2093-08-01,Beirut,353.52149181404855,460.57014950350003 +2093-09-01,Beirut,696.7629385673549,428.07790079812946 +2093-10-01,Beirut,442.82867655950224,262.7767842439662 +2093-11-01,Beirut,296.8635218391818,178.33839837762224 +2093-12-01,Beirut,416.3432713260886,232.10777537950298 +2094-01-01,Beirut,437.67432791846545,249.8843982928291 +2094-02-01,Beirut,428.5698388612643,322.39040625628513 +2094-03-01,Beirut,575.957739584094,403.2305627106956 +2094-04-01,Beirut,679.862795214182,302.27893555115463 +2094-05-01,Beirut,342.3861471610171,331.0191743415838 +2094-06-01,Beirut,479.26473924887614,383.4822786798588 +2094-07-01,Beirut,575.5936556979897,384.4870560856623 +2094-08-01,Beirut,526.889308599799,416.5374357123539 +2094-09-01,Beirut,523.0295461700553,354.5439725315661 +2094-10-01,Beirut,698.0564188442664,234.1235337972376 +2094-11-01,Beirut,281.74295550263315,92.40325467507611 +2094-12-01,Beirut,272.73059335133945,134.26882482673452 +2095-01-01,Beirut,291.8919610039195,479.9440803690135 +2095-02-01,Beirut,684.4177017011191,330.8817644658571 +2095-03-01,Beirut,600.6658053890503,209.3631840535044 +2095-04-01,Beirut,404.2733092431938,136.10945199703855 +2095-05-01,Beirut,271.6728314140822,192.5528072590336 +2095-06-01,Beirut,546.8286367911531,378.68082539499505 +2095-07-01,Beirut,555.053239310666,508.30131541001913 +2095-08-01,Beirut,814.3439273184931,461.14108805411195 +2095-09-01,Beirut,534.5252711149838,398.246240902981 +2095-10-01,Beirut,679.7499384684752,391.5979051449679 +2095-11-01,Beirut,428.47452274923387,191.17083336843157 +2095-12-01,Beirut,323.04867874775914,119.0945629872272 +2096-01-01,Beirut,286.5311884246324,164.56697867044068 +2096-02-01,Beirut,449.38234082580595,259.09525418753026 +2096-03-01,Beirut,432.723779836449,315.9143239617489 +2096-04-01,Beirut,585.6936400148372,250.6155105072083 +2096-05-01,Beirut,474.01386568381076,124.26442431487536 +2096-06-01,Beirut,317.639090739267,166.78282061803023 +2096-07-01,Beirut,363.5713232926718,306.41289804892574 +2096-08-01,Beirut,538.1660328178145,460.9779332129555 +2096-09-01,Beirut,693.4015667525398,496.86951682491235 +2096-10-01,Beirut,645.5078695558839,450.4883934696773 +2096-11-01,Beirut,667.8684224602828,342.26576081930267 +2096-12-01,Beirut,569.8699308863837,119.79028018220055 +2097-01-01,Beirut,611.2514492157388,267.0455717815775 +2097-02-01,Beirut,773.6429187053313,174.37605175047608 +2097-03-01,Beirut,299.83956554000883,242.76943072834428 +2097-04-01,Beirut,430.81447414495125,312.9484488010909 +2097-05-01,Beirut,655.3396519255502,277.36282359690045 +2097-06-01,Beirut,437.97933433308197,403.3736592253727 +2097-07-01,Beirut,655.5014526974832,425.3324949063513 +2097-08-01,Beirut,816.6874794308009,221.74599545797525 +2097-09-01,Beirut,290.00690871059896,229.60906622473325 +2097-10-01,Beirut,365.1289418508982,349.81930610477093 +2097-11-01,Beirut,584.6071752224732,436.1808443351554 +2097-12-01,Beirut,826.5612615875547,414.77526692732505 +2098-01-01,Beirut,565.4090031024576,260.94637579153346 +2098-02-01,Beirut,282.1769704488052,96.84562255858617 +2098-03-01,Beirut,289.57453980629685,170.53803572947095 +2098-04-01,Beirut,472.41599625798386,288.6733072177337 +2098-05-01,Beirut,531.5734808123339,447.46292922571564 +2098-06-01,Beirut,795.3456206886525,317.61742063065145 +2098-07-01,Beirut,380.7735924871888,262.07248539384966 +2098-08-01,Beirut,336.14427923204346,267.9216760569506 +2098-09-01,Beirut,539.937945451982,305.37934280358576 +2098-10-01,Beirut,648.692780538362,314.72915947554566 +2098-11-01,Beirut,353.92029689584666,309.4014163719496 +2098-12-01,Beirut,436.9794410553143,285.62297685254384 +2099-01-01,Beirut,687.2253604625334,231.49320479912683 +2099-02-01,Beirut,826.3100858859656,142.09279564264932 +2099-03-01,Beirut,312.9082378080773,219.08080563987505 +2099-04-01,Beirut,383.7837658374126,361.26471815887993 +2099-05-01,Beirut,471.31157932147585,431.36536400754756 +2099-06-01,Beirut,785.3372231702238,387.1660489273964 +2099-07-01,Beirut,556.7407665795955,350.1405495087461 +2099-08-01,Beirut,427.19732285519206,277.084471236402 +2099-09-01,Beirut,415.43733103192784,315.63764312845706 +2099-10-01,Beirut,557.5389940088928,400.68398239530774 +2099-11-01,Beirut,628.7443219585107,404.0924503886929 +2099-12-01,Beirut,542.7758245133521,307.85206574157655 +2100-01-01,Beirut,431.1882799658498,205.0725805010109 +2100-02-01,Beirut,366.553179578852,251.6356246059384 +2100-03-01,Beirut,508.09554839170113,266.8353212305689 +2100-04-01,Beirut,534.6118683489843,215.43937500415853 +2100-05-01,Beirut,336.2416786158155,222.01150980023735 +2100-06-01,Beirut,470.81061676612546,252.40452712097837 +2100-07-01,Beirut,434.6860675006351,362.39249928840275 +2100-08-01,Beirut,584.1738804196193,354.68048633085226 +2100-09-01,Beirut,421.4248083337853,203.65571132594104 +2100-10-01,Beirut,371.1913140578373,233.84444045045166 +2100-11-01,Beirut,440.39680401311125,250.30824244925944 +2100-12-01,Beirut,442.8368553300435,299.80021579390717 +2101-01-01,Beirut,563.3180155395668,287.54418197354994 +2101-02-01,Beirut,803.2522799332274,169.5876949674373 +2101-03-01,Beirut,603.2256062520198,113.38684900831447 +2101-04-01,Beirut,265.4085104452265,323.16951025695715 +2101-05-01,Beirut,630.21341432742,437.95221513594026 +2101-06-01,Beirut,874.8012448425965,228.15573363142434 +2101-07-01,Beirut,354.0540120783739,370.5830515297421 +2101-08-01,Beirut,641.0973775236284,293.9365155853633 +2101-09-01,Beirut,398.4776986967997,329.5099748286479 +2101-10-01,Beirut,548.8034755245974,411.1144500224596 +2101-11-01,Beirut,765.4322561029044,294.76369753352435 +2101-12-01,Beirut,334.62156190534034,346.9021981811717 +2102-01-01,Beirut,549.1744007722236,279.9543111277566 +2102-02-01,Beirut,353.32723315399295,278.0150121555449 +2102-03-01,Beirut,515.1708793337505,291.4906921728315 +2102-04-01,Beirut,416.42907125855857,358.66113359607493 +2102-05-01,Beirut,480.3330718612668,431.4383597729826 +2102-06-01,Beirut,579.8514516274051,451.7979747232178 +2102-07-01,Beirut,641.6164465395482,412.0645667653831 +2102-08-01,Beirut,580.4556775906891,261.8166555700423 +2102-09-01,Beirut,335.7282164300153,206.15760844497083 +2102-10-01,Beirut,415.28669248142535,275.28868235260927 +2102-11-01,Beirut,506.2400734132308,250.78812584770935 +2102-12-01,Beirut,437.6263097907912,272.7022094033729 +2103-01-01,Beirut,417.5710642446285,363.2442199452464 +2103-02-01,Beirut,472.63304231017617,350.4632059563394 +2103-03-01,Beirut,766.730108678533,189.2177486048252 +2103-04-01,Beirut,263.2888971854413,226.63388565488378 +2103-05-01,Beirut,444.9138772564442,420.04302460611484 +2103-06-01,Beirut,799.10960405709,376.24187764592136 +2103-07-01,Beirut,368.0893481539609,415.12070439519795 +2103-08-01,Beirut,580.3412005225166,313.98834551047236 +2103-09-01,Beirut,354.361204642349,254.14550025173787 +2103-10-01,Beirut,470.74459505549885,237.440326277848 +2103-11-01,Beirut,389.99659655902474,138.82010046226276 +2103-12-01,Beirut,308.9525162811976,159.89254422103994 +2104-01-01,Beirut,386.6280747498371,188.03801227398358 +2104-02-01,Beirut,365.55925320286286,286.2900368336554 +2104-03-01,Beirut,478.3240263202131,403.708998601049 +2104-04-01,Beirut,758.243322552426,347.4381552861196 +2104-05-01,Beirut,515.9076373869678,257.3612428814251 +2104-06-01,Beirut,377.4014699614108,133.369818905407 +2104-07-01,Beirut,282.4602954056663,176.8466723552791 +2104-08-01,Beirut,560.575555467844,256.11779896210066 +2104-09-01,Beirut,346.34454350593546,397.08013527338096 +2104-10-01,Beirut,477.20083421862626,497.45065686115635 +2104-11-01,Beirut,796.8056598272773,441.0697340019401 +2104-12-01,Beirut,590.4826959577714,400.8064346873712 +2105-01-01,Beirut,352.7572911565309,414.52491695559706 +2105-02-01,Beirut,453.6588347620875,424.92605531155675 +2105-03-01,Beirut,719.4701376017988,303.6927718521177 +2105-04-01,Beirut,664.839216750938,188.87708446722266 +2105-05-01,Beirut,263.80866062527485,147.3044279182234 +2105-06-01,Beirut,502.5835971544229,248.86474946455854 +2105-07-01,Beirut,365.70942880408944,226.33197682333966 +2105-08-01,Beirut,567.9319994979917,184.86485050746685 +2105-09-01,Beirut,330.488119295317,419.4768421535341 +2105-10-01,Beirut,594.3520260058841,525.1096071035414 +2105-11-01,Beirut,936.4335276289767,274.52279547943687 +2105-12-01,Beirut,345.80464177259955,298.5450884163758 +2106-01-01,Beirut,312.3327146999,260.2802463513411 +2106-02-01,Beirut,615.095882880569,317.98980932070106 +2106-03-01,Beirut,517.4135599427169,396.5893955642078 +2106-04-01,Beirut,460.81844819175797,392.07117136354833 +2106-05-01,Beirut,520.7582398641948,307.1714267559412 +2106-06-01,Beirut,558.065804565482,295.9673349801966 +2106-07-01,Beirut,568.4478021495756,185.96781721247922 +2106-08-01,Beirut,279.67797025740623,124.27045559861057 +2106-09-01,Beirut,333.73912914663447,178.78326586592956 +2106-10-01,Beirut,340.73416410871647,258.4962443191908 +2106-11-01,Beirut,523.5448344335549,377.1507404080961 +2106-12-01,Beirut,621.7365044525325,322.0807429170814 +2107-01-01,Beirut,531.1037416137035,303.80378193732355 +2107-02-01,Beirut,328.3806713137268,440.6011204879554 +2107-03-01,Beirut,546.629465724892,483.83815286427733 +2107-04-01,Beirut,742.4877698451489,372.28480408398366 +2107-05-01,Beirut,551.3663112772645,358.9837555791896 +2107-06-01,Beirut,514.4790787991055,243.9451347152029 +2107-07-01,Beirut,377.57649050711154,204.21012415911858 +2107-08-01,Beirut,419.6051862047943,285.49618203619104 +2107-09-01,Beirut,691.9911146252466,182.19648995734596 +2107-10-01,Beirut,292.8296904816933,111.38001689050795 +2107-11-01,Beirut,316.1111009346993,168.77054218251584 +2107-12-01,Beirut,510.6015185416431,254.97926491528997 +2108-01-01,Beirut,476.99896261492233,228.5623627808506 +2108-02-01,Beirut,341.35986577452223,323.66786661587594 +2108-03-01,Beirut,496.4966114776476,401.1619357829623 +2108-04-01,Beirut,634.3727049386819,462.8286067787385 +2108-05-01,Beirut,805.1194572406168,320.4375799762674 +2108-06-01,Beirut,406.94195462481207,95.59006437507364 +2108-07-01,Beirut,263.9833468187208,88.65710372147753 +2108-08-01,Beirut,362.7044764929218,239.30195954778966 +2108-09-01,Beirut,501.2068888854632,351.480666290226 +2108-10-01,Beirut,700.796615608418,309.01827476461204 +2108-11-01,Beirut,397.84945080997636,338.83847522066367 +2108-12-01,Beirut,609.0190563684596,262.3051550881139 +2109-01-01,Beirut,521.3600482034824,310.1894294403105 +2109-02-01,Beirut,367.54034175153197,395.9087221140939 +2109-03-01,Beirut,579.2728164713175,393.3708613117632 +2109-04-01,Beirut,531.0730840838762,347.89387908515016 +2109-05-01,Beirut,558.0885919576187,353.8690891138381 +2109-06-01,Beirut,550.143044973867,255.04164562135105 +2109-07-01,Beirut,546.3521076698095,128.69605651333674 +2109-08-01,Beirut,280.3290055363663,106.8134217942924 +2109-09-01,Beirut,361.86851869763717,185.06803584038565 +2109-10-01,Beirut,431.4363179001244,255.27441870905074 +2109-11-01,Beirut,426.8317472436431,421.74522519857675 +2109-12-01,Beirut,620.0386894219159,507.01096533547417 +2110-01-01,Beirut,722.5102226191276,518.221019465997 +2110-02-01,Beirut,688.0632472131344,500.6486847489013 +2110-03-01,Beirut,601.7559223368133,365.3267015933314 +2110-04-01,Beirut,650.4413399534998,308.1074647594028 +2110-05-01,Beirut,479.03203007951527,257.75455150991615 +2110-06-01,Beirut,404.805443716456,292.80714908983015 +2110-07-01,Beirut,571.2915709545116,289.52099553059446 +2110-08-01,Beirut,423.6677461367939,250.09206400795117 +2110-09-01,Beirut,434.83840353181597,261.3051337803416 +2110-10-01,Beirut,534.4000690552525,217.19763207087917 +2110-11-01,Beirut,338.67812921615723,135.71738408977296 +2110-12-01,Beirut,310.7633423739462,151.5938424462091 +2111-01-01,Beirut,341.7147163945125,424.2668187670617 +2111-02-01,Beirut,423.8844321173271,460.2497677114869 +2111-03-01,Beirut,708.7069270083919,367.83071827778815 +2111-04-01,Beirut,622.669372962909,344.2729031174155 +2111-05-01,Beirut,455.50206730415033,368.7115614189532 +2111-06-01,Beirut,581.0321523168225,320.22210805676804 +2111-07-01,Beirut,525.0456388278645,235.59282344408587 +2111-08-01,Beirut,384.91323347362857,260.8057607193074 +2111-09-01,Beirut,452.51612163269954,340.54060688416854 +2111-10-01,Beirut,626.5854608878894,361.92233487288615 +2111-11-01,Beirut,709.8444448181278,219.71707160945869 +2111-12-01,Beirut,285.02580597637194,115.02654826904062 +2112-01-01,Beirut,287.6034561058683,168.9154997790312 +2112-02-01,Beirut,399.20722959743193,238.512119862069 +2112-03-01,Beirut,426.16553751619455,372.4595734543901 +2112-04-01,Beirut,558.3815102522531,440.7662398043856 +2112-05-01,Beirut,694.544074126694,416.0690289852401 +2112-06-01,Beirut,703.3656240180974,282.8898747795855 +2112-07-01,Beirut,308.0273121532779,187.3370047815626 +2112-08-01,Beirut,361.76826445999694,222.03954665348635 +2112-09-01,Beirut,383.00827436144357,163.7158439097313 +2112-10-01,Beirut,332.0918527453055,143.9255821440976 +2112-11-01,Beirut,309.65385871480737,146.79528417753824 +2112-12-01,Beirut,393.9765972034858,229.69159141846984 +2113-01-01,Beirut,679.0477472945263,232.7706306942392 +2113-02-01,Beirut,655.3197193872816,191.81421625282272 +2113-03-01,Beirut,272.0632776895096,385.35521629874415 +2113-04-01,Beirut,570.9937145342675,503.9532768041274 +2113-05-01,Beirut,833.0903381034263,342.8613414720326 +2113-06-01,Beirut,540.0329529311618,247.84987396655842 +2113-07-01,Beirut,266.75885632486313,114.24622077938221 +2113-08-01,Beirut,426.90095816039263,242.59285197281727 +2113-09-01,Beirut,448.26110339893967,270.68458990380003 +2113-10-01,Beirut,501.7582871924843,344.94478812551523 +2113-11-01,Beirut,703.4080610350563,261.4495054807227 +2113-12-01,Beirut,330.10137661409703,438.6191717236164 +2114-01-01,Beirut,586.1268319400742,446.0352037399224 +2114-02-01,Beirut,721.8649742061164,238.5312993443469 +2114-03-01,Beirut,296.28056582318567,137.00651067533158 +2114-04-01,Beirut,277.2374817106023,147.32689875819676 +2114-05-01,Beirut,411.62622971496376,261.9260113602809 +2114-06-01,Beirut,487.7394372550009,409.0563692251433 +2114-07-01,Beirut,636.7892487201592,437.7937474638581 +2114-08-01,Beirut,530.6623451985212,398.2701247865724 +2114-09-01,Beirut,581.3681506135212,395.8083960172189 +2114-10-01,Beirut,634.1001306927838,259.28670436552426 +2114-11-01,Beirut,403.6070223575327,123.72095395361738 +2114-12-01,Beirut,272.78069475075534,93.68531604254497 +2017-01-01,Bekaa,701.2118961803191,34.81829981811756 +2017-02-01,Bekaa,785.5704465408992,40.08047561217825 +2017-03-01,Bekaa,612.6104434220903,31.541242717338484 +2017-04-01,Bekaa,639.5353344141924,32.549815637474325 +2017-05-01,Bekaa,766.4208429973125,36.66749521683109 +2017-06-01,Bekaa,866.9958003571505,43.126840032527305 +2017-07-01,Bekaa,923.9753061283228,49.03394853635197 +2017-08-01,Bekaa,936.6169484590273,52.45491946551175 +2017-09-01,Bekaa,639.1951995551442,37.24131247117067 +2017-10-01,Bekaa,473.66754933603335,45.13667205209403 +2017-11-01,Bekaa,460.3249964371678,31.472980390758792 +2017-12-01,Bekaa,761.2252775357642,30.55333171007905 +2018-01-01,Bekaa,707.7628957614215,38.01758662540048 +2018-02-01,Bekaa,483.97694029703797,27.418111017092563 +2018-03-01,Bekaa,567.6312588888479,22.502532014851866 +2018-04-01,Bekaa,806.0978268263176,35.47016218830704 +2018-05-01,Bekaa,815.0233476030508,37.46756514529393 +2018-06-01,Bekaa,873.9021958513384,44.750608701718406 +2018-07-01,Bekaa,819.8259134751985,47.16218963137872 +2018-08-01,Bekaa,911.7392894389203,51.89954781474404 +2018-09-01,Bekaa,541.9586801097922,35.104630727328626 +2018-10-01,Bekaa,506.3274401332018,36.50992449051584 +2018-11-01,Bekaa,401.2686698158486,20.109135164265492 +2018-12-01,Bekaa,767.3989228526485,35.26571356512179 +2019-01-01,Bekaa,905.2387391695455,46.17977950381315 +2019-02-01,Bekaa,667.725685182082,35.70136166479803 +2019-03-01,Bekaa,573.2141422164411,29.753229275746413 +2019-04-01,Bekaa,901.0427178515655,44.19284934705996 +2019-05-01,Bekaa,929.2445967537997,50.77783525969075 +2019-06-01,Bekaa,548.6965452590355,29.62389580751048 +2019-07-01,Bekaa,557.2129819541633,33.03741993740702 +2019-08-01,Bekaa,670.6120555426198,34.00050828045565 +2019-09-01,Bekaa,825.1698075986494,41.874099271389866 +2019-10-01,Bekaa,919.7522211425714,52.56087678074297 +2019-11-01,Bekaa,708.0127817973137,33.423746289820116 +2019-12-01,Bekaa,543.3182314201839,28.746405762421613 +2020-01-01,Bekaa,792.2109264028682,40.255472439785294 +2020-02-01,Bekaa,821.0044730763775,40.007975702208284 +2020-03-01,Bekaa,758.6424264837606,43.13353919678515 +2020-04-01,Bekaa,1000.6762658024594,49.81687900619306 +2020-05-01,Bekaa,721.8217300742415,38.76121602111402 +2020-06-01,Bekaa,534.8307248526735,41.62602038323554 +2020-07-01,Bekaa,486.70724167689895,41.23799486035563 +2020-08-01,Bekaa,534.9471590095557,24.134291217855584 +2020-09-01,Bekaa,563.0387795411639,28.58329278530549 +2020-10-01,Bekaa,633.4446367687126,31.602188268134135 +2020-11-01,Bekaa,610.5276389212597,24.095142330300277 +2020-12-01,Bekaa,853.657474440878,37.13670562707567 +2021-01-01,Bekaa,911.0786175492101,46.37704580731216 +2021-02-01,Bekaa,733.7772837237994,40.09915762207595 +2021-03-01,Bekaa,800.2873177412934,42.05021016380732 +2021-04-01,Bekaa,605.6071567035284,35.76311099710146 +2021-05-01,Bekaa,714.1163250782062,37.92793691403202 +2021-06-01,Bekaa,857.9385843694979,43.758600477324656 +2021-07-01,Bekaa,687.2163019187619,38.94640491644285 +2021-08-01,Bekaa,600.0871291560532,35.51836839322022 +2021-09-01,Bekaa,360.7347887818223,24.389036764397957 +2021-10-01,Bekaa,551.3083264386569,32.12289979645797 +2021-11-01,Bekaa,496.46037270782995,24.22684577195252 +2021-12-01,Bekaa,801.6044894339984,35.72184036277193 +2022-01-01,Bekaa,774.6916206391415,34.2334941022461 +2022-02-01,Bekaa,908.7822680836124,47.40442928328537 +2022-03-01,Bekaa,882.8290890250175,51.56855236288844 +2022-04-01,Bekaa,822.8503469684844,53.47986500124996 +2022-05-01,Bekaa,489.5452487690667,33.8077839334914 +2022-06-01,Bekaa,617.4108134591247,40.265682237981515 +2022-07-01,Bekaa,675.8010883947061,30.898897179302676 +2022-08-01,Bekaa,527.9451074482449,25.725709158898148 +2022-09-01,Bekaa,701.200752317119,34.844371003236574 +2022-10-01,Bekaa,549.3846376397228,25.590375402605073 +2022-11-01,Bekaa,727.4258306586167,28.340369032593514 +2022-12-01,Bekaa,855.103541654733,38.152998691288985 +2023-01-01,Bekaa,668.3611049679894,32.15762197556236 +2023-02-01,Bekaa,716.8681456421774,35.30339525591751 +2023-03-01,Bekaa,737.7123300385653,35.48257352041244 +2023-04-01,Bekaa,421.559888034833,26.061131319204684 +2023-05-01,Bekaa,853.399024648044,37.44346352037688 +2023-06-01,Bekaa,682.5022830975574,30.970860742420935 +2023-07-01,Bekaa,974.2205698781888,53.731466343658965 +2023-08-01,Bekaa,874.2599522871708,41.234425124835795 +2023-09-01,Bekaa,799.2907928710058,43.43557487372816 +2023-10-01,Bekaa,724.5282066431233,36.97476138373281 +2023-11-01,Bekaa,601.5854846935433,36.292019914773 +2023-12-01,Bekaa,689.9259075526802,35.84499032804821 +2024-01-01,Bekaa,721.4812658399262,34.07936456551102 +2024-02-01,Bekaa,565.241421743302,33.136137308910094 +2024-03-01,Bekaa,755.3330284886479,38.47275302235199 +2024-04-01,Bekaa,780.589743545186,38.48511116303408 +2024-05-01,Bekaa,789.0834533468914,40.763465307780166 +2024-06-01,Bekaa,823.5136538603305,38.21898265190361 +2024-07-01,Bekaa,893.3034969947855,46.784704875551185 +2024-08-01,Bekaa,822.6004609325923,40.4425584958788 +2024-09-01,Bekaa,696.8174262639757,34.68338420551326 +2024-10-01,Bekaa,719.5898832650965,39.37998298322865 +2024-11-01,Bekaa,593.7145960737829,34.782900925905516 +2024-12-01,Bekaa,820.7757768493287,37.27715314770408 +2025-01-01,Bekaa,622.2558687407145,28.912170923005498 +2025-02-01,Bekaa,606.1338277554503,27.210138462113107 +2025-03-01,Bekaa,991.259811190273,52.156740166758624 +2025-04-01,Bekaa,644.318357353832,28.01477546528283 +2025-05-01,Bekaa,652.548182670798,32.36571716632333 +2025-06-01,Bekaa,831.9946827142567,36.85455763229203 +2025-07-01,Bekaa,588.4611703569994,30.97539826633709 +2025-08-01,Bekaa,1012.7384821426452,52.99601512927916 +2025-09-01,Bekaa,946.1270554387953,47.06724294077243 +2025-10-01,Bekaa,749.7851412831726,38.05332978432449 +2025-11-01,Bekaa,552.2028273199932,39.484594259942256 +2025-12-01,Bekaa,629.1647894452828,44.866040000456756 +2026-01-01,Bekaa,583.6159503877761,30.423800251545252 +2026-02-01,Bekaa,700.1945108764554,32.10602925003185 +2026-03-01,Bekaa,657.441930596025,36.913889709913974 +2026-04-01,Bekaa,774.1453517588335,41.08173914422774 +2026-05-01,Bekaa,464.98815422756076,23.78890157583679 +2026-06-01,Bekaa,845.6066645815226,34.94823612248432 +2026-07-01,Bekaa,658.5356211700754,34.83442272953828 +2026-08-01,Bekaa,787.7426764267183,43.87393721353267 +2026-09-01,Bekaa,776.7458792834993,39.376034997587496 +2026-10-01,Bekaa,849.7441668937336,41.11444891448361 +2026-11-01,Bekaa,748.2291176260197,34.73745771992532 +2026-12-01,Bekaa,990.8597300326322,55.1927056638508 +2027-01-01,Bekaa,578.6326947337438,28.724127421292422 +2027-02-01,Bekaa,785.0584326883585,39.398667948205414 +2027-03-01,Bekaa,740.0332728574317,36.23141715314978 +2027-04-01,Bekaa,619.6217449388156,32.284350541595686 +2027-05-01,Bekaa,1024.9932183263886,54.68999943231701 +2027-06-01,Bekaa,680.6814966216199,30.860816552832148 +2027-07-01,Bekaa,872.1792338296979,43.22220338928285 +2027-08-01,Bekaa,462.26364436281096,25.228821478058535 +2027-09-01,Bekaa,743.1083203500788,41.418978678163995 +2027-10-01,Bekaa,622.9886189180183,32.950581983776246 +2027-11-01,Bekaa,897.0657310861358,45.334780553128766 +2027-12-01,Bekaa,854.4417169515884,49.53136813142467 +2028-01-01,Bekaa,832.6728663889954,45.66862470121047 +2028-02-01,Bekaa,651.9203385160315,36.00944195598427 +2028-03-01,Bekaa,598.2284096285334,36.54497172831823 +2028-04-01,Bekaa,450.27822735571243,25.45605819351301 +2028-05-01,Bekaa,646.2740230016032,35.44614626068309 +2028-06-01,Bekaa,565.655556245668,30.44634159471191 +2028-07-01,Bekaa,669.8614642050205,26.994286188786262 +2028-08-01,Bekaa,889.9666510607568,42.56099558152591 +2028-09-01,Bekaa,943.0374056426449,50.88516964176985 +2028-10-01,Bekaa,791.7284465326011,52.70196998614877 +2028-11-01,Bekaa,726.8652339541945,42.499331946515596 +2028-12-01,Bekaa,395.205420109285,32.33186378046632 +2029-01-01,Bekaa,914.7119012235325,45.78224749155632 +2029-02-01,Bekaa,779.7969372775337,40.91787114440854 +2029-03-01,Bekaa,572.7650939357738,31.219993116264693 +2029-04-01,Bekaa,536.5860754422351,28.856071701889096 +2029-05-01,Bekaa,561.8430649781624,32.41382142100851 +2029-06-01,Bekaa,533.0887139614251,29.50669737148665 +2029-07-01,Bekaa,751.1113158998423,31.42877536291007 +2029-08-01,Bekaa,846.6675823165072,42.685614221101325 +2029-09-01,Bekaa,843.48922078178,47.98008755188725 +2029-10-01,Bekaa,795.4105875381942,41.40953129036853 +2029-11-01,Bekaa,925.6157596455816,49.25712792823961 +2029-12-01,Bekaa,526.2777823987873,31.881523027640558 +2030-01-01,Bekaa,640.895215099851,42.723448098469284 +2030-02-01,Bekaa,677.6677678245113,34.02290630228728 +2030-03-01,Bekaa,830.8981924504368,37.46820048729457 +2030-04-01,Bekaa,674.1285756847933,37.17312549910733 +2030-05-01,Bekaa,845.6011749937394,44.96309661752096 +2030-06-01,Bekaa,363.03102845566434,22.928550989369665 +2030-07-01,Bekaa,825.1277024603521,37.9650763478179 +2030-08-01,Bekaa,714.1770399190884,34.01030732266077 +2030-09-01,Bekaa,652.3839891002019,30.477124653412375 +2030-10-01,Bekaa,891.3706131363147,40.53415117173757 +2030-11-01,Bekaa,846.7026058865641,49.38061477253018 +2030-12-01,Bekaa,688.1568329936605,30.222359898856027 +2031-01-01,Bekaa,938.4228032561945,47.37946773035816 +2031-02-01,Bekaa,776.366548767679,40.34379088803149 +2031-03-01,Bekaa,529.2028818011358,29.191815965814556 +2031-04-01,Bekaa,793.5099275600109,39.72106411995942 +2031-05-01,Bekaa,408.9551082860929,25.932854291737243 +2031-06-01,Bekaa,940.1551524729445,47.14377948875572 +2031-07-01,Bekaa,681.040625454398,28.270954225175466 +2031-08-01,Bekaa,919.3888104313226,53.386384029863734 +2031-09-01,Bekaa,786.6701207656332,39.750907463514764 +2031-10-01,Bekaa,764.8726145548118,40.681252052898195 +2031-11-01,Bekaa,687.653602481573,35.11724891496911 +2031-12-01,Bekaa,784.3282626173127,41.1012810821356 +2032-01-01,Bekaa,542.506321387046,30.325759593149826 +2032-02-01,Bekaa,486.436714790942,28.934607360865073 +2032-03-01,Bekaa,848.2017025184051,44.51229930497847 +2032-04-01,Bekaa,517.1856251848944,24.096927198060193 +2032-05-01,Bekaa,808.7072474831922,33.203521977005195 +2032-06-01,Bekaa,936.795963916638,50.22407708209674 +2032-07-01,Bekaa,853.9513320749136,50.44462645360967 +2032-08-01,Bekaa,821.1686666469735,40.061979772262134 +2032-09-01,Bekaa,867.2792826702758,39.83688992175398 +2032-10-01,Bekaa,498.63743343089834,35.69843909159512 +2032-11-01,Bekaa,797.5954434759147,46.73814760476057 +2032-12-01,Bekaa,581.6015187027856,31.27708967656813 +2033-01-01,Bekaa,941.3186157077195,47.38729573482178 +2033-02-01,Bekaa,819.270696566804,42.53091287656568 +2033-03-01,Bekaa,522.3676039166794,29.287690551249682 +2033-04-01,Bekaa,860.5846754727644,44.08966094091986 +2033-05-01,Bekaa,538.5958684255489,28.8177605792509 +2033-06-01,Bekaa,868.0807075907477,43.0478034876485 +2033-07-01,Bekaa,449.51824882300383,27.129621422618875 +2033-08-01,Bekaa,616.5558650577664,30.571450777413396 +2033-09-01,Bekaa,785.3466909428553,37.105974282258984 +2033-10-01,Bekaa,747.1626005114962,38.35587521240754 +2033-11-01,Bekaa,885.5106977612414,49.08497093162144 +2033-12-01,Bekaa,738.6965033363405,36.23744846953719 +2034-01-01,Bekaa,972.6271072323543,52.427596804405425 +2034-02-01,Bekaa,702.3899068227197,31.900967447939017 +2034-03-01,Bekaa,543.5308980509056,43.71929497057849 +2034-04-01,Bekaa,564.7434886834253,44.39292297567805 +2034-05-01,Bekaa,636.7291669311674,35.16162533740406 +2034-06-01,Bekaa,497.45656820285046,22.452133141266735 +2034-07-01,Bekaa,632.1004014082362,29.886797372293543 +2034-08-01,Bekaa,671.4418616319309,34.0898403208238 +2034-09-01,Bekaa,566.5190135080902,23.427158526229597 +2034-10-01,Bekaa,855.9088092866532,36.40282946984162 +2034-11-01,Bekaa,819.1559641821348,36.868275109347564 +2034-12-01,Bekaa,842.5502816873385,43.33868374109201 +2035-01-01,Bekaa,908.2344072228473,44.31750049250517 +2035-02-01,Bekaa,642.221609300032,32.417355695579474 +2035-03-01,Bekaa,428.9109950353395,23.09656939774649 +2035-04-01,Bekaa,934.6645216680481,45.43462085467948 +2035-05-01,Bekaa,965.2251117530974,50.42482742382249 +2035-06-01,Bekaa,848.9397226999808,44.85408079544948 +2035-07-01,Bekaa,523.8514669424219,25.504375213891418 +2035-08-01,Bekaa,764.3738306088287,43.400805413358604 +2035-09-01,Bekaa,743.1711761301966,36.51066178274449 +2035-10-01,Bekaa,831.5933938473034,43.38015532079848 +2035-11-01,Bekaa,797.9696686750967,43.386346211455816 +2035-12-01,Bekaa,721.5976999968084,40.03284269260517 +2036-01-01,Bekaa,368.3785182591132,24.811087067721093 +2036-02-01,Bekaa,656.9141067306687,35.56674894779869 +2036-03-01,Bekaa,700.9282491795602,36.141539900692734 +2036-04-01,Bekaa,577.5402942128223,26.803528446944902 +2036-05-01,Bekaa,794.7254869828487,33.3392265957219 +2036-06-01,Bekaa,906.4175183542358,47.57338297418872 +2036-07-01,Bekaa,874.8901020688063,51.13834308624554 +2036-08-01,Bekaa,860.9611514029374,46.177300192471144 +2036-09-01,Bekaa,770.7074974095937,38.51823907697874 +2036-10-01,Bekaa,437.38005658789825,37.31352130585197 +2036-11-01,Bekaa,808.445943104711,45.36501101204263 +2036-12-01,Bekaa,619.2410420260494,31.106458978291023 +2037-01-01,Bekaa,341.2464502240724,19.594175697356693 +2037-02-01,Bekaa,398.14882728689054,20.7700164357849 +2037-03-01,Bekaa,551.2375382041923,27.887494299462894 +2037-04-01,Bekaa,856.0183814588063,40.62370779811524 +2037-05-01,Bekaa,808.951973306568,38.34628745835613 +2037-06-01,Bekaa,801.4509456637019,48.94860289765292 +2037-07-01,Bekaa,789.5380461112195,37.6451151612198 +2037-08-01,Bekaa,880.0898396170699,42.23377081056709 +2037-09-01,Bekaa,581.9402811648879,32.58956145100233 +2037-10-01,Bekaa,724.3049451079798,47.76691701281888 +2037-11-01,Bekaa,583.9170817256245,36.59659843725808 +2037-12-01,Bekaa,723.130941864661,34.58997120094571 +2038-01-01,Bekaa,593.3675992300057,29.833468537807818 +2038-02-01,Bekaa,761.2889567540497,37.56465131314887 +2038-03-01,Bekaa,772.7080129895537,39.086920403889934 +2038-04-01,Bekaa,342.7417315924041,20.966945860269625 +2038-05-01,Bekaa,666.5439965158665,23.27898938398419 +2038-06-01,Bekaa,781.4491934085264,36.45460245519557 +2038-07-01,Bekaa,754.8302920394608,33.761468979184755 +2038-08-01,Bekaa,810.2411481015788,36.94470822956331 +2038-09-01,Bekaa,924.7415427911043,49.36785178601512 +2038-10-01,Bekaa,803.1705590367948,50.86472049458668 +2038-11-01,Bekaa,855.2733346048681,47.09682919244844 +2038-12-01,Bekaa,517.1922950340511,33.49553698081263 +2039-01-01,Bekaa,953.8626531676383,47.89888493404814 +2039-02-01,Bekaa,798.4054321533285,41.5062569385766 +2039-03-01,Bekaa,671.367916884491,37.115697969947746 +2039-04-01,Bekaa,525.710680532842,31.427684938732234 +2039-05-01,Bekaa,591.2948955706963,29.892899610578695 +2039-06-01,Bekaa,692.3158544899817,36.80760438090567 +2039-07-01,Bekaa,745.3998389784273,38.23840934172763 +2039-08-01,Bekaa,680.8706678166295,31.99438636266472 +2039-09-01,Bekaa,843.9675834612095,43.252998268299606 +2039-10-01,Bekaa,883.2858776244591,47.33092760150976 +2039-11-01,Bekaa,886.679870167311,51.946341491860466 +2039-12-01,Bekaa,696.6617415544436,32.60948607165011 +2040-01-01,Bekaa,547.1662677685857,33.59049253665614 +2040-02-01,Bekaa,714.067961809836,36.13723582802332 +2040-03-01,Bekaa,860.0375831542889,41.40786167069244 +2040-04-01,Bekaa,447.3874653249479,28.345756141743067 +2040-05-01,Bekaa,920.7568706027781,47.399393828545456 +2040-06-01,Bekaa,568.6317637102782,26.141549363549977 +2040-07-01,Bekaa,837.335447772671,44.42088688894314 +2040-08-01,Bekaa,676.2531010527763,34.05154101850188 +2040-09-01,Bekaa,524.908322382447,30.833347615311737 +2040-10-01,Bekaa,870.6982528375415,36.00932079774229 +2040-11-01,Bekaa,651.6639747665552,33.00007955824421 +2040-12-01,Bekaa,752.2934437330804,35.679505899976235 +2041-01-01,Bekaa,452.8083509170584,22.72569663134415 +2041-02-01,Bekaa,420.0620540081822,22.90763346215346 +2041-03-01,Bekaa,759.9173832464128,38.07726444727394 +2041-04-01,Bekaa,936.740354392394,50.120823664217056 +2041-05-01,Bekaa,833.9859208908631,46.75279297664495 +2041-06-01,Bekaa,690.1676689986531,28.41333288997789 +2041-07-01,Bekaa,753.3933375413259,30.0188465581973 +2041-08-01,Bekaa,795.5511209854446,37.058249755234655 +2041-09-01,Bekaa,1041.0709583382422,54.99036548958394 +2041-10-01,Bekaa,544.5244859917292,26.570087542977262 +2041-11-01,Bekaa,630.0427941153307,38.9516575694946 +2041-12-01,Bekaa,533.9919432873369,27.15069261394686 +2042-01-01,Bekaa,969.3930263816275,52.87627828033186 +2042-02-01,Bekaa,427.0451390437018,22.882441413058572 +2042-03-01,Bekaa,935.1930042839385,52.5932555821427 +2042-04-01,Bekaa,760.836779408346,33.55460753393664 +2042-05-01,Bekaa,726.5847160184721,45.92158242491385 +2042-06-01,Bekaa,465.59876107668805,25.961506738426277 +2042-07-01,Bekaa,915.014597093899,49.64672259810713 +2042-08-01,Bekaa,763.4583869500993,39.48516459020328 +2042-09-01,Bekaa,625.6726430728669,38.47422169665113 +2042-10-01,Bekaa,535.0427876287392,32.77310879990627 +2042-11-01,Bekaa,529.076868313572,30.65397727067708 +2042-12-01,Bekaa,836.5290822231942,40.29235773677091 +2043-01-01,Bekaa,740.2769556591288,37.43085124289453 +2043-02-01,Bekaa,869.3951344895613,45.12887064334207 +2043-03-01,Bekaa,811.7287714949529,41.49531132569126 +2043-04-01,Bekaa,565.1418680688535,31.769977657882826 +2043-05-01,Bekaa,592.4319264402952,31.5054153386609 +2043-06-01,Bekaa,892.0052094840546,44.859139890821965 +2043-07-01,Bekaa,662.4568886195054,36.684243127475696 +2043-08-01,Bekaa,995.9786608487267,55.51774958645396 +2043-09-01,Bekaa,644.1690954620062,30.32454801073001 +2043-10-01,Bekaa,854.6918225709917,45.82168893193983 +2043-11-01,Bekaa,574.3102756570552,31.32821106698654 +2043-12-01,Bekaa,782.201376726583,44.4675682730548 +2044-01-01,Bekaa,358.27358699509466,23.498211924993463 +2044-02-01,Bekaa,684.4402722726667,34.89495604680329 +2044-03-01,Bekaa,533.5510195965888,29.173990928847942 +2044-04-01,Bekaa,683.534709871947,28.329798714750414 +2044-05-01,Bekaa,805.6568482396917,35.83507603775925 +2044-06-01,Bekaa,817.3398987516907,39.1310013184176 +2044-07-01,Bekaa,852.8885478800827,46.27918245366109 +2044-08-01,Bekaa,880.2062188780741,40.29567038041142 +2044-09-01,Bekaa,833.6023084965719,37.20473893502722 +2044-10-01,Bekaa,875.739011923603,47.67347150238153 +2044-11-01,Bekaa,600.2755043608341,31.868070030162023 +2044-12-01,Bekaa,712.2252718786434,48.080855748266785 +2045-01-01,Bekaa,690.8516167405642,35.79746231378222 +2045-02-01,Bekaa,872.2451088830965,46.577134211325614 +2045-03-01,Bekaa,937.6119911406132,48.280781622931244 +2045-04-01,Bekaa,429.5291500676687,26.205132322418024 +2045-05-01,Bekaa,877.6984653869447,46.64366781664776 +2045-06-01,Bekaa,616.0554891313261,31.302952528612522 +2045-07-01,Bekaa,716.0307090258475,38.747544347784114 +2045-08-01,Bekaa,506.93335338477436,30.538774990566864 +2045-09-01,Bekaa,925.9787311898081,46.521770804898324 +2045-10-01,Bekaa,762.2226258442192,37.194892611556945 +2045-11-01,Bekaa,565.5919044753216,34.64546758593127 +2045-12-01,Bekaa,783.1549730204057,38.22562271458 +2046-01-01,Bekaa,676.3740366716405,35.70848192782373 +2046-02-01,Bekaa,904.2524798284127,48.076429039815864 +2046-03-01,Bekaa,656.2834079902548,37.35820062389187 +2046-04-01,Bekaa,545.7170989376331,32.2973351590412 +2046-05-01,Bekaa,741.5065135308138,36.09801010841212 +2046-06-01,Bekaa,832.7866106478637,40.0519443237312 +2046-07-01,Bekaa,836.4141302550137,46.67430016631552 +2046-08-01,Bekaa,757.1965788534167,39.86500897667039 +2046-09-01,Bekaa,924.0389304507303,48.97163182886658 +2046-10-01,Bekaa,771.7858720337288,40.50984860144357 +2046-11-01,Bekaa,594.7810308444896,37.529757739458276 +2046-12-01,Bekaa,544.3693227930364,35.20661198366752 +2047-01-01,Bekaa,708.8258446438861,34.38612098127269 +2047-02-01,Bekaa,756.6119377545041,38.18328234162615 +2047-03-01,Bekaa,900.0212153568643,43.85217010108307 +2047-04-01,Bekaa,673.8454776428126,35.10482576254742 +2047-05-01,Bekaa,646.0596545986684,33.59009212344179 +2047-06-01,Bekaa,774.8254018934185,38.88670493147635 +2047-07-01,Bekaa,643.4491360242373,35.6147409094791 +2047-08-01,Bekaa,957.7611388277679,50.25740741895788 +2047-09-01,Bekaa,435.1609181744715,24.973018013208133 +2047-10-01,Bekaa,847.4174600076947,42.60246125107423 +2047-11-01,Bekaa,670.1796407129358,33.00916938147187 +2047-12-01,Bekaa,849.0366688202324,47.057408437618435 +2048-01-01,Bekaa,751.6422688302351,39.609477379094685 +2048-02-01,Bekaa,868.8078034926349,46.04227376440163 +2048-03-01,Bekaa,770.203937522239,39.88696078156204 +2048-04-01,Bekaa,730.6018865664751,40.80024126684009 +2048-05-01,Bekaa,590.4622897916158,37.26962065114773 +2048-06-01,Bekaa,704.9410280573366,37.60946804236565 +2048-07-01,Bekaa,795.7565962561705,38.70600332371943 +2048-08-01,Bekaa,465.5639296422035,28.881166233374586 +2048-09-01,Bekaa,878.059460679569,43.990748534197984 +2048-10-01,Bekaa,672.5036577009608,32.91468072812185 +2048-11-01,Bekaa,877.0469062129546,52.48446434608073 +2048-12-01,Bekaa,576.8770971127319,28.827354243460462 +2049-01-01,Bekaa,857.496013802415,43.59480044432412 +2049-02-01,Bekaa,832.4408215133988,43.50957891894613 +2049-03-01,Bekaa,634.5503495400083,34.05981228482641 +2049-04-01,Bekaa,602.8227279881248,32.382996991201026 +2049-05-01,Bekaa,833.8981972780873,41.15157357287411 +2049-06-01,Bekaa,592.5911244860085,33.74712354782626 +2049-07-01,Bekaa,791.8746891511461,39.062784795563545 +2049-08-01,Bekaa,715.3631751514083,36.17199346807658 +2049-09-01,Bekaa,774.1880058559092,40.045366317715335 +2049-10-01,Bekaa,694.4942876099959,35.06921114956308 +2049-11-01,Bekaa,940.9311606019801,48.96697757932705 +2049-12-01,Bekaa,802.9694205404177,41.550331942946116 +2050-01-01,Bekaa,674.4654716870493,35.54677113572761 +2050-02-01,Bekaa,590.7458544485578,32.772613824161596 +2050-03-01,Bekaa,690.5238883499061,36.62439243347649 +2050-04-01,Bekaa,601.0057567756967,34.087755512537996 +2050-05-01,Bekaa,901.4143629444893,47.23150987626644 +2050-06-01,Bekaa,735.3094276740953,38.435369794542616 +2050-07-01,Bekaa,833.6996388879683,48.59775226950775 +2050-08-01,Bekaa,700.5204825990229,36.24734502935171 +2050-09-01,Bekaa,833.4392128435325,40.017174863361646 +2050-10-01,Bekaa,368.4685749466969,21.38146514457595 +2050-11-01,Bekaa,945.5598163331555,51.84714835262669 +2050-12-01,Bekaa,572.7191460860284,28.09877654300379 +2051-01-01,Bekaa,915.0322186706833,46.558153738441575 +2051-02-01,Bekaa,861.9181512411857,46.36066284893304 +2051-03-01,Bekaa,700.5041236274288,40.32467448151011 +2051-04-01,Bekaa,626.7848884536246,45.40816698682055 +2051-05-01,Bekaa,401.35688749152496,34.23014895273578 +2051-06-01,Bekaa,510.7884713014166,22.07633721312925 +2051-07-01,Bekaa,759.9090939688601,37.60508270502174 +2051-08-01,Bekaa,671.5834381008601,33.510658120427706 +2051-09-01,Bekaa,618.2040588937996,25.907898648968178 +2051-10-01,Bekaa,910.9325396182986,42.878956179591775 +2051-11-01,Bekaa,932.1971166471254,52.9542391764282 +2051-12-01,Bekaa,798.5471733098911,43.26154435697789 +2052-01-01,Bekaa,919.1700503581612,45.54829092629049 +2052-02-01,Bekaa,527.6621191980202,32.00041472397305 +2052-03-01,Bekaa,590.2028518729809,41.05538870413635 +2052-04-01,Bekaa,424.5469648832541,22.241953142219963 +2052-05-01,Bekaa,710.0090703946806,33.790350444501925 +2052-06-01,Bekaa,589.2496672982419,28.437551240518317 +2052-07-01,Bekaa,728.7842840514517,29.874248629011262 +2052-08-01,Bekaa,898.363908805111,43.33557499790753 +2052-09-01,Bekaa,874.6006910008751,49.0068593264924 +2052-10-01,Bekaa,794.8631109485739,39.069222435323454 +2052-11-01,Bekaa,943.6018999543932,46.99721052182818 +2052-12-01,Bekaa,543.5784378811084,30.882059138746353 +2053-01-01,Bekaa,704.7324237215742,33.37804008180245 +2053-02-01,Bekaa,600.3100338679906,27.847594821823108 +2053-03-01,Bekaa,433.1213716253727,24.670168211980588 +2053-04-01,Bekaa,839.1352091273989,39.77213231895453 +2053-05-01,Bekaa,775.0226976783473,37.11921008142566 +2053-06-01,Bekaa,949.8820432742717,54.71697339409275 +2053-07-01,Bekaa,767.7699640909161,29.24899674587157 +2053-08-01,Bekaa,859.4264273463833,42.724059799837335 +2053-09-01,Bekaa,560.7041950966561,26.466715921934657 +2053-10-01,Bekaa,833.9040162411375,41.82986764782949 +2053-11-01,Bekaa,845.1196283533956,41.054611518340224 +2053-12-01,Bekaa,705.6418288337421,37.32988505621712 +2054-01-01,Bekaa,530.7657948909567,32.414883771935145 +2054-02-01,Bekaa,613.8630026665869,33.2824284984048 +2054-03-01,Bekaa,869.5189246940729,43.584419251541675 +2054-04-01,Bekaa,620.7792245229068,30.145526365425933 +2054-05-01,Bekaa,888.4704639104409,41.59600269001491 +2054-06-01,Bekaa,890.8845650339886,50.20001091812857 +2054-07-01,Bekaa,974.4938964539151,59.52556080342676 +2054-08-01,Bekaa,597.0122189031006,29.90971105542337 +2054-09-01,Bekaa,630.523517317507,42.695614208683395 +2054-10-01,Bekaa,386.93705788608077,23.842525918229793 +2054-11-01,Bekaa,761.6682323739922,35.27692661266321 +2054-12-01,Bekaa,825.8546885704836,45.51354806163259 +2055-01-01,Bekaa,827.818808183441,40.63457953402376 +2055-02-01,Bekaa,633.4323400920783,31.181996709547732 +2055-03-01,Bekaa,443.94198044868926,23.471492100017986 +2055-04-01,Bekaa,706.7685118303696,34.821893194269975 +2055-05-01,Bekaa,732.874905283994,36.98270315874072 +2055-06-01,Bekaa,823.7974655487229,43.83935687822378 +2055-07-01,Bekaa,881.3286748921086,48.06529430186988 +2055-08-01,Bekaa,843.8587798313462,50.785075203418884 +2055-09-01,Bekaa,741.0259550162709,39.038647709697614 +2055-10-01,Bekaa,477.68919389807957,42.90612813166538 +2055-11-01,Bekaa,453.8619400523524,43.978428809543836 +2055-12-01,Bekaa,418.4251687229824,20.099426251972094 +2056-01-01,Bekaa,770.642281106729,32.330990554600334 +2056-02-01,Bekaa,607.9221158717112,29.0238817771913 +2056-03-01,Bekaa,693.5994299054536,27.994016034797014 +2056-04-01,Bekaa,842.0301981407564,37.24666116429228 +2056-05-01,Bekaa,837.4163094007179,42.94898859853602 +2056-06-01,Bekaa,905.381248868398,47.50033637459029 +2056-07-01,Bekaa,814.93397711394,37.42128417439662 +2056-08-01,Bekaa,949.4726847132772,50.392011270720005 +2056-09-01,Bekaa,563.4004610322612,33.0273283423737 +2056-10-01,Bekaa,627.932596571462,46.06549773083408 +2056-11-01,Bekaa,646.366302972239,41.121470182360376 +2056-12-01,Bekaa,492.5954009811169,23.928295610775777 +2057-01-01,Bekaa,715.4422252154866,34.55313614030433 +2057-02-01,Bekaa,742.4513264841834,34.97172752357286 +2057-03-01,Bekaa,905.1849961051479,42.91275341894641 +2057-04-01,Bekaa,832.7816151229808,41.88609393734601 +2057-05-01,Bekaa,779.8270202185857,38.114708254204295 +2057-06-01,Bekaa,657.7296398917434,36.16454075865519 +2057-07-01,Bekaa,552.5592937026964,31.372680574412275 +2057-08-01,Bekaa,605.8366214728669,31.8798179470156 +2057-09-01,Bekaa,826.6272931550936,42.59293112106474 +2057-10-01,Bekaa,595.8536139535136,30.30631812793044 +2057-11-01,Bekaa,620.6561479648071,27.962319856663086 +2057-12-01,Bekaa,966.9789252580797,53.86810919998125 +2058-01-01,Bekaa,937.8432674739202,53.954214294001986 +2058-02-01,Bekaa,827.6834898445848,48.38777912599606 +2058-03-01,Bekaa,574.880753619487,32.24236773320965 +2058-04-01,Bekaa,324.3618231519025,27.665990437409484 +2058-05-01,Bekaa,840.533187552273,39.580960866042986 +2058-06-01,Bekaa,788.0834700363005,38.5320511165646 +2058-07-01,Bekaa,485.0966515171808,30.282859232711697 +2058-08-01,Bekaa,734.2002015666184,31.721573462671778 +2058-09-01,Bekaa,601.4072652261611,28.906692206404685 +2058-10-01,Bekaa,939.5383423896221,52.18817629793415 +2058-11-01,Bekaa,864.8049058728685,45.631367064261696 +2058-12-01,Bekaa,772.9998394761095,43.76448108467935 +2059-01-01,Bekaa,475.8927262960217,23.689894606584584 +2059-02-01,Bekaa,743.0004499501387,37.314350205531866 +2059-03-01,Bekaa,985.9318368713936,55.5614227000696 +2059-04-01,Bekaa,696.9946850534958,31.918576764133313 +2059-05-01,Bekaa,895.2870497484955,45.05921647451913 +2059-06-01,Bekaa,598.8677819176447,31.11193473981276 +2059-07-01,Bekaa,543.4045826360139,32.08494180576896 +2059-08-01,Bekaa,744.1875733082594,36.09410644895706 +2059-09-01,Bekaa,755.8834694556712,39.62040821658465 +2059-10-01,Bekaa,443.5762915585103,26.341386585842255 +2059-11-01,Bekaa,729.0309861264295,27.51334139528984 +2059-12-01,Bekaa,930.6028305631233,52.53624028651376 +2060-01-01,Bekaa,902.298296369343,48.59024341358399 +2060-02-01,Bekaa,780.610329499373,47.277948943894145 +2060-03-01,Bekaa,753.9790216619173,38.28061821366274 +2060-04-01,Bekaa,464.4646396886142,36.87918526128402 +2060-05-01,Bekaa,834.5426199879591,46.31400806053303 +2060-06-01,Bekaa,435.4560109657583,23.78801505211498 +2060-07-01,Bekaa,794.657965053115,35.263652397468576 +2060-08-01,Bekaa,911.5022490384409,50.80087305614161 +2060-09-01,Bekaa,665.2347847254471,34.70585167170311 +2060-10-01,Bekaa,578.9899845546145,33.711380388902256 +2060-11-01,Bekaa,526.0637982669975,30.483271217883612 +2060-12-01,Bekaa,731.6161977011801,34.51703393927299 +2061-01-01,Bekaa,651.6193444178775,31.703461783035113 +2061-02-01,Bekaa,831.9345168321527,41.68831345008835 +2061-03-01,Bekaa,1002.7193256877393,52.546609658979904 +2061-04-01,Bekaa,712.2444854358846,37.000376009135096 +2061-05-01,Bekaa,706.0955981599028,42.62243758560578 +2061-06-01,Bekaa,373.0915215065778,41.16379873499793 +2061-07-01,Bekaa,553.1565334055716,30.149731442946404 +2061-08-01,Bekaa,522.4612013883832,24.190591384348934 +2061-09-01,Bekaa,777.2829805522092,38.41700693318477 +2061-10-01,Bekaa,568.061066164335,25.273041281302625 +2061-11-01,Bekaa,719.7345339031843,27.721155853538903 +2061-12-01,Bekaa,866.63875756773,39.209098148151284 +2062-01-01,Bekaa,837.0732101642668,42.7211076758437 +2062-02-01,Bekaa,855.3923488680081,44.97388856629452 +2062-03-01,Bekaa,786.5930469531569,31.542551817367695 +2062-04-01,Bekaa,808.5543075675517,28.520692390229122 +2062-05-01,Bekaa,998.4334947136259,58.210630403204064 +2062-06-01,Bekaa,655.2813935321842,32.6653045602546 +2062-07-01,Bekaa,558.3695283083316,40.76260242469093 +2062-08-01,Bekaa,687.754995167929,41.070081357285886 +2062-09-01,Bekaa,608.9050814601741,30.444379422207632 +2062-10-01,Bekaa,589.8798719757552,26.391126476794177 +2062-11-01,Bekaa,757.7648609807354,38.81625880146193 +2062-12-01,Bekaa,770.148327997995,39.354315166403055 +2063-01-01,Bekaa,902.8087731373043,45.55011716515743 +2063-02-01,Bekaa,638.244732326358,34.089442862688514 +2063-03-01,Bekaa,576.3601975270641,29.50838472163717 +2063-04-01,Bekaa,495.2839265979476,28.54876268634083 +2063-05-01,Bekaa,937.5253654453941,48.19023504506423 +2063-06-01,Bekaa,825.8276797985902,37.29848290845093 +2063-07-01,Bekaa,939.5461925001521,57.31166579849378 +2063-08-01,Bekaa,614.748143800753,29.9086679125107 +2063-09-01,Bekaa,594.1259583343183,33.93036652358572 +2063-10-01,Bekaa,355.9558006892035,22.727521392671544 +2063-11-01,Bekaa,774.3927125843453,39.86544189575454 +2063-12-01,Bekaa,659.2526162304415,30.712221879200268 +2064-01-01,Bekaa,752.6090401347376,36.069664989946645 +2064-02-01,Bekaa,923.3915982593333,49.06643963075646 +2064-03-01,Bekaa,782.1204602026583,44.170780816544934 +2064-04-01,Bekaa,906.3604815371682,48.78396066711666 +2064-05-01,Bekaa,714.0799291112033,32.778680601497875 +2064-06-01,Bekaa,506.1942901815199,42.91903000689685 +2064-07-01,Bekaa,585.6495681820691,40.016442003751614 +2064-08-01,Bekaa,556.4926656931884,24.469373544068755 +2064-09-01,Bekaa,742.8857724613472,33.7222329167968 +2064-10-01,Bekaa,768.1199253120963,41.26245995999862 +2064-11-01,Bekaa,629.7590373228161,29.873981194355185 +2064-12-01,Bekaa,907.2267933852378,43.2275373070091 +2065-01-01,Bekaa,562.8996459387984,26.080460491419302 +2065-02-01,Bekaa,539.6517906356507,24.93243591230255 +2065-03-01,Bekaa,976.9395627072163,52.42247565237241 +2065-04-01,Bekaa,456.944343592629,20.51850670082715 +2065-05-01,Bekaa,994.4195081265374,48.50889304179124 +2065-06-01,Bekaa,794.9668641576767,30.98574104309159 +2065-07-01,Bekaa,763.8695570750624,42.91045732250691 +2065-08-01,Bekaa,775.2209266931993,36.21871474575572 +2065-09-01,Bekaa,778.5548082498251,38.4795201534285 +2065-10-01,Bekaa,776.5752079993191,38.38889083334744 +2065-11-01,Bekaa,775.0532746822998,39.503410725937755 +2065-12-01,Bekaa,697.6325751539056,38.646290040897114 +2066-01-01,Bekaa,460.73781343846576,28.41925930105822 +2066-02-01,Bekaa,897.4518686908074,45.615001836357 +2066-03-01,Bekaa,722.2339432208832,37.47756808795507 +2066-04-01,Bekaa,600.2656505507632,38.699836073694684 +2066-05-01,Bekaa,751.3569749531413,38.68508579650323 +2066-06-01,Bekaa,744.5221636836465,40.47300763064405 +2066-07-01,Bekaa,489.7179512007267,27.545494133140505 +2066-08-01,Bekaa,857.5938382567118,38.601798370378326 +2066-09-01,Bekaa,663.081164542213,34.569117207929565 +2066-10-01,Bekaa,975.0185363583572,51.19613556767061 +2066-11-01,Bekaa,941.723088535587,55.58214075944839 +2066-12-01,Bekaa,784.7548584839466,42.14088381007447 +2067-01-01,Bekaa,962.6125071353085,48.57261636691524 +2067-02-01,Bekaa,819.933728979261,43.12674251491791 +2067-03-01,Bekaa,519.0808779191113,30.062776763692263 +2067-04-01,Bekaa,840.6019720871967,44.58323302303989 +2067-05-01,Bekaa,741.7908192821067,38.438253951717584 +2067-06-01,Bekaa,469.9147573356703,28.353882609193032 +2067-07-01,Bekaa,724.7373599376639,36.822797919958035 +2067-08-01,Bekaa,803.3017052889358,41.17767283124432 +2067-09-01,Bekaa,735.0993411496316,39.81151465775659 +2067-10-01,Bekaa,824.2567244626669,40.97764648389139 +2067-11-01,Bekaa,876.2436148326364,48.73009253070016 +2067-12-01,Bekaa,769.952075234745,39.126050083431274 +2068-01-01,Bekaa,593.4628984739225,30.761980978166157 +2068-02-01,Bekaa,497.0327445780472,26.45574519087721 +2068-03-01,Bekaa,829.3252059670336,42.42156017547991 +2068-04-01,Bekaa,739.1737680982134,40.23566749983996 +2068-05-01,Bekaa,677.2387016433751,38.07386610634032 +2068-06-01,Bekaa,592.9388349761975,32.01423858387521 +2068-07-01,Bekaa,952.6851365881381,46.99106691243601 +2068-08-01,Bekaa,986.3523941914659,59.511500537198785 +2068-09-01,Bekaa,713.8279570319537,34.4312923199782 +2068-10-01,Bekaa,465.6068033227904,28.19255006721822 +2068-11-01,Bekaa,572.0412917865567,32.21277557137549 +2068-12-01,Bekaa,775.7567104608413,37.991516917821 +2069-01-01,Bekaa,521.7885073014278,25.411251807072986 +2069-02-01,Bekaa,573.4330944251748,29.541543663912094 +2069-03-01,Bekaa,817.8952803477188,40.538468542262805 +2069-04-01,Bekaa,809.3714327090837,40.013147090585534 +2069-05-01,Bekaa,749.6219358383777,35.64961823023481 +2069-06-01,Bekaa,872.9280684992066,39.56243843041522 +2069-07-01,Bekaa,753.0976683433217,36.6600011363027 +2069-08-01,Bekaa,988.2660095968175,50.259759661899764 +2069-09-01,Bekaa,483.5437020291864,22.808625015361713 +2069-10-01,Bekaa,692.9384835363543,37.35714566066291 +2069-11-01,Bekaa,624.8979524448994,33.77733923134476 +2069-12-01,Bekaa,876.5087070266881,44.64703909037793 +2070-01-01,Bekaa,696.6535071727689,38.27305616631567 +2070-02-01,Bekaa,782.6255571745921,43.86533793343108 +2070-03-01,Bekaa,589.9960316532481,31.719494564544117 +2070-04-01,Bekaa,564.572213544589,29.504924324043024 +2070-05-01,Bekaa,830.3234875054118,38.688665874799824 +2070-06-01,Bekaa,630.458410806398,34.09490975897303 +2070-07-01,Bekaa,956.874350817267,45.4210481764985 +2070-08-01,Bekaa,784.9876719018328,35.079908535806304 +2070-09-01,Bekaa,956.0485521270376,56.7449968804311 +2070-10-01,Bekaa,852.104030889983,42.072482594778364 +2070-11-01,Bekaa,552.935934320503,37.28341496025916 +2070-12-01,Bekaa,539.6882963944092,47.39795174995798 +2071-01-01,Bekaa,585.6589553771782,29.461019236720176 +2071-02-01,Bekaa,649.623275404022,33.685297383466946 +2071-03-01,Bekaa,999.0538181331295,55.720991059838 +2071-04-01,Bekaa,623.7208750324219,28.243545866776042 +2071-05-01,Bekaa,831.3625017851414,42.19877380910894 +2071-06-01,Bekaa,820.9953054647796,37.61428777633324 +2071-07-01,Bekaa,748.7880674541069,42.188431032354444 +2071-08-01,Bekaa,676.0931893606511,37.684940761882764 +2071-09-01,Bekaa,602.6954793433099,36.061166182533526 +2071-10-01,Bekaa,834.7473816122732,40.38649769079035 +2071-11-01,Bekaa,739.6099158475901,40.78271469285983 +2071-12-01,Bekaa,504.5362425354157,32.00849686523692 +2072-01-01,Bekaa,643.3878173286987,33.892005164603276 +2072-02-01,Bekaa,888.8673611071675,46.28928882408978 +2072-03-01,Bekaa,370.39904338654316,21.45347007880123 +2072-04-01,Bekaa,827.8141969297031,29.406274919358616 +2072-05-01,Bekaa,780.7515765930352,37.91883379294853 +2072-06-01,Bekaa,816.8212424979323,47.06917556248598 +2072-07-01,Bekaa,833.35368506587,43.497005057491734 +2072-08-01,Bekaa,842.478477879134,45.232842145436436 +2072-09-01,Bekaa,812.951412486031,48.75844060424471 +2072-10-01,Bekaa,445.9993681580836,32.525026956672875 +2072-11-01,Bekaa,710.1225401741598,46.65454841779351 +2072-12-01,Bekaa,442.0892994677313,22.614337431567996 +2073-01-01,Bekaa,866.9407397916849,43.033435893196966 +2073-02-01,Bekaa,746.4667403640956,38.66918008339435 +2073-03-01,Bekaa,716.902565357578,36.67126737526741 +2073-04-01,Bekaa,423.03927704653233,24.974562042023628 +2073-05-01,Bekaa,768.8725477971753,37.46175841491605 +2073-06-01,Bekaa,734.2965438322138,37.39510512889145 +2073-07-01,Bekaa,692.5685951115211,33.76704816847404 +2073-08-01,Bekaa,787.3373252648055,36.780098504896856 +2073-09-01,Bekaa,898.2133843080952,46.35126274240273 +2073-10-01,Bekaa,935.3571429586566,57.57649111975317 +2073-11-01,Bekaa,789.460368444087,39.23993735335413 +2073-12-01,Bekaa,476.45656185723595,35.782311623376415 +2074-01-01,Bekaa,486.8849396334417,35.8197524752277 +2074-02-01,Bekaa,734.1472819403882,30.461645949229496 +2074-03-01,Bekaa,956.6361576033532,52.28403019781578 +2074-04-01,Bekaa,505.28856309316683,27.81550414063298 +2074-05-01,Bekaa,686.1856318124628,38.261853461551006 +2074-06-01,Bekaa,828.9165061565731,43.50391107728466 +2074-07-01,Bekaa,623.4542457537909,31.729289174130628 +2074-08-01,Bekaa,506.60718952663456,28.888929226098604 +2074-09-01,Bekaa,529.2244284331849,25.535418319550274 +2074-10-01,Bekaa,814.6162397730474,38.982422897720625 +2074-11-01,Bekaa,840.4938821037452,44.17615315029912 +2074-12-01,Bekaa,767.9451368370786,45.17044860589515 +2075-01-01,Bekaa,569.2031749026332,26.815656091459317 +2075-02-01,Bekaa,899.105112947601,43.07433418756332 +2075-03-01,Bekaa,630.4463886091528,30.53721470881647 +2075-04-01,Bekaa,1017.5346251970867,54.74674877082941 +2075-05-01,Bekaa,353.82545635817036,18.92613131416503 +2075-06-01,Bekaa,744.6594033782269,34.78563289650824 +2075-07-01,Bekaa,493.59214543491566,29.460768054998994 +2075-08-01,Bekaa,791.9700981868183,37.09274439325044 +2075-09-01,Bekaa,988.6272244729533,52.51266171059257 +2075-10-01,Bekaa,866.1403029970139,48.80992990200768 +2075-11-01,Bekaa,820.1485365492183,47.103853415404274 +2075-12-01,Bekaa,570.4697051480383,34.60117981586852 +2076-01-01,Bekaa,585.9663722930385,45.08377318161338 +2076-02-01,Bekaa,387.64098772752266,22.466908536630303 +2076-03-01,Bekaa,902.4045747888262,41.529138115836616 +2076-04-01,Bekaa,736.5164233399913,37.154775935605315 +2076-05-01,Bekaa,482.2157707444261,29.971352527340642 +2076-06-01,Bekaa,570.9115346207707,28.33426531676882 +2076-07-01,Bekaa,554.0737886282693,31.599779878689876 +2076-08-01,Bekaa,894.5978868981904,46.89502979765188 +2076-09-01,Bekaa,808.2361859555143,45.296512279137126 +2076-10-01,Bekaa,722.2528822987354,41.4667268458209 +2076-11-01,Bekaa,878.9666699566236,42.43345141366851 +2076-12-01,Bekaa,709.4272838814153,36.781907013289356 +2077-01-01,Bekaa,693.7705952525343,32.39887167597964 +2077-02-01,Bekaa,499.43273746099203,23.161600345360167 +2077-03-01,Bekaa,721.5790902942232,33.203263407586334 +2077-04-01,Bekaa,657.340208534402,33.788252338360294 +2077-05-01,Bekaa,883.8867130073322,44.91834785512286 +2077-06-01,Bekaa,959.4017570326603,52.55460905802974 +2077-07-01,Bekaa,796.8108166940594,34.40249655195414 +2077-08-01,Bekaa,757.965505414212,40.330141377794625 +2077-09-01,Bekaa,532.3601633187754,29.477072703782696 +2077-10-01,Bekaa,749.6878657876541,36.98172502756766 +2077-11-01,Bekaa,933.6568529345608,47.395847733658215 +2077-12-01,Bekaa,780.2967093493178,41.27853263507512 +2078-01-01,Bekaa,326.78783668093973,22.54460199807056 +2078-02-01,Bekaa,788.2537570493358,39.2560499219981 +2078-03-01,Bekaa,457.35611757224814,27.13505729057313 +2078-04-01,Bekaa,719.9644927354233,32.235136654718715 +2078-05-01,Bekaa,710.4830962997615,31.539162341671293 +2078-06-01,Bekaa,789.6533274546672,38.08763677481916 +2078-07-01,Bekaa,848.261319441731,45.136793210336016 +2078-08-01,Bekaa,906.0925896533472,45.07341267438444 +2078-09-01,Bekaa,819.073126302486,40.3574788142963 +2078-10-01,Bekaa,905.0570338139211,48.8711384548408 +2078-11-01,Bekaa,512.625012894292,31.843189741909313 +2078-12-01,Bekaa,723.5304740635235,49.56893014151794 +2079-01-01,Bekaa,731.2178732116298,37.404189041960976 +2079-02-01,Bekaa,702.7775266160927,37.90008233869263 +2079-03-01,Bekaa,769.1857836760857,38.928557716383196 +2079-04-01,Bekaa,533.8089478785832,29.560673368289308 +2079-05-01,Bekaa,527.0771761717795,30.169953049040984 +2079-06-01,Bekaa,846.2130444480568,40.1115305381534 +2079-07-01,Bekaa,882.615324476739,46.05120992351752 +2079-08-01,Bekaa,910.5354228380608,54.281223344188504 +2079-09-01,Bekaa,787.7387239235144,38.007088706994665 +2079-10-01,Bekaa,677.17754763547,38.70142738377534 +2079-11-01,Bekaa,359.12288112103624,26.729010217968273 +2079-12-01,Bekaa,691.6744510533906,32.82189124523863 +2080-01-01,Bekaa,597.2127260968825,34.01324762633812 +2080-02-01,Bekaa,527.9770842970822,26.54329088594589 +2080-03-01,Bekaa,724.0177298751619,27.318097843416098 +2080-04-01,Bekaa,823.6067023732561,36.99872116485437 +2080-05-01,Bekaa,833.2980206457481,39.46096840275591 +2080-06-01,Bekaa,905.5726158985209,47.970386027291525 +2080-07-01,Bekaa,860.3772788463144,41.869539584380675 +2080-08-01,Bekaa,871.4309481189675,43.689008365162245 +2080-09-01,Bekaa,702.4043993344674,37.361708302751175 +2080-10-01,Bekaa,584.0008253872575,35.1747414558683 +2080-11-01,Bekaa,879.1620992817061,47.57754963568124 +2080-12-01,Bekaa,555.1031961293783,31.646201215843135 +2081-01-01,Bekaa,798.5777503138437,39.32281550102746 +2081-02-01,Bekaa,833.1133509127208,41.342962224097505 +2081-03-01,Bekaa,698.495648145183,35.657165502186515 +2081-04-01,Bekaa,905.1438241967737,44.1381744740566 +2081-05-01,Bekaa,593.175847928738,31.78966734974432 +2081-06-01,Bekaa,654.5150470776471,35.40313508477975 +2081-07-01,Bekaa,494.17170866512885,29.66943948617915 +2081-08-01,Bekaa,826.4006829714025,40.241223048496664 +2081-09-01,Bekaa,636.8002021970822,30.906231685561153 +2081-10-01,Bekaa,881.6107848082881,44.330866315151056 +2081-11-01,Bekaa,838.7357318244142,41.51474392567343 +2081-12-01,Bekaa,931.1779197792932,55.401765687929014 +2082-01-01,Bekaa,730.3268582185358,34.66173529622657 +2082-02-01,Bekaa,586.883709859553,35.54693809769522 +2082-03-01,Bekaa,457.16678168960493,25.749080879284243 +2082-04-01,Bekaa,917.7440201397148,45.034219460643044 +2082-05-01,Bekaa,957.3593010020364,53.17132519526791 +2082-06-01,Bekaa,413.2786252803382,25.832938635670182 +2082-07-01,Bekaa,800.8255718234377,43.5423862068114 +2082-08-01,Bekaa,793.5492330085387,40.749121353961215 +2082-09-01,Bekaa,694.4845710396196,42.2179256765792 +2082-10-01,Bekaa,799.2599413876642,41.77127138489665 +2082-11-01,Bekaa,378.52453908768916,25.116651109076926 +2082-12-01,Bekaa,808.9824405187649,41.570597875226795 +2083-01-01,Bekaa,844.4742724136005,42.00964874845525 +2083-02-01,Bekaa,665.313285830747,34.034900968243434 +2083-03-01,Bekaa,901.9467431677058,43.324738722947885 +2083-04-01,Bekaa,637.9789813817724,33.41387928079632 +2083-05-01,Bekaa,471.78352280883314,27.21109886281174 +2083-06-01,Bekaa,864.7388112359586,41.44747746074124 +2083-07-01,Bekaa,526.2694382253569,28.284402790035383 +2083-08-01,Bekaa,843.6733415560291,37.38102860972859 +2083-09-01,Bekaa,774.982239416385,37.865722156774645 +2083-10-01,Bekaa,753.8469970757309,41.90674107482707 +2083-11-01,Bekaa,850.3475823828647,35.57578705714259 +2083-12-01,Bekaa,968.5536135136956,53.961767476111845 +2084-01-01,Bekaa,775.7440844089399,39.41314192550357 +2084-02-01,Bekaa,570.5593226685994,32.645369596830065 +2084-03-01,Bekaa,631.6205016442273,36.65102212854025 +2084-04-01,Bekaa,628.7165646027831,29.119992768952244 +2084-05-01,Bekaa,918.1402036900297,48.1358172639402 +2084-06-01,Bekaa,602.3477963010598,33.52400621259915 +2084-07-01,Bekaa,890.8926896239078,51.257089983703466 +2084-08-01,Bekaa,728.9527046046409,38.6476715403636 +2084-09-01,Bekaa,936.2340497111478,48.545137086618084 +2084-10-01,Bekaa,551.1797877407128,29.854208760279654 +2084-11-01,Bekaa,563.3290963910794,33.480767495607196 +2084-12-01,Bekaa,734.2695899561983,36.57634728037277 +2085-01-01,Bekaa,565.9848766167833,27.273957827306972 +2085-02-01,Bekaa,891.4354451680344,44.07692159503739 +2085-03-01,Bekaa,780.3269020821256,37.98151840777847 +2085-04-01,Bekaa,458.5302306073227,25.817111232156726 +2085-05-01,Bekaa,944.6605669583865,44.243059095584435 +2085-06-01,Bekaa,723.0073163477829,33.58513793337639 +2085-07-01,Bekaa,854.5078115884984,44.405254520648484 +2085-08-01,Bekaa,681.1300508393865,34.60438903174148 +2085-09-01,Bekaa,814.102139877149,42.1414009489122 +2085-10-01,Bekaa,480.43269773655925,26.57536974681974 +2085-11-01,Bekaa,663.303547743311,35.98246060651086 +2085-12-01,Bekaa,852.0243769712487,42.09530467045694 +2086-01-01,Bekaa,641.3998729047622,32.76871016470654 +2086-02-01,Bekaa,826.6891059135327,37.43621471141151 +2086-03-01,Bekaa,966.0185767712836,55.55795343723824 +2086-04-01,Bekaa,984.1742904467187,60.16201982394972 +2086-05-01,Bekaa,548.2265816489141,32.846075612369724 +2086-06-01,Bekaa,515.5229113891746,50.71931878389286 +2086-07-01,Bekaa,276.9178960478123,20.619221705783385 +2086-08-01,Bekaa,762.6844099685435,31.581945976486043 +2086-09-01,Bekaa,587.8397490199393,29.83980865995832 +2086-10-01,Bekaa,586.3380448339012,24.107649702475534 +2086-11-01,Bekaa,860.9988648710081,35.73743727011772 +2086-12-01,Bekaa,870.6553242610767,41.816448633760295 +2087-01-01,Bekaa,845.9390042259187,42.87384389279598 +2087-02-01,Bekaa,766.592447511416,40.16664867301766 +2087-03-01,Bekaa,784.1948656341806,39.62158286051606 +2087-04-01,Bekaa,716.2142259454405,37.94009263179763 +2087-05-01,Bekaa,696.3795767423862,36.85298848530441 +2087-06-01,Bekaa,709.9229936582399,37.60147455347396 +2087-07-01,Bekaa,520.8572536298827,31.137769518605964 +2087-08-01,Bekaa,744.8923814837467,37.273061840727905 +2087-09-01,Bekaa,499.19646560280233,28.29934071474795 +2087-10-01,Bekaa,597.0769960389425,24.08149577514248 +2087-11-01,Bekaa,851.1642134614963,38.012803829921296 +2087-12-01,Bekaa,850.3809590765868,42.175724192341775 +2088-01-01,Bekaa,834.1122363057549,48.286910456928055 +2088-02-01,Bekaa,812.7588377465959,38.97583602646755 +2088-03-01,Bekaa,918.6134610528209,49.08640414497171 +2088-04-01,Bekaa,522.0270573385474,31.74277763255803 +2088-05-01,Bekaa,783.6224114201467,49.071826739906015 +2088-06-01,Bekaa,541.9218449757668,39.28425024158901 +2088-07-01,Bekaa,608.9530055615216,31.383404556367157 +2088-08-01,Bekaa,621.971453197666,27.664202614570492 +2088-09-01,Bekaa,698.0424826736785,36.07053673827309 +2088-10-01,Bekaa,574.911852134279,28.984721069319697 +2088-11-01,Bekaa,608.440332958447,23.708920883194253 +2088-12-01,Bekaa,813.5238667000649,33.76633747195705 +2089-01-01,Bekaa,884.4039968641448,44.95141518994653 +2089-02-01,Bekaa,827.6943592283955,44.52718994842587 +2089-03-01,Bekaa,557.6614538281133,31.688101282015143 +2089-04-01,Bekaa,644.9659091287402,34.36662041447185 +2089-05-01,Bekaa,606.9872939681072,32.19957375561815 +2089-06-01,Bekaa,968.5189742147835,52.90603001643595 +2089-07-01,Bekaa,807.604663776933,39.80469729033584 +2089-08-01,Bekaa,782.6916518115021,42.7121183253045 +2089-09-01,Bekaa,630.4275593230564,34.84346379396125 +2089-10-01,Bekaa,367.06845558258726,23.981877104522226 +2089-11-01,Bekaa,697.3014981146998,36.1670850817368 +2089-12-01,Bekaa,542.9950593873858,30.761568744635518 +2090-01-01,Bekaa,651.8618195102624,27.215936327253775 +2090-02-01,Bekaa,864.9092629366274,41.077362672121055 +2090-03-01,Bekaa,918.5510993356035,49.09275165481991 +2090-04-01,Bekaa,772.8631487403075,47.70531247939002 +2090-05-01,Bekaa,882.197621742314,46.47248008596546 +2090-06-01,Bekaa,534.7282342487608,32.33490898945075 +2090-07-01,Bekaa,713.0621595361948,48.459702795546846 +2090-08-01,Bekaa,475.55964555727496,33.950750659029296 +2090-09-01,Bekaa,409.1408210407992,19.238313255104206 +2090-10-01,Bekaa,792.7687783133987,36.30738780349064 +2090-11-01,Bekaa,572.2704546285672,24.66079913378055 +2090-12-01,Bekaa,783.886570384275,33.64479359215679 +2091-01-01,Bekaa,971.2012965974193,49.097642310685245 +2091-02-01,Bekaa,678.0627436655138,35.686447380718036 +2091-03-01,Bekaa,470.4538348559823,25.615763964458296 +2091-04-01,Bekaa,819.688069925962,39.0305108994709 +2091-05-01,Bekaa,639.0406127631688,34.2720859573962 +2091-06-01,Bekaa,834.7009396996272,41.37537648644609 +2091-07-01,Bekaa,723.9455966916904,34.05640655619511 +2091-08-01,Bekaa,730.9243998487391,36.09593416536354 +2091-09-01,Bekaa,857.8320863665035,39.8962737132597 +2091-10-01,Bekaa,987.5697102823945,55.23584390815428 +2091-11-01,Bekaa,670.1697045590481,33.67676016002588 +2091-12-01,Bekaa,718.2671121928524,37.678215001913266 +2092-01-01,Bekaa,585.2463030635139,32.263591111109875 +2092-02-01,Bekaa,561.5341658736008,29.31311309651224 +2092-03-01,Bekaa,721.4809364646593,38.20114283954164 +2092-04-01,Bekaa,670.5562813307423,36.73213018384902 +2092-05-01,Bekaa,775.9317185193703,37.42338671315686 +2092-06-01,Bekaa,942.4012173144479,50.36186059894111 +2092-07-01,Bekaa,834.2424493279728,49.64676692429322 +2092-08-01,Bekaa,851.3168240018697,44.52242340588158 +2092-09-01,Bekaa,457.8397502559496,35.34491559442868 +2092-10-01,Bekaa,451.14876618637504,37.72757959782295 +2092-11-01,Bekaa,709.4578608853678,29.247321216037335 +2092-12-01,Bekaa,943.6951131549522,48.68656717103816 +2093-01-01,Bekaa,998.6099300649786,51.54087804737247 +2093-02-01,Bekaa,618.3859838329355,32.38910366210479 +2093-03-01,Bekaa,544.3021851344477,28.782723684225267 +2093-04-01,Bekaa,945.9973913753557,49.02850232562096 +2093-05-01,Bekaa,839.0708711585796,43.74629848314495 +2093-06-01,Bekaa,901.2652108444194,42.73358106460962 +2093-07-01,Bekaa,517.7668901873205,31.787310674183832 +2093-08-01,Bekaa,617.7652212464093,41.00767895250738 +2093-09-01,Bekaa,416.4064002636431,23.756580398478985 +2093-10-01,Bekaa,714.1080906965313,36.01228178697315 +2093-11-01,Bekaa,527.8417934061649,26.044189850880812 +2093-12-01,Bekaa,768.2733043947593,31.43789178184939 +2094-01-01,Bekaa,813.7481712568872,37.55619387684277 +2094-02-01,Bekaa,814.7128016221542,41.953280615143235 +2094-03-01,Bekaa,883.4074170979795,45.692238738080526 +2094-04-01,Bekaa,844.4486909345306,39.83420523241642 +2094-05-01,Bekaa,874.0403138799643,46.00280572830647 +2094-06-01,Bekaa,667.7383112339833,34.89043477582204 +2094-07-01,Bekaa,634.6245138709596,36.185987245025416 +2094-08-01,Bekaa,697.2501155730489,32.45815351725736 +2094-09-01,Bekaa,745.6941906753634,33.82721505593403 +2094-10-01,Bekaa,859.1157715737311,44.97991101744471 +2094-11-01,Bekaa,647.6724405934999,35.914829189313195 +2094-12-01,Bekaa,631.8935537405646,34.50153602707614 +2095-01-01,Bekaa,651.1892901109404,33.65761420271376 +2095-02-01,Bekaa,964.3727434579972,52.713577536746385 +2095-03-01,Bekaa,652.4430570647494,34.359904997279116 +2095-04-01,Bekaa,766.165577165393,40.80881099615096 +2095-05-01,Bekaa,766.0983297150486,39.05926086376933 +2095-06-01,Bekaa,544.6077355904615,31.81362417578681 +2095-07-01,Bekaa,453.28064760198754,27.493413819562996 +2095-08-01,Bekaa,603.0743157962297,33.82027062011315 +2095-09-01,Bekaa,528.73733730918,25.29138345710696 +2095-10-01,Bekaa,815.7581838237123,35.11566499258615 +2095-11-01,Bekaa,829.1402068587392,39.05418699300148 +2095-12-01,Bekaa,921.2464869371632,51.30685942544612 +2096-01-01,Bekaa,828.0705057833015,49.6988826988196 +2096-02-01,Bekaa,760.6861451195746,44.95926092488458 +2096-03-01,Bekaa,430.3377389001977,32.69559116567084 +2096-04-01,Bekaa,780.8119071627727,43.659132515737106 +2096-05-01,Bekaa,297.1742828323122,19.301987821423506 +2096-06-01,Bekaa,765.992545358466,35.304754592290955 +2096-07-01,Bekaa,625.5779476836065,24.974216297772116 +2096-08-01,Bekaa,880.4288765585613,44.93284251797452 +2096-09-01,Bekaa,911.2425915362949,47.044704552684834 +2096-10-01,Bekaa,788.0515206354021,49.95723935198883 +2096-11-01,Bekaa,816.7517443165968,45.482611338820355 +2096-12-01,Bekaa,508.81405871136576,32.147285108966 +2097-01-01,Bekaa,642.7628277595795,31.604986728015998 +2097-02-01,Bekaa,541.0626970397544,27.43390148211761 +2097-03-01,Bekaa,943.4758041230125,47.23057902635854 +2097-04-01,Bekaa,609.3131225201007,27.71311508338205 +2097-05-01,Bekaa,1021.0052523853923,55.66016371220526 +2097-06-01,Bekaa,717.4343417261384,30.68719974715206 +2097-07-01,Bekaa,897.7300809996607,45.63634341742015 +2097-08-01,Bekaa,479.7702691787584,26.83288863507185 +2097-09-01,Bekaa,509.9227633080033,29.04653245828365 +2097-10-01,Bekaa,687.6410313255494,35.8719421267309 +2097-11-01,Bekaa,434.0012153073279,26.089810361605373 +2097-12-01,Bekaa,735.9293119265762,27.743061854704933 +2098-01-01,Bekaa,811.8654073348771,36.451190816406125 +2098-02-01,Bekaa,832.7202964274423,39.48666724791177 +2098-03-01,Bekaa,967.8911849558948,52.09845714220748 +2098-04-01,Bekaa,819.743020699672,52.91016712713774 +2098-05-01,Bekaa,721.1265835732526,43.949770452696654 +2098-06-01,Bekaa,397.8247220241693,33.692906712079186 +2098-07-01,Bekaa,810.0595525377099,42.11756232603261 +2098-08-01,Bekaa,426.6512885681948,22.375117870473666 +2098-09-01,Bekaa,760.914621763112,34.219126507794556 +2098-10-01,Bekaa,762.9699234291487,36.461369586272085 +2098-11-01,Bekaa,770.7034351146341,37.10688444661338 +2098-12-01,Bekaa,888.4275353339762,46.13163240048142 +2099-01-01,Bekaa,708.8267229779314,36.66817045239921 +2099-02-01,Bekaa,974.8334274583073,52.19729271687348 +2099-03-01,Bekaa,649.5774373460322,34.44982805346179 +2099-04-01,Bekaa,789.7245823040932,42.175422774276356 +2099-05-01,Bekaa,513.1460571187362,29.322655046838033 +2099-06-01,Bekaa,471.56388440162664,27.07491699882479 +2099-07-01,Bekaa,515.3573454216329,32.001769627727896 +2099-08-01,Bekaa,505.38402702471694,24.84181545745871 +2099-09-01,Bekaa,830.1902003140352,36.11350654306943 +2099-10-01,Bekaa,791.1066958202739,36.08322732535087 +2099-11-01,Bekaa,886.2324687629788,47.92638489989882 +2099-12-01,Bekaa,861.0414091763281,45.70275881957939 +2100-01-01,Bekaa,892.1500248097759,53.84404008093399 +2100-02-01,Bekaa,548.279995338045,34.43225863083497 +2100-03-01,Bekaa,563.2376398586109,43.15070229603947 +2100-04-01,Bekaa,714.6608921863013,42.97553111876714 +2100-05-01,Bekaa,564.9256881019503,30.421202737040332 +2100-06-01,Bekaa,473.6601932884039,21.29493895178735 +2100-07-01,Bekaa,724.5086637106151,35.27016539174484 +2100-08-01,Bekaa,561.951154961614,25.485047519216334 +2100-09-01,Bekaa,776.945810070564,32.54309135504437 +2100-10-01,Bekaa,812.3998736014512,35.58550187959413 +2100-11-01,Bekaa,838.151914163669,40.89494268588335 +2100-12-01,Bekaa,884.2890448959643,46.99091915848237 +2101-01-01,Bekaa,772.2596234594205,38.41057372604348 +2101-02-01,Bekaa,824.3696452833676,41.00642008882241 +2101-03-01,Bekaa,546.6887285273237,28.577914541393152 +2101-04-01,Bekaa,771.3260641610066,36.857237889010975 +2101-05-01,Bekaa,704.6437668788752,36.16107149582383 +2101-06-01,Bekaa,800.0117953304535,40.05648037010781 +2101-07-01,Bekaa,674.0595166704803,34.5276943870278 +2101-08-01,Bekaa,746.7611469569096,36.046067206011486 +2101-09-01,Bekaa,991.345887926714,52.78011409714762 +2101-10-01,Bekaa,879.5437354243954,46.28944839835971 +2101-11-01,Bekaa,693.4088314176203,36.987805102759765 +2101-12-01,Bekaa,359.2094244724387,31.494901167320187 +2102-01-01,Bekaa,614.1300162163627,29.945028682960906 +2102-02-01,Bekaa,828.6361529084842,40.0715896894066 +2102-03-01,Bekaa,589.2543059999188,33.94216024416492 +2102-04-01,Bekaa,600.4465050202814,26.81625597251108 +2102-05-01,Bekaa,876.8833713928926,41.662805207532685 +2102-06-01,Bekaa,971.3686192330517,57.22318777597765 +2102-07-01,Bekaa,865.4214414768015,49.49944145712307 +2102-08-01,Bekaa,790.1178014770051,40.847034943956515 +2102-09-01,Bekaa,440.6250891662526,39.91852989129585 +2102-10-01,Bekaa,416.0793031755801,41.81529910800101 +2102-11-01,Bekaa,399.3045502028913,20.503392948909756 +2102-12-01,Bekaa,787.6923369067462,34.41988571475752 +2103-01-01,Bekaa,910.1445092920178,45.59824949309379 +2103-02-01,Bekaa,822.6408094027989,43.111018539171994 +2103-03-01,Bekaa,639.181859856831,35.21839240639089 +2103-04-01,Bekaa,580.925256383771,32.77253255948709 +2103-05-01,Bekaa,636.2889568868311,32.44738520911639 +2103-06-01,Bekaa,640.414052730652,35.02146889206432 +2103-07-01,Bekaa,666.7902594238217,33.71194924162375 +2103-08-01,Bekaa,850.7005628773256,41.20760778225092 +2103-09-01,Bekaa,967.7512553633005,55.20006676582092 +2103-10-01,Bekaa,823.891008124549,44.48041991194203 +2103-11-01,Bekaa,717.8989804361099,38.73627810881939 +2103-12-01,Bekaa,423.1263419087742,32.08374204366544 +2104-01-01,Bekaa,630.8495439359523,31.044940142155266 +2104-02-01,Bekaa,582.700753760497,32.854985175773955 +2104-03-01,Bekaa,685.7073789247888,35.74836515252861 +2104-04-01,Bekaa,577.8741160459199,24.411097907215304 +2104-05-01,Bekaa,908.0945325261309,43.09513203407708 +2104-06-01,Bekaa,930.416843329028,49.610525834545456 +2104-07-01,Bekaa,810.0536786787819,52.76122523171483 +2104-08-01,Bekaa,818.1910593374786,43.1140829561704 +2104-09-01,Bekaa,439.0007201411986,35.0456000677721 +2104-10-01,Bekaa,627.7987055254292,40.648400438846835 +2104-11-01,Bekaa,384.0381163695193,21.24827973076874 +2104-12-01,Bekaa,801.9099849941346,35.93846391173676 +2105-01-01,Bekaa,568.0704259115053,27.988439800586804 +2105-02-01,Bekaa,717.901560542368,36.29873680950528 +2105-03-01,Bekaa,544.0723909898422,29.14627228714589 +2105-04-01,Bekaa,319.2676778246491,23.025625336908313 +2105-05-01,Bekaa,709.326275466204,30.015854540636177 +2105-06-01,Bekaa,811.2143971196655,36.54726043706005 +2105-07-01,Bekaa,855.6127009216265,43.68862420488279 +2105-08-01,Bekaa,768.9417714991217,48.333618436751365 +2105-09-01,Bekaa,878.9917024769151,46.31719363577342 +2105-10-01,Bekaa,650.7760339426197,36.703353623838936 +2105-11-01,Bekaa,574.3987952600595,38.656563373293395 +2105-12-01,Bekaa,739.8932334730819,47.464154386423985 +2106-01-01,Bekaa,510.90078826746134,31.768931559891087 +2106-02-01,Bekaa,536.3505172304573,22.801640685973354 +2106-03-01,Bekaa,763.1388929411161,36.65406438244561 +2106-04-01,Bekaa,746.4228785577077,37.091906628333334 +2106-05-01,Bekaa,551.7543279981044,23.69059348278528 +2106-06-01,Bekaa,826.9627069686483,32.20803562454286 +2106-07-01,Bekaa,853.5989554351089,43.12848601157081 +2106-08-01,Bekaa,854.3145232026512,46.0572116891142 +2106-09-01,Bekaa,844.8829173281832,39.36582372185174 +2106-10-01,Bekaa,797.3812946564914,28.759561774453335 +2106-11-01,Bekaa,849.9257624576023,34.12155570697169 +2106-12-01,Bekaa,886.7582614808554,44.7916872559082 +2107-01-01,Bekaa,579.0224829142911,28.44757043611435 +2107-02-01,Bekaa,752.216699295871,38.649682471672584 +2107-03-01,Bekaa,638.0785076082822,33.04413387706022 +2107-04-01,Bekaa,887.409985342479,42.295257140833044 +2107-05-01,Bekaa,833.5121145692935,40.356991226249306 +2107-06-01,Bekaa,985.8141401093214,51.287689827501424 +2107-07-01,Bekaa,695.2875879405486,36.053292374344274 +2107-08-01,Bekaa,447.84881028224953,32.3093239148392 +2107-09-01,Bekaa,705.1115346538833,35.76721412439392 +2107-10-01,Bekaa,554.9733399303664,29.447198331897095 +2107-11-01,Bekaa,837.3026749336052,42.49913100113864 +2107-12-01,Bekaa,440.22885072006,23.127444063898206 +2108-01-01,Bekaa,721.8699286549781,26.251216780557 +2108-02-01,Bekaa,848.4982500504545,40.75769403835116 +2108-03-01,Bekaa,806.6546357151693,40.720826471839985 +2108-04-01,Bekaa,850.2385591694901,45.7158616401878 +2108-05-01,Bekaa,801.5754495146252,38.81027328880015 +2108-06-01,Bekaa,921.9478366723471,51.21560067352257 +2108-07-01,Bekaa,590.9385938756266,33.05929638778231 +2108-08-01,Bekaa,652.4706147954212,42.778167297658726 +2108-09-01,Bekaa,671.2862867141546,40.81817268665331 +2108-10-01,Bekaa,520.3627241144316,25.136113259849814 +2108-11-01,Bekaa,584.1311207532922,27.147012062961792 +2108-12-01,Bekaa,703.3499259342487,35.90921897169365 +2109-01-01,Bekaa,456.0301076432119,22.419975970797463 +2109-02-01,Bekaa,721.5731615394174,34.58661718619818 +2109-03-01,Bekaa,614.5195024695819,31.968100934312925 +2109-04-01,Bekaa,677.050957741189,32.58579520272416 +2109-05-01,Bekaa,984.1238411349908,53.29461995941875 +2109-06-01,Bekaa,857.3764505804965,36.27106544906839 +2109-07-01,Bekaa,769.221026829654,37.09812115962325 +2109-08-01,Bekaa,846.8694344592961,41.25515204945181 +2109-09-01,Bekaa,622.9047380166908,31.11571428594676 +2109-10-01,Bekaa,682.6458907139663,33.54255081131997 +2109-11-01,Bekaa,930.0550794941139,45.984445822027695 +2109-12-01,Bekaa,745.3380262199883,40.00536932246615 +2110-01-01,Bekaa,503.21791802927606,31.213917473691186 +2110-02-01,Bekaa,414.3615562623335,26.108588411572928 +2110-03-01,Bekaa,562.4267728471519,32.391229841497605 +2110-04-01,Bekaa,552.9583318386585,25.163734383942476 +2110-05-01,Bekaa,800.2476829174984,35.975790993043745 +2110-06-01,Bekaa,792.8843890321133,35.4351858724024 +2110-07-01,Bekaa,917.7517604584892,49.18971370935378 +2110-08-01,Bekaa,821.1310629706585,46.58110288252027 +2110-09-01,Bekaa,874.0872498555108,47.54711232123228 +2110-10-01,Bekaa,620.5718827923349,33.6195971104433 +2110-11-01,Bekaa,654.8073676271033,37.684716175873234 +2110-12-01,Bekaa,744.6742801611194,36.781578999512284 +2111-01-01,Bekaa,848.3958692382976,42.38789295960448 +2111-02-01,Bekaa,550.7895329452039,28.441073694772992 +2111-03-01,Bekaa,620.8040923555649,29.604203160569917 +2111-04-01,Bekaa,741.5126069732532,36.11295394328283 +2111-05-01,Bekaa,983.2618111653923,53.74762767110764 +2111-06-01,Bekaa,933.951479110886,50.46448458497831 +2111-07-01,Bekaa,806.2233736989198,39.9394370757353 +2111-08-01,Bekaa,499.47404660906074,33.829664816485305 +2111-09-01,Bekaa,661.7482926284478,39.836712617009624 +2111-10-01,Bekaa,490.43516584460406,25.980555178128988 +2111-11-01,Bekaa,764.9996985119933,37.76833604839382 +2111-12-01,Bekaa,597.9654583737174,30.91079432764942 +2112-01-01,Bekaa,843.3326577382026,40.100330788467815 +2112-02-01,Bekaa,905.6875678667014,48.702028144746606 +2112-03-01,Bekaa,759.0416293073561,38.53477422193011 +2112-04-01,Bekaa,723.9821573463266,32.17006876861663 +2112-05-01,Bekaa,553.6036877784536,26.477469454680264 +2112-06-01,Bekaa,766.2039493839977,35.326091740735485 +2112-07-01,Bekaa,767.5182664910557,38.284805560708776 +2112-08-01,Bekaa,669.4941009905676,37.421765852285475 +2112-09-01,Bekaa,888.8975538399752,43.50271427026021 +2112-10-01,Bekaa,1004.0250241419777,58.33216394022756 +2112-11-01,Bekaa,799.6519528512637,38.833275624302146 +2112-12-01,Bekaa,498.0214193378046,32.86084657511468 +2113-01-01,Bekaa,848.3730874489972,40.48960926487456 +2113-02-01,Bekaa,511.20589955645255,24.52418582824899 +2113-03-01,Bekaa,763.7486763520759,33.88647325657916 +2113-04-01,Bekaa,775.4294761330838,37.65917542744778 +2113-05-01,Bekaa,783.7952236435623,38.17837691036545 +2113-06-01,Bekaa,946.8499243580894,45.48730991454597 +2113-07-01,Bekaa,847.3974779081638,43.69160292458808 +2113-08-01,Bekaa,929.7888344866278,46.6101128937771 +2113-09-01,Bekaa,526.719474631825,35.49018728164329 +2113-10-01,Bekaa,565.7521729906525,48.72148438536135 +2113-11-01,Bekaa,615.770634421255,33.47546608375076 +2113-12-01,Bekaa,664.6592563422545,29.556836198113388 +2114-01-01,Bekaa,507.827771922294,28.227807115634768 +2114-02-01,Bekaa,659.5673891939311,34.027486674849996 +2114-03-01,Bekaa,548.2863083639957,24.087290685204074 +2114-04-01,Bekaa,834.8820960964734,36.75351018094011 +2114-05-01,Bekaa,831.8630972950929,38.242691251303995 +2114-06-01,Bekaa,876.5688180129142,48.11747213305678 +2114-07-01,Bekaa,794.8407134304184,37.65228122797113 +2114-08-01,Bekaa,926.2182419047898,45.54512603660361 +2114-09-01,Bekaa,717.7170006010962,36.600032239140575 +2114-10-01,Bekaa,593.4429438223303,35.41265634955203 +2114-11-01,Bekaa,703.0891705145459,38.64051729392856 +2114-12-01,Bekaa,612.1626577466131,27.628595389283827 +2017-01-01,Kesrouan,789.5888642673247,121.7145710230069 +2017-02-01,Kesrouan,594.2434765270409,97.94459097559235 +2017-03-01,Kesrouan,626.8328001641511,96.63788578367466 +2017-04-01,Kesrouan,1007.1489723145082,166.52728236295397 +2017-05-01,Kesrouan,825.2830157254268,167.3793095695574 +2017-06-01,Kesrouan,908.5511373185271,149.0053367766081 +2017-07-01,Kesrouan,953.4588989481208,135.70600494202685 +2017-08-01,Kesrouan,687.3067959638172,139.50315832712275 +2017-09-01,Kesrouan,802.6468520157956,131.92777775158032 +2017-10-01,Kesrouan,795.8595507144141,88.0700567630943 +2017-11-01,Kesrouan,771.4050632139098,99.55774035729618 +2017-12-01,Kesrouan,794.1108456850745,131.45702533834924 +2018-01-01,Kesrouan,684.0328135584318,136.0653336634382 +2018-02-01,Kesrouan,817.3716776352001,132.7133921097759 +2018-03-01,Kesrouan,876.8039965560253,125.48971109191018 +2018-04-01,Kesrouan,826.2847093317187,127.13086158297816 +2018-05-01,Kesrouan,602.7321787043236,126.3341610962307 +2018-06-01,Kesrouan,795.2015161514053,120.4507951598764 +2018-07-01,Kesrouan,744.3207604331908,97.67598389232501 +2018-08-01,Kesrouan,854.4469414302976,93.53005913018451 +2018-09-01,Kesrouan,638.7955418957355,106.29964090794262 +2018-10-01,Kesrouan,756.8993008764999,144.38179457649773 +2018-11-01,Kesrouan,757.1789726050871,161.4827362547987 +2018-12-01,Kesrouan,719.0306366150273,123.46655223403384 +2019-01-01,Kesrouan,860.0961273257391,131.980943486356 +2019-02-01,Kesrouan,833.873295125048,129.84310570453755 +2019-03-01,Kesrouan,813.5062525256641,125.60858055410554 +2019-04-01,Kesrouan,587.1632344004603,90.74592481189498 +2019-05-01,Kesrouan,830.8430135815729,110.32889387163983 +2019-06-01,Kesrouan,869.5112729009421,142.98452668734717 +2019-07-01,Kesrouan,758.453157845248,162.97068604686552 +2019-08-01,Kesrouan,909.202484538416,144.1402043915679 +2019-09-01,Kesrouan,795.240865886185,159.75926048487318 +2019-10-01,Kesrouan,925.1382824072258,173.79263035198574 +2019-11-01,Kesrouan,613.4162300382768,85.82610147064335 +2019-12-01,Kesrouan,595.7943065931136,82.70648873728112 +2020-01-01,Kesrouan,522.5292536250931,107.23592208022913 +2020-02-01,Kesrouan,656.361643624118,136.66057960187416 +2020-03-01,Kesrouan,790.025582969604,134.80079366131184 +2020-04-01,Kesrouan,809.4191595899712,129.8305615987816 +2020-05-01,Kesrouan,913.5787522692351,171.2464336342258 +2020-06-01,Kesrouan,809.6557507502486,130.1133144231402 +2020-07-01,Kesrouan,897.6780101569914,139.20181858582893 +2020-08-01,Kesrouan,607.6504028002053,89.60110705108337 +2020-09-01,Kesrouan,709.7967532349193,86.72835400516641 +2020-10-01,Kesrouan,685.6543182823203,111.2340929261309 +2020-11-01,Kesrouan,665.9212006141704,137.41370276996594 +2020-12-01,Kesrouan,841.8101859053018,176.02028503137706 +2021-01-01,Kesrouan,895.6651902709542,137.42393611939843 +2021-02-01,Kesrouan,944.5163725487887,146.81810199354155 +2021-03-01,Kesrouan,994.6052060554232,146.08836147872296 +2021-04-01,Kesrouan,857.4499808496944,113.28403944064597 +2021-05-01,Kesrouan,868.0469559369166,136.81390867622665 +2021-06-01,Kesrouan,730.4703577215417,111.39051523513862 +2021-07-01,Kesrouan,828.5241245598959,104.74213612791702 +2021-08-01,Kesrouan,720.5424689117476,105.46583994466835 +2021-09-01,Kesrouan,615.2312101575898,121.99760199396002 +2021-10-01,Kesrouan,741.4611117289041,131.86673221547937 +2021-11-01,Kesrouan,796.831538438636,122.01186999729063 +2021-12-01,Kesrouan,836.5657602513345,130.41357825672787 +2022-01-01,Kesrouan,827.6773661347318,163.68445300011473 +2022-02-01,Kesrouan,774.0610647219208,129.0961537229763 +2022-03-01,Kesrouan,968.0805283042207,154.86104393786837 +2022-04-01,Kesrouan,657.4365460393025,89.89803312553713 +2022-05-01,Kesrouan,541.9842482125362,85.12173342704317 +2022-06-01,Kesrouan,678.3604331413268,122.9983000835972 +2022-07-01,Kesrouan,757.7830156715376,138.19440218614017 +2022-08-01,Kesrouan,747.9636026064587,132.90178599437024 +2022-09-01,Kesrouan,790.6262471679518,138.2215749688328 +2022-10-01,Kesrouan,816.390609202952,142.00260807767216 +2022-11-01,Kesrouan,774.8831855671691,111.91385569406452 +2022-12-01,Kesrouan,782.3150059591485,126.24268448875877 +2023-01-01,Kesrouan,876.3702343633358,134.45576350879094 +2023-02-01,Kesrouan,912.6002883811497,142.24889313259254 +2023-03-01,Kesrouan,869.6339680489227,130.65916947344002 +2023-04-01,Kesrouan,907.8075751566677,118.83580573147054 +2023-05-01,Kesrouan,659.6491766984569,107.46481838815981 +2023-06-01,Kesrouan,508.10050132319145,97.40309151756892 +2023-07-01,Kesrouan,768.7851733587469,103.01129711462742 +2023-08-01,Kesrouan,801.7351207727393,123.20218459391552 +2023-09-01,Kesrouan,790.565216362846,121.7897317346393 +2023-10-01,Kesrouan,822.4657436585953,134.37949632389257 +2023-11-01,Kesrouan,864.8088036120373,148.41132568678944 +2023-12-01,Kesrouan,834.3471813764575,133.07727509960256 +2024-01-01,Kesrouan,836.2506104076684,117.34109483756842 +2024-02-01,Kesrouan,857.8169400042692,145.41261196879557 +2024-03-01,Kesrouan,634.5167333917548,120.17296644720707 +2024-04-01,Kesrouan,585.0041376828086,88.13613950345594 +2024-05-01,Kesrouan,775.3341236727141,102.231554400476 +2024-06-01,Kesrouan,669.7117274807623,118.90491446225576 +2024-07-01,Kesrouan,761.8637028364524,146.41056527115964 +2024-08-01,Kesrouan,867.6793632445725,170.82082043975794 +2024-09-01,Kesrouan,692.3487711039619,121.44333835814982 +2024-10-01,Kesrouan,743.2458580180062,117.17524610990782 +2024-11-01,Kesrouan,633.5843065815692,131.23934964743367 +2024-12-01,Kesrouan,601.9674986168219,152.9645181943853 +2025-01-01,Kesrouan,815.7506656629099,125.42148264924819 +2025-02-01,Kesrouan,821.7290800191123,127.92664815948658 +2025-03-01,Kesrouan,773.024596931405,122.12842564660656 +2025-04-01,Kesrouan,764.8038108374355,111.9841534251273 +2025-05-01,Kesrouan,849.631702418464,121.94680509007148 +2025-06-01,Kesrouan,908.2431675695794,149.0905780098738 +2025-07-01,Kesrouan,781.6775965701834,120.83433180467645 +2025-08-01,Kesrouan,712.0071665118815,121.35431922168856 +2025-09-01,Kesrouan,786.9725644595209,149.17252427578944 +2025-10-01,Kesrouan,739.7125474857355,88.91863311799244 +2025-11-01,Kesrouan,734.7840459993746,101.43559360027652 +2025-12-01,Kesrouan,953.6362895235147,148.00489543767353 +2026-01-01,Kesrouan,1003.2238538684903,145.9745597863481 +2026-02-01,Kesrouan,791.0390322211699,100.3996289677026 +2026-03-01,Kesrouan,627.4698223911461,97.74997088645978 +2026-04-01,Kesrouan,597.438020335469,150.14524265195433 +2026-05-01,Kesrouan,531.9518960638991,146.35389672322697 +2026-06-01,Kesrouan,789.0842162375632,109.87998666402227 +2026-07-01,Kesrouan,669.3543417858119,114.28950575761729 +2026-08-01,Kesrouan,597.21529661303,126.37300686622403 +2026-09-01,Kesrouan,711.8152045677945,148.39416618149852 +2026-10-01,Kesrouan,774.1015407460683,155.41432336265194 +2026-11-01,Kesrouan,736.0875147630925,154.25846837818418 +2026-12-01,Kesrouan,809.2771767365706,129.00060272637847 +2027-01-01,Kesrouan,819.6649435737647,125.98734591501548 +2027-02-01,Kesrouan,857.5811935610175,133.8010858958133 +2027-03-01,Kesrouan,869.7399800356463,138.97156211048562 +2027-04-01,Kesrouan,1004.9793166340355,148.15094990878546 +2027-05-01,Kesrouan,911.3762230178463,124.52762036089963 +2027-06-01,Kesrouan,824.3317939614196,111.95705705633424 +2027-07-01,Kesrouan,792.3350393178276,100.02231547088478 +2027-08-01,Kesrouan,917.9508668080115,118.62310305714004 +2027-09-01,Kesrouan,1033.627190629298,157.32259850733527 +2027-10-01,Kesrouan,993.5810570548653,163.9574645805542 +2027-11-01,Kesrouan,757.0608530076622,120.36233231660414 +2027-12-01,Kesrouan,653.7165530443554,98.47073123979908 +2028-01-01,Kesrouan,494.61054640571075,106.26232952905296 +2028-02-01,Kesrouan,566.30048369317,121.96808788938407 +2028-03-01,Kesrouan,673.769290517099,125.91252753765323 +2028-04-01,Kesrouan,727.3665154037465,132.50925696186692 +2028-05-01,Kesrouan,938.7635680315299,174.92826316206714 +2028-06-01,Kesrouan,800.5386494989415,144.67876955584723 +2028-07-01,Kesrouan,849.3082461907119,147.13057982483897 +2028-08-01,Kesrouan,509.15914293563156,112.72082926547228 +2028-09-01,Kesrouan,505.8204692846959,88.18847996811608 +2028-10-01,Kesrouan,852.2437786411393,103.20091056505915 +2028-11-01,Kesrouan,632.6515630024988,119.34527553934367 +2028-12-01,Kesrouan,685.7023967596989,147.06689342436835 +2029-01-01,Kesrouan,858.0526160544352,131.67220076647033 +2029-02-01,Kesrouan,899.1136067421436,140.3689950536593 +2029-03-01,Kesrouan,1033.5506029523026,157.95496937474593 +2029-04-01,Kesrouan,821.6316559888165,105.72043577530766 +2029-05-01,Kesrouan,467.9715502836988,86.24042069075249 +2029-06-01,Kesrouan,454.1603213241157,83.77587680953378 +2029-07-01,Kesrouan,836.2004905308111,112.4233713502774 +2029-08-01,Kesrouan,827.9458453627287,134.5380337696408 +2029-09-01,Kesrouan,775.71832913323,120.90673550281181 +2029-10-01,Kesrouan,859.0534649437014,131.72039654121693 +2029-11-01,Kesrouan,836.5906794035922,149.5815281450434 +2029-12-01,Kesrouan,791.6481435897746,114.34646773492437 +2030-01-01,Kesrouan,861.15786623394,124.78331960824897 +2030-02-01,Kesrouan,873.4644781880638,132.81776127038592 +2030-03-01,Kesrouan,830.3168252676564,132.98139093840254 +2030-04-01,Kesrouan,688.5447287649591,94.8440694909026 +2030-05-01,Kesrouan,628.8714895090999,103.32273877344646 +2030-06-01,Kesrouan,733.5514630727288,117.42226168170825 +2030-07-01,Kesrouan,734.5765975764834,118.98059173184936 +2030-08-01,Kesrouan,752.4466566479415,140.46357712201038 +2030-09-01,Kesrouan,749.4010998049187,149.23555046016764 +2030-10-01,Kesrouan,740.1298376964241,142.62310116853118 +2030-11-01,Kesrouan,793.6025372148684,130.31729368669403 +2030-12-01,Kesrouan,853.4811482975974,135.9494963047784 +2031-01-01,Kesrouan,762.3511749533583,118.00924269276501 +2031-02-01,Kesrouan,584.5330671548181,96.7483344341357 +2031-03-01,Kesrouan,506.65420498904723,88.4181312453747 +2031-04-01,Kesrouan,643.0326073000302,103.03235067224125 +2031-05-01,Kesrouan,862.1165496650074,168.80456328529218 +2031-06-01,Kesrouan,771.7245774288754,177.22048453005232 +2031-07-01,Kesrouan,841.3042708000016,172.43462086788625 +2031-08-01,Kesrouan,1013.8680627160657,153.078167058961 +2031-09-01,Kesrouan,735.8522610714392,158.50719734427116 +2031-10-01,Kesrouan,845.3613762812828,167.19963909573974 +2031-11-01,Kesrouan,689.5186874955742,89.79573019677191 +2031-12-01,Kesrouan,798.6558456417744,85.3327916742546 +2032-01-01,Kesrouan,834.4246841635642,130.19998918116218 +2032-02-01,Kesrouan,683.455027112863,143.68678876387477 +2032-03-01,Kesrouan,702.8658500391714,133.0467462184401 +2032-04-01,Kesrouan,778.0812842264137,126.43225209085074 +2032-05-01,Kesrouan,791.7079777124272,126.38687446072083 +2032-06-01,Kesrouan,806.9882047762197,146.32912639353728 +2032-07-01,Kesrouan,748.9959875980171,118.51675019169679 +2032-08-01,Kesrouan,710.5747376155755,114.23715306673321 +2032-09-01,Kesrouan,558.4052656195167,133.73055892305177 +2032-10-01,Kesrouan,977.8900863373333,112.3741210637165 +2032-11-01,Kesrouan,740.8306008623156,105.58131051661015 +2032-12-01,Kesrouan,739.410701935224,128.70511323323694 +2033-01-01,Kesrouan,751.1212252415559,116.5312389338683 +2033-02-01,Kesrouan,775.743881823257,120.02178918826692 +2033-03-01,Kesrouan,860.1637046877938,139.97391074035386 +2033-04-01,Kesrouan,761.851172867238,121.90528177703666 +2033-05-01,Kesrouan,879.8882695960586,132.98968031822957 +2033-06-01,Kesrouan,649.2031243864905,101.67843697315958 +2033-07-01,Kesrouan,816.8800523262512,108.36905768407209 +2033-08-01,Kesrouan,780.7474927318184,127.37396781967578 +2033-09-01,Kesrouan,848.6564062192248,158.64122121103236 +2033-10-01,Kesrouan,680.1462705232537,167.01707711996178 +2033-11-01,Kesrouan,909.0574043892545,123.33219520267046 +2033-12-01,Kesrouan,850.5304813337931,139.52491489261277 +2034-01-01,Kesrouan,803.3570478551405,166.41174454678054 +2034-02-01,Kesrouan,444.9322453735592,85.17746666884491 +2034-03-01,Kesrouan,611.8543482577846,82.80126948177113 +2034-04-01,Kesrouan,700.2929827651049,122.28090194183966 +2034-05-01,Kesrouan,735.3942132642613,131.9501823069388 +2034-06-01,Kesrouan,736.89316362634,137.60167484983455 +2034-07-01,Kesrouan,833.4940875736008,151.53173312470736 +2034-08-01,Kesrouan,859.0581108873428,140.2100785949691 +2034-09-01,Kesrouan,800.0846140976356,119.00492191747742 +2034-10-01,Kesrouan,777.7048220053,132.6381030227922 +2034-11-01,Kesrouan,690.5770475356724,161.67589225361522 +2034-12-01,Kesrouan,731.4431901627892,170.60478917596149 +2035-01-01,Kesrouan,811.0698774443312,124.74860630194522 +2035-02-01,Kesrouan,821.3543072320499,127.8549688651193 +2035-03-01,Kesrouan,803.312981783634,127.82506352137747 +2035-04-01,Kesrouan,856.7434454507941,130.97756785367733 +2035-05-01,Kesrouan,919.011057068332,145.54449013325637 +2035-06-01,Kesrouan,894.5868385945814,133.84658578818255 +2035-07-01,Kesrouan,882.3265452906994,125.91857034883246 +2035-08-01,Kesrouan,794.8296294808473,88.25561722029201 +2035-09-01,Kesrouan,839.9359700045625,94.85970683131379 +2035-10-01,Kesrouan,817.1087594609554,118.58709377109932 +2035-11-01,Kesrouan,602.7252801819471,120.18629303129481 +2035-12-01,Kesrouan,747.2496055404982,129.42179308433836 +2036-01-01,Kesrouan,813.0761507734194,123.04416676268445 +2036-02-01,Kesrouan,824.6408899997349,138.6571525358067 +2036-03-01,Kesrouan,765.0976315762032,144.81518976249941 +2036-04-01,Kesrouan,743.7327669902284,147.1835499400317 +2036-05-01,Kesrouan,707.5836650207092,154.27623308155984 +2036-06-01,Kesrouan,668.7385078775446,86.17882803113051 +2036-07-01,Kesrouan,631.7409580488102,95.88299286966847 +2036-08-01,Kesrouan,721.2297869983136,117.00855682935179 +2036-09-01,Kesrouan,685.7637795302321,129.52135122583044 +2036-10-01,Kesrouan,778.4614772810576,145.2145043492859 +2036-11-01,Kesrouan,916.7498903767432,170.92114272024588 +2036-12-01,Kesrouan,771.1516481062043,138.4989146325448 +2037-01-01,Kesrouan,728.019763236943,113.58737816955295 +2037-02-01,Kesrouan,663.3161285034997,104.33325146434642 +2037-03-01,Kesrouan,696.5549691402765,106.73354959534952 +2037-04-01,Kesrouan,911.5951455136696,152.11598768782693 +2037-05-01,Kesrouan,754.8017981086377,137.23789578291135 +2037-06-01,Kesrouan,823.9028888916279,126.35000628244876 +2037-07-01,Kesrouan,888.7670902530369,138.79488094841977 +2037-08-01,Kesrouan,815.0036542398623,141.55275028114374 +2037-09-01,Kesrouan,857.5956241435397,127.5074506760279 +2037-10-01,Kesrouan,937.8512032507042,147.5228093148559 +2037-11-01,Kesrouan,768.172894301296,124.0292886430301 +2037-12-01,Kesrouan,734.1302350214942,108.1442541046032 +2038-01-01,Kesrouan,792.71649944801,103.9119969187109 +2038-02-01,Kesrouan,669.8400188790383,106.14802044838487 +2038-03-01,Kesrouan,599.9520389900795,120.8614679086973 +2038-04-01,Kesrouan,652.1957808257799,127.06486136962809 +2038-05-01,Kesrouan,773.3136309403603,123.2480848951186 +2038-06-01,Kesrouan,807.5020039070928,134.45062238162683 +2038-07-01,Kesrouan,794.1434376836489,159.33424637537803 +2038-08-01,Kesrouan,746.0508112948798,127.15625850664443 +2038-09-01,Kesrouan,935.1298065662882,143.66951310945646 +2038-10-01,Kesrouan,659.0407692607072,85.50290735406804 +2038-11-01,Kesrouan,660.0659741575472,83.9096744911522 +2038-12-01,Kesrouan,618.4063958675127,108.40474297517858 +2039-01-01,Kesrouan,863.1858910264394,132.44819308643008 +2039-02-01,Kesrouan,1029.9226841131551,160.0388253213411 +2039-03-01,Kesrouan,933.2669943453956,134.15967493067666 +2039-04-01,Kesrouan,836.600604828644,109.9896986844913 +2039-05-01,Kesrouan,562.6447947818031,97.74162648862503 +2039-06-01,Kesrouan,564.4635409311891,85.87333443025521 +2039-07-01,Kesrouan,736.2645533730591,105.30172734080634 +2039-08-01,Kesrouan,773.8433389085505,139.3003864031824 +2039-09-01,Kesrouan,914.0618600148417,133.92171593425513 +2039-10-01,Kesrouan,980.392419739755,133.03079099620663 +2039-11-01,Kesrouan,651.729848993029,127.26530419790907 +2039-12-01,Kesrouan,711.0645327043021,156.70376206981928 +2040-01-01,Kesrouan,543.0357097302578,85.99601847431789 +2040-02-01,Kesrouan,648.13959045461,84.21734130333172 +2040-03-01,Kesrouan,717.5145807331786,110.34857809217308 +2040-04-01,Kesrouan,706.8139870241391,126.86376138181066 +2040-05-01,Kesrouan,820.4355366804461,164.5676142859653 +2040-06-01,Kesrouan,881.4195303843698,168.67889604258968 +2040-07-01,Kesrouan,872.9068945580261,121.03488466897286 +2040-08-01,Kesrouan,844.9249391513454,135.07825558726316 +2040-09-01,Kesrouan,495.8309161320268,88.87844551992238 +2040-10-01,Kesrouan,867.0012666522035,87.94814297113945 +2040-11-01,Kesrouan,682.887870023201,112.60616868086609 +2040-12-01,Kesrouan,665.9337657799275,145.28451170753027 +2041-01-01,Kesrouan,749.9971884527106,116.38492465549777 +2041-02-01,Kesrouan,607.4026543358804,98.71259345821144 +2041-03-01,Kesrouan,818.1321341375733,123.97856815304115 +2041-04-01,Kesrouan,870.0673078830994,151.42310312505646 +2041-05-01,Kesrouan,797.4904881117561,147.9971012199158 +2041-06-01,Kesrouan,755.170165124922,109.6800176019187 +2041-07-01,Kesrouan,812.9057995065727,97.6856670616805 +2041-08-01,Kesrouan,928.2757726198774,118.43331538301727 +2041-09-01,Kesrouan,775.6151328699256,139.9990906485453 +2041-10-01,Kesrouan,712.5176571677372,163.30603914314287 +2041-11-01,Kesrouan,834.7334986295376,130.02556681396808 +2041-12-01,Kesrouan,976.5167172397399,122.1707925690928 +2042-01-01,Kesrouan,695.2101092423,162.2999187231911 +2042-02-01,Kesrouan,788.1205348974272,174.9007052533206 +2042-03-01,Kesrouan,563.752711554075,83.55480528492068 +2042-04-01,Kesrouan,526.442722015465,81.18132843267213 +2042-05-01,Kesrouan,590.1723276252078,111.52439544376858 +2042-06-01,Kesrouan,780.677310825601,131.09879086397993 +2042-07-01,Kesrouan,784.1918264040503,138.03383518721895 +2042-08-01,Kesrouan,907.1177229190247,174.27662376573699 +2042-09-01,Kesrouan,824.5487454508499,130.64806500555224 +2042-10-01,Kesrouan,889.5576046029075,138.88676713439347 +2042-11-01,Kesrouan,548.4641077131109,86.61006528860788 +2042-12-01,Kesrouan,848.8373164488925,86.15763081538546 +2043-01-01,Kesrouan,855.0279659577982,131.2164621562298 +2043-02-01,Kesrouan,894.1501902853876,139.6048499446913 +2043-03-01,Kesrouan,754.4917165671258,115.75374890147665 +2043-04-01,Kesrouan,886.9305346530261,122.15551895884363 +2043-05-01,Kesrouan,969.4746633620288,155.6203780277185 +2043-06-01,Kesrouan,858.1003425663866,128.34219305854506 +2043-07-01,Kesrouan,798.1274751422083,92.91729912596354 +2043-08-01,Kesrouan,670.2933503494894,83.57394849504486 +2043-09-01,Kesrouan,553.1998729314447,91.15186906860953 +2043-10-01,Kesrouan,688.8058167189813,122.24854829675513 +2043-11-01,Kesrouan,823.0124163603847,126.77552778023716 +2043-12-01,Kesrouan,825.4799051854968,135.02667314848688 +2044-01-01,Kesrouan,821.3275578595698,163.36896751772963 +2044-02-01,Kesrouan,814.0751694424632,127.64991369385932 +2044-03-01,Kesrouan,885.5044411344129,156.3841930286403 +2044-04-01,Kesrouan,561.5563065011221,87.57565271966348 +2044-05-01,Kesrouan,560.0136068364216,83.10705039890887 +2044-06-01,Kesrouan,647.9400964503773,108.39353152783137 +2044-07-01,Kesrouan,714.6197354861552,128.3737581121859 +2044-08-01,Kesrouan,808.2105807054719,148.28587851611775 +2044-09-01,Kesrouan,867.2884704409366,169.56548678425366 +2044-10-01,Kesrouan,769.8311442158017,108.87944140218427 +2044-11-01,Kesrouan,683.0026107525232,105.72851425277184 +2044-12-01,Kesrouan,535.4330101232911,150.24992358127466 +2045-01-01,Kesrouan,785.218298376429,121.10901226468286 +2045-02-01,Kesrouan,815.0422296507019,126.6642355203247 +2045-03-01,Kesrouan,814.7400321347629,131.33146201855016 +2045-04-01,Kesrouan,818.1904196123455,125.94017714307928 +2045-05-01,Kesrouan,685.1374218556864,98.43673316759545 +2045-06-01,Kesrouan,801.9199730151934,103.23984803173198 +2045-07-01,Kesrouan,809.6885539280793,125.17828777242704 +2045-08-01,Kesrouan,790.6104791168057,149.35027523244946 +2045-09-01,Kesrouan,760.7804940371819,170.0752347387213 +2045-10-01,Kesrouan,802.0165523284635,137.09104660724373 +2045-11-01,Kesrouan,956.1705813867416,125.7935602656664 +2045-12-01,Kesrouan,706.5989361480166,151.06963687802133 +2046-01-01,Kesrouan,496.31141933347084,101.48366405622784 +2046-02-01,Kesrouan,682.0501219129776,84.5136377272529 +2046-03-01,Kesrouan,766.5923583531533,111.62501421018692 +2046-04-01,Kesrouan,691.784922489317,127.69125055697916 +2046-05-01,Kesrouan,870.986641579387,173.9331524567677 +2046-06-01,Kesrouan,846.9110800579879,154.32677629130174 +2046-07-01,Kesrouan,844.0797997671473,130.21379870109527 +2046-08-01,Kesrouan,650.661422741708,119.12127889065442 +2046-09-01,Kesrouan,632.6778196233806,94.80915750845992 +2046-10-01,Kesrouan,956.6307409864837,90.93906858448756 +2046-11-01,Kesrouan,669.1941623198164,109.73686343009842 +2046-12-01,Kesrouan,738.1589720893293,148.88015858286295 +2047-01-01,Kesrouan,808.6833406675137,124.40705451013346 +2047-02-01,Kesrouan,693.2635292496935,109.07442827803484 +2047-03-01,Kesrouan,664.8870557954751,102.48395256736323 +2047-04-01,Kesrouan,813.2169369443669,126.43120063559245 +2047-05-01,Kesrouan,659.651182901393,109.04062276885817 +2047-06-01,Kesrouan,719.8327658240011,105.09522336201022 +2047-07-01,Kesrouan,732.1627482825022,115.55274978000668 +2047-08-01,Kesrouan,809.8427851783524,148.2424815342651 +2047-09-01,Kesrouan,862.4245898070405,173.61248305543467 +2047-10-01,Kesrouan,715.2108262248784,159.8867677742777 +2047-11-01,Kesrouan,1001.0504673544876,134.28766515592656 +2047-12-01,Kesrouan,649.3272625927235,161.6945372451141 +2048-01-01,Kesrouan,756.4500522050062,175.80606936183477 +2048-02-01,Kesrouan,532.667195401941,90.5982901013396 +2048-03-01,Kesrouan,634.3008729951495,94.71704208078746 +2048-04-01,Kesrouan,934.1942120672561,143.7650060314906 +2048-05-01,Kesrouan,734.1183385900491,135.1297524424719 +2048-06-01,Kesrouan,432.82664087500586,85.93889755609966 +2048-07-01,Kesrouan,444.50795105086615,113.62179498992631 +2048-08-01,Kesrouan,683.6946451758159,127.71094394718035 +2048-09-01,Kesrouan,664.4046519807234,125.2446242069353 +2048-10-01,Kesrouan,827.2676783772744,148.1081092201218 +2048-11-01,Kesrouan,740.0262894676921,135.9392629553459 +2048-12-01,Kesrouan,681.8231042123246,121.9798097815805 +2049-01-01,Kesrouan,813.5845296367108,125.1097536741667 +2049-02-01,Kesrouan,668.2166839349275,106.04898192140995 +2049-03-01,Kesrouan,511.504886919417,88.89694379673406 +2049-04-01,Kesrouan,974.4943942871638,155.30071728986002 +2049-05-01,Kesrouan,825.030022976234,159.1154519849726 +2049-06-01,Kesrouan,744.2951373500784,143.8388952158339 +2049-07-01,Kesrouan,909.8725563190409,146.6560984133081 +2049-08-01,Kesrouan,844.5432678419066,130.3269768560495 +2049-09-01,Kesrouan,791.0173511508441,107.30548929441187 +2049-10-01,Kesrouan,680.8187356687848,124.35374817378255 +2049-11-01,Kesrouan,815.756930647517,105.01854659861003 +2049-12-01,Kesrouan,1011.4221141751083,99.95048029216234 +2050-01-01,Kesrouan,742.328354541941,121.40238050797191 +2050-02-01,Kesrouan,807.1157570470983,151.74841237837228 +2050-03-01,Kesrouan,826.4235244962729,126.19591306910041 +2050-04-01,Kesrouan,832.9006034699714,128.69612390208968 +2050-05-01,Kesrouan,824.9529425476403,143.79512533415127 +2050-06-01,Kesrouan,625.216856494015,94.1969782498758 +2050-07-01,Kesrouan,835.1414265598581,88.62679009613912 +2050-08-01,Kesrouan,765.6719687605837,114.89978383837973 +2050-09-01,Kesrouan,730.39433318923,137.08569763427272 +2050-10-01,Kesrouan,826.6316064569334,157.528439213483 +2050-11-01,Kesrouan,838.3816906773015,140.27927290932186 +2050-12-01,Kesrouan,776.2543724791128,133.88658999289362 +2051-01-01,Kesrouan,709.7757760954482,111.35798736636302 +2051-02-01,Kesrouan,622.5283685770579,99.66510188621396 +2051-03-01,Kesrouan,744.97661281055,112.48089879044143 +2051-04-01,Kesrouan,1005.7327338278612,170.03053566401968 +2051-05-01,Kesrouan,784.4976843604338,151.7556747553889 +2051-06-01,Kesrouan,776.708759845846,92.27839028530435 +2051-07-01,Kesrouan,907.5677459144586,97.72612058012113 +2051-08-01,Kesrouan,804.7182389489469,101.92058956439037 +2051-09-01,Kesrouan,892.88466339474,134.782509343419 +2051-10-01,Kesrouan,713.6929401228074,159.76901701157226 +2051-11-01,Kesrouan,869.18112933007,131.56398645843316 +2051-12-01,Kesrouan,849.9533284259936,142.24808008870093 +2052-01-01,Kesrouan,814.4243895394985,168.549022978854 +2052-02-01,Kesrouan,437.81293508454075,92.99532994366437 +2052-03-01,Kesrouan,630.0409650346184,82.20197055010114 +2052-04-01,Kesrouan,605.3953603070529,112.48916371782062 +2052-05-01,Kesrouan,729.4031985457592,138.56831679270442 +2052-06-01,Kesrouan,756.0957638058167,135.07982054392667 +2052-07-01,Kesrouan,789.7810373906681,136.8237079947095 +2052-08-01,Kesrouan,917.9429827824383,158.48776987444052 +2052-09-01,Kesrouan,806.0081922402538,142.49963464613677 +2052-10-01,Kesrouan,762.4303671745163,106.22477056912864 +2052-11-01,Kesrouan,533.8337144178696,119.70208871518065 +2052-12-01,Kesrouan,627.7883511029149,123.79791041164087 +2053-01-01,Kesrouan,752.322201672824,116.68782018378715 +2053-02-01,Kesrouan,529.3050808535424,92.23752718836197 +2053-03-01,Kesrouan,638.9231645596994,97.27446858523045 +2053-04-01,Kesrouan,1045.7259318020178,171.69948247520094 +2053-05-01,Kesrouan,837.6051845514403,169.62226536820174 +2053-06-01,Kesrouan,972.7606125919447,147.4919747780951 +2053-07-01,Kesrouan,887.1943679373819,137.74554082686237 +2053-08-01,Kesrouan,709.7745090199097,134.8561906819554 +2053-09-01,Kesrouan,735.4780514290607,93.84902297327876 +2053-10-01,Kesrouan,698.4637480459834,82.38327016825795 +2053-11-01,Kesrouan,673.8982506496868,103.8335901446241 +2053-12-01,Kesrouan,544.8300646755273,129.55218270603524 +2054-01-01,Kesrouan,656.1954455493144,139.55439843162887 +2054-02-01,Kesrouan,750.0008488931553,133.71744629788287 +2054-03-01,Kesrouan,808.7604914891931,130.4281610853248 +2054-04-01,Kesrouan,954.992553101338,164.69105024279992 +2054-05-01,Kesrouan,812.0732604846744,148.86032764764246 +2054-06-01,Kesrouan,812.2643777117357,136.32405890121112 +2054-07-01,Kesrouan,720.6734000507288,126.22571143338283 +2054-08-01,Kesrouan,574.1838757284636,91.50345553371486 +2054-09-01,Kesrouan,984.6554249960469,89.57075239361197 +2054-10-01,Kesrouan,628.3744791291123,107.08503825066337 +2054-11-01,Kesrouan,831.2172232239515,163.86243014191757 +2054-12-01,Kesrouan,678.9038677611844,171.32598967336241 +2055-01-01,Kesrouan,738.2461891222314,114.87417295579462 +2055-02-01,Kesrouan,751.4595344103428,116.14895547702142 +2055-03-01,Kesrouan,1025.5188926859157,166.91824032568178 +2055-04-01,Kesrouan,927.7763336784411,142.4409854499268 +2055-05-01,Kesrouan,755.2054320607443,96.73485196569281 +2055-06-01,Kesrouan,835.9827647174407,136.15176084042548 +2055-07-01,Kesrouan,788.4514527922395,97.23313172211061 +2055-08-01,Kesrouan,831.8623054592332,88.75484450906468 +2055-09-01,Kesrouan,851.2344825816162,140.4594385452088 +2055-10-01,Kesrouan,762.3244255808784,134.98518957067986 +2055-11-01,Kesrouan,813.6826575978613,126.95918400305717 +2055-12-01,Kesrouan,781.5848888766144,122.26102515827947 +2056-01-01,Kesrouan,864.8847577512636,138.09653126355096 +2056-02-01,Kesrouan,849.4563532425487,127.67841913496073 +2056-03-01,Kesrouan,811.290630160377,133.53399792086972 +2056-04-01,Kesrouan,842.6555364687564,130.3749403325414 +2056-05-01,Kesrouan,893.8469368731666,150.4647261095658 +2056-06-01,Kesrouan,639.628855241574,139.97114150063285 +2056-07-01,Kesrouan,560.2285521229157,86.44357468419076 +2056-08-01,Kesrouan,619.5903371720962,87.47064779540892 +2056-09-01,Kesrouan,654.7352817773318,111.59023671620753 +2056-10-01,Kesrouan,613.4917618189902,132.69150716893458 +2056-11-01,Kesrouan,719.1388307874005,156.22023936568942 +2056-12-01,Kesrouan,850.0036594821073,171.1796295466521 +2057-01-01,Kesrouan,902.1652173905172,138.4297692230878 +2057-02-01,Kesrouan,1103.149935994276,167.90717067478278 +2057-03-01,Kesrouan,1091.5146628963157,152.3190285886938 +2057-04-01,Kesrouan,814.4966832382801,109.14348199081238 +2057-05-01,Kesrouan,423.67202010914133,85.9418746416275 +2057-06-01,Kesrouan,637.7425317301334,90.68755987539149 +2057-07-01,Kesrouan,886.8939302485799,133.23065307885076 +2057-08-01,Kesrouan,831.9759902922733,146.8181081066535 +2057-09-01,Kesrouan,890.2080367126852,131.8474208947761 +2057-10-01,Kesrouan,858.7057231014611,113.24146772890884 +2057-11-01,Kesrouan,882.8902531191734,125.1219432194286 +2057-12-01,Kesrouan,697.9152451239717,131.960843574209 +2058-01-01,Kesrouan,625.448696121023,132.63011318545153 +2058-02-01,Kesrouan,694.0081473078352,127.53448591370129 +2058-03-01,Kesrouan,915.5161107676445,158.82567825152003 +2058-04-01,Kesrouan,821.041409967119,135.1979808851339 +2058-05-01,Kesrouan,844.8263184385967,143.30665100932828 +2058-06-01,Kesrouan,826.8619326326036,131.26652243012632 +2058-07-01,Kesrouan,807.0151653279563,134.90801764521038 +2058-08-01,Kesrouan,706.6603189185498,137.9050808229732 +2058-09-01,Kesrouan,677.2448787192811,100.14142640100283 +2058-10-01,Kesrouan,1085.3095124118024,89.54129330704373 +2058-11-01,Kesrouan,675.8727063041408,106.46014983230017 +2058-12-01,Kesrouan,768.9994499109291,147.75799907155647 +2059-01-01,Kesrouan,706.4834914878396,110.96485924888697 +2059-02-01,Kesrouan,710.6799048852733,109.89529695294324 +2059-03-01,Kesrouan,903.9665764477911,145.85838009341816 +2059-04-01,Kesrouan,912.5761435528323,161.9135089157666 +2059-05-01,Kesrouan,950.078763769841,135.2395989514042 +2059-06-01,Kesrouan,850.7728447270794,123.87781795471554 +2059-07-01,Kesrouan,855.5658395239032,109.3084779393536 +2059-08-01,Kesrouan,604.015902207566,84.40366589952528 +2059-09-01,Kesrouan,601.2181994184963,84.7399115101498 +2059-10-01,Kesrouan,493.59227522778986,110.69046610514302 +2059-11-01,Kesrouan,676.4614740710435,140.0461860631379 +2059-12-01,Kesrouan,756.2682972583129,132.8791124620852 +2060-01-01,Kesrouan,808.2010776389329,128.83333575674158 +2060-02-01,Kesrouan,955.0908922417448,160.62678443031257 +2060-03-01,Kesrouan,824.2408460949875,153.12430271497482 +2060-04-01,Kesrouan,866.7308164178133,129.74305240097615 +2060-05-01,Kesrouan,911.2913289567648,149.93619867513598 +2060-06-01,Kesrouan,572.3517900893803,94.98188043052724 +2060-07-01,Kesrouan,530.3302857503825,85.02505761784344 +2060-08-01,Kesrouan,746.1111381691309,107.48344809687879 +2060-09-01,Kesrouan,651.1864495697141,125.26712351552928 +2060-10-01,Kesrouan,713.8152129122752,147.99187450918413 +2060-11-01,Kesrouan,710.398895688062,148.76063501768712 +2060-12-01,Kesrouan,638.9637109769324,111.42854490468439 +2061-01-01,Kesrouan,751.7640548981024,116.61502524648591 +2061-02-01,Kesrouan,576.0279281920773,95.8843316411892 +2061-03-01,Kesrouan,789.7092364434849,117.7198326894745 +2061-04-01,Kesrouan,886.5651945394172,152.60851500588393 +2061-05-01,Kesrouan,781.2266584646385,147.73965362254395 +2061-06-01,Kesrouan,827.7618378373003,135.83734515263458 +2061-07-01,Kesrouan,754.3882387314793,102.95204577688875 +2061-08-01,Kesrouan,981.2072900971995,141.92494099013334 +2061-09-01,Kesrouan,771.6812152882235,131.0873837970498 +2061-10-01,Kesrouan,935.213151979489,127.21949559338549 +2061-11-01,Kesrouan,809.308431266521,103.14994249403554 +2061-12-01,Kesrouan,519.5287483567733,95.05372783547361 +2062-01-01,Kesrouan,865.3525901973222,97.28778294309424 +2062-02-01,Kesrouan,671.0807322070563,111.3316398537859 +2062-03-01,Kesrouan,812.301122902353,152.9733577542894 +2062-04-01,Kesrouan,828.2613471718222,161.83869665151633 +2062-05-01,Kesrouan,849.4724732591222,129.68054277455914 +2062-06-01,Kesrouan,896.1648403916471,156.70958786552364 +2062-07-01,Kesrouan,509.1445363703957,91.66265319555552 +2062-08-01,Kesrouan,565.3936095730112,82.5666299051476 +2062-09-01,Kesrouan,669.4673578845401,103.7288144620683 +2062-10-01,Kesrouan,658.248600673328,124.52910890366357 +2062-11-01,Kesrouan,769.3674649617859,154.36467147238423 +2062-12-01,Kesrouan,889.4044996420021,178.19320290621727 +2063-01-01,Kesrouan,812.7717710718307,124.9928251250208 +2063-02-01,Kesrouan,719.2658903066807,112.53634471598076 +2063-03-01,Kesrouan,715.6716897554752,109.9782457692214 +2063-04-01,Kesrouan,751.8266343510886,115.73172030250412 +2063-05-01,Kesrouan,907.5219904089006,148.4800554046327 +2063-06-01,Kesrouan,849.2187061859893,158.8455091867405 +2063-07-01,Kesrouan,920.491071690418,148.1776030769609 +2063-08-01,Kesrouan,682.2884025073063,150.0085901470474 +2063-09-01,Kesrouan,801.021616458377,164.20864012504805 +2063-10-01,Kesrouan,712.4661998222558,87.27344797302635 +2063-11-01,Kesrouan,651.3214635076529,86.31699353124922 +2063-12-01,Kesrouan,635.4472243920899,111.69349940355153 +2064-01-01,Kesrouan,648.106681687151,137.5706324672669 +2064-02-01,Kesrouan,758.4210585982719,135.23325965429456 +2064-03-01,Kesrouan,738.1754440713303,125.47621639724335 +2064-04-01,Kesrouan,893.3981809532713,147.82146539999627 +2064-05-01,Kesrouan,863.2746567072219,164.5528450074534 +2064-06-01,Kesrouan,788.8536788826366,108.75888166453007 +2064-07-01,Kesrouan,873.9079546265485,117.20660637429775 +2064-08-01,Kesrouan,709.0954269243441,114.20142804039894 +2064-09-01,Kesrouan,722.4230201901795,101.8359260202055 +2064-10-01,Kesrouan,827.167790588987,110.10052023478232 +2064-11-01,Kesrouan,639.2919187379539,120.200270661807 +2064-12-01,Kesrouan,804.5110017053122,155.89694743932264 +2065-01-01,Kesrouan,774.8795251267245,119.69297100868211 +2065-02-01,Kesrouan,860.1810213868205,134.12596723129144 +2065-03-01,Kesrouan,979.3098444782538,159.3436238891352 +2065-04-01,Kesrouan,885.991490892806,117.64828177045852 +2065-05-01,Kesrouan,867.4021552739769,110.24047382015134 +2065-06-01,Kesrouan,776.9942038074422,120.07890399337317 +2065-07-01,Kesrouan,687.8222141356562,85.81631132182845 +2065-08-01,Kesrouan,698.6287494383338,96.59999671570414 +2065-09-01,Kesrouan,660.0517195577387,127.1887558098602 +2065-10-01,Kesrouan,765.625650110342,133.07583851829034 +2065-11-01,Kesrouan,771.3044011016823,131.80920783187133 +2065-12-01,Kesrouan,965.426357016432,165.36115735038192 +2066-01-01,Kesrouan,852.8357844899738,162.026473111802 +2066-02-01,Kesrouan,837.2863742673295,140.79461436123913 +2066-03-01,Kesrouan,887.3562720339715,165.42713005472814 +2066-04-01,Kesrouan,517.2050374087414,85.7180002551776 +2066-05-01,Kesrouan,502.8406595835054,81.58354980419887 +2066-06-01,Kesrouan,609.498890028204,103.98530230086135 +2066-07-01,Kesrouan,651.1549134674219,127.10377438385305 +2066-08-01,Kesrouan,724.1703173578096,147.72168107336142 +2066-09-01,Kesrouan,922.317983437719,177.77260857667414 +2066-10-01,Kesrouan,811.2880960092998,146.49181464231103 +2066-11-01,Kesrouan,774.844539763244,162.22406111679447 +2066-12-01,Kesrouan,693.3658807959724,173.0119492751474 +2067-01-01,Kesrouan,714.657466179969,111.94605956790588 +2067-02-01,Kesrouan,646.2120165950815,102.21195270695429 +2067-03-01,Kesrouan,868.1274152336131,135.5753310606235 +2067-04-01,Kesrouan,921.2479381454322,163.75337833754094 +2067-05-01,Kesrouan,900.7100515276034,147.83902225756506 +2067-06-01,Kesrouan,853.4458813617749,120.7706729132097 +2067-07-01,Kesrouan,668.2092222678673,102.92081083129413 +2067-08-01,Kesrouan,744.0798049016141,94.62849671050364 +2067-09-01,Kesrouan,910.7007309696398,93.34481044169712 +2067-10-01,Kesrouan,1068.3499879009473,165.88554009489815 +2067-11-01,Kesrouan,988.2254807189348,167.79888912251397 +2067-12-01,Kesrouan,802.9564408057092,112.79454422612451 +2068-01-01,Kesrouan,836.5716028774289,129.22683677404763 +2068-02-01,Kesrouan,695.3302702392037,157.27099161611116 +2068-03-01,Kesrouan,658.7722548361675,159.74280398745844 +2068-04-01,Kesrouan,784.881326676266,131.4573798988433 +2068-05-01,Kesrouan,842.8226496536711,119.57690135176756 +2068-06-01,Kesrouan,705.481516309206,130.22105190844394 +2068-07-01,Kesrouan,681.3991970516015,129.287796726581 +2068-08-01,Kesrouan,790.4159830216415,130.06391742189209 +2068-09-01,Kesrouan,683.1824650859086,133.43464151207255 +2068-10-01,Kesrouan,699.8774523815532,127.76667107587015 +2068-11-01,Kesrouan,747.3016964237488,125.17091535939502 +2068-12-01,Kesrouan,711.1598449420335,136.75274087788637 +2069-01-01,Kesrouan,771.5682343860381,119.24445809678642 +2069-02-01,Kesrouan,559.8937978049453,94.75908500833945 +2069-03-01,Kesrouan,516.2391034898702,88.72103594333203 +2069-04-01,Kesrouan,714.4761335917885,113.32032687328119 +2069-05-01,Kesrouan,758.3056139380949,154.54589467664147 +2069-06-01,Kesrouan,757.2687941821516,170.29974488881575 +2069-07-01,Kesrouan,819.9855840780978,174.99306214891573 +2069-08-01,Kesrouan,911.9770983954504,158.02649889787 +2069-09-01,Kesrouan,920.1869031680859,133.07432857963454 +2069-10-01,Kesrouan,775.1811594979797,149.94653594747194 +2069-11-01,Kesrouan,750.821421090523,157.1363319857054 +2069-12-01,Kesrouan,593.8214699796256,85.95092816045042 +2070-01-01,Kesrouan,622.4537519064556,84.26181113633456 +2070-02-01,Kesrouan,726.1456177292893,125.23406074945657 +2070-03-01,Kesrouan,821.3616985060246,149.57896063801732 +2070-04-01,Kesrouan,925.0783074984022,155.52325290478922 +2070-05-01,Kesrouan,950.18188964006,147.23724751554852 +2070-06-01,Kesrouan,570.6767514239891,102.08179232695616 +2070-07-01,Kesrouan,575.6093357093075,109.79403936632437 +2070-08-01,Kesrouan,613.2126884316293,115.3098544456719 +2070-09-01,Kesrouan,906.0009366179833,106.94423494273096 +2070-10-01,Kesrouan,663.022448550903,122.61556731302076 +2070-11-01,Kesrouan,803.0846970074425,155.12940955321304 +2070-12-01,Kesrouan,681.6390966868961,136.21979977661653 +2071-01-01,Kesrouan,942.2986383909374,144.67063300381935 +2071-02-01,Kesrouan,1076.9465322851759,163.62195865647763 +2071-03-01,Kesrouan,845.5676984148064,117.24525958126414 +2071-04-01,Kesrouan,498.60595234757403,88.54559574299545 +2071-05-01,Kesrouan,590.4987051660069,94.27037227214977 +2071-06-01,Kesrouan,798.6347277161323,109.83680058453247 +2071-07-01,Kesrouan,1036.9083531294016,163.73120608043718 +2071-08-01,Kesrouan,1055.7648305076038,150.809322231137 +2071-09-01,Kesrouan,993.2209964226669,102.23974902706756 +2071-10-01,Kesrouan,797.0354672072536,106.00965321557123 +2071-11-01,Kesrouan,672.6785848542255,149.12002487021815 +2071-12-01,Kesrouan,461.705052225195,117.13892505515679 +2072-01-01,Kesrouan,763.2401692298066,110.71298680962889 +2072-02-01,Kesrouan,781.3603349339531,120.60502897479998 +2072-03-01,Kesrouan,776.6938365117256,124.95614950977571 +2072-04-01,Kesrouan,835.4099761809406,167.73996483626553 +2072-05-01,Kesrouan,744.7759221238642,136.4287459436434 +2072-06-01,Kesrouan,957.0633768898055,154.9321638824907 +2072-07-01,Kesrouan,628.7434092900803,86.87415478213173 +2072-08-01,Kesrouan,523.9525314202874,83.89353587555972 +2072-09-01,Kesrouan,616.734384104797,105.67156144513271 +2072-10-01,Kesrouan,637.763438476519,127.56904944876186 +2072-11-01,Kesrouan,714.0310381123379,142.37473765554208 +2072-12-01,Kesrouan,794.4805501699828,156.22887719289858 +2073-01-01,Kesrouan,714.1461308070876,111.88418570513343 +2073-02-01,Kesrouan,658.1218227263897,103.53009553136195 +2073-03-01,Kesrouan,938.6453780410195,150.12442139259525 +2073-04-01,Kesrouan,901.8686513214161,161.8430675265726 +2073-05-01,Kesrouan,915.3504758375246,129.429238854714 +2073-06-01,Kesrouan,839.6777681670447,117.22596965645275 +2073-07-01,Kesrouan,695.4461372578935,97.76319660420006 +2073-08-01,Kesrouan,750.878017131244,88.84059313062366 +2073-09-01,Kesrouan,926.7354311235404,106.82613573264342 +2073-10-01,Kesrouan,955.6241902572941,149.35996451491695 +2073-11-01,Kesrouan,688.6156146020312,125.89743732076306 +2073-12-01,Kesrouan,763.1337348845702,125.3386499820974 +2074-01-01,Kesrouan,789.6060401801802,123.08496261539523 +2074-02-01,Kesrouan,836.2159770096152,142.69977181881939 +2074-03-01,Kesrouan,760.9552096753279,145.06445190294767 +2074-04-01,Kesrouan,710.8748233389503,116.61668495638492 +2074-05-01,Kesrouan,763.5160397317784,122.69859865631048 +2074-06-01,Kesrouan,717.2780599659868,102.07012850932341 +2074-07-01,Kesrouan,844.8827736931465,105.80686600885096 +2074-08-01,Kesrouan,726.215095704652,125.54688702813611 +2074-09-01,Kesrouan,805.6753033390484,154.02824858151268 +2074-10-01,Kesrouan,715.6510645814315,97.69425292743794 +2074-11-01,Kesrouan,476.1587588758972,122.53653394495737 +2074-12-01,Kesrouan,751.8472595251325,122.21094654504704 +2075-01-01,Kesrouan,908.0866837405712,139.3482887485546 +2075-02-01,Kesrouan,994.1746819446655,153.83909667103444 +2075-03-01,Kesrouan,817.9581224302821,116.42433588834804 +2075-04-01,Kesrouan,859.7483854834985,115.5847396949292 +2075-05-01,Kesrouan,676.3796773057229,121.13745657466461 +2075-06-01,Kesrouan,698.906309374357,105.99280242243461 +2075-07-01,Kesrouan,1019.4643834043163,142.96767283765456 +2075-08-01,Kesrouan,1062.0176371109828,150.83076702791672 +2075-09-01,Kesrouan,990.6764271689608,124.00438688143313 +2075-10-01,Kesrouan,764.7357407237824,102.1926077641352 +2075-11-01,Kesrouan,679.5762273170872,143.90437887122278 +2075-12-01,Kesrouan,678.2842326263013,159.0034597737399 +2076-01-01,Kesrouan,802.9122339480317,114.66851258644994 +2076-02-01,Kesrouan,979.1299197517828,136.6562943103854 +2076-03-01,Kesrouan,881.3378744052202,151.06041830517532 +2076-04-01,Kesrouan,728.4184696730666,148.8843154990004 +2076-05-01,Kesrouan,636.8033823802849,150.04891834669272 +2076-06-01,Kesrouan,639.854007525462,139.95109660649356 +2076-07-01,Kesrouan,715.8720284767336,116.2602844156057 +2076-08-01,Kesrouan,676.4066378574594,114.65083957975376 +2076-09-01,Kesrouan,652.9151981593219,119.03726639289403 +2076-10-01,Kesrouan,739.7655534790973,137.21661604015475 +2076-11-01,Kesrouan,852.405682737729,165.94888416109865 +2076-12-01,Kesrouan,569.2382687223326,100.64622884788926 +2077-01-01,Kesrouan,917.738631655308,140.84834250231577 +2077-02-01,Kesrouan,903.1211554912511,139.84730207840846 +2077-03-01,Kesrouan,774.0821826475631,112.33376229851135 +2077-04-01,Kesrouan,780.8072564613858,106.09256229662161 +2077-05-01,Kesrouan,695.8940484607631,115.78652129473093 +2077-06-01,Kesrouan,751.1927446163972,132.29211922480448 +2077-07-01,Kesrouan,825.9779362652239,142.5656562553787 +2077-08-01,Kesrouan,759.3632700473385,139.19903100677203 +2077-09-01,Kesrouan,823.5275529598817,137.10172010073785 +2077-10-01,Kesrouan,891.474197141102,117.91287559571963 +2077-11-01,Kesrouan,725.3523580490853,141.5721349591906 +2077-12-01,Kesrouan,896.5947309646353,165.61810367257246 +2078-01-01,Kesrouan,599.7711639569546,83.34321214041215 +2078-02-01,Kesrouan,553.4048575963443,84.73843825016579 +2078-03-01,Kesrouan,713.1675261328311,120.09957242493309 +2078-04-01,Kesrouan,781.8172564517633,134.66802298250389 +2078-05-01,Kesrouan,829.4752759308175,152.14238410529975 +2078-06-01,Kesrouan,808.6065418112619,153.01786732252 +2078-07-01,Kesrouan,824.8857875440982,108.91287706808694 +2078-08-01,Kesrouan,749.8686506786355,114.3898158118813 +2078-09-01,Kesrouan,624.0994718517471,113.47433450306198 +2078-10-01,Kesrouan,530.8233893141262,117.34150747262618 +2078-11-01,Kesrouan,1076.5716891050279,99.60530953806621 +2078-12-01,Kesrouan,701.8207238991422,109.92676114023662 +2079-01-01,Kesrouan,765.958468618462,118.49032320866411 +2079-02-01,Kesrouan,943.078593777987,148.21052829801437 +2079-03-01,Kesrouan,942.4211223596618,151.54084166153797 +2079-04-01,Kesrouan,860.8252589050765,105.86567414597204 +2079-05-01,Kesrouan,852.6892964791028,119.19917827644795 +2079-06-01,Kesrouan,1005.1668438137376,156.47303488485448 +2079-07-01,Kesrouan,965.174208984265,115.89367803439781 +2079-08-01,Kesrouan,1000.5965023462672,121.31338582395854 +2079-09-01,Kesrouan,879.2192537117159,127.57341726726216 +2079-10-01,Kesrouan,730.8213376457139,111.18043202928591 +2079-11-01,Kesrouan,681.7073779798058,107.9985083456456 +2079-12-01,Kesrouan,746.5067473094934,120.36199609544596 +2080-01-01,Kesrouan,753.1084220444806,120.16219514392148 +2080-02-01,Kesrouan,813.4831635936287,144.60535719423734 +2080-03-01,Kesrouan,787.0158562070873,153.9796187758164 +2080-04-01,Kesrouan,818.5100042203966,102.36997665129732 +2080-05-01,Kesrouan,682.7626407241431,111.6525323837057 +2080-06-01,Kesrouan,630.2496805330481,141.27549008788733 +2080-07-01,Kesrouan,1008.5354345259997,108.89060700119171 +2080-08-01,Kesrouan,804.7318248144434,102.04716460421994 +2080-09-01,Kesrouan,792.6191458107999,123.78937956389113 +2080-10-01,Kesrouan,698.6302276931287,130.4312940552078 +2080-11-01,Kesrouan,848.5349781467826,118.51796975753419 +2080-12-01,Kesrouan,518.6495739157488,110.42803020840621 +2081-01-01,Kesrouan,709.4455621314906,111.31837745737383 +2081-02-01,Kesrouan,667.1051419187538,104.493570882233 +2081-03-01,Kesrouan,675.6325954895898,104.2194619981955 +2081-04-01,Kesrouan,910.2488777539837,150.67214399860094 +2081-05-01,Kesrouan,854.0651997277732,164.33497369695493 +2081-06-01,Kesrouan,931.5791089419054,151.83178911248814 +2081-07-01,Kesrouan,885.8159305376344,138.09580991633885 +2081-08-01,Kesrouan,718.6651557152475,147.90330774300844 +2081-09-01,Kesrouan,620.7569969741958,88.69917851149455 +2081-10-01,Kesrouan,732.1612700277072,81.5410208842455 +2081-11-01,Kesrouan,519.1347582573767,100.98225132992701 +2081-12-01,Kesrouan,628.9338225862869,135.53102322508778 +2082-01-01,Kesrouan,821.4820706821847,139.0893006469671 +2082-02-01,Kesrouan,860.7493751589357,139.24289869824617 +2082-03-01,Kesrouan,894.296889475515,169.6634677428583 +2082-04-01,Kesrouan,713.7148323723897,145.5856313767933 +2082-05-01,Kesrouan,898.9324149401341,161.73399126974815 +2082-06-01,Kesrouan,558.9190647503899,82.20551309848594 +2082-07-01,Kesrouan,596.3652649093915,83.25619810467603 +2082-08-01,Kesrouan,717.3616165584441,113.08039334169435 +2082-09-01,Kesrouan,696.8320363247012,131.90833194241378 +2082-10-01,Kesrouan,878.3910086680314,175.35685344206286 +2082-11-01,Kesrouan,839.6187787614176,154.5054870065406 +2082-12-01,Kesrouan,795.2744433879561,138.64334301587354 +2083-01-01,Kesrouan,740.9214079425767,115.21512871918961 +2083-02-01,Kesrouan,569.9680338394392,95.24780080108513 +2083-03-01,Kesrouan,553.9486793781718,91.19096241963751 +2083-04-01,Kesrouan,987.3499315218121,162.79166967602833 +2083-05-01,Kesrouan,786.5630174882346,162.06315789671507 +2083-06-01,Kesrouan,811.3498307452603,165.0164022878995 +2083-07-01,Kesrouan,923.9338567147695,134.1049870310212 +2083-08-01,Kesrouan,944.4169071190142,133.39176414473707 +2083-09-01,Kesrouan,825.8945204589374,128.72412195489784 +2083-10-01,Kesrouan,835.4548869694729,144.29718299376458 +2083-11-01,Kesrouan,697.2338400565854,92.23134683216347 +2083-12-01,Kesrouan,671.3149300024276,85.87706037199901 +2084-01-01,Kesrouan,689.0793642491324,114.40921882926409 +2084-02-01,Kesrouan,678.4392030039719,135.61541473579013 +2084-03-01,Kesrouan,770.2846868655092,138.2896016787999 +2084-04-01,Kesrouan,832.252001580416,139.7739019430225 +2084-05-01,Kesrouan,917.095450033334,168.07723744970048 +2084-06-01,Kesrouan,825.8224379394122,124.01560749844829 +2084-07-01,Kesrouan,842.3261672218244,141.0808791684227 +2084-08-01,Kesrouan,649.4526326779524,137.97885997130106 +2084-09-01,Kesrouan,569.310034472973,88.7691125123953 +2084-10-01,Kesrouan,874.618220858979,95.54756947260348 +2084-11-01,Kesrouan,645.3234798736889,113.87547691032658 +2084-12-01,Kesrouan,746.6377488415602,151.77968094608275 +2085-01-01,Kesrouan,783.5924292812412,120.88484750541451 +2085-02-01,Kesrouan,765.3410508657714,118.83285615494654 +2085-03-01,Kesrouan,872.8177769118162,141.08529283526278 +2085-04-01,Kesrouan,891.0103067078298,149.2167832064294 +2085-05-01,Kesrouan,895.3418044362876,127.95600637970738 +2085-06-01,Kesrouan,905.3053825404169,127.79773791088567 +2085-07-01,Kesrouan,967.0938988182203,146.13700962375515 +2085-08-01,Kesrouan,839.7492875418859,91.5411764911063 +2085-09-01,Kesrouan,845.3721464233603,103.56635545499333 +2085-10-01,Kesrouan,900.6690123587721,138.81343424323916 +2085-11-01,Kesrouan,800.5961606497735,141.1695437443899 +2085-12-01,Kesrouan,771.56851595838,118.7779115045885 +2086-01-01,Kesrouan,828.9255059332672,125.22148302158479 +2086-02-01,Kesrouan,723.4510408104387,118.5710560218543 +2086-03-01,Kesrouan,718.8212171857429,120.0228223041893 +2086-04-01,Kesrouan,751.5670950449468,138.84212307769957 +2086-05-01,Kesrouan,853.882107312456,169.1101822049628 +2086-06-01,Kesrouan,846.5684769109871,121.35769671605024 +2086-07-01,Kesrouan,847.5277938798237,122.01763466187538 +2086-08-01,Kesrouan,919.0081005587421,141.39230554446183 +2086-09-01,Kesrouan,676.4351470570764,91.82074132757421 +2086-10-01,Kesrouan,557.1594135962591,86.86857045435 +2086-11-01,Kesrouan,694.4809072698771,110.38534234754171 +2086-12-01,Kesrouan,683.3987830375696,127.94766198187261 +2087-01-01,Kesrouan,711.1192281317151,111.51916261992497 +2087-02-01,Kesrouan,662.9208361320217,104.03351641494389 +2087-03-01,Kesrouan,846.5610856370123,132.12620325291223 +2087-04-01,Kesrouan,861.8566583934382,151.613300377681 +2087-05-01,Kesrouan,747.4650787751335,123.75729795228912 +2087-06-01,Kesrouan,676.2981621127444,88.01797304913676 +2087-07-01,Kesrouan,839.3273513875562,97.67148158536143 +2087-08-01,Kesrouan,667.9468672383065,107.97919702494232 +2087-09-01,Kesrouan,801.371822058609,142.60371037737235 +2087-10-01,Kesrouan,876.0681072404823,174.22370255544 +2087-11-01,Kesrouan,647.0341374403298,164.16331751292583 +2087-12-01,Kesrouan,998.6516117877122,135.12434233838124 +2088-01-01,Kesrouan,627.1707573675106,162.19812318271914 +2088-02-01,Kesrouan,824.3981042479359,176.32652137535632 +2088-03-01,Kesrouan,549.3106549590186,113.18769068293648 +2088-04-01,Kesrouan,724.6840460955972,91.59978289553247 +2088-05-01,Kesrouan,659.671772878894,91.34542547625986 +2088-06-01,Kesrouan,553.6572872008533,111.42134060223145 +2088-07-01,Kesrouan,550.0391530005867,131.45799732315197 +2088-08-01,Kesrouan,666.0165128519019,134.50131841916792 +2088-09-01,Kesrouan,675.5324261289607,134.92600242061684 +2088-10-01,Kesrouan,869.4621385272814,155.7348705017456 +2088-11-01,Kesrouan,799.7113195653683,160.2651571788017 +2088-12-01,Kesrouan,758.544387284022,114.37109746303881 +2089-01-01,Kesrouan,865.3273894727226,132.7733556250587 +2089-02-01,Kesrouan,774.5445948260403,120.69446991598694 +2089-03-01,Kesrouan,837.8052417003568,129.430709058142 +2089-04-01,Kesrouan,932.85385732675,148.6903281169564 +2089-05-01,Kesrouan,927.0989410169269,138.18164412146538 +2089-06-01,Kesrouan,896.1571675453304,123.46200102217452 +2089-07-01,Kesrouan,635.4288166002384,89.26853847730689 +2089-08-01,Kesrouan,680.1475024022496,84.04716143584261 +2089-09-01,Kesrouan,669.985732565969,92.44091348005499 +2089-10-01,Kesrouan,588.9750116343844,120.38928502726597 +2089-11-01,Kesrouan,781.5523672711256,132.97986266041082 +2089-12-01,Kesrouan,802.5250015848404,129.92051298481778 +2090-01-01,Kesrouan,918.4736762538251,169.3389287416503 +2090-02-01,Kesrouan,843.8301154929717,134.60717306598585 +2090-03-01,Kesrouan,874.3384083442207,148.31237274338207 +2090-04-01,Kesrouan,600.4513723418877,129.4455364112176 +2090-05-01,Kesrouan,494.8072598830672,85.34266435008105 +2090-06-01,Kesrouan,819.0101470926877,96.43250050436848 +2090-07-01,Kesrouan,665.0897526850969,116.16691579998003 +2090-08-01,Kesrouan,877.2078416873883,170.2554126008322 +2090-09-01,Kesrouan,797.7634724972233,171.82750937912266 +2090-10-01,Kesrouan,775.3847363011697,149.8967996685097 +2090-11-01,Kesrouan,549.8906939833225,133.36831424723223 +2090-12-01,Kesrouan,519.7918777102744,84.21828272257461 +2091-01-01,Kesrouan,772.5207936186692,119.37325830937192 +2091-02-01,Kesrouan,840.8187696894892,130.8344599025334 +2091-03-01,Kesrouan,922.1119428765373,151.4771063561716 +2091-04-01,Kesrouan,971.486004993271,143.62658683722526 +2091-05-01,Kesrouan,838.8940115533796,110.86948858909217 +2091-06-01,Kesrouan,832.7212418881842,123.46232196055277 +2091-07-01,Kesrouan,842.8788233358791,106.8985149783309 +2091-08-01,Kesrouan,936.4733289956406,111.56603490593078 +2091-09-01,Kesrouan,1015.4156547002065,152.14517779746862 +2091-10-01,Kesrouan,885.8699220341928,149.18369904446484 +2091-11-01,Kesrouan,899.9207338601858,141.1277728503204 +2091-12-01,Kesrouan,847.6844184950029,128.78193059821234 +2092-01-01,Kesrouan,665.4049377253057,116.63173849460328 +2092-02-01,Kesrouan,665.4571693947273,146.5086501526677 +2092-03-01,Kesrouan,703.79574269828,136.13699767502555 +2092-04-01,Kesrouan,846.5277897075832,114.43917613445763 +2092-05-01,Kesrouan,757.175241771557,113.79725964271077 +2092-06-01,Kesrouan,718.714712447421,135.99676899961804 +2092-07-01,Kesrouan,772.0090358872749,157.48369123388568 +2092-08-01,Kesrouan,783.3996930132139,137.10724635395587 +2092-09-01,Kesrouan,884.3894850535937,138.6038584256797 +2092-10-01,Kesrouan,747.4553645293381,128.43264571976255 +2092-11-01,Kesrouan,670.9619790718621,137.15389551137488 +2092-12-01,Kesrouan,571.928868431854,149.30835151058085 +2093-01-01,Kesrouan,727.7143980321578,113.5493668393431 +2093-02-01,Kesrouan,696.3501252615478,108.36202760531022 +2093-03-01,Kesrouan,971.8048856704671,157.79875491154507 +2093-04-01,Kesrouan,888.0411967556314,155.3755478934462 +2093-05-01,Kesrouan,859.8686872665733,108.91471100167699 +2093-06-01,Kesrouan,777.5486901417191,102.53014018482875 +2093-07-01,Kesrouan,649.9288067046398,102.99495676634004 +2093-08-01,Kesrouan,945.9570374360951,93.47318579300094 +2093-09-01,Kesrouan,808.4681490052204,120.34311269258036 +2093-10-01,Kesrouan,742.5745191618429,127.2183341021118 +2093-11-01,Kesrouan,767.340707244825,134.13662849856163 +2093-12-01,Kesrouan,923.4689807783006,160.4747268832492 +2094-01-01,Kesrouan,890.2422477522255,168.65584961047466 +2094-02-01,Kesrouan,922.742312956955,128.6377559090302 +2094-03-01,Kesrouan,773.1705921906777,162.28371897647895 +2094-04-01,Kesrouan,570.14718424197,143.32239838575487 +2094-05-01,Kesrouan,526.2640995610753,81.46511131639716 +2094-06-01,Kesrouan,653.6501723647536,86.66965284750474 +2094-07-01,Kesrouan,649.7474037233737,114.75753783602315 +2094-08-01,Kesrouan,692.1791941610556,144.92609995291394 +2094-09-01,Kesrouan,884.947279862888,179.90423849329028 +2094-10-01,Kesrouan,789.1881164317225,141.56326483372672 +2094-11-01,Kesrouan,865.314507538081,153.40963221602743 +2094-12-01,Kesrouan,508.840051079179,129.4709639004437 +2095-01-01,Kesrouan,790.8332028392447,121.88783495548327 +2095-02-01,Kesrouan,820.2746884801386,127.56169843162172 +2095-03-01,Kesrouan,868.0369601187793,141.02215661486917 +2095-04-01,Kesrouan,769.0962404034555,113.73625078528161 +2095-05-01,Kesrouan,811.917058228008,108.47074013197266 +2095-06-01,Kesrouan,900.4534687310513,136.60548212371697 +2095-07-01,Kesrouan,751.9719256795065,129.11270497362656 +2095-08-01,Kesrouan,884.7415208740482,115.71601266130529 +2095-09-01,Kesrouan,714.8780077167584,116.36496840148199 +2095-10-01,Kesrouan,662.7202862315069,106.2346249056192 +2095-11-01,Kesrouan,661.2938055509236,95.00835631845565 +2095-12-01,Kesrouan,812.687721727775,121.4621300643359 +2096-01-01,Kesrouan,818.8111458400533,133.5910699341922 +2096-02-01,Kesrouan,757.0418468745843,129.5366217795236 +2096-03-01,Kesrouan,763.7510118510897,140.23976997979207 +2096-04-01,Kesrouan,854.4030865380474,157.34054660406997 +2096-05-01,Kesrouan,841.3924029430149,128.83038618021757 +2096-06-01,Kesrouan,822.8671250319668,115.15282999513545 +2096-07-01,Kesrouan,743.0256684466442,121.77173778956488 +2096-08-01,Kesrouan,706.942806370556,127.66755307843965 +2096-09-01,Kesrouan,593.3467390111905,104.16146384841002 +2096-10-01,Kesrouan,965.1151491855525,106.39426271152148 +2096-11-01,Kesrouan,647.8245110040293,117.69130585248121 +2096-12-01,Kesrouan,819.3849198797501,150.83804774426926 +2097-01-01,Kesrouan,871.7858142787708,133.75580607547485 +2097-02-01,Kesrouan,801.2594746941929,124.69499430999595 +2097-03-01,Kesrouan,645.9539555437347,100.2914574514492 +2097-04-01,Kesrouan,751.9547497666508,105.93092550310618 +2097-05-01,Kesrouan,856.6132182426676,137.78478089257757 +2097-06-01,Kesrouan,843.3463038165105,159.45975467716943 +2097-07-01,Kesrouan,816.953261135144,155.49436233763387 +2097-08-01,Kesrouan,894.8206140314398,153.3470400625989 +2097-09-01,Kesrouan,797.546943366306,166.6293346541285 +2097-10-01,Kesrouan,510.2652646842237,87.39815240059406 +2097-11-01,Kesrouan,681.0024264253286,81.91974956648365 +2097-12-01,Kesrouan,602.1621354981569,113.22171015103198 +2098-01-01,Kesrouan,700.5364020546732,132.84153516282498 +2098-02-01,Kesrouan,775.9458395854813,136.58884834605516 +2098-03-01,Kesrouan,858.3463664001174,148.47459639564633 +2098-04-01,Kesrouan,919.50627242464,168.46809760263685 +2098-05-01,Kesrouan,792.0594503881978,110.50585623685616 +2098-06-01,Kesrouan,814.6910385472733,121.97621221518801 +2098-07-01,Kesrouan,569.5502508771524,106.84261362595007 +2098-08-01,Kesrouan,713.3211942384203,118.05713892502527 +2098-09-01,Kesrouan,1039.7915131242366,112.2674075246672 +2098-10-01,Kesrouan,767.6998527669122,128.0105292253397 +2098-11-01,Kesrouan,739.1548230695269,150.66327387313703 +2098-12-01,Kesrouan,798.756085395489,104.74293694558467 +2099-01-01,Kesrouan,930.6025456671276,142.85071677950484 +2099-02-01,Kesrouan,1065.2950687775565,162.60586775090792 +2099-03-01,Kesrouan,974.9545538869057,135.4455680329032 +2099-04-01,Kesrouan,574.2722894438186,91.95399494222757 +2099-05-01,Kesrouan,662.2051848285525,100.13413957153834 +2099-06-01,Kesrouan,599.1965100036894,89.9691958619432 +2099-07-01,Kesrouan,649.8879083219795,113.35437690693652 +2099-08-01,Kesrouan,708.624286003268,140.65599343427888 +2099-09-01,Kesrouan,859.3291946595023,131.8149297046723 +2099-10-01,Kesrouan,887.6708587329539,126.25483429879289 +2099-11-01,Kesrouan,740.7435246155844,138.58297603520094 +2099-12-01,Kesrouan,674.5579746467471,139.07491038139716 +2100-01-01,Kesrouan,892.356152109003,152.4074914319661 +2100-02-01,Kesrouan,739.5067181038103,87.4604175025324 +2100-03-01,Kesrouan,579.771256494859,92.97427638605055 +2100-04-01,Kesrouan,807.5819000591056,132.3871903421129 +2100-05-01,Kesrouan,758.3406696946608,131.25301245267957 +2100-06-01,Kesrouan,729.8387909586709,132.57958831504553 +2100-07-01,Kesrouan,750.9536193050428,140.25993713617072 +2100-08-01,Kesrouan,877.6743366648229,163.81309732834507 +2100-09-01,Kesrouan,745.4067849558803,129.96168479391451 +2100-10-01,Kesrouan,739.7551353024472,111.79472642461056 +2100-11-01,Kesrouan,725.2749960481497,134.51256043207496 +2100-12-01,Kesrouan,633.7231921392089,150.66393408922949 +2101-01-01,Kesrouan,880.133167140422,135.03230332460836 +2101-02-01,Kesrouan,956.7931378346717,149.07219588218953 +2101-03-01,Kesrouan,909.744652082735,133.93596559824985 +2101-04-01,Kesrouan,852.7614493917134,109.72162344196508 +2101-05-01,Kesrouan,876.717201881636,145.59297322426548 +2101-06-01,Kesrouan,998.0479910797746,157.14515320627356 +2101-07-01,Kesrouan,960.5310810664147,128.4455627253485 +2101-08-01,Kesrouan,890.8255248584611,107.6532947997657 +2101-09-01,Kesrouan,909.0343154572191,137.37299555737872 +2101-10-01,Kesrouan,769.6649461409982,131.59394682018268 +2101-11-01,Kesrouan,785.3021365412282,121.81195595319478 +2101-12-01,Kesrouan,844.0659323293089,133.5903547000921 +2102-01-01,Kesrouan,791.7488057020021,138.37187193964976 +2102-02-01,Kesrouan,708.9091668201804,124.23138201154214 +2102-03-01,Kesrouan,724.6339966118254,114.24293301409786 +2102-04-01,Kesrouan,748.7677028218257,122.5473174744669 +2102-05-01,Kesrouan,760.560163679649,146.38567267923065 +2102-06-01,Kesrouan,778.3177346005201,158.39316335364157 +2102-07-01,Kesrouan,866.2926898538245,112.92759610808298 +2102-08-01,Kesrouan,738.7826548266271,105.66491037931277 +2102-09-01,Kesrouan,603.7737851900789,129.9870205864611 +2102-10-01,Kesrouan,677.367820243061,119.23478104054288 +2102-11-01,Kesrouan,1066.6380280622252,102.05041066667434 +2102-12-01,Kesrouan,691.8845287052624,106.48690997993506 +2103-01-01,Kesrouan,827.1549086543455,127.07803206936066 +2103-02-01,Kesrouan,706.4401293471878,110.95673492308303 +2103-03-01,Kesrouan,606.4581199149932,96.1619647342756 +2103-04-01,Kesrouan,822.903870222584,124.38136721364877 +2103-05-01,Kesrouan,752.4636213815409,130.4420806412733 +2103-06-01,Kesrouan,806.3361536254762,138.61183603679643 +2103-07-01,Kesrouan,847.4235417202372,153.9090856899429 +2103-08-01,Kesrouan,753.774270239977,114.3455599377973 +2103-09-01,Kesrouan,890.9085886993201,132.46461290517303 +2103-10-01,Kesrouan,792.9445026518596,132.75809729758947 +2103-11-01,Kesrouan,849.7380663706149,159.1538545543483 +2103-12-01,Kesrouan,629.6957925399978,89.16564257668091 +2104-01-01,Kesrouan,520.3571693831716,92.7616745780675 +2104-02-01,Kesrouan,870.28285151082,148.43160287918346 +2104-03-01,Kesrouan,880.9283978270191,149.34034142550337 +2104-04-01,Kesrouan,598.1305827069028,101.48467271970236 +2104-05-01,Kesrouan,537.0683822850178,118.78418661402247 +2104-06-01,Kesrouan,438.55927777327656,123.92517317656673 +2104-07-01,Kesrouan,717.3133269018091,127.29633129769681 +2104-08-01,Kesrouan,687.2191565724024,120.65303524307564 +2104-09-01,Kesrouan,840.796173509052,143.60324086262386 +2104-10-01,Kesrouan,821.4331474877805,168.127854016786 +2104-11-01,Kesrouan,730.2315139825291,107.14777100566718 +2104-12-01,Kesrouan,741.1979823754032,104.92757737943137 +2105-01-01,Kesrouan,942.1151940101928,144.6421336758299 +2105-02-01,Kesrouan,1034.0908698833136,158.15199497343744 +2105-03-01,Kesrouan,1063.5536142360206,149.91496172416316 +2105-04-01,Kesrouan,693.2065108504598,99.68985387656772 +2105-05-01,Kesrouan,535.6618932407091,90.88723245156466 +2105-06-01,Kesrouan,611.1147985017972,89.82277154755727 +2105-07-01,Kesrouan,848.0857998683744,127.0628868344628 +2105-08-01,Kesrouan,858.2921637243027,149.27851341107066 +2105-09-01,Kesrouan,997.4430329032131,137.16582830593418 +2105-10-01,Kesrouan,1060.648491598518,118.07423729919657 +2105-11-01,Kesrouan,825.6530721757624,94.88271964131299 +2105-12-01,Kesrouan,637.6825216247669,97.25932640688856 +2106-01-01,Kesrouan,620.3069739787619,128.059149861368 +2106-02-01,Kesrouan,567.5058596922802,149.91463772922893 +2106-03-01,Kesrouan,708.964354999192,118.30837560063881 +2106-04-01,Kesrouan,822.1907882667348,120.32774432909571 +2106-05-01,Kesrouan,809.9515424954093,132.9909151668469 +2106-06-01,Kesrouan,723.777383154695,146.38146074508546 +2106-07-01,Kesrouan,664.5280862561017,112.26573558854427 +2106-08-01,Kesrouan,625.826179041876,106.79988908641376 +2106-09-01,Kesrouan,763.7859972145703,111.79637085172965 +2106-10-01,Kesrouan,833.9146862593066,110.30173331517113 +2106-11-01,Kesrouan,753.250827256394,133.10925278830115 +2106-12-01,Kesrouan,811.9954057321405,159.32751583910255 +2107-01-01,Kesrouan,933.3938426854194,143.2852551174443 +2107-02-01,Kesrouan,909.3034282229854,140.3457040970656 +2107-03-01,Kesrouan,976.8861401523062,141.8378902757254 +2107-04-01,Kesrouan,880.6302127169523,120.55969719300981 +2107-05-01,Kesrouan,919.5901105894392,145.98926793374034 +2107-06-01,Kesrouan,817.3159263115049,128.44385411055376 +2107-07-01,Kesrouan,753.3325536286291,99.3443316185335 +2107-08-01,Kesrouan,846.3745439605069,116.18135497044572 +2107-09-01,Kesrouan,870.9510226781372,144.82083216484483 +2107-10-01,Kesrouan,913.5963505406037,147.9809687174353 +2107-11-01,Kesrouan,979.1798284493838,137.91640230633578 +2107-12-01,Kesrouan,911.0580462715047,136.09702403587434 +2108-01-01,Kesrouan,750.7657401599133,149.45008401153223 +2108-02-01,Kesrouan,572.6877762863467,139.19945281149776 +2108-03-01,Kesrouan,621.5466666070406,114.69671848506496 +2108-04-01,Kesrouan,765.4555100227519,122.10040925446248 +2108-05-01,Kesrouan,763.5230790403257,120.00555276288297 +2108-06-01,Kesrouan,766.5708884620838,130.23851095622126 +2108-07-01,Kesrouan,817.8125495295224,157.43325806015918 +2108-08-01,Kesrouan,819.1022916415728,116.37954817352292 +2108-09-01,Kesrouan,850.0568766547256,117.62720681695282 +2108-10-01,Kesrouan,775.5307315604424,115.25116857079016 +2108-11-01,Kesrouan,636.6995877757538,112.86906306100042 +2108-12-01,Kesrouan,957.1171572071075,98.46305317116871 +2109-01-01,Kesrouan,846.7507246092787,129.97541178683605 +2109-02-01,Kesrouan,899.1556314141715,140.50461444264383 +2109-03-01,Kesrouan,705.0492323713114,109.37076443718381 +2109-04-01,Kesrouan,767.7279396080162,102.33658989029038 +2109-05-01,Kesrouan,881.8689902351198,129.00412999198335 +2109-06-01,Kesrouan,664.2889257482045,114.65233423562967 +2109-07-01,Kesrouan,911.9309205313796,149.00232912552042 +2109-08-01,Kesrouan,720.6217315259912,147.4612563904617 +2109-09-01,Kesrouan,955.7197840673675,131.14300700283616 +2109-10-01,Kesrouan,685.5375361535193,162.2565523068983 +2109-11-01,Kesrouan,751.3928721583992,168.603234055776 +2109-12-01,Kesrouan,708.6685632540311,87.08689719169001 +2110-01-01,Kesrouan,638.4042619301296,92.61035366099611 +2110-02-01,Kesrouan,746.1158545058576,115.2124206105883 +2110-03-01,Kesrouan,498.497335816688,112.01866194218016 +2110-04-01,Kesrouan,597.041918443508,128.69358390406745 +2110-05-01,Kesrouan,743.0857137485534,129.59213494929458 +2110-06-01,Kesrouan,759.7702828675477,127.47489529824844 +2110-07-01,Kesrouan,913.1833543081291,167.00576786282312 +2110-08-01,Kesrouan,805.8253110041929,139.9470130476997 +2110-09-01,Kesrouan,845.266767974406,147.29146470558248 +2110-10-01,Kesrouan,539.5672312297086,113.34666827274634 +2110-11-01,Kesrouan,457.20105624078366,89.3501546351763 +2110-12-01,Kesrouan,849.5696861101616,101.66699934066959 +2111-01-01,Kesrouan,831.9653609363668,127.78361662224225 +2111-02-01,Kesrouan,741.6487796947773,115.80324065596025 +2111-03-01,Kesrouan,759.0667039782373,116.84156494975338 +2111-04-01,Kesrouan,816.2239887696356,128.06498788329634 +2111-05-01,Kesrouan,891.6188549317507,148.33584709333476 +2111-06-01,Kesrouan,861.5332725587717,149.595062574938 +2111-07-01,Kesrouan,793.6877832413771,136.56166333713858 +2111-08-01,Kesrouan,856.1315887518559,159.44245457030323 +2111-09-01,Kesrouan,739.9588528918083,91.56195190212563 +2111-10-01,Kesrouan,750.878017131244,83.93935059319527 +2111-11-01,Kesrouan,558.6481921574868,108.46140540999929 +2111-12-01,Kesrouan,628.2059932790307,134.51685183667567 +2112-01-01,Kesrouan,769.1470642111676,137.68181774771995 +2112-02-01,Kesrouan,826.4047999355369,135.93736789063615 +2112-03-01,Kesrouan,942.4209111804054,171.45528199146125 +2112-04-01,Kesrouan,835.4545350040455,133.30338688503232 +2112-05-01,Kesrouan,871.1641729409517,146.67727423316126 +2112-06-01,Kesrouan,595.7051537503611,129.7840713822737 +2112-07-01,Kesrouan,531.0564608201299,87.04827760683945 +2112-08-01,Kesrouan,845.2726106005005,97.2604634457144 +2112-09-01,Kesrouan,682.1222044325027,116.5838667147909 +2112-10-01,Kesrouan,836.9624956810646,160.28399778988353 +2112-11-01,Kesrouan,795.2098929285766,171.4031249201601 +2112-12-01,Kesrouan,772.8127841372144,102.93179915005453 +2113-01-01,Kesrouan,676.9699233274206,107.56859763346502 +2113-02-01,Kesrouan,700.1210124572924,108.02259400679498 +2113-03-01,Kesrouan,843.1418822962947,133.12331905893683 +2113-04-01,Kesrouan,900.9380547314528,159.23856394687294 +2113-05-01,Kesrouan,872.6681916051845,145.90930842921398 +2113-06-01,Kesrouan,905.7050744797369,123.9541095920618 +2113-07-01,Kesrouan,625.7763407373607,98.8806245668442 +2113-08-01,Kesrouan,510.20743676450695,83.63721309078977 +2113-09-01,Kesrouan,892.7856907165639,91.05404399436003 +2113-10-01,Kesrouan,912.5613610048827,141.86587610230964 +2113-11-01,Kesrouan,851.3766766142734,142.99912479872398 +2113-12-01,Kesrouan,934.5472333909071,149.3144646225477 +2114-01-01,Kesrouan,862.2481847348433,132.51503996578757 +2114-02-01,Kesrouan,606.0994671445043,130.84169782710217 +2114-03-01,Kesrouan,796.1133177875471,155.13329137931197 +2114-04-01,Kesrouan,680.8127170599768,85.15804836868223 +2114-05-01,Kesrouan,656.555611771141,91.01204385859181 +2114-06-01,Kesrouan,745.4110789340941,119.48212977694551 +2114-07-01,Kesrouan,721.9515273036762,130.45453916346173 +2114-08-01,Kesrouan,788.7499194746482,147.38516648581032 +2114-09-01,Kesrouan,863.6748413981404,150.99514860870528 +2114-10-01,Kesrouan,787.5217009193018,115.58522263077458 +2114-11-01,Kesrouan,790.0730279092134,124.1098533456412 +2114-12-01,Kesrouan,641.8639764915374,152.26226223096967 +2017-01-01,Tripoli,566.4444446251316,34.660191068888615 +2017-02-01,Tripoli,498.3968763155555,30.5238651324798 +2017-03-01,Tripoli,455.97997115810006,26.089468759518923 +2017-04-01,Tripoli,442.9927608865812,25.26707071828371 +2017-05-01,Tripoli,450.4112441426047,24.941077446713575 +2017-06-01,Tripoli,442.40185879660976,24.885415936074878 +2017-07-01,Tripoli,427.28105878088843,24.953072717998506 +2017-08-01,Tripoli,426.33654832115025,25.140683992089272 +2017-09-01,Tripoli,427.46103929729134,25.203422739475847 +2017-10-01,Tripoli,427.8573410435919,25.217600344103644 +2017-11-01,Tripoli,428.27593802647607,25.254947336113588 +2017-12-01,Tripoli,427.9373323842154,25.25169919137864 +2018-01-01,Tripoli,428.288051597641,25.261127796665125 +2018-02-01,Tripoli,428.5234830303247,25.27113823888852 +2018-03-01,Tripoli,428.8556837958776,25.276368543708223 +2018-04-01,Tripoli,428.9045209807752,25.286100522688113 +2018-05-01,Tripoli,429.02821516219626,25.307741476037215 +2018-06-01,Tripoli,429.2716178816523,25.338391115660226 +2018-07-01,Tripoli,429.57952188665024,25.37655481456326 +2018-08-01,Tripoli,429.80722569634935,25.400306928541234 +2018-09-01,Tripoli,429.9401791017069,25.42674225383682 +2018-10-01,Tripoli,430.2418522755596,25.46805534533413 +2018-11-01,Tripoli,430.52333616413756,25.49976901703137 +2018-12-01,Tripoli,430.73776029740156,25.527993446425 +2019-01-01,Tripoli,582.4298333781927,35.6270252365874 +2019-02-01,Tripoli,656.9588236341382,39.794595994440016 +2019-03-01,Tripoli,711.2209391033623,44.079228963294796 +2019-04-01,Tripoli,694.8982152406483,41.62251947001953 +2019-05-01,Tripoli,677.6355757210517,40.225991607142085 +2019-06-01,Tripoli,652.0781335371651,40.33884840040608 +2019-07-01,Tripoli,662.279170227084,40.93635756893673 +2019-08-01,Tripoli,637.1962284608253,40.154310008242035 +2019-09-01,Tripoli,593.06102367636,38.87994121234773 +2019-10-01,Tripoli,563.8760194470435,38.27264223700706 +2019-11-01,Tripoli,538.023047897668,37.37328158149337 +2019-12-01,Tripoli,490.7201964672454,34.336913926016315 +2020-01-01,Tripoli,444.6676187411376,30.883085385578482 +2020-02-01,Tripoli,431.6103029169574,29.545808807101857 +2020-03-01,Tripoli,439.4356698894944,29.634971314217992 +2020-04-01,Tripoli,456.28742264463494,29.392146917586693 +2020-05-01,Tripoli,462.73495791994384,29.06472574344204 +2020-06-01,Tripoli,464.5333185058023,29.731668342769424 +2020-07-01,Tripoli,473.4043860282396,31.033322088232637 +2020-08-01,Tripoli,497.47246811831087,32.83689737835447 +2020-09-01,Tripoli,527.5711593382089,35.46673182944575 +2020-10-01,Tripoli,542.1015794006469,38.185731456629945 +2020-11-01,Tripoli,544.2636952125783,39.489781053578014 +2020-12-01,Tripoli,548.7473525718875,39.79855319733814 +2021-01-01,Tripoli,573.9277424487099,35.08066967692278 +2021-02-01,Tripoli,547.9643912034608,33.60177630111572 +2021-03-01,Tripoli,536.4712924696195,31.446091801682222 +2021-04-01,Tripoli,537.9417338107678,34.28728875118332 +2021-05-01,Tripoli,605.1911291697359,39.81116500225804 +2021-06-01,Tripoli,620.2649890971932,40.88652955186885 +2021-07-01,Tripoli,580.0375945232404,39.0058190536371 +2021-08-01,Tripoli,590.7135319355816,39.71884687493515 +2021-09-01,Tripoli,626.6335773052549,40.66722150960041 +2021-10-01,Tripoli,622.7176913806325,40.078217480392155 +2021-11-01,Tripoli,601.1967661008856,39.50708136103234 +2021-12-01,Tripoli,602.9934906584544,39.99185650923065 +2022-01-01,Tripoli,606.6262044525407,40.183254171705954 +2022-02-01,Tripoli,589.256283248087,39.51645480746548 +2022-03-01,Tripoli,578.6300358439007,39.499656267644816 +2022-04-01,Tripoli,582.9563734190724,40.02333797994848 +2022-05-01,Tripoli,580.4306416175182,39.86670107098833 +2022-06-01,Tripoli,571.5499319709065,39.54722988899691 +2022-07-01,Tripoli,574.5395822198758,39.86183107803322 +2022-08-01,Tripoli,581.5951108594147,40.13109880689043 +2022-09-01,Tripoli,578.9080910348931,39.8479274883543 +2022-10-01,Tripoli,577.4262323048307,39.78974913261696 +2022-11-01,Tripoli,584.3034338608126,40.10919896279417 +2022-12-01,Tripoli,587.7637381204739,40.098419855259635 +2023-01-01,Tripoli,573.2272786770097,35.04829943693894 +2023-02-01,Tripoli,570.4920134225036,34.94046565796515 +2023-03-01,Tripoli,604.3296906570813,36.86300613952959 +2023-04-01,Tripoli,635.2445511387718,42.398962179487114 +2023-05-01,Tripoli,642.4248530422208,40.438395896153004 +2023-06-01,Tripoli,615.8990387519477,39.498522842174445 +2023-07-01,Tripoli,611.5681759921455,39.734535120417505 +2023-08-01,Tripoli,643.3394624742846,40.50059195159537 +2023-09-01,Tripoli,616.5885202486406,39.662132897788254 +2023-10-01,Tripoli,578.1596603061089,38.55181898697022 +2023-11-01,Tripoli,552.4621114442373,38.08163691411766 +2023-12-01,Tripoli,525.6328835244843,36.97217618620864 +2024-01-01,Tripoli,464.81147812413235,32.5366712982273 +2024-02-01,Tripoli,410.38186120535187,26.75051292017397 +2024-03-01,Tripoli,412.9945113609257,25.1211346268727 +2024-04-01,Tripoli,436.2545869260956,25.133401244129733 +2024-05-01,Tripoli,456.4359705324116,24.737728995899595 +2024-06-01,Tripoli,424.40051769518476,24.82327148085016 +2024-07-01,Tripoli,427.49551772326504,25.238623874158836 +2024-08-01,Tripoli,428.0542910023594,25.216221372769994 +2024-09-01,Tripoli,427.1365139410541,25.21067079073731 +2024-10-01,Tripoli,429.25489210307546,25.288232145472264 +2024-11-01,Tripoli,427.717565052176,25.26382435286661 +2024-12-01,Tripoli,429.00987075988616,25.29422043969602 +2025-01-01,Tripoli,589.295652354373,36.0295104928647 +2025-02-01,Tripoli,677.9925779792914,40.786499860984605 +2025-03-01,Tripoli,713.5136761101109,43.67816894061524 +2025-04-01,Tripoli,681.4852547136177,41.21796664640067 +2025-05-01,Tripoli,674.4881531694818,40.55977206328219 +2025-06-01,Tripoli,657.6656574734336,40.58786927144956 +2025-07-01,Tripoli,659.5160576825436,40.795083290292396 +2025-08-01,Tripoli,639.389394001145,40.30210904544187 +2025-09-01,Tripoli,617.3107571202363,39.76584399730389 +2025-10-01,Tripoli,598.9500293363624,39.38990794266456 +2025-11-01,Tripoli,576.4851331381217,38.88220450465277 +2025-12-01,Tripoli,546.3552007397166,37.93603889309813 +2026-01-01,Tripoli,520.6668588881124,37.04938879464502 +2026-02-01,Tripoli,504.26304719772975,36.41636711080764 +2026-03-01,Tripoli,486.3705541912263,35.308452610110166 +2026-04-01,Tripoli,466.46085570830735,33.831546732341415 +2026-05-01,Tripoli,454.8751995442145,32.93869037322794 +2026-06-01,Tripoli,450.31069802102456,32.337083435689024 +2026-07-01,Tripoli,446.2131085289284,31.25615495916167 +2026-08-01,Tripoli,443.5850553410544,30.098544110917196 +2026-09-01,Tripoli,443.77004836966347,29.08485872491337 +2026-10-01,Tripoli,445.0365431204232,27.887521047034745 +2026-11-01,Tripoli,445.91333245170915,26.770837178314164 +2026-12-01,Tripoli,443.9474182026256,25.97329175914707 +2027-01-01,Tripoli,572.1204881345967,34.97801193357427 +2027-02-01,Tripoli,527.4330019705262,32.36836384348982 +2027-03-01,Tripoli,485.3375589674041,28.069065736916368 +2027-04-01,Tripoli,451.506321418647,26.623472294669707 +2027-05-01,Tripoli,454.96662567830833,26.05300964711607 +2027-06-01,Tripoli,452.9185445190674,25.722541391153506 +2027-07-01,Tripoli,441.649929752015,25.485186617592724 +2027-08-01,Tripoli,435.27039407805853,25.81504278821493 +2027-09-01,Tripoli,435.6514842421779,26.55353798589824 +2027-10-01,Tripoli,436.9852127938141,27.774053947748254 +2027-11-01,Tripoli,445.9429376019269,28.973263468004944 +2027-12-01,Tripoli,469.0723919722797,31.07032567189755 +2028-01-01,Tripoli,516.3300959837342,35.200639293291644 +2028-02-01,Tripoli,561.3397926980576,38.97686599358394 +2028-03-01,Tripoli,554.4386772817589,39.43501720879458 +2028-04-01,Tripoli,555.7807774249617,39.89606337414696 +2028-05-01,Tripoli,588.2696711667282,40.46166759431151 +2028-06-01,Tripoli,601.3290581331047,40.21402035664813 +2028-07-01,Tripoli,595.8126492137612,39.835829906293 +2028-08-01,Tripoli,597.3932613961077,40.031239930519774 +2028-09-01,Tripoli,600.7544293032471,40.21455415200309 +2028-10-01,Tripoli,594.1092130778072,39.92218376018312 +2028-11-01,Tripoli,587.1580073485593,39.80176664537501 +2028-12-01,Tripoli,588.5321840889703,40.0478979042303 +2029-01-01,Tripoli,569.0037150066208,34.798183395758855 +2029-02-01,Tripoli,524.5582217929484,32.20552957045855 +2029-03-01,Tripoli,494.93314335830866,28.62146830829378 +2029-04-01,Tripoli,463.3947298390814,27.837346952645063 +2029-05-01,Tripoli,465.1702208379992,27.377167315085572 +2029-06-01,Tripoli,461.1942891942403,27.1871690860992 +2029-07-01,Tripoli,454.61830829364817,27.120619039878193 +2029-08-01,Tripoli,454.3674738286643,28.834001597848815 +2029-09-01,Tripoli,481.4879147839507,32.35073347257434 +2029-10-01,Tripoli,550.664081544948,36.898382537020794 +2029-11-01,Tripoli,578.3336710597107,39.233861767230565 +2029-12-01,Tripoli,561.588468998064,40.06890986871946 +2030-01-01,Tripoli,587.7314700731467,40.53984548268144 +2030-02-01,Tripoli,609.4233777137042,40.348317930003105 +2030-03-01,Tripoli,616.6379665930077,40.22751648253943 +2030-04-01,Tripoli,624.8308829848849,40.43793861146558 +2030-05-01,Tripoli,627.8422019064121,40.467345397570455 +2030-06-01,Tripoli,621.3043891977231,40.1761564728028 +2030-07-01,Tripoli,613.4721474254591,40.04475384958957 +2030-08-01,Tripoli,607.65286441788,40.03057802427962 +2030-09-01,Tripoli,597.1609801881092,39.80170792788596 +2030-10-01,Tripoli,583.7418062344897,39.548003892261605 +2030-11-01,Tripoli,575.6882655292342,39.556555293848106 +2030-12-01,Tripoli,570.859771696519,39.60845799552894 +2031-01-01,Tripoli,577.0061559346634,35.253326674144276 +2031-02-01,Tripoli,604.2794785122383,36.87727182039096 +2031-03-01,Tripoli,632.3474931291667,39.030914552591724 +2031-04-01,Tripoli,629.1580385742013,41.29187950988445 +2031-05-01,Tripoli,636.1894619033043,40.597379725357136 +2031-06-01,Tripoli,637.0808710618583,40.254012304641904 +2031-07-01,Tripoli,633.7653204967064,40.06536190892682 +2031-08-01,Tripoli,644.615494921881,40.40268854554172 +2031-09-01,Tripoli,639.5768584767446,40.380528921039385 +2031-10-01,Tripoli,626.0683817448964,39.97067906818144 +2031-11-01,Tripoli,612.1338588800796,39.77269081239021 +2031-12-01,Tripoli,604.84731956515,39.88588745536352 +2032-01-01,Tripoli,594.4254364607028,39.75982100638207 +2032-02-01,Tripoli,582.0852927822434,39.57311896371259 +2032-03-01,Tripoli,577.5377258923055,39.71640387152728 +2032-04-01,Tripoli,578.6216816568905,39.92051120140423 +2032-05-01,Tripoli,577.1154043343791,39.83513597233156 +2032-06-01,Tripoli,574.2041964205252,39.69436879927443 +2032-07-01,Tripoli,573.5804171237571,39.693059221336924 +2032-08-01,Tripoli,573.2658471737072,39.71102855230281 +2032-09-01,Tripoli,570.9910368599183,39.65928420991061 +2032-10-01,Tripoli,569.3129939715642,39.66665948239834 +2032-11-01,Tripoli,567.835503785126,39.64786098931441 +2032-12-01,Tripoli,563.9271366288128,39.512518956381555 +2033-01-01,Tripoli,579.6824893616343,35.429315444039666 +2033-02-01,Tripoli,605.1091537096975,36.854236771506486 +2033-03-01,Tripoli,613.8227099978783,37.41388739414536 +2033-04-01,Tripoli,600.0033356773533,39.78014793349904 +2033-05-01,Tripoli,623.8766259736346,40.82565019163539 +2033-06-01,Tripoli,629.7424487646836,40.440495491215856 +2033-07-01,Tripoli,618.0317234592242,39.74997248208301 +2033-08-01,Tripoli,632.8434011510086,40.32820274171028 +2033-09-01,Tripoli,648.3425762200709,40.82015032016143 +2033-10-01,Tripoli,636.3280021712249,40.134440365812495 +2033-11-01,Tripoli,616.2791542609159,39.69801818018452 +2033-12-01,Tripoli,610.8865265457748,39.949651089831626 +2034-01-01,Tripoli,600.3516530620136,39.72753528399609 +2034-02-01,Tripoli,574.2118892343973,38.98576970010471 +2034-03-01,Tripoli,557.2216484250049,38.821864277727826 +2034-04-01,Tripoli,548.2173316197535,38.8605537650555 +2034-05-01,Tripoli,531.796219800437,38.260099825483294 +2034-06-01,Tripoli,512.3117842454543,37.37045958338347 +2034-07-01,Tripoli,491.7020745092983,36.11015985372812 +2034-08-01,Tripoli,452.33441280148554,32.71004802951907 +2034-09-01,Tripoli,410.6526761009354,27.556147118286596 +2034-10-01,Tripoli,412.51115202415536,25.362966164143767 +2034-11-01,Tripoli,435.49933361125306,25.209706400462675 +2034-12-01,Tripoli,455.5539598342442,24.822219014341957 +2035-01-01,Tripoli,578.4462785387869,35.36596994926629 +2035-02-01,Tripoli,626.9026517452113,38.1501966998501 +2035-03-01,Tripoli,688.27964539086,43.54132160478139 +2035-04-01,Tripoli,708.743992273037,43.30829502189042 +2035-05-01,Tripoli,702.578010504531,40.718156262370925 +2035-06-01,Tripoli,681.4626984086899,40.587184234077355 +2035-07-01,Tripoli,685.1182817897168,41.491910422567344 +2035-08-01,Tripoli,695.9276947441036,41.843524981516744 +2035-09-01,Tripoli,678.4929241629825,40.96608819089028 +2035-10-01,Tripoli,666.1968140118897,40.615831251460335 +2035-11-01,Tripoli,666.4654359333831,40.901146648005565 +2035-12-01,Tripoli,655.6476513874297,40.61718353302624 +2036-01-01,Tripoli,623.5740825719683,39.844500522175444 +2036-02-01,Tripoli,600.0284852611655,39.6544462446768 +2036-03-01,Tripoli,590.0296024923393,39.752566727508125 +2036-04-01,Tripoli,575.8812472491718,39.41232556825513 +2036-05-01,Tripoli,558.5304362475042,38.96369548285917 +2036-06-01,Tripoli,549.6376826479527,38.97926629336342 +2036-07-01,Tripoli,544.3972925865179,39.02662817589138 +2036-08-01,Tripoli,534.604392741164,38.7172652986051 +2036-09-01,Tripoli,525.1220597979177,38.4109984343776 +2036-10-01,Tripoli,521.9573719265267,38.4968131549592 +2036-11-01,Tripoli,520.221197820226,38.5697491729434 +2036-12-01,Tripoli,517.1525134812282,38.4727603362646 +2037-01-01,Tripoli,579.9145617149576,35.52646708830174 +2037-02-01,Tripoli,642.4337119613629,38.9668359788642 +2037-03-01,Tripoli,684.1342281781299,42.299576601664526 +2037-04-01,Tripoli,652.7176813619152,40.34942644502358 +2037-05-01,Tripoli,626.661859709196,39.45057912270958 +2037-06-01,Tripoli,625.4544708315341,40.10156924785391 +2037-07-01,Tripoli,642.9516367468882,40.63125081994735 +2037-08-01,Tripoli,620.2451653076,39.77408223894881 +2037-09-01,Tripoli,598.8571760286543,39.408729566880524 +2037-10-01,Tripoli,595.3175940151766,39.76365543634854 +2037-11-01,Tripoli,586.8281213889904,39.564540872358336 +2037-12-01,Tripoli,565.0418810534418,38.8832080399201 +2038-01-01,Tripoli,555.3903410141247,38.991395903146014 +2038-02-01,Tripoli,557.7616421878824,39.513840989544015 +2038-03-01,Tripoli,553.8985094733187,39.402188794464394 +2038-04-01,Tripoli,548.9412741378637,39.26544821770154 +2038-05-01,Tripoli,555.4637012188088,39.72356384655517 +2038-06-01,Tripoli,563.9679851223818,40.02422052160202 +2038-07-01,Tripoli,564.4028205562673,39.796243642769 +2038-08-01,Tripoli,567.3159603758673,39.802442786157954 +2038-09-01,Tripoli,576.1642453341453,40.070352895495716 +2038-10-01,Tripoli,580.6995420119118,40.03991944299146 +2038-11-01,Tripoli,579.9392587803068,39.855071449521546 +2038-12-01,Tripoli,583.068371738679,39.96321482980122 +2039-01-01,Tripoli,568.1761631650268,34.72401520016361 +2039-02-01,Tripoli,498.2752358717745,30.535634430397792 +2039-03-01,Tripoli,452.6455540539499,25.831233690989862 +2039-04-01,Tripoli,441.0089025399818,25.141301415383175 +2039-05-01,Tripoli,448.52857588616735,24.84612059101932 +2039-06-01,Tripoli,440.5341584585659,24.817668408940904 +2039-07-01,Tripoli,426.13956355327014,24.942437735209804 +2039-08-01,Tripoli,425.68659257174977,25.05898928198906 +2039-09-01,Tripoli,425.80988644837663,25.07760361567552 +2039-10-01,Tripoli,426.5855379031693,25.12548950731027 +2039-11-01,Tripoli,427.84266900265504,25.204005466071678 +2039-12-01,Tripoli,428.1461870594726,25.251742784665964 +2040-01-01,Tripoli,428.78336786456975,25.2983867124415 +2040-02-01,Tripoli,428.85075830645275,25.32848120489535 +2040-03-01,Tripoli,429.18353342236253,25.346026168554037 +2040-04-01,Tripoli,429.32343124567234,25.358176240491908 +2040-05-01,Tripoli,429.5638055723371,25.375118015399487 +2040-06-01,Tripoli,429.62348579579185,25.372400997042728 +2040-07-01,Tripoli,429.48506735976514,25.363243737728347 +2040-08-01,Tripoli,429.5481588762491,25.37507264279431 +2040-09-01,Tripoli,429.6761171739567,25.386321490241222 +2040-10-01,Tripoli,429.6929125707586,25.386122206642035 +2040-11-01,Tripoli,429.64891385250445,25.38773248929617 +2040-12-01,Tripoli,429.68302678279645,25.39611663500478 +2041-01-01,Tripoli,572.7039932881528,35.008165143517175 +2041-02-01,Tripoli,533.1896285755281,32.72003445095149 +2041-03-01,Tripoli,485.33517454319497,28.102750892791267 +2041-04-01,Tripoli,439.9244246387088,25.670559509828347 +2041-05-01,Tripoli,438.3793003465997,24.90616723049904 +2041-06-01,Tripoli,435.69590066978253,24.581704172279796 +2041-07-01,Tripoli,427.2339968607305,24.610560259510137 +2041-08-01,Tripoli,423.4406390122589,24.757427823815554 +2041-09-01,Tripoli,424.98475384010425,24.83307730152082 +2041-10-01,Tripoli,425.20199751148425,24.86686743714886 +2041-11-01,Tripoli,425.2266423631646,24.92963643293888 +2041-12-01,Tripoli,426.10600756877886,25.02995704229158 +2042-01-01,Tripoli,427.1986482069432,25.135251734693604 +2042-02-01,Tripoli,428.35852264598407,25.239070482939155 +2042-03-01,Tripoli,428.6583161277595,25.29047853425773 +2042-04-01,Tripoli,428.65943001936085,25.311262746062113 +2042-05-01,Tripoli,428.79166983791123,25.336166968347882 +2042-06-01,Tripoli,429.16628550709754,25.357244767597496 +2042-07-01,Tripoli,429.53557538206485,25.375975646603123 +2042-08-01,Tripoli,429.80780004670635,25.39907564058912 +2042-09-01,Tripoli,429.9790260713047,25.421620487405956 +2042-10-01,Tripoli,430.1397049348026,25.45117317757452 +2042-11-01,Tripoli,430.3318164269267,25.475740219127736 +2042-12-01,Tripoli,430.3813846031877,25.477893193726086 +2043-01-01,Tripoli,578.565099444452,35.35943718378047 +2043-02-01,Tripoli,635.9517156646366,38.6882214933416 +2043-03-01,Tripoli,699.2825273927601,44.13566892549282 +2043-04-01,Tripoli,706.1082810804036,42.68283632857394 +2043-05-01,Tripoli,694.381961292525,40.48617413905783 +2043-06-01,Tripoli,668.6197022904361,40.502180882435304 +2043-07-01,Tripoli,683.7410940610707,41.55193037227931 +2043-08-01,Tripoli,688.1033024267178,41.59029068580476 +2043-09-01,Tripoli,664.9010796065941,40.55824007061345 +2043-10-01,Tripoli,650.7468938370756,40.345606249599896 +2043-11-01,Tripoli,651.2801868457886,40.705542678133156 +2043-12-01,Tripoli,635.0305273103021,40.227614345021166 +2044-01-01,Tripoli,603.4850301366723,39.51973586958065 +2044-02-01,Tripoli,588.5800118096042,39.625715599354876 +2044-03-01,Tripoli,585.4213981283518,39.86261753652286 +2044-04-01,Tripoli,573.6951653632547,39.480548173255016 +2044-05-01,Tripoli,562.8497423819422,39.27218293576331 +2044-06-01,Tripoli,561.5292586976285,39.488419875422856 +2044-07-01,Tripoli,555.546755761336,39.260368265240146 +2044-08-01,Tripoli,539.5485572548591,38.622726582605566 +2044-09-01,Tripoli,528.0649091950731,38.34779706435006 +2044-10-01,Tripoli,517.9948940047657,38.03581236221199 +2044-11-01,Tripoli,497.70582840879825,36.723496944192334 +2044-12-01,Tripoli,472.1276922075048,34.61393147376866 +2045-01-01,Tripoli,573.5876922282786,35.02500816628408 +2045-02-01,Tripoli,539.5236687393909,33.12590041114356 +2045-03-01,Tripoli,505.21946237395764,29.350778667236035 +2045-04-01,Tripoli,459.708914743811,27.80452743490413 +2045-05-01,Tripoli,453.10954211959006,26.46426871971111 +2045-06-01,Tripoli,447.19721435418404,25.41404948995474 +2045-07-01,Tripoli,437.0231547264858,24.936590896755117 +2045-08-01,Tripoli,430.2751297871506,25.004486996929554 +2045-09-01,Tripoli,429.4169111174062,25.13122157976364 +2045-10-01,Tripoli,428.63363646696655,25.182610948244786 +2045-11-01,Tripoli,428.4707994384911,25.21994904366548 +2045-12-01,Tripoli,428.43682574464924,25.283347917974357 +2046-01-01,Tripoli,428.69060157964304,25.325317577758273 +2046-02-01,Tripoli,429.14148401441076,25.339956025709192 +2046-03-01,Tripoli,429.4543483179461,25.35314610893031 +2046-04-01,Tripoli,429.80816554238805,25.382832247937618 +2046-05-01,Tripoli,430.10372971698956,25.420765525179092 +2046-06-01,Tripoli,430.325167886431,25.4511189083801 +2046-07-01,Tripoli,430.4369051376936,25.47123231735508 +2046-08-01,Tripoli,430.5445175091199,25.492353709892015 +2046-09-01,Tripoli,430.7077722469459,25.514472410083805 +2046-10-01,Tripoli,430.8781280437307,25.53678594558016 +2046-11-01,Tripoli,431.0035278716664,25.553091614356408 +2046-12-01,Tripoli,431.0444633880168,25.56068396362182 +2047-01-01,Tripoli,579.4124750756393,35.42755214005044 +2047-02-01,Tripoli,616.3995415766453,37.50078216066183 +2047-03-01,Tripoli,634.8844682740722,39.07405233454409 +2047-04-01,Tripoli,615.0272793374243,40.29174096033064 +2047-05-01,Tripoli,620.0693096710335,40.193293083014936 +2047-06-01,Tripoli,621.658450085953,40.043753872957936 +2047-07-01,Tripoli,617.2094277936241,39.856873898503466 +2047-08-01,Tripoli,627.068447548253,40.250715228666095 +2047-09-01,Tripoli,629.460094648292,40.411803990886625 +2047-10-01,Tripoli,619.839987237601,40.009984199485174 +2047-11-01,Tripoli,609.7661778540264,39.87635209100605 +2047-12-01,Tripoli,609.7332136244482,40.19336959368249 +2048-01-01,Tripoli,608.1469449613135,40.20949021340235 +2048-02-01,Tripoli,598.9540323843048,39.90162196310996 +2048-03-01,Tripoli,595.2303623791441,39.95733774294308 +2048-04-01,Tripoli,598.4758596053035,40.17210852469434 +2048-05-01,Tripoli,596.1873693102852,40.00262316154024 +2048-06-01,Tripoli,589.981809580818,39.80147661656548 +2048-07-01,Tripoli,588.7290296204002,39.874350358424934 +2048-08-01,Tripoli,586.7306210647579,39.84130842595277 +2048-09-01,Tripoli,579.8860878608975,39.65334840556342 +2048-10-01,Tripoli,575.2427611023543,39.638588963998714 +2048-11-01,Tripoli,573.5517344150218,39.72585738726366 +2048-12-01,Tripoli,570.5316261925775,39.68745437010982 +2049-01-01,Tripoli,574.7229914338642,35.220269617470386 +2049-02-01,Tripoli,579.7785799168089,35.38832885736781 +2049-03-01,Tripoli,600.0779142009765,36.25711015631355 +2049-04-01,Tripoli,602.1978587730622,39.269289764939415 +2049-05-01,Tripoli,604.7252440074622,39.19521142489559 +2049-06-01,Tripoli,592.5849568486676,39.52857374134098 +2049-07-01,Tripoli,595.0045382615223,39.76438673598484 +2049-08-01,Tripoli,606.3398124790942,39.95482178750336 +2049-09-01,Tripoli,600.608231030567,39.82686748228319 +2049-10-01,Tripoli,599.0333275426775,39.87475782221256 +2049-11-01,Tripoli,596.013393365796,39.88019541756178 +2049-12-01,Tripoli,591.6458592059298,39.807851912421576 +2050-01-01,Tripoli,587.7047366747138,39.7933148855881 +2050-02-01,Tripoli,585.6143102300643,39.82702940020752 +2050-03-01,Tripoli,583.421475376314,39.82538708983209 +2050-04-01,Tripoli,581.1534702440272,39.793273961277556 +2050-05-01,Tripoli,578.8133406305515,39.746655833610845 +2050-06-01,Tripoli,576.943743195874,39.74443346561635 +2050-07-01,Tripoli,574.9675602585903,39.71437189054272 +2050-08-01,Tripoli,570.6568345703942,39.579218465301956 +2050-09-01,Tripoli,566.5673207924079,39.52703641071869 +2050-10-01,Tripoli,564.720331876327,39.57807258460663 +2050-11-01,Tripoli,560.8225292856707,39.48183995801402 +2050-12-01,Tripoli,553.8892502493823,39.252537487382845 +2051-01-01,Tripoli,578.770281758336,35.444858675117246 +2051-02-01,Tripoli,628.1797980844092,38.16781461554063 +2051-03-01,Tripoli,679.410527178725,42.481374844339754 +2051-04-01,Tripoli,680.6784491030991,42.01653695264929 +2051-05-01,Tripoli,662.1366095066646,40.08149676318948 +2051-06-01,Tripoli,647.7964908624984,40.18623808774019 +2051-07-01,Tripoli,664.178564262098,41.033156018605595 +2051-08-01,Tripoli,666.1862842553456,40.935950105149104 +2051-09-01,Tripoli,639.4565581837965,40.05379100494908 +2051-10-01,Tripoli,625.1151516024662,39.97256158646661 +2051-11-01,Tripoli,619.4744393422321,40.08391129751176 +2051-12-01,Tripoli,596.8148035638703,39.43313646982726 +2052-01-01,Tripoli,570.0729117074875,38.886099431426146 +2052-02-01,Tripoli,559.8747119602409,39.08055574128538 +2052-03-01,Tripoli,554.9287199681374,39.22594736143432 +2052-04-01,Tripoli,544.3936376297008,38.9086451679019 +2052-05-01,Tripoli,538.128467295004,38.86203593682444 +2052-06-01,Tripoli,537.7668876384649,39.07342601466093 +2052-07-01,Tripoli,534.949159596345,39.01753942031422 +2052-08-01,Tripoli,531.7202663168684,38.95876677241502 +2052-09-01,Tripoli,535.060862038495,39.269140302240025 +2052-10-01,Tripoli,541.309115144496,39.62043102534075 +2052-11-01,Tripoli,546.2662982662821,39.737029724043026 +2052-12-01,Tripoli,553.4219031043817,39.901326596346884 +2053-01-01,Tripoli,582.2919544834103,35.653943646679224 +2053-02-01,Tripoli,619.967841107971,37.58986993642827 +2053-03-01,Tripoli,636.1839446589663,39.08684029193113 +2053-04-01,Tripoli,616.9977709848072,39.87240200537933 +2053-05-01,Tripoli,605.5177778818381,39.188078139635444 +2053-06-01,Tripoli,595.0885848637571,39.3105557045137 +2053-07-01,Tripoli,597.9820227256578,39.702333025970475 +2053-08-01,Tripoli,599.7290572750718,39.750839009875904 +2053-09-01,Tripoli,583.6640948907377,39.2963958930644 +2053-10-01,Tripoli,575.7101430564674,39.3064312457377 +2053-11-01,Tripoli,575.9742746024426,39.671428054236 +2053-12-01,Tripoli,574.2942824037862,39.71580957936542 +2054-01-01,Tripoli,569.5866806189325,39.58376284309054 +2054-02-01,Tripoli,570.1694025674564,39.705692378071035 +2054-03-01,Tripoli,573.3723978672009,39.83075707110301 +2054-04-01,Tripoli,571.5518116629839,39.66577516142695 +2054-05-01,Tripoli,569.1856274287699,39.596506317531336 +2054-06-01,Tripoli,572.0890032923016,39.80533595698185 +2054-07-01,Tripoli,573.5326242122358,39.836995359484675 +2054-08-01,Tripoli,569.3800015132092,39.612555764537206 +2054-09-01,Tripoli,568.5708636921503,39.66705093232531 +2054-10-01,Tripoli,571.6342744505979,39.8529754130944 +2054-11-01,Tripoli,570.4507298150278,39.757187615964256 +2054-12-01,Tripoli,566.9856567069481,39.60478370416895 +2055-01-01,Tripoli,574.709189620741,35.17823056429033 +2055-02-01,Tripoli,597.5059733025215,36.47116654194808 +2055-03-01,Tripoli,633.9393138457519,39.18718136343911 +2055-04-01,Tripoli,642.339135602584,41.79695845406768 +2055-05-01,Tripoli,639.5958294430806,40.29302384850041 +2055-06-01,Tripoli,631.776205974113,39.980241122306666 +2055-07-01,Tripoli,636.2411534354305,40.331179540473116 +2055-08-01,Tripoli,658.6482142931811,40.888257269501075 +2055-09-01,Tripoli,647.165767147778,40.42064186264696 +2055-10-01,Tripoli,632.8537916711027,40.06873905420588 +2055-11-01,Tripoli,628.4977271138193,40.25078818069794 +2055-12-01,Tripoli,624.8415867869918,40.26175233728886 +2056-01-01,Tripoli,606.48458357816,39.74468257011533 +2056-02-01,Tripoli,592.2168504835267,39.64445181631405 +2056-03-01,Tripoli,589.5929221754891,39.90735314590441 +2056-04-01,Tripoli,583.4756731645432,39.7522019673489 +2056-05-01,Tripoli,572.7999794159897,39.46441331899236 +2056-06-01,Tripoli,571.8469233191222,39.70000389890498 +2056-07-01,Tripoli,576.4402990011665,40.004471872786254 +2056-08-01,Tripoli,574.1933707865244,39.81020950857266 +2056-09-01,Tripoli,572.1086878454446,39.72683779139894 +2056-10-01,Tripoli,578.2532620097368,40.03335731876112 +2056-11-01,Tripoli,583.8134085789903,40.13729617096154 +2056-12-01,Tripoli,582.0829257625905,39.89240687596546 +2057-01-01,Tripoli,580.6063928267472,35.53297227436088 +2057-02-01,Tripoli,620.2915310455071,37.67222210447402 +2057-03-01,Tripoli,632.1781990103144,38.68004374850358 +2057-04-01,Tripoli,589.1042022353872,38.10350028219799 +2057-05-01,Tripoli,570.3746370950091,37.86039920164104 +2057-06-01,Tripoli,557.0853185357307,37.92730867006772 +2057-07-01,Tripoli,512.3238978166193,35.43078782956044 +2057-08-01,Tripoli,440.9074687860319,29.797092970450382 +2057-09-01,Tripoli,409.75583672082473,25.307048431734685 +2057-10-01,Tripoli,431.8124394334938,25.58182048036048 +2057-11-01,Tripoli,456.80597399418605,25.048436147821455 +2057-12-01,Tripoli,441.7530517479233,25.030699907493904 +2058-01-01,Tripoli,428.35606860354983,25.45846749110008 +2058-02-01,Tripoli,432.41432379847254,25.515273992775175 +2058-03-01,Tripoli,430.12059473201657,25.491686465698315 +2058-04-01,Tripoli,430.0989956776837,25.532859880744407 +2058-05-01,Tripoli,431.1961963095912,25.512398615129776 +2058-06-01,Tripoli,430.0169854085327,25.426706667479824 +2058-07-01,Tripoli,430.35191868942013,25.410922338833586 +2058-08-01,Tripoli,429.87251018692353,25.410514875045966 +2058-09-01,Tripoli,430.0421698014575,25.40680410767005 +2058-10-01,Tripoli,429.6322925012652,25.3681831240796 +2058-11-01,Tripoli,429.17422198475737,25.331873474376135 +2058-12-01,Tripoli,428.9899947566242,25.31638095385728 +2059-01-01,Tripoli,569.5148520152003,34.82105919569577 +2059-02-01,Tripoli,524.4999165294391,32.20292109049064 +2059-03-01,Tripoli,481.0019621682961,27.766416225877666 +2059-04-01,Tripoli,439.4716102981949,25.508931614299296 +2059-05-01,Tripoli,439.0717058087462,24.85420581132915 +2059-06-01,Tripoli,436.74198411992086,24.627857897987692 +2059-07-01,Tripoli,428.49044918252156,24.694742455964477 +2059-08-01,Tripoli,424.98155140175027,24.917658065173526 +2059-09-01,Tripoli,427.8506228848711,25.120338382134882 +2059-10-01,Tripoli,428.4814858360417,25.22113940730705 +2059-11-01,Tripoli,427.8376216813363,25.277503748496443 +2059-12-01,Tripoli,427.87580727779584,25.330343261025245 +2060-01-01,Tripoli,428.2195646687129,25.350925520253668 +2060-02-01,Tripoli,429.2063682001907,25.370108345993167 +2060-03-01,Tripoli,429.70086645297465,25.388380160993528 +2060-04-01,Tripoli,430.0662751118934,25.41644267246282 +2060-05-01,Tripoli,430.20316194696824,25.44628450178199 +2060-06-01,Tripoli,430.33797763984677,25.471833726788336 +2060-07-01,Tripoli,430.5401141563832,25.496105401578475 +2060-08-01,Tripoli,430.6821179310018,25.509819493906384 +2060-09-01,Tripoli,430.7897303024281,25.52229873964648 +2060-10-01,Tripoli,430.9076461711671,25.542654135849045 +2060-11-01,Tripoli,431.007095805702,25.553588044036523 +2060-12-01,Tripoli,431.0791158595532,25.566365325516472 +2061-01-01,Tripoli,577.8079838420883,35.357276202251796 +2061-02-01,Tripoli,631.0829650932656,38.39069463839269 +2061-03-01,Tripoli,685.9627160508942,43.01322718421004 +2061-04-01,Tripoli,680.8229765383771,41.89469638356128 +2061-05-01,Tripoli,660.7316789153219,40.0563888090099 +2061-06-01,Tripoli,643.4911779913027,40.10486988246543 +2061-07-01,Tripoli,658.6429929262997,40.8744373077611 +2061-08-01,Tripoli,660.5017299178637,40.956253901134026 +2061-09-01,Tripoli,642.4607586418088,40.283630829570924 +2061-10-01,Tripoli,632.4551055005929,40.168557006265985 +2061-11-01,Tripoli,630.846837478331,40.39647872624566 +2061-12-01,Tripoli,619.5401067330442,40.109818165405926 +2062-01-01,Tripoli,600.956792079015,39.73725925604566 +2062-02-01,Tripoli,593.6195184825541,39.87174721641057 +2062-03-01,Tripoli,591.7217082621607,39.957681151288114 +2062-04-01,Tripoli,582.8843011515523,39.65690348262747 +2062-05-01,Tripoli,574.4571194322617,39.49538412548726 +2062-06-01,Tripoli,569.9736361185153,39.49588055516739 +2062-07-01,Tripoli,558.4251212775057,39.09967984953583 +2062-08-01,Tripoli,538.107564422922,38.3792500659823 +2062-09-01,Tripoli,514.1496531740489,37.375079582180675 +2062-10-01,Tripoli,476.2421293100718,34.62094376541501 +2062-11-01,Tripoli,415.83345555714055,28.321875665321162 +2062-12-01,Tripoli,402.6046700445743,24.589239583374017 +2063-01-01,Tripoli,582.116620983532,35.60556399434113 +2063-02-01,Tripoli,667.4613246432345,40.42318094921873 +2063-03-01,Tripoli,736.4459542624646,45.44505291735481 +2063-04-01,Tripoli,717.6488246346408,41.72508468883984 +2063-05-01,Tripoli,704.7185620712421,40.57437492487611 +2063-06-01,Tripoli,668.7268273342868,40.845453999304496 +2063-07-01,Tripoli,685.6526364763623,41.69117800789264 +2063-08-01,Tripoli,662.6619312286053,40.85940918920106 +2063-09-01,Tripoli,630.0983023222093,39.829006222338734 +2063-10-01,Tripoli,607.7996196363608,39.465609020587465 +2063-11-01,Tripoli,583.7799396172803,38.96926296841143 +2063-12-01,Tripoli,539.5895797939909,37.32525156511279 +2064-01-01,Tripoli,494.1429068853605,34.873719886780655 +2064-02-01,Tripoli,443.65524791649705,30.99523134136145 +2064-03-01,Tripoli,414.9841828293197,27.215252059723767 +2064-04-01,Tripoli,423.20621704383893,26.15752499829985 +2064-05-01,Tripoli,443.74792717864244,25.53645499246008 +2064-06-01,Tripoli,447.12571643702097,25.079166746406635 +2064-07-01,Tripoli,431.1986329474692,25.179276506594125 +2064-08-01,Tripoli,431.2508466162834,25.384772594052905 +2064-09-01,Tripoli,430.27739237946594,25.461803712068598 +2064-10-01,Tripoli,430.44099520841735,25.558618175598117 +2064-11-01,Tripoli,431.8258757509354,25.65483478833008 +2064-12-01,Tripoli,431.38966535710443,25.724106301202468 +2065-01-01,Tripoli,579.1983990335007,35.41936905725887 +2065-02-01,Tripoli,603.0401696783745,36.7267175095006 +2065-03-01,Tripoli,611.6898164359266,37.21655303766396 +2065-04-01,Tripoli,587.9640645631581,38.55204318101931 +2065-05-01,Tripoli,596.7534350984573,39.428798492909266 +2065-06-01,Tripoli,599.8752555477519,39.847906136540104 +2065-07-01,Tripoli,585.3473939550856,39.17061591425677 +2065-08-01,Tripoli,578.6823539400526,39.041199009764 +2065-09-01,Tripoli,576.141845670224,39.27455654577504 +2065-10-01,Tripoli,565.844683616018,39.02605345622587 +2065-11-01,Tripoli,545.439581843389,38.29935157725153 +2065-12-01,Tripoli,534.911844227699,38.210343870788336 +2066-01-01,Tripoli,532.9450945599144,38.534221533434966 +2066-02-01,Tripoli,526.0323354954701,38.30866986483132 +2066-03-01,Tripoli,519.6342465645282,38.154766877747505 +2066-04-01,Tripoli,525.0187811610031,38.82010809101 +2066-05-01,Tripoli,532.780656312262,39.368680680715556 +2066-06-01,Tripoli,531.9761481031711,39.15736889286446 +2066-07-01,Tripoli,533.945804331853,39.21687995767137 +2066-08-01,Tripoli,542.5453433718997,39.62133847744418 +2066-09-01,Tripoli,547.5363087374086,39.7027440483938 +2066-10-01,Tripoli,548.5731155590541,39.57061724281566 +2066-11-01,Tripoli,554.3425171083593,39.7302113780423 +2066-12-01,Tripoli,560.9161832029672,39.874809422430204 +2067-01-01,Tripoli,572.7172207509191,34.993728648142216 +2067-02-01,Tripoli,548.9915384963757,33.686644424601184 +2067-03-01,Tripoli,533.3736991626547,31.1766950722809 +2067-04-01,Tripoli,503.19287584171184,31.50466516598224 +2067-05-01,Tripoli,531.1066860900754,32.83327646652998 +2067-06-01,Tripoli,518.9724035031944,33.22979922869236 +2067-07-01,Tripoli,481.13756106620684,30.81212796904334 +2067-08-01,Tripoli,466.9906329966535,30.26907482330809 +2067-09-01,Tripoli,469.1235961768303,30.036957471838413 +2067-10-01,Tripoli,469.1837637278606,29.608685451621795 +2067-11-01,Tripoli,470.3817019314671,29.526806582124124 +2067-12-01,Tripoli,475.59563706736935,30.351551543603325 +2068-01-01,Tripoli,489.0650405703883,31.6767714643292 +2068-02-01,Tripoli,508.6301288391328,33.07311427815026 +2068-03-01,Tripoli,527.2998397104934,35.190338822258724 +2068-04-01,Tripoli,546.3046927174169,38.092813699191645 +2068-05-01,Tripoli,558.1563601195622,39.74977497780168 +2068-06-01,Tripoli,559.4744245705542,39.76639558583735 +2068-07-01,Tripoli,567.8999180478866,39.887864277494735 +2068-08-01,Tripoli,583.2537824766387,40.13686557604187 +2068-09-01,Tripoli,588.3282200940254,39.99153623201767 +2068-10-01,Tripoli,583.4311871187133,39.7260798019949 +2068-11-01,Tripoli,581.7821924347763,39.768370628650715 +2068-12-01,Tripoli,581.7476791996901,39.871768568224766 +2069-01-01,Tripoli,566.96487566676,34.65274640300474 +2069-02-01,Tripoli,487.78953025948005,29.821327279565672 +2069-03-01,Tripoli,438.14426921871024,24.993441881376455 +2069-04-01,Tripoli,433.6276998434918,24.67282126005402 +2069-05-01,Tripoli,440.3255822562091,24.507142747439733 +2069-06-01,Tripoli,432.9475123798479,24.588882830145117 +2069-07-01,Tripoli,422.24818324387786,24.747245677419645 +2069-08-01,Tripoli,424.82772993342337,24.888607142638627 +2069-09-01,Tripoli,424.83665847079055,24.9141536986682 +2069-10-01,Tripoli,424.8945982386182,24.957319949706154 +2069-11-01,Tripoli,425.81108736275934,25.037172176172824 +2069-12-01,Tripoli,426.3464689182249,25.1108528386772 +2070-01-01,Tripoli,427.7106728478925,25.203619354098258 +2070-02-01,Tripoli,428.076899520956,25.26774507974881 +2070-03-01,Tripoli,428.5805003566699,25.31725459892157 +2070-04-01,Tripoli,428.7918612880302,25.355267945466284 +2070-05-01,Tripoli,429.2163758200468,25.390538473545423 +2070-06-01,Tripoli,429.6382970731789,25.419059159361062 +2070-07-01,Tripoli,429.94496535468153,25.44106398321046 +2070-08-01,Tripoli,430.14703225299286,25.452481865853105 +2070-09-01,Tripoli,430.220201007558,25.462421135362504 +2070-10-01,Tripoli,430.3638408104661,25.47809425664312 +2070-11-01,Tripoli,430.4442150513276,25.48366174219538 +2070-12-01,Tripoli,430.40583800474906,25.47651511205136 +2071-01-01,Tripoli,573.5679902705792,35.07922665014654 +2071-02-01,Tripoli,568.7023377102247,34.81977452820816 +2071-03-01,Tripoli,581.4078900476029,34.770079959979014 +2071-04-01,Tripoli,588.2606556065797,38.89558141624813 +2071-05-01,Tripoli,623.5060481615034,40.94625235549988 +2071-06-01,Tripoli,617.8447637157565,40.3591272859411 +2071-07-01,Tripoli,604.766336164819,39.6111963656999 +2071-08-01,Tripoli,628.7010993538511,40.40101064880929 +2071-09-01,Tripoli,653.4283093944778,41.031223679420634 +2071-10-01,Tripoli,644.959948495049,40.343851842199925 +2071-11-01,Tripoli,630.3315407808027,40.05599913840078 +2071-12-01,Tripoli,636.9207491441612,40.63418135644609 +2072-01-01,Tripoli,639.7768194237472,40.59946686519504 +2072-02-01,Tripoli,620.3629071307763,39.920393766426145 +2072-03-01,Tripoli,608.9008581253231,39.954426778940686 +2072-04-01,Tripoli,611.0161208717718,40.30862312809026 +2072-05-01,Tripoli,603.158694706583,39.99170348789556 +2072-06-01,Tripoli,588.4864101059765,39.5955454858924 +2072-07-01,Tripoli,583.9904651299396,39.73759910575498 +2072-08-01,Tripoli,580.9950713774008,39.7550880209014 +2072-09-01,Tripoli,567.3268556280933,39.26636812502992 +2072-10-01,Tripoli,556.2403969469777,39.0965429121665 +2072-11-01,Tripoli,553.8037938780896,39.31829573716066 +2072-12-01,Tripoli,549.6611962034754,39.31158237091309 +2073-01-01,Tripoli,578.6886195803104,35.47221924569477 +2073-02-01,Tripoli,607.252107105174,36.90205949735756 +2073-03-01,Tripoli,629.9205495890092,38.60022888771176 +2073-04-01,Tripoli,621.4834994863126,40.175581753137294 +2073-05-01,Tripoli,616.7117445070423,39.65500139184596 +2073-06-01,Tripoli,606.8575980281694,39.56429354717721 +2073-07-01,Tripoli,600.8400075064337,39.53266439307784 +2073-08-01,Tripoli,599.5512871373154,39.52455070368241 +2073-09-01,Tripoli,574.9648973614808,38.78877608299156 +2073-10-01,Tripoli,546.5802416523062,37.916110533179534 +2073-11-01,Tripoli,528.0314054242506,37.38157854062734 +2073-12-01,Tripoli,510.11169169173866,36.505144395609285 +2074-01-01,Tripoli,485.0640289610423,34.73927907833876 +2074-02-01,Tripoli,464.51156281046303,33.35056508979904 +2074-03-01,Tripoli,454.2791108964742,32.694408715277596 +2074-04-01,Tripoli,448.45154332011,31.792875512669212 +2074-05-01,Tripoli,441.6653675934278,30.26372441453352 +2074-06-01,Tripoli,434.85933326803985,28.296917173840974 +2074-07-01,Tripoli,436.2231717020257,26.69757554516343 +2074-08-01,Tripoli,442.60519622752895,25.74650435429669 +2074-09-01,Tripoli,442.3376707930807,25.24077773841611 +2074-10-01,Tripoli,435.3097805889008,25.190899010789504 +2074-11-01,Tripoli,431.80060433522925,25.343041362860873 +2074-12-01,Tripoli,430.97253035694695,25.433734972986827 +2075-01-01,Tripoli,581.1629209180825,35.56301338727924 +2075-02-01,Tripoli,626.8223471225749,38.03915925908761 +2075-03-01,Tripoli,663.4958357332386,41.38091657509217 +2075-04-01,Tripoli,659.1823253160389,41.723122101251434 +2075-05-01,Tripoli,647.4041399504715,40.118035055236646 +2075-06-01,Tripoli,638.3942710917695,40.094370127833315 +2075-07-01,Tripoli,648.3814057851125,40.596716039799134 +2075-08-01,Tripoli,649.2724668525411,40.501476272566755 +2075-09-01,Tripoli,619.2895507409606,39.601837153809555 +2075-10-01,Tripoli,593.7396273253833,39.12248892505337 +2075-11-01,Tripoli,575.4834661155883,38.9257195019893 +2075-12-01,Tripoli,547.8618957715782,38.01565180131399 +2076-01-01,Tripoli,513.845473744093,36.44237984811389 +2076-02-01,Tripoli,483.8577887840943,34.61913064052599 +2076-03-01,Tripoli,451.0506005172358,32.13401344811855 +2076-04-01,Tripoli,431.77615093366785,30.1523542413331 +2076-05-01,Tripoli,435.5805954844843,29.68257251499676 +2076-06-01,Tripoli,450.7989480381071,29.76464444048115 +2076-07-01,Tripoli,465.5976071218005,29.883102526336543 +2076-08-01,Tripoli,476.76064585051034,30.813764941465223 +2076-09-01,Tripoli,497.5986337467225,32.98211462535413 +2076-10-01,Tripoli,535.0417170265964,36.61143906464294 +2076-11-01,Tripoli,558.6289460360005,39.65184666129813 +2076-12-01,Tripoli,554.7282542890031,40.17278822411299 +2077-01-01,Tripoli,588.8496083862487,36.00573791673146 +2077-02-01,Tripoli,729.4423608188397,43.8276102881905 +2077-03-01,Tripoli,824.1877874574318,47.8524735268707 +2077-04-01,Tripoli,791.7176384227696,42.055112563634566 +2077-05-01,Tripoli,796.8013352640927,41.995953803761935 +2077-06-01,Tripoli,710.3870171941728,42.41438708592768 +2077-07-01,Tripoli,711.4949216281873,43.37276326622708 +2077-08-01,Tripoli,693.1517028279225,42.24187510311094 +2077-09-01,Tripoli,685.1229462107975,41.46754088529546 +2077-10-01,Tripoli,688.8163322880459,41.53565139327081 +2077-11-01,Tripoli,689.1905650569943,41.50610582037364 +2077-12-01,Tripoli,662.1114599228524,40.76059121377258 +2078-01-01,Tripoli,638.067222074873,40.50342284629451 +2078-02-01,Tripoli,631.3163950019781,40.675525586005776 +2078-03-01,Tripoli,622.7433805056892,40.401652982553095 +2078-04-01,Tripoli,605.9934966184053,39.95171865717318 +2078-05-01,Tripoli,598.4219925036434,40.01327059955389 +2078-06-01,Tripoli,596.6833817594647,40.086190603677444 +2078-07-01,Tripoli,588.5784453995398,39.79927382106733 +2078-08-01,Tripoli,581.5152935643539,39.688763948047324 +2078-09-01,Tripoli,581.606667484779,39.868373629767206 +2078-10-01,Tripoli,579.9212798736785,39.83685123473883 +2078-11-01,Tripoli,574.7970652253554,39.67577670706109 +2078-12-01,Tripoli,574.3750221403294,39.7854947836379 +2079-01-01,Tripoli,569.4379760901494,34.888175064993035 +2079-02-01,Tripoli,516.4687406789924,31.64458894237852 +2079-03-01,Tripoli,480.34410475034844,27.746591956053287 +2079-04-01,Tripoli,457.05717395485163,26.884483988703497 +2079-05-01,Tripoli,457.59283398321753,26.076492194439787 +2079-06-01,Tripoli,449.6051173097806,25.393674521255825 +2079-07-01,Tripoli,436.54983781868424,25.18273372117643 +2079-08-01,Tripoli,433.05904077643527,25.429983281300366 +2079-09-01,Tripoli,433.0375983631089,25.606759399344323 +2079-10-01,Tripoli,432.3212094224204,25.6711858297115 +2079-11-01,Tripoli,432.8522920524869,25.758246962446936 +2079-12-01,Tripoli,432.8428413784315,25.972606721774866 +2080-01-01,Tripoli,433.9087138090504,26.348410217234385 +2080-02-01,Tripoli,435.3356089504076,26.873807191945325 +2080-03-01,Tripoli,437.8107979205496,27.9353571177697 +2080-04-01,Tripoli,448.4552330860395,30.25989532252059 +2080-05-01,Tripoli,492.8987073711845,33.823330732169616 +2080-06-01,Tripoli,555.4291357700537,37.93179522002618 +2080-07-01,Tripoli,556.2609865370468,39.7437252971121 +2080-08-01,Tripoli,551.654748887918,40.152046715937004 +2080-09-01,Tripoli,577.1527371075814,40.31967625057368 +2080-10-01,Tripoli,594.9815120335752,40.193536849560374 +2080-11-01,Tripoli,602.3287062271108,40.17046799363675 +2080-12-01,Tripoli,604.5194351295524,40.20016302923331 +2081-01-01,Tripoli,572.2815847074451,34.983571412196206 +2081-02-01,Tripoli,512.8700353878605,31.45560759354335 +2081-03-01,Tripoli,453.5764889597964,26.02142497596295 +2081-04-01,Tripoli,430.03057836698065,24.73863466868518 +2081-05-01,Tripoli,439.9887344741317,24.626706679338824 +2081-06-01,Tripoli,436.4087738901042,24.54085281376453 +2081-07-01,Tripoli,424.18912195471194,24.71601509051865 +2081-08-01,Tripoli,425.7163195538614,24.98414494561086 +2081-09-01,Tripoli,427.36822079869575,25.109673150942733 +2081-10-01,Tripoli,427.71793054785763,25.23510527311071 +2081-11-01,Tripoli,427.98333262644076,25.33809219026145 +2081-12-01,Tripoli,428.0118238850571,25.385403362230686 +2082-01-01,Tripoli,428.9595193785929,25.43153662578331 +2082-02-01,Tripoli,429.722691766539,25.46755980531294 +2082-03-01,Tripoli,430.45535396734135,25.501275209591288 +2082-04-01,Tripoli,430.8176994243563,25.5293991075264 +2082-05-01,Tripoli,431.06132840304383,25.562356522400705 +2082-06-01,Tripoli,431.37650751256325,25.60784567289167 +2082-07-01,Tripoli,431.7190987982101,25.659162089340974 +2082-08-01,Tripoli,432.07389067780326,25.712374368959324 +2082-09-01,Tripoli,432.31087111599516,25.75506287315459 +2082-10-01,Tripoli,432.51855968598215,25.80181978761359 +2082-11-01,Tripoli,432.71383880734766,25.838775329696556 +2082-12-01,Tripoli,432.80138372539295,25.838549356329622 +2083-01-01,Tripoli,578.0881275798333,35.44256869304446 +2083-02-01,Tripoli,606.6354462719208,36.87089652453486 +2083-03-01,Tripoli,619.7089135243209,37.70666169111726 +2083-04-01,Tripoli,585.8825144422073,37.86724067877381 +2083-05-01,Tripoli,577.3852793839241,38.100954078354825 +2083-06-01,Tripoli,583.6679412976737,39.39680457865067 +2083-07-01,Tripoli,589.5378019457775,39.79630591889374 +2083-08-01,Tripoli,589.6933116560627,39.79509776207368 +2083-09-01,Tripoli,595.3152966137487,40.13954878735948 +2083-10-01,Tripoli,606.7080058670165,40.40638774735161 +2083-11-01,Tripoli,606.2362379647229,40.09878817405456 +2083-12-01,Tripoli,603.4228262525583,39.97603303559171 +2084-01-01,Tripoli,607.5730123137067,40.197851695346316 +2084-02-01,Tripoli,610.5819816201372,40.24214781321894 +2084-03-01,Tripoli,606.2408675766911,40.03043567885163 +2084-04-01,Tripoli,604.4591631511845,40.066360106240595 +2084-05-01,Tripoli,606.5842594719265,40.22355572100561 +2084-06-01,Tripoli,604.4318379978383,40.128520575325965 +2084-07-01,Tripoli,599.0524551500198,39.98635841707454 +2084-08-01,Tripoli,596.6604599588553,40.01011586900606 +2084-09-01,Tripoli,594.3453755018543,39.97729279262943 +2084-10-01,Tripoli,588.8463363296697,39.82543869004974 +2084-11-01,Tripoli,584.4455246582125,39.78743424009427 +2084-12-01,Tripoli,583.3595499651001,39.88441951813738 +2085-01-01,Tripoli,571.6432203925215,34.994085401371116 +2085-02-01,Tripoli,540.2478723258453,33.11847264877926 +2085-03-01,Tripoli,528.3195726624367,30.854877859704423 +2085-04-01,Tripoli,540.6069979399501,34.481056465034655 +2085-05-01,Tripoli,618.8249013021822,40.806819670830166 +2085-06-01,Tripoli,624.1279477661942,40.58740131085504 +2085-07-01,Tripoli,579.8437251709329,39.08562145920397 +2085-08-01,Tripoli,604.4956082920169,40.21931916520505 +2085-09-01,Tripoli,642.7205564532724,40.82591886863072 +2085-10-01,Tripoli,627.4079408228836,39.97528572209477 +2085-11-01,Tripoli,613.8359374606446,39.841858235168374 +2085-12-01,Tripoli,624.0037662571975,40.5079138445476 +2086-01-01,Tripoli,624.580309588245,40.34934637572033 +2086-02-01,Tripoli,604.7364525417009,39.68242779718392 +2086-03-01,Tripoli,596.9295343988117,39.860060656772596 +2086-04-01,Tripoli,598.7240137686216,40.14850587341575 +2086-05-01,Tripoli,588.0660204537962,39.71689140461814 +2086-06-01,Tripoli,577.3456144001815,39.524675255931896 +2086-07-01,Tripoli,579.5142221116021,39.88358145943009 +2086-08-01,Tripoli,578.9472512865038,39.854987821582604 +2086-09-01,Tripoli,569.0209629218858,39.442787489844974 +2086-10-01,Tripoli,565.8661782430132,39.51848678845003 +2086-11-01,Tripoli,570.1146652379828,39.86342000887316 +2086-12-01,Tripoli,566.845167128725,39.65631096978347 +2087-01-01,Tripoli,579.4133975171217,35.40633199537284 +2087-02-01,Tripoli,647.6608049418064,39.35653149843661 +2087-03-01,Tripoli,713.7030724914566,44.785160865007555 +2087-04-01,Tripoli,712.7594670686445,42.490041901586494 +2087-05-01,Tripoli,705.1016711638889,40.671548810611306 +2087-06-01,Tripoli,675.3583287693848,40.7410916694558 +2087-07-01,Tripoli,689.2993435336907,41.74151668918344 +2087-08-01,Tripoli,687.4502138571886,41.603763680564 +2087-09-01,Tripoli,668.805321883071,40.74869469462831 +2087-10-01,Tripoli,661.2921404363747,40.657588282761196 +2087-11-01,Tripoli,665.172555875316,40.99053068019401 +2087-12-01,Tripoli,650.7878293534261,40.54156608304228 +2088-01-01,Tripoli,625.158924061489,40.05737988905228 +2088-02-01,Tripoli,615.0272445283117,40.2527205198829 +2088-03-01,Tripoli,612.6356148328288,40.32965288575792 +2088-04-01,Tripoli,600.3725907432081,39.89818965897756 +2088-05-01,Tripoli,591.7847475649758,39.833216088371536 +2088-06-01,Tripoli,594.849411451475,40.17074378790348 +2088-07-01,Tripoli,595.3661179180614,40.1371413703086 +2088-08-01,Tripoli,589.3434800750069,39.862094417075 +2088-09-01,Tripoli,588.7224681026859,39.940742045357304 +2088-10-01,Tripoli,591.9835075975957,40.09488613000978 +2088-11-01,Tripoli,589.3446635848334,39.928680049653 +2088-12-01,Tripoli,585.5498959673038,39.83862699395301 +2089-01-01,Tripoli,571.8881373083731,34.94882133458816 +2089-02-01,Tripoli,530.4369761693068,32.565227570399934 +2089-03-01,Tripoli,491.2563960368557,28.444297181687155 +2089-04-01,Tripoli,456.9197127694199,27.268151179400537 +2089-05-01,Tripoli,462.3616475924779,27.039293538231828 +2089-06-01,Tripoli,458.79858683258993,26.663656408991272 +2089-07-01,Tripoli,448.16821454856733,25.96333825509487 +2089-08-01,Tripoli,440.47444342599863,26.280695607480638 +2089-09-01,Tripoli,438.8189046289036,26.95403396481939 +2089-10-01,Tripoli,440.233372917083,27.428943685199073 +2089-11-01,Tripoli,443.9786419765766,27.339419086900485 +2089-12-01,Tripoli,444.38491653362064,27.779665026587832 +2090-01-01,Tripoli,444.3574521438244,28.365278565633147 +2090-02-01,Tripoli,447.0645742308394,28.03787429500807 +2090-03-01,Tripoli,445.4077997102491,27.644411959547472 +2090-04-01,Tripoli,443.57569168978034,27.968940852527155 +2090-05-01,Tripoli,447.23447750916114,28.499407993451314 +2090-06-01,Tripoli,453.649048554892,28.794231174927344 +2090-07-01,Tripoli,461.3456914292455,29.68796028944618 +2090-08-01,Tripoli,478.30862448984794,31.56449472868427 +2090-09-01,Tripoli,508.7547628665926,33.93323296814389 +2090-10-01,Tripoli,534.3834418992982,36.44655501744862 +2090-11-01,Tripoli,544.5122322761345,38.96596589243561 +2090-12-01,Tripoli,555.7008905116758,40.12274135094957 +2091-01-01,Tripoli,566.4594473526375,34.68762815013368 +2091-02-01,Tripoli,494.8090662766496,30.267009924943313 +2091-03-01,Tripoli,452.70523427740466,25.89298135833406 +2091-04-01,Tripoli,443.302005042412,25.214257895522657 +2091-05-01,Tripoli,449.28151439502585,24.840918755285216 +2091-06-01,Tripoli,439.4887537861223,24.802223930003994 +2091-07-01,Tripoli,426.32843779792773,24.954278205841792 +2091-08-01,Tripoli,426.688746921859,25.140400190892215 +2091-09-01,Tripoli,427.0118276999256,25.14742315844567 +2091-10-01,Tripoli,426.6091558860297,25.121427324659006 +2091-11-01,Tripoli,426.83557175856475,25.144136758376952 +2091-12-01,Tripoli,427.2044787332941,25.185206972987757 +2092-01-01,Tripoli,428.51963662338875,25.252105765507338 +2092-02-01,Tripoli,429.0450975817796,25.301123303294606 +2092-03-01,Tripoli,429.30559157549413,25.33103630532777 +2092-04-01,Tripoli,429.3053653162626,25.360745575467124 +2092-05-01,Tripoli,429.6346073072493,25.40447053230994 +2092-06-01,Tripoli,430.0501933018986,25.43771263804022 +2092-07-01,Tripoli,430.23790144128606,25.451800387116602 +2092-08-01,Tripoli,430.33818649452206,25.464707558799592 +2092-09-01,Tripoli,430.4212410370493,25.481088848584463 +2092-10-01,Tripoli,430.61695527232155,25.506340037850958 +2092-11-01,Tripoli,430.8935658851435,25.54286231603748 +2092-12-01,Tripoli,431.15759300378113,25.580992207901364 +2093-01-01,Tripoli,562.3285803489504,34.394844956572534 +2093-02-01,Tripoli,465.40023945368245,28.159682836374778 +2093-03-01,Tripoli,420.8965976175071,24.271918707004176 +2093-04-01,Tripoli,437.5564825443114,24.639118311000622 +2093-05-01,Tripoli,445.32333539866386,24.433209421800672 +2093-06-01,Tripoli,429.08991431417854,24.643660909471354 +2093-07-01,Tripoli,422.4922473364722,24.88849059731946 +2093-08-01,Tripoli,425.052387945775,24.94578107344972 +2093-09-01,Tripoli,424.5115065505277,24.936044646175205 +2093-10-01,Tripoli,424.0233609607828,24.92790782564773 +2093-11-01,Tripoli,424.56123136779513,24.9389449342705 +2093-12-01,Tripoli,424.5313825537897,24.92790782564773 +2094-01-01,Tripoli,425.398059837882,24.96179849273429 +2094-02-01,Tripoli,425.89962434051216,25.004147147220227 +2094-03-01,Tripoli,426.6614217685128,25.06690190846745 +2094-04-01,Tripoli,427.1750128195265,25.127524157271598 +2094-05-01,Tripoli,427.5974910184593,25.182249746721265 +2094-06-01,Tripoli,428.0422296448633,25.239603388635192 +2094-07-01,Tripoli,428.31562041477497,25.267476402753477 +2094-08-01,Tripoli,428.5091590805133,25.291676015170697 +2094-09-01,Tripoli,428.86386393732516,25.325754400290418 +2094-10-01,Tripoli,429.14656614484204,25.34506088862048 +2094-11-01,Tripoli,429.2662050646519,25.355560643252588 +2094-12-01,Tripoli,429.38379024682166,25.368683112395413 +2095-01-01,Tripoli,578.0735425616779,35.41034524678323 +2095-02-01,Tripoli,648.6289159798486,39.38848448838466 +2095-03-01,Tripoli,708.1648034494362,44.02752198657744 +2095-04-01,Tripoli,690.6431145142956,41.487463907260505 +2095-05-01,Tripoli,669.2593371379676,40.06811629295842 +2095-06-01,Tripoli,648.2550835156944,40.32911731108511 +2095-07-01,Tripoli,665.3576881403751,41.05906822445333 +2095-08-01,Tripoli,648.5540067696563,40.523436613469904 +2095-09-01,Tripoli,622.8597299643636,39.81510797061337 +2095-10-01,Tripoli,614.7840680680872,39.94692517488562 +2095-11-01,Tripoli,607.5437030409456,39.89933376035502 +2095-12-01,Tripoli,581.0335180422044,39.075890369883005 +2096-01-01,Tripoli,561.6793729954695,38.88775063839083 +2096-02-01,Tripoli,560.8902504141228,39.43503500197308 +2096-03-01,Tripoli,558.7404222189191,39.50467928193501 +2096-04-01,Tripoli,551.1286091518325,39.23451655619932 +2096-05-01,Tripoli,553.4288823314466,39.52007216065428 +2096-06-01,Tripoli,562.1593732528795,39.95452464142243 +2096-07-01,Tripoli,564.7733113456172,39.87227745312983 +2096-08-01,Tripoli,565.7030627416373,39.75895981654273 +2096-09-01,Tripoli,572.5111508046652,39.96049959076231 +2096-10-01,Tripoli,578.916549649241,40.056689513726525 +2096-11-01,Tripoli,578.820946421642,39.86640214558955 +2096-12-01,Tripoli,578.9882216119669,39.82415224324428 +2097-01-01,Tripoli,574.6341933877673,35.23198197721718 +2097-02-01,Tripoli,563.1401199987748,34.39292863124822 +2097-03-01,Tripoli,557.6735577285926,32.9204941792362 +2097-04-01,Tripoli,535.7885291316474,33.83943266905206 +2097-05-01,Tripoli,549.7657627775542,34.434747049014895 +2097-06-01,Tripoli,508.8027646327892,33.43955233410696 +2097-07-01,Tripoli,446.2146923435491,29.287156488537 +2097-08-01,Tripoli,425.2072188783657,26.183893599176063 +2097-09-01,Tripoli,435.8099701315856,25.41421318719693 +2097-10-01,Tripoli,445.5492117299545,24.952044272281277 +2097-11-01,Tripoli,437.94397758513855,24.900126446398716 +2097-12-01,Tripoli,428.8501143378707,25.14483336131518 +2098-01-01,Tripoli,429.90427350211894,25.268532427897377 +2098-02-01,Tripoli,428.84717296786084,25.292706240205774 +2098-03-01,Tripoli,429.1565737646981,25.387158659289586 +2098-04-01,Tripoli,430.2350644986138,25.474081894891654 +2098-05-01,Tripoli,430.42613171736156,25.511956454644082 +2098-06-01,Tripoli,431.12991975930953,25.55171353268168 +2098-07-01,Tripoli,431.12151335863047,25.581889873756626 +2098-08-01,Tripoli,431.54158972879776,25.627670832374974 +2098-09-01,Tripoli,431.76412438528433,25.66363529441556 +2098-10-01,Tripoli,432.0078751958658,25.70822944802804 +2098-11-01,Tripoli,432.3037352479239,25.778155749869182 +2098-12-01,Tripoli,432.55350803497515,25.84466843041534 +2099-01-01,Tripoli,578.4871444369123,35.453133392778085 +2099-02-01,Tripoli,601.980545483457,36.60743382016287 +2099-03-01,Tripoli,603.1296116930533,36.328264187471106 +2099-04-01,Tripoli,537.5150959228862,34.456612196413076 +2099-05-01,Tripoli,497.86991856532535,32.30337692799993 +2099-06-01,Tripoli,448.5597822555621,29.100255162268333 +2099-07-01,Tripoli,422.84143494894596,25.436417294645512 +2099-08-01,Tripoli,434.97662257275306,25.21890369442868 +2099-09-01,Tripoli,445.67974590199026,24.890115114516398 +2099-10-01,Tripoli,435.98526882235143,24.867086293244395 +2099-11-01,Tripoli,425.678847544209,25.018108564729268 +2099-12-01,Tripoli,427.11634206033557,25.084327657830197 +2100-01-01,Tripoli,426.64586209520616,25.11444439175717 +2100-02-01,Tripoli,427.4711687490412,25.162827602730957 +2100-03-01,Tripoli,428.1915085240033,25.175503463093467 +2100-04-01,Tripoli,427.6675617620081,25.170458207330146 +2100-05-01,Tripoli,428.33071016506227,25.21634147672486 +2100-06-01,Tripoli,428.4011115951802,25.230298445939276 +2100-07-01,Tripoli,428.60885237883605,25.239100731342603 +2100-08-01,Tripoli,428.6392581386423,25.25629605904379 +2100-09-01,Tripoli,428.87524651712664,25.28541103702129 +2100-10-01,Tripoli,429.1271948737119,25.312316991888167 +2100-11-01,Tripoli,429.19169615925387,25.32388967518375 +2100-12-01,Tripoli,429.2541263025995,25.338371543163877 +2101-01-01,Tripoli,586.3451449524582,35.84886079986157 +2101-02-01,Tripoli,693.5248217052695,41.81203995216322 +2101-03-01,Tripoli,769.0769910152999,46.481873883701624 +2101-04-01,Tripoli,744.5943149902869,41.76510154728352 +2101-05-01,Tripoli,735.5962986344058,40.91469081547881 +2101-06-01,Tripoli,673.5747794609133,41.055208884036944 +2101-07-01,Tripoli,683.6580395185434,41.940826978137125 +2101-08-01,Tripoli,658.1319951541705,40.972189471797506 +2101-09-01,Tripoli,627.155592161504,39.84712857463971 +2101-10-01,Tripoli,615.5572306713331,39.87483967083365 +2101-11-01,Tripoli,607.4533037756718,39.9195574870367 +2101-12-01,Tripoli,575.4217495590497,38.88188600675764 +2102-01-01,Tripoli,555.4539198581842,38.73324535221482 +2102-02-01,Tripoli,560.2678112681875,39.65699956579137 +2102-03-01,Tripoli,563.0747484854193,39.81344786705944 +2102-04-01,Tripoli,554.6950463956371,39.34991599467078 +2102-05-01,Tripoli,558.5445513426403,39.63578475906732 +2102-06-01,Tripoli,568.6840803306959,39.99219813825783 +2102-07-01,Tripoli,565.4735836671985,39.6006681419822 +2102-08-01,Tripoli,558.2161795794672,39.26158176001376 +2102-09-01,Tripoli,557.4836044014462,39.3594887247031 +2102-10-01,Tripoli,550.3771152211445,39.123488901685 +2102-11-01,Tripoli,530.9027220951305,38.30338173218149 +2102-12-01,Tripoli,506.76606605334973,37.07550829102225 +2103-01-01,Tripoli,577.9830388690664,35.321134698085146 +2103-02-01,Tripoli,609.0663580509083,37.129794388963 +2103-03-01,Tripoli,659.2261151796179,41.583027510341566 +2103-04-01,Tripoli,682.4192876304804,43.30308339990815 +2103-05-01,Tripoli,677.1255177949611,40.64146054576993 +2103-06-01,Tripoli,666.5381695740415,40.324923458912956 +2103-07-01,Tripoli,669.4453396308404,40.97762706714671 +2103-08-01,Tripoli,688.4220494702729,41.52026207318724 +2103-09-01,Tripoli,672.1971044046918,40.85226522803381 +2103-10-01,Tripoli,661.4773075105466,40.572006652817926 +2103-11-01,Tripoli,662.0031165600628,40.80672358766627 +2103-12-01,Tripoli,654.1647831931035,40.59023576418989 +2104-01-01,Tripoli,626.3727700295275,39.92286879755531 +2104-02-01,Tripoli,606.0115799523712,39.818010038026515 +2104-03-01,Tripoli,597.9822489848893,39.937880902254705 +2104-04-01,Tripoli,585.2497892035155,39.6210786970381 +2104-05-01,Tripoli,572.9266497765332,39.430901646607815 +2104-06-01,Tripoli,572.8194551144575,39.779251157302696 +2104-07-01,Tripoli,573.4381696853507,39.857443280215435 +2104-08-01,Tripoli,566.7823366805852,39.53096158589551 +2104-09-01,Tripoli,563.6465925862735,39.4936226008159 +2104-10-01,Tripoli,565.8520109342082,39.685536265467654 +2104-11-01,Tripoli,562.5883607558578,39.52799190440407 +2104-12-01,Tripoli,554.4818231767557,39.21916638110845 +2105-01-01,Tripoli,570.7375220932686,34.95642969771422 +2105-02-01,Tripoli,566.8026826068665,34.7089523849055 +2105-03-01,Tripoli,590.7028455380309,35.43072466377677 +2105-04-01,Tripoli,590.6793493870646,38.38373572628183 +2105-05-01,Tripoli,589.4480988627545,38.26485149380139 +2105-06-01,Tripoli,572.3902935659164,38.82828761516587 +2105-07-01,Tripoli,564.3495278049642,38.705272696296944 +2105-08-01,Tripoli,552.8012566277424,38.15707999095234 +2105-09-01,Tripoli,525.8216359372481,37.04427414548555 +2105-10-01,Tripoli,496.70229909874365,35.1325145507735 +2105-11-01,Tripoli,447.7820248494605,31.24309298682574 +2105-12-01,Tripoli,416.8522660676015,27.456201055341296 +2106-01-01,Tripoli,422.4770183497347,26.056139467214 +2106-02-01,Tripoli,442.1555669208127,25.442967853309824 +2106-03-01,Tripoli,448.97420214494116,25.044760966802535 +2106-04-01,Tripoli,432.34578465587566,25.15983123147177 +2106-05-01,Tripoli,431.62292122025417,25.417362579791206 +2106-06-01,Tripoli,430.79963349494653,25.500071501065847 +2106-07-01,Tripoli,430.7241151252848,25.586896874186174 +2106-08-01,Tripoli,431.8863739885349,25.634942904427408 +2106-09-01,Tripoli,431.1235148826017,25.62666195915409 +2106-10-01,Tripoli,431.79590510503596,25.673297879999303 +2106-11-01,Tripoli,431.7267393984133,25.68975034249817 +2106-12-01,Tripoli,432.0247228063365,25.693574096557548 +2107-01-01,Tripoli,572.8009714756972,35.039450889271514 +2107-02-01,Tripoli,522.4946505786259,32.03846941753384 +2107-03-01,Tripoli,471.94468329831074,27.255649692187315 +2107-04-01,Tripoli,440.9106538198296,25.512108586320245 +2107-05-01,Tripoli,444.1114387409276,24.924879426667243 +2107-06-01,Tripoli,437.3894510177745,24.610682142782856 +2107-07-01,Tripoli,425.436471693573,24.66015340662184 +2107-08-01,Tripoli,423.5221271447217,24.83289759041798 +2107-09-01,Tripoli,425.27116321810695,24.883901736584633 +2107-10-01,Tripoli,425.5300559926445,24.912360146275528 +2107-11-01,Tripoli,425.58921407941114,24.958424016432 +2107-12-01,Tripoli,425.69270157100107,24.99526034421903 +2108-01-01,Tripoli,426.0242931770845,25.019408356418598 +2108-02-01,Tripoli,426.65623521074394,25.063039009415373 +2108-03-01,Tripoli,427.5292825624316,25.138781901307755 +2108-04-01,Tripoli,428.1764013691598,25.1944772189856 +2108-05-01,Tripoli,428.11050771911613,25.206062357506134 +2108-06-01,Tripoli,428.057406417932,25.22548272217859 +2108-07-01,Tripoli,428.38584779933024,25.262556588898576 +2108-08-01,Tripoli,428.8121898097553,25.293057655481125 +2108-09-01,Tripoli,429.05754183951365,25.312978898128318 +2108-10-01,Tripoli,429.16198658169856,25.32968669273864 +2108-11-01,Tripoli,429.3167304915078,25.35532844227318 +2108-12-01,Tripoli,429.51213144476725,25.376705166921575 +2109-01-01,Tripoli,580.643638577168,35.50364822653602 +2109-02-01,Tripoli,622.2487430164549,37.81019396918898 +2109-03-01,Tripoli,663.875846814869,41.6499138476362 +2109-04-01,Tripoli,668.542426060591,42.43125146050879 +2109-05-01,Tripoli,662.4090952396502,40.47056418356088 +2109-06-01,Tripoli,649.5348753474454,40.10206567753403 +2109-07-01,Tripoli,653.5719666019422,40.62228661661968 +2109-08-01,Tripoli,671.0595948204596,41.24199811328107 +2109-09-01,Tripoli,660.8063618662827,40.713683057296336 +2109-10-01,Tripoli,645.7844719438519,40.203168297081746 +2109-11-01,Tripoli,639.3393210927521,40.35892800234191 +2109-12-01,Tripoli,633.9828600455431,40.40293587072286 +2110-01-01,Tripoli,614.5928268037767,39.92422463775692 +2110-02-01,Tripoli,598.9370977510528,39.78703389357805 +2110-03-01,Tripoli,596.8040475480947,40.066669707546474 +2110-04-01,Tripoli,594.2140755293426,40.03609746824993 +2110-05-01,Tripoli,586.5438527714091,39.7968539487915 +2110-06-01,Tripoli,585.9756114137031,39.95250155702713 +2110-07-01,Tripoli,591.2914676311309,40.2037447960651 +2110-08-01,Tripoli,590.9855303409915,40.05063983303695 +2110-09-01,Tripoli,588.1743812211422,39.897965464928475 +2110-10-01,Tripoli,589.7538969164436,39.98367164712123 +2110-11-01,Tripoli,589.2819375640311,39.91377114538891 +2110-12-01,Tripoli,581.7594794888421,39.622226357051275 +2111-01-01,Tripoli,563.7559628178832,34.49695022172865 +2111-02-01,Tripoli,488.78568003767555,29.87829303018833 +2111-03-01,Tripoli,451.4067325476618,25.765274378295015 +2111-04-01,Tripoli,446.39860628966926,25.314832947327886 +2111-05-01,Tripoli,452.6095440270243,24.96693360404903 +2111-06-01,Tripoli,443.22867964684053,25.09073765038437 +2111-07-01,Tripoli,430.8782672801809,25.408460652588285 +2111-08-01,Tripoli,432.1186029828646,25.723042269128243 +2111-09-01,Tripoli,432.818057290301,26.05024013888274 +2111-10-01,Tripoli,434.0670778665642,26.364566423311246 +2111-11-01,Tripoli,436.27743910848,26.660465202427524 +2111-12-01,Tripoli,436.8891744523084,27.3069118394422 +2112-01-01,Tripoli,442.0383298297683,28.912594956936694 +2112-02-01,Tripoli,462.0768742427647,31.092650772959924 +2112-03-01,Tripoli,508.12367365619036,33.59463056063063 +2112-04-01,Tripoli,539.0992760392683,36.898249088182055 +2112-05-01,Tripoli,543.6800160134595,39.47386683472874 +2112-06-01,Tripoli,553.4489497848275,40.00587041661626 +2112-07-01,Tripoli,564.3464646030604,39.88095340696582 +2112-08-01,Tripoli,579.810900177805,40.016815000710835 +2112-09-01,Tripoli,589.6639327650765,40.04375743159363 +2112-10-01,Tripoli,584.5682267799261,39.7551058140799 +2112-11-01,Tripoli,577.4264063503934,39.596956484947356 +2112-12-01,Tripoli,573.3149628315052,39.59963969626496 +2113-01-01,Tripoli,569.0304484050538,34.79654909231375 +2113-02-01,Tripoli,517.7594451675257,31.782745856149877 +2113-03-01,Tripoli,487.8479573548832,28.165215625228964 +2113-04-01,Tripoli,466.92329476843935,28.07650595450562 +2113-05-01,Tripoli,476.5149631341828,28.517013453916896 +2113-06-01,Tripoli,483.67937467775585,29.58554898161988 +2113-07-01,Tripoli,487.01668093824696,29.737478705208186 +2113-08-01,Tripoli,490.85683963853245,31.30203200094391 +2113-09-01,Tripoli,512.5026078004144,33.800876630563124 +2113-10-01,Tripoli,534.179269049678,35.5883811218649 +2113-11-01,Tripoli,531.6300236926011,36.15358677483108 +2113-12-01,Tripoli,532.4904875501045,37.47740459309125 +2114-01-01,Tripoli,543.2140960420733,38.58807080884357 +2114-02-01,Tripoli,534.2440662126766,38.16611714631185 +2114-03-01,Tripoli,517.7046208152706,37.408080590342294 +2114-04-01,Tripoli,508.4769339348317,36.94159149168715 +2114-05-01,Tripoli,483.8357198067421,35.07095104282676 +2114-06-01,Tripoli,433.5259354029727,30.453023371604893 +2114-07-01,Tripoli,408.78090309672405,26.073461126482528 +2114-08-01,Tripoli,420.3350396094093,25.25303812806067 +2114-09-01,Tripoli,443.34629963812284,24.78237830836542 +2114-10-01,Tripoli,439.22566651352327,24.62997617588797 +2114-11-01,Tripoli,424.1649818351634,24.84495424816873 +2114-12-01,Tripoli,427.8429474755554,25.103352124281052 diff --git a/main_timegan.py b/main_timegan.py index e51c07c4..0a05b02e 100644 --- a/main_timegan.py +++ b/main_timegan.py @@ -40,39 +40,24 @@ from metrics.predictive_metrics import predictive_score_metrics from metrics.visualization_metrics import visualization - def main (args): - """Main function for timeGAN experiments. - - Args: - - data_name: sine, stock, or energy - - seq_len: sequence length - - Network parameters (should be optimized for different datasets) - - module: gru, lstm, or lstmLN - - hidden_dim: hidden dimensions - - num_layer: number of layers - - iteration: number of training iterations - - batch_size: the number of samples in each batch - - metric_iteration: number of iterations for metric computation + """Main function for timeGAN experiments.""" - Returns: - - ori_data: original data - - generated_data: generated synthetic data - - metric_results: discriminative and predictive scores - """ ## Data loading - # if args.data_name in ['stock', 'energy', 'transaction']: - if args.data_name in ['stock', 'energy', 'transaction']: - ori_data = real_data_loading(args.data_name, args.seq_len) - elif args.data_name == 'sine': + + # We simplify the logic to handle 'sine' or any other real data name. + if args.data_name == 'sine': # Set number of samples and its dimensions no, dim = 10000, 5 ori_data = sine_data_generation(no, args.seq_len, dim) + else: # This will now correctly handle 'Beirut', 'Tripoli', etc. + ori_data = real_data_loading(args.data_name, args.seq_len) + print(args.data_name + ' dataset is ready.') ## Synthetic data generation by TimeGAN - # Set newtork parameters + # Set network parameters parameters = dict() parameters['module'] = args.module parameters['hidden_dim'] = args.hidden_dim @@ -110,36 +95,32 @@ def main (args): ## Print discriminative and predictive scores print(metric_results) + # Reshape and save the data stacked_data = np.asarray(generated_data) - - # Reshape the 3D array to a 2D array: (num_samples * seq_len, num_features) num_samples, seq_len, num_features = stacked_data.shape reshaped_data = stacked_data.reshape(num_samples * seq_len, num_features) - # 2. Save to a CSV file using pandas - # This creates a file named 'synthetic_data.csv' in your project folder. - pd.DataFrame(reshaped_data).to_csv('synthetic_data.csv', index=False) - - print("Synthetic data saved to synthetic_data.csv") - # ---------------------------------------- + pd.DataFrame(reshaped_data).to_csv('{city}_synthetic_data.csv', index=False) + print("Synthetic data saved to {city}_synthetic_data.csv") return ori_data, generated_data, metric_results - - if __name__ == '__main__': # Inputs for the main function parser = argparse.ArgumentParser() + + parser.add_argument( '--data_name', - choices=['sine','stock','energy', 'transaction'], - default='transaction', # <--- TO THIS + default='Tripoli', # Set a default city for easy testing type=str) + + parser.add_argument( '--seq_len', help='sequence length', - default=12 , + default=24, # A good starting point for optimization type=int) parser.add_argument( '--module', @@ -154,26 +135,23 @@ def main (args): parser.add_argument( '--num_layer', help='number of layers (should be optimized)', - default=3 , + default=3, type=int) parser.add_argument( '--iteration', help='Training iterations (should be optimized)', - default=12000, + default=5000, # A good number for initial quality tests type=int) parser.add_argument( '--batch_size', help='the number of samples in mini-batch (should be optimized)', - default=64, + default=128, # Try a different batch size type=int) parser.add_argument( '--metric_iteration', - help='iterati ons of the metric computation', + help='iterations of the metric computation', default=10, type=int) args = parser.parse_args() ori_data, generated_data, metrics = main(args) - - - # Calls main function diff --git a/min_max_Baabda.npz b/min_max_Baabda.npz new file mode 100644 index 0000000000000000000000000000000000000000..b99267e1ea8d8b1e7bb7240e0037ef8b17f8695f GIT binary patch literal 546 zcmWIWW@Zs#fB;2?FPENIPXKa2n43X_AvZHGzAQ0EFR!4IkwE|~3{nb`27$?bp}ql; zj0|NA)#@p!#mPnLRtoAiX%^}_3hHV3MI}XvdGYy0DXAcFx5S*{RG@fqMq)uKkgs8+ zqp71%t3UzZ0y{z>!C}@+Ah1ku2te_S!NduxQ9P4aG3Y%rWwFCig$+d+#nnL1Ffxe% u;{XEC;|3}Wq#77OY^0b%*N7Sp$QsXrG$KMJz?+o~B+UebML>EM*kl0O>1vb! literal 0 HcmV?d00001 diff --git a/min_max_Beirut.npz b/min_max_Beirut.npz new file mode 100644 index 0000000000000000000000000000000000000000..882ddb6d96d7db4872c11e0a04ce23e2d3b782c2 GIT binary patch literal 546 zcmWIWW@Zs#fB;1X7O&jn6M!5L=4KFK$j!`)FH6kP%PXj4WDo!ggOq}#L1409sBb_d zBSRTOwR%cwadMHmm4doWnuWTKf_hqhQAtr^UVMI0N-9X)EitD!6)0YukywxlYYO?@%qW&i&yp6Ndm4&pa~zABy6c#EL=hnUaYPcU9OLr|xV5dWMln w1Q-VpfF3tcVIbAO2x23}6uL&#a6s007NijoDgoZCY#?bSAS?pXv%n?;02oPVmH+?% literal 0 HcmV?d00001 diff --git a/min_max_Bekaa.npz b/min_max_Bekaa.npz new file mode 100644 index 0000000000000000000000000000000000000000..9298b869489cdb35e3e9264646bc61012a2be8d7 GIT binary patch literal 546 zcmWIWW@Zs#fB;2?m3R9VP5^R1n43X_AvZHGzAQ0EFR!4IkwE|~3{nb`27$?bp}ql; zj0|NA)#@p!#mPnLRtoAiX%^}_3hHV3MI}XvdGYy0DXAcFx5S*{RG@fqMq)uKkgs8+ zqp71%t3UzZ0y{z>$zj{)zgH?U^&A3FJafilr#Xse5-SG1XI4ybkYowt(=`eJdWMln w1Q-VpfF3tcVIbAO2x23}6uL&#a6s007NijoDgoZCY#?bSAS?pXv%n?;0Nqe%h5!Hn literal 0 HcmV?d00001 diff --git a/min_max_Kesrouan.npz b/min_max_Kesrouan.npz new file mode 100644 index 0000000000000000000000000000000000000000..e9d15dd85ca1358a44c5f9b909ae8228451e94d8 GIT binary patch literal 546 zcmWIWW@Zs#fB;2?LS4nE2|x}Ab2ErAWf zG<6he6(|5)U`HGXb4ani@85er*dYMLGeOC_o}qXqv0~7B=D}o#T6@#DT?f;Eo?&DX v0mcCYpvMhV7)UiRg4jqgg{~1b9FR4h1!+WtN`N;j8%UZ72#bL9EU?J{?7L^e literal 0 HcmV?d00001 diff --git a/min_max_Tripoli.npz b/min_max_Tripoli.npz new file mode 100644 index 0000000000000000000000000000000000000000..fd4751dc35c0cb93add6c8db573438b85f2181a6 GIT binary patch literal 546 zcmWIWW@Zs#fB;2?PpiI)O#pI0n43X_AvZHGzAQ0EFR!4IkwE|~3{nb`27$?bp}ql; zj0|NA)#@p!#mPnLRtoAiX%^}_3hHV3MI}XvdGYy0DXAcFx5S*{RG@fqMq)uKkgs8+ zqp71%t3UzZg1Dl>;nOAGB!LKXhX54Muz4NsMe$5x#h~|$L!Sc=lXknYW&=CJMa-zycFdJbSd5kvrrr)Ai##G!aPv0~7BddgylyDDsrQ+GB& zJ^jHR;&0q^fHxzP2ry0|06ngu!a%Bl5yVD{d324a;f1X6D@Y?E^a8wD*+9}vKv)E% IUx7^q0B;I#`~Uy| literal 0 HcmV?d00001 diff --git a/normalize_synthetic_data.py b/normalize_synthetic_data.py new file mode 100644 index 00000000..d1637780 --- /dev/null +++ b/normalize_synthetic_data.py @@ -0,0 +1,43 @@ +import pandas as pd +import numpy as np + +cities = ['Baabda', 'Beirut', 'Bekaa', 'Kesrouan', 'Tripoli'] +all_cities_df = [] + +print("Processing and combining synthetic data for all cities...") + +for city in cities: + print(f"...Processing {city}") + + # 1. Load the specific files for this city + df_synthetic_scaled = pd.read_csv(f'synthetic_data_{city}.csv') + df_synthetic_scaled.columns = ['transaction_number', 'transaction_value'] + + min_max_data = np.load(f'min_max_{city}.npz') + min_val = min_max_data['min_val'] + max_val = min_max_data['max_val'] + + # 2. Un-scale the data + df_synthetic_denormalized = df_synthetic_scaled * (max_val - min_val) + min_val + + # 3. Create the date range and add the city column + date_range = pd.date_range(start='2017-01-01', periods=len(df_synthetic_denormalized), freq='MS') + df_synthetic_denormalized['date'] = date_range + df_synthetic_denormalized['city'] = city + + # 4. Append to our master list + all_cities_df.append(df_synthetic_denormalized) + +# 5. Concatenate all city dataframes into one final dataframe +final_df = pd.concat(all_cities_df, ignore_index=True) + +# Reorder columns for clarity +final_df = final_df[['date', 'city', 'transaction_number', 'transaction_value']] + +# 6. Save the final, correct file +output_file = 'final_usable_synthetic_data_COMBINED.csv' +final_df.to_csv(output_file, index=False) + +print(f"\nSuccess! All cities combined into '{output_file}'") +print("\nHere is a preview:") +print(final_df.head()) \ No newline at end of file diff --git a/process_synthetic_data.py b/process_synthetic_data.py index e92fead7..41844e29 100644 --- a/process_synthetic_data.py +++ b/process_synthetic_data.py @@ -1,104 +1,172 @@ -import pandas as pd -import numpy as np +# import pandas as pd +# import numpy as np -# --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- +# # --- IMPORTANT: YOU MUST CUSTOMIZE THIS SECTION --- -# TODO: Define the column names in the exact order they went into the model. -# To find this order, you can add `print(df.columns)` to your `transaction_data_loading` -# function right before the `ori_data = df.values` line and run the main script again. -# The console output will give you the exact list you need here. -# -# EXAMPLE: -# column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] -# -column_names = [ - 'transaction_number', - 'transaction_value', - 'city_Baabda', # Alphabetical order is crucial - 'city_Bekaa', - 'city_Beirut', - 'city_Kesrouan', - 'city_Tripoli' -] +# # TODO: Define the column names in the exact order they went into the model. +# # To find this order, you can add `print(df.columns)` to your `transaction_data_loading` +# # function right before the `ori_data = df.values` line and run the main script again. +# # The console output will give you the exact list you need here. +# # +# # EXAMPLE: +# # column_names = ['transaction_value', 'feature_2', 'city_1', 'city_2', 'city_3', 'city_4', 'city_5'] +# # +# column_names = [ +# 'transaction_number', +# 'transaction_value', +# 'city_Baabda', # Alphabetical order is crucial +# 'city_Bekaa', +# 'city_Beirut', +# 'city_Kesrouan', +# 'city_Tripoli' +# ] -original_city_column_name = 'city' +# original_city_column_name = 'city' -# TODO: Define the name of your original date and id columns from the CSV. -original_date_column_name = 'date' -original_id_column_name = 'id' +# # TODO: Define the name of your original date and id columns from the CSV. +# original_date_column_name = 'date' +# original_id_column_name = 'id' -print("Starting the reverse transformation process...") +# print("Starting the reverse transformation process...") -# --- Step 1: Load Raw Synthetic Data --- -try: - df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) - df_synthetic.columns = column_names - print("-> Successfully loaded and renamed raw synthetic data.") -except FileNotFoundError: - print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") - exit() +# # --- Step 1: Load Raw Synthetic Data --- +# try: +# df_synthetic = pd.read_csv('synthetic_data.csv', nrows=360) +# df_synthetic.columns = column_names +# print("-> Successfully loaded and renamed raw synthetic data.") +# except FileNotFoundError: +# print("Error: 'synthetic_data.csv' not found. Please run main_timegan.py first to generate the data.") +# exit() -# --- Step 2: Calculate Min/Max for Denormalization --- -df_original = pd.read_csv('data/transaction_data.csv') -if original_date_column_name in df_original.columns: - df_original = df_original.drop(columns=[original_date_column_name]) -if original_id_column_name in df_original.columns: - df_original = df_original.drop(columns=[original_id_column_name]) -if original_city_column_name in df_original.columns: - df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') +# # --- Step 2: Calculate Min/Max for Denormalization --- +# df_original = pd.read_csv('data/transaction_data.csv') +# if original_date_column_name in df_original.columns: +# df_original = df_original.drop(columns=[original_date_column_name]) +# if original_id_column_name in df_original.columns: +# df_original = df_original.drop(columns=[original_id_column_name]) +# if original_city_column_name in df_original.columns: +# df_original = pd.get_dummies(df_original, columns=[original_city_column_name], prefix='city') -df_original = df_original[column_names] -min_vals = df_original.min(axis=0) -max_vals = df_original.max(axis=0) -print("-> Calculated min/max values from original data.") +# df_original = df_original[column_names] +# min_vals = df_original.min(axis=0) +# max_vals = df_original.max(axis=0) +# print("-> Calculated min/max values from original data.") -# --- Step 3: Denormalize Synthetic Data --- -df_synthetic_denormalized = df_synthetic.copy() -for col in column_names: - df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] -print("-> Synthetic data has been denormalized.") +# # --- Step 3: Denormalize Synthetic Data --- +# df_synthetic_denormalized = df_synthetic.copy() +# for col in column_names: +# df_synthetic_denormalized[col] = df_synthetic[col] * (max_vals[col] - min_vals[col]) + min_vals[col] +# print("-> Synthetic data has been denormalized.") -# --- Step 4: Reconstruct 'city' Column --- -city_cols = [col for col in column_names if col.startswith('city_')] -df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') -df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) -print("-> Reconstructed 'city' column with text names.") +# # --- Step 4: Reconstruct 'city' Column --- +# city_cols = [col for col in column_names if col.startswith('city_')] +# df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +# df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +# print("-> Reconstructed 'city' column with text names.") + + +# # --- Step 5: Create a Structured DataFrame with Correct Dates --- +# # THIS IS THE FIX: Use 'MS' for Month Start frequency to match your original data. +# date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='MS') + +# cities = sorted(df_final_data_only['city'].unique()) # Using the correct df + +# structured_dfs = [] +# for city_name in cities: +# temp_df = pd.DataFrame({ +# 'date': date_range_single_city, +# 'city': city_name +# }) +# structured_dfs.append(temp_df) + +# final_index_df = pd.concat(structured_dfs, ignore_index=True) + +# df_final_data_only.reset_index(drop=True, inplace=True) +# final_index_df.reset_index(drop=True, inplace=True) +# # Drop the flawed city column from the data part before combining +# df_final_data_only = df_final_data_only.drop(columns=['city']) +# df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) -# --- Step 5: Create a Structured DataFrame with Correct Dates --- -# THIS IS THE FIX: Use 'MS' for Month Start frequency to match your original data. -date_range_single_city = pd.date_range(start='2017-01-01', periods=72, freq='MS') +# print("-> Created a structured final DataFrame.") -cities = sorted(df_final_data_only['city'].unique()) # Using the correct df -structured_dfs = [] -for city_name in cities: - temp_df = pd.DataFrame({ - 'date': date_range_single_city, - 'city': city_name - }) - structured_dfs.append(temp_df) +# # --- Step 6: Save the Final Data --- +# df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) +# print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +# print("\nHere is a preview:") +# print(df_final_structured.head()) -final_index_df = pd.concat(structured_dfs, ignore_index=True) +import pandas as pd +import numpy as np + +# --- Customize this section with your column names --- +column_names = [ + 'transaction_number', + 'transaction_value', + 'city_Baabda', + 'city_Bekaa', + 'city_Beirut', + 'city_Kesrouan', + 'city_Tripoli' +] +# ------------------------------------ + +print("Starting the un-scaling process...") + +# --- Step 1: Load the raw synthetic data and our saved min/max values --- +try: + df_synthetic_scaled = pd.read_csv('synthetic_data.csv') + df_synthetic_scaled.columns = column_names + + # Load the min and max values we saved from training + min_max_data = np.load('min_max_values.npz') + min_val = min_max_data['min_val'] + max_val = min_max_data['max_val'] + + print("-> Loaded synthetic data and min/max values successfully.") + +except FileNotFoundError as e: + print(f"Error: {e}. Did you run main_timegan.py after modifying data_loading.py?") + exit() + +# --- Step 2: Un-scale the data using the correct formula --- +# This is the inverse of the formula: (data - min) / (max - min) +df_synthetic_denormalized = df_synthetic_scaled * (max_val - min_val) + min_val +print("-> Un-scaling complete.") + +# --- Step 3: Reconstruct the 'city' column --- +city_cols = [col for col in column_names if col.startswith('city_')] +df_synthetic_denormalized['city'] = df_synthetic_denormalized[city_cols].idxmax(axis=1).str.replace('city_', '') +df_final_data_only = df_synthetic_denormalized.drop(columns=city_cols) +print("-> Reconstructed the 'city' column.") -df_final_data_only.reset_index(drop=True, inplace=True) -final_index_df.reset_index(drop=True, inplace=True) +# --- Step 4: Create the final, structured DataFrame with dates --- +# Get the number of cities and the number of time steps per city +num_cities = len(df_final_data_only['city'].unique()) +timesteps_per_city = len(df_final_data_only) // num_cities -# Drop the flawed city column from the data part before combining -df_final_data_only = df_final_data_only.drop(columns=['city']) -df_final_structured = pd.concat([final_index_df, df_final_data_only], axis=1) +date_range = pd.date_range(start='2017-01-01', periods=timesteps_per_city, freq='MS') +cities = sorted(df_final_data_only['city'].unique()) +full_date_range = np.tile(date_range, num_cities) +full_city_list = np.repeat(cities, len(date_range)) -print("-> Created a structured final DataFrame.") +df_final_structured = pd.DataFrame({'date': full_date_range, 'city': full_city_list}) +# Sort the data by city to ensure it aligns correctly before concatenating +df_final_data_only = df_final_data_only.sort_values(by=['city']).reset_index(drop=True) +df_final_structured = pd.concat([df_final_structured, df_final_data_only.drop('city', axis=1)], axis=1) +print("-> Created the final structured DataFrame.") -# --- Step 6: Save the Final Data --- -df_final_structured.to_csv('final_usable_synthetic_data.csv', index=False) -print("\nSuccess! Your final, usable synthetic data has been saved to 'final_usable_synthetic_data.csv'") +# --- Step 5: Save the final, usable data --- +output_file = 'final_usable_synthetic_data.csv' +df_final_structured.to_csv(output_file, index=False) +print(f"\nSuccess! Your final data is saved in '{output_file}'") print("\nHere is a preview:") print(df_final_structured.head()) \ No newline at end of file diff --git a/synthetic_data.csv b/synthetic_data.csv deleted file mode 100644 index f543c686..00000000 --- a/synthetic_data.csv +++ /dev/null @@ -1,4189 +0,0 @@ -0,1,2,3,4,5,6 -0.10441720485254888,0.030766636127925642,0.00011318920910954589,0.0120193648239882,0.0,0.0,0.9951906401125887 -0.08302393555297391,0.06368532775742064,5.999206896722376e-05,0.0003210603869766029,0.0,8.940695822239011e-08,0.9999922706062416 -0.23448202012998484,0.1324485540163216,2.4735925108194595e-06,5.900859242677747e-06,0.0,0.004890322196209479,0.9998725844915013 -0.1757552623676003,0.07322433589635119,0.00023519990476370093,3.874301522970238e-07,0.0,1.0281800195574863e-05,0.9999865485609154 -0.2104187309654844,0.04233881830444139,6.72042302638299e-05,5.066394299268773e-07,1.4901159703731684e-07,1.9073484420776557e-06,0.9999907208856325 -0.22161853312528373,0.03773298858950131,6.702541634738512e-05,3.278255134820971e-07,2.086162358522436e-07,1.4603136509657052e-06,0.999991793769131 -0.23942619561157638,0.03827616571724644,3.9488073214888964e-05,2.9802319407463367e-07,5.066394299268773e-07,2.5033948302269232e-06,0.9999896480021337 -0.25175088642985266,0.038619011633935774,2.8759238228202153e-05,2.086162358522436e-07,9.536742210388278e-07,3.5166736900806776e-06,0.9999880982815246 -0.25979477166053766,0.03843638300237525,2.3424623054266208e-05,2.086162358522436e-07,1.5795229285955586e-06,4.112720078229945e-06,0.9999870253980259 -0.2645585536847239,0.03819587826074773,2.086162358522436e-05,2.086162358522436e-07,1.9669530808925826e-06,4.440545591712042e-06,0.9999863101423602 -0.2669510543235867,0.03793430327719572,1.9788740086555676e-05,1.7881391644478022e-07,2.1457669973373625e-06,4.410743272304579e-06,0.9999858333052496 -0.26589033006520774,0.037278473370844396,2.086162358522436e-05,2.086162358522436e-07,2.026557719707509e-06,3.874301522970238e-06,0.9999861313284437 -0.15529996156049442,0.025752931828857406,1.7881391644478022e-06,2.682208746671703e-07,0.9997287584980409,2.115964677929899e-05,3.5166736900806776e-06 -0.42330458758508727,0.08012828229485772,2.086162358522436e-07,4.172324717044872e-07,0.9999666406115512,0.01219758269404483,0.0 -0.23653107880566598,0.11057665942205966,5.3942198127508695e-06,8.940695822239011e-08,0.9825911731413343,0.30814087289723163,0.0 -0.09763079881263824,0.06079885362537706,9.736417750418283e-05,0.0,0.08256735572069668,0.9936745365196923,0.0 -0.1227488517710403,0.10491204259983322,3.749131781458892e-05,0.0,0.0006913840079337427,0.9999331428045373,0.0 -0.11860024928555533,0.11078268287669052,3.150105161368878e-05,0.0,0.00016349552426934405,0.999966044565163,0.0 -0.12338596581901806,0.11962550876476372,2.598762252330806e-05,0.0,8.091329719126304e-05,0.9999773694465379,0.0 -0.11500960587978971,0.11958041785099885,3.1441446974873854e-05,0.0,7.781385597288686e-05,0.9999714089826564,0.0 -0.10035169124187737,0.11757123468293164,4.386901416778608e-05,0.0,9.995697929263214e-05,0.9999493552662949,0.0 -0.08473530411369407,0.11412975190115705,6.288289394974771e-05,0.0,0.0001702904530942457,0.9998783065368275,0.0 -0.0696675777406455,0.10629114506808768,0.00010359286226034267,0.0,0.0005677043823927697,0.99942852993233,0.0 -0.05539226531753055,0.08896324036982191,0.00030547377392649955,0.0,0.012048660503965736,0.9830518573947349,8.940695822239011e-08 -0.12134891747925866,0.1118653714465277,0.00023663041609525915,0.0,0.0011868475680828212,0.9998631669585685,0.0 -0.22201338409458193,0.1854579448382382,1.069903266727935e-05,0.0,4.2498107475042767e-05,0.9999996615814547,2.9802319407463367e-07 -0.22912585734372287,0.1686291396329137,6.7055218666792585e-06,0.0,9.924172362685302e-06,0.9999994827675383,2.682208746671703e-07 -0.2512722313300037,0.17419147488472309,5.155801257491163e-06,0.0,7.033347380161355e-06,0.9999996615814547,5.066394299268773e-07 -0.25529140232936426,0.1800190806080599,5.48362677097326e-06,0.0,6.765126505494185e-06,0.9999997807907323,6.556510269641942e-07 -0.2555623054398572,0.1810519396948734,5.930661562085211e-06,0.0,6.616114908456868e-06,0.9999997807907323,8.344649434089744e-07 -0.2534356117143593,0.17792814966969725,6.407498672604624e-06,0.0,6.198882436752381e-06,0.9999997807907323,7.748603045940476e-07 -0.24910438059729012,0.17159783837241085,7.033347380161355e-06,0.0,5.811452284455357e-06,0.9999996615814547,6.556510269641942e-07 -0.244709610928893,0.16529497501403884,7.68899840712555e-06,0.0,5.543231409788187e-06,0.9999996019768158,5.66244068741804e-07 -0.23676472901317583,0.15705785152606944,8.612870308756914e-06,0.0,5.334615173935943e-06,0.9999994231628994,4.172324717044872e-07 -0.21984213589711632,0.14520463344948584,1.1026858180761447e-05,0.0,5.543231409788187e-06,0.9999991847443441,2.086162358522436e-07 -0.19371223448904912,0.1328356861840715,1.707672902047651e-05,0.0,6.884335783124038e-06,0.9999980522562066,5.960463881492674e-08 -0.695228934259237,0.4115378557931014,0.9999996615814547,3.5762783288956045e-06,2.3841855525970696e-07,6.556510269641942e-07,2.7030703702569276e-05 -0.5411847233548185,0.450802296322877,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 -0.5918448567145372,0.3092705308861442,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,5.960463881492674e-08 -0.5483335852395933,0.34262293571327307,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 -0.5784543156384315,0.3325960039522947,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5772681236028055,0.3390295504943144,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.5799865722416091,0.33755710715235765,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5844708680864551,0.3387548922912364,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 -0.5862112045045349,0.3415297567259572,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 -0.5886878967041393,0.34252279991006757,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5912961959594024,0.3449222742920572,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.592860996698626,0.3469466566445395,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.16536375879556658,0.4654632805980917,5.364417493343406e-07,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.158693492405996,0.4226948022118605,0.0,0.9999999000000099,0.0,6.645917227864331e-06,0.0 -0.1772499382422485,0.47049054495384407,5.960463881492674e-08,0.9999999000000099,0.0,6.616114908456868e-06,8.940695822239011e-08 -0.1782937645838343,0.5415201782252964,8.940695822239011e-08,0.9999999000000099,0.0,9.536742210388277e-06,5.960463881492674e-08 -0.17726960777502354,0.5538820027356613,0.0,0.9999999000000099,0.0,9.953974682092765e-06,5.960463881492674e-08 -0.1788797080442745,0.5565514563561148,5.960463881492674e-08,0.9999999000000099,0.0,9.953974682092765e-06,2.980231940746337e-08 -0.18029603361336868,0.5582656859395615,2.980231940746337e-08,0.9999999000000099,0.0,1.0222195556759936e-05,0.0 -0.18133792280399938,0.5588477849003384,2.980231940746337e-08,0.9999999000000099,0.0,1.0550021070242033e-05,2.980231940746337e-08 -0.18225553631027852,0.5594696997638182,2.980231940746337e-08,0.9999999000000099,0.0,1.1026858180761447e-05,0.0 -0.18305954336362049,0.5604499577516265,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,8.940695822239011e-08 -0.18384724854661702,0.5602018832201138,2.980231940746337e-08,0.9999999000000099,0.0,1.2338160234689835e-05,0.0 -0.18456044792364742,0.5601701139444539,1.1920927762985348e-07,0.9999999000000099,0.0,1.317262517809881e-05,1.1920927762985348e-07 -0.41879385708028444,0.3091232776112518,0.9999997211860935,2.682208746671703e-07,1.1920927762985348e-07,0.0,9.238719016313645e-07 -0.7265598177608998,0.4310984610773038,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 -0.5735671519995653,0.3720480202991463,0.9999999000000099,0.0,3.874301522970238e-07,0.0,2.980231940746337e-08 -0.6025111675012965,0.3104480504458028,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 -0.6018087267626476,0.3388568162337849,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 -0.5873838662857974,0.34617793554100296,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5865893363709743,0.3460998534563605,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5855681895967246,0.34820628160236217,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5850735306497541,0.34685313695690295,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.587263226484777,0.3463897704484984,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5873935222382506,0.3464886843564862,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.5884665250534528,0.3470637201668583,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.11642333864683628,0.10756063459461895,0.0002636909221172359,0.0,0.0018718836819827743,0.9997217847552995,0.0 -0.20500034093007952,0.1665179133130085,1.2695788067579396e-05,0.0,5.531310482025202e-05,0.9999994231628994,1.1920927762985348e-07 -0.21699959038789562,0.15892648694178035,7.241963616013599e-06,0.0,1.1473892971873398e-05,0.9999993039536218,1.7881391644478022e-07 -0.23931547998391067,0.16296830770562987,5.48362677097326e-06,0.0,7.450579851865842e-06,0.999999542372177,3.278255134820971e-07 -0.2487703263656603,0.17102527615479649,5.48362677097326e-06,0.0,6.8247311443091115e-06,0.9999996615814547,4.768371105194139e-07 -0.2502561807528821,0.17362141606218887,5.900859242677747e-06,0.0,6.526707950234478e-06,0.9999996615814547,5.66244068741804e-07 -0.24638545512132848,0.1692899763294253,6.467103311419552e-06,0.0,6.288289394974771e-06,0.9999996615814547,5.066394299268773e-07 -0.24041640757518892,0.16231352088056195,7.241963616013599e-06,0.0,5.871056923270284e-06,0.999999542372177,3.874301522970238e-07 -0.2330541312598047,0.15504780409065314,8.255242475867353e-06,0.0,5.6624406874180405e-06,0.9999994231628994,2.682208746671703e-07 -0.22097769378700766,0.14647096392984457,1.0102986279130082e-05,0.0,5.871056923270284e-06,0.9999990655350666,2.3841855525970696e-07 -0.20383799075236275,0.13741880652935604,1.3500450691580906e-05,0.0,6.675719547271795e-06,0.9999985290933172,1.4901159703731684e-07 -0.18596407770340498,0.12972739336653427,1.8984077462554166e-05,0.0,8.1360331982375e-06,0.9999975158144573,5.960463881492674e-08 -0.10187199711377792,0.031272798771271586,0.00012856720592379698,0.00961002611381123,0.0,0.0,0.995828230933992 -0.318205416189369,0.26547402138932547,0.0,0.999971528191934,0.0,5.066394299268773e-07,0.030761656069189614 -0.1346418559495487,0.3375075756925578,0.0,0.9999999000000099,0.0,0.0007069408186644386,1.3947485482692857e-05 -0.11706313490382883,0.4697990416676008,0.0,0.9999999000000099,0.0,4.9054617744684705e-05,7.450579851865842e-07 -0.15221512317027183,0.47850072375687003,0.0,0.9999999000000099,0.0,0.0009310840629279706,2.2053716361522894e-06 -0.15286567806564588,0.4992459117511357,0.0,0.9999999000000099,0.0,0.0008564590551316823,1.7881391644478022e-06 -0.1527749299939791,0.5233755706844581,0.0,0.9999999000000099,0.0,0.000646829540419585,1.2814997345209249e-06 -0.1552143990929229,0.5343093871155387,0.0,0.9999999000000099,0.0,0.00043508406102955773,9.536742210388278e-07 -0.1583091318541778,0.5404465197591412,0.0,0.9999999000000099,0.0,0.00031170245868265936,7.748603045940476e-07 -0.16135191916751312,0.5437005757354516,0.0,0.9999999000000099,0.0,0.00023710725320577857,6.556510269641942e-07 -0.16405349969184582,0.5463762878436055,0.0,0.9999999000000099,0.0,0.00019001958854198645,6.854533463716575e-07 -0.16650310158040102,0.5480272172943116,0.0,0.9999999000000099,0.0,0.00015911458331644692,5.66244068741804e-07 -0.36865776775740927,0.0679339170339606,1.7285345256328755e-06,1.1920927762985348e-07,0.9990654184726695,0.00033336874489188527,0.0 -0.3084666132799212,0.08070036767531395,1.4603136509657052e-06,8.940695822239011e-08,0.9969370560298662,0.0594072282511717,0.0 -0.10737174748929787,0.07947340606282263,0.00010335444370508297,0.0,0.12397943687421206,0.9972814516329388,0.0 -0.13192400335719295,0.10845017431309456,3.0457970434427562e-05,0.0,0.0004237889819741291,0.9999713493780176,0.0 -0.13345679640217345,0.11937114594322829,2.256035579144977e-05,0.0,8.010863456726154e-05,0.9999849392356673,0.0 -0.13652348517806268,0.12410804627200701,2.0444391113519873e-05,0.0,4.82499551206832e-05,0.9999874426304977,0.0 -0.13173821567943575,0.12299588320533343,2.381205320656323e-05,0.0,4.619359508156822e-05,0.9999854756774167,0.0 -0.11838832497106522,0.12007179854244303,3.334879541695151e-05,0.0,5.528330250084455e-05,0.9999776674697319,0.0 -0.11491775512219464,0.11794096229441008,3.862380595207253e-05,0.0,6.130337102115215e-05,0.9999727202847103,0.0 -0.10469293593926841,0.11588373778266213,5.039572211802056e-05,0.0,7.46846124351032e-05,0.9999591900316993,0.0 -0.09728759526803575,0.11350861189805907,6.276368467211785e-05,0.0,9.661911951899624e-05,0.9999379111756425,0.0 -0.0925699472389037,0.11042588947312612,7.68005771130331e-05,0.0,0.00013509391387403146,0.9999034000897685,0.0 -0.11630174517149951,0.02283442020025254,1.1622904568910714e-06,6.258487075567308e-07,0.9992351724840144,2.6941296744346887e-05,2.565979700982596e-05 -0.117679536337748,0.02334383129673819,2.166628620922587e-05,8.940695822239011e-08,0.9999988271165112,4.768371105194139e-07,5.66244068741804e-07 -0.18639835714522052,0.038076221936381625,3.0130144920945468e-05,2.980231940746337e-08,0.9999998403953712,1.3113020539283883e-06,1.4901159703731684e-07 -0.19567710160398852,0.03709095715841313,7.697939102947789e-05,5.960463881492674e-08,0.9999997807907323,7.152556657791209e-07,5.960463881492674e-08 -0.1798187494203495,0.030833899969543152,7.554887969791964e-05,2.980231940746337e-08,0.9999999000000099,4.4703479111195056e-07,0.0 -0.16081818937589398,0.028790891165571698,5.954503417611181e-05,0.0,0.9999997807907323,4.172324717044872e-07,2.3841855525970696e-07 -0.14464861153957317,0.028701275582167243,4.339217705726667e-05,2.980231940746337e-08,0.9999998403953712,4.4703479111195056e-07,2.3841855525970696e-07 -0.13544711470043086,0.029782086605694327,3.2484528154135074e-05,0.0,0.9999997211860935,6.854533463716575e-07,2.9802319407463367e-07 -0.11652976274007833,0.029841482634202835,2.1606681570410942e-05,1.7881391644478022e-07,0.9999996615814547,8.642672628164378e-07,6.556510269641942e-07 -0.08159157633443581,0.03206843137191965,9.208916696906181e-06,7.152556657791209e-07,0.999998290674762,2.264976274967216e-06,3.725289925932921e-06 -0.043046772478228516,0.039231926196056165,2.1457669973373625e-06,8.821486544609158e-06,0.9999468518714647,1.5258787536621245e-05,7.450579851865843e-05 -0.03315582871299782,0.048708975306753305,5.066394299268773e-07,4.711746698319959e-05,0.9984082773297349,7.483362403214052e-05,0.0007666646667569952 -0.1835895478649413,0.6377831696371881,3.2782551348209707e-06,0.9999998403953712,8.940695822239011e-08,2.980231940746337e-08,0.0 -0.17478796838990293,0.4676534830723108,2.980231940746337e-08,0.9999999000000099,0.0,1.919269369840641e-05,5.960463881492674e-08 -0.18150675296031868,0.5712885855650172,0.0,0.9999999000000099,0.0,1.4096497079730174e-05,0.0 -0.17520347236861497,0.6352770923480359,5.960463881492674e-08,0.9999999000000099,0.0,1.1444090652465934e-05,0.0 -0.18072602152076056,0.6443951128809899,5.960463881492674e-08,0.9999999000000099,0.0,1.069903266727935e-05,8.940695822239011e-08 -0.1850274503154433,0.6465629338110996,8.940695822239011e-08,0.9999999000000099,0.0,1.0490416431427107e-05,2.980231940746337e-08 -0.18799132107909924,0.6464197634543737,2.980231940746337e-08,0.9999999000000099,0.0,1.0818241944909203e-05,8.940695822239011e-08 -0.19002044200110385,0.6455999015656286,2.980231940746337e-08,0.9999999000000099,0.0,1.1533497610688325e-05,2.980231940746337e-08 -0.1915709078232595,0.6435397862286095,0.0,0.9999999000000099,0.0,1.2457369512319688e-05,2.980231940746337e-08 -0.19272333382762155,0.641164541134717,2.980231940746337e-08,0.9999999000000099,0.0,1.370906692743315e-05,2.980231940746337e-08 -0.1935566663661918,0.6400398014879979,5.960463881492674e-08,0.9999999000000099,0.0,1.5050171300769002e-05,0.0 -0.1944214999595245,0.6384731530049899,0.0,0.9999999000000099,0.0,1.662969422936456e-05,8.940695822239011e-08 -0.39100864527990603,0.22641879316267569,3.957748017311135e-05,1.4901159703731684e-07,3.418326036036048e-05,0.9999999000000099,2.980231940746337e-06 -0.18271720408636719,0.15214470026272006,2.6375052675605083e-05,0.0,1.3828276205063004e-05,0.9999989463257889,1.4901159703731684e-07 -0.20996809004867872,0.13824728128926972,1.3500450691580906e-05,0.0,5.960463881492674e-06,0.9999987079072337,2.086162358522436e-07 -0.21058613061032916,0.13706254956759453,1.379847388565554e-05,0.0,5.722045326232967e-06,0.9999987079072337,1.7881391644478022e-07 -0.2042048275386177,0.13439637420260309,1.5705822327733197e-05,0.0,5.990266200900137e-06,0.9999985290933172,1.4901159703731684e-07 -0.1873660385531089,0.12819761035631344,2.1308658376336308e-05,0.0,7.182358977198672e-06,0.999997635023735,1.1920927762985348e-07 -0.16515472530634795,0.12090483305768124,3.28719583064321e-05,0.0,9.775160765647985e-06,0.9999956084660152,1.4901159703731684e-07 -0.13773286342050528,0.11385783551173828,5.8054918205738646e-05,0.0,1.5169380578398855e-05,0.9999902440485219,2.980231940746337e-08 -0.0996956825215066,0.11036917565363205,0.0001199245332956326,0.0,2.4795529747009523e-05,0.9999711705641011,0.0 -0.046725243328067045,0.11777025459180258,0.00021189449098706455,8.940695822239011e-08,3.0368563476205174e-05,0.9998687101899782,2.980231940746337e-08 -0.022110372780837998,0.09783405063861236,0.000497043083077674,0.0,0.0006021558636277974,0.993688126377342,9.238719016313645e-07 -0.10519149899047152,0.07080668209770817,2.333521609604382e-05,1.4901159703731684e-07,0.9788732145859756,0.00047376747162044516,2.264976274967216e-06 -0.5243982076427756,0.36304515593987857,0.9999996615814547,8.642672628164378e-07,2.980231940746337e-08,8.940695822239011e-08,4.053115439415018e-06 -0.5924242734663748,0.4200350641485037,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5879620909447395,0.3435937761672084,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5480281114351321,0.34448575967611933,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5718190073730203,0.3451562523250829,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5518996715317125,0.35225617879557736,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5627690553432131,0.3427022694954555,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5590523481137527,0.3478626608252909,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5643817186121893,0.34238755697109535,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5628420114284152,0.34440210455719145,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5686357021096328,0.3410621582877743,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5696069001915628,0.34192141884670924,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.12109705805277067,0.03147754072603999,0.0001248121136784566,8.58306798934945e-05,2.3841855525970696e-07,1.1920927762985348e-07,0.9998693658410053 -0.1746627688335574,0.032311558717916834,0.00013414023965299261,1.3113020539283883e-06,1.7881391644478022e-07,3.874301522970238e-07,0.9999977542330126 -0.18334403633312163,0.033621698612177967,0.000101298083665968,8.642672628164378e-07,1.4901159703731684e-07,6.258487075567308e-07,0.999997277395902 -0.15084716677041085,0.028978943819805852,0.00011205672097206227,1.9073484420776557e-06,0.0,1.4901159703731684e-07,0.9999985290933172 -0.10204431414181644,0.026148468251519168,4.0024514964223304e-05,1.6868112784624266e-05,0.0,2.980231940746337e-08,0.9999991847443441 -0.07936269044547475,0.027550637717297745,1.573562464714066e-05,9.751318910122014e-05,0.0,0.0,0.9999993039536218 -0.08946985005961923,0.045248597852588154,9.208916696906181e-06,0.0005642771156609115,0.0,8.940695822239011e-08,0.9999959660938481 -0.2954143881675466,0.15222123262659856,0.0,0.9934642513539532,0.0,1.4901159703731685e-06,0.9731881837404467 -0.2332540154360507,0.33757841581286124,0.0,0.9999993039536218,0.0,0.0001549720609188095,0.03261580737112495 -0.14335581659677085,0.2933582066987292,0.0,0.9999999000000099,0.0,0.0048559005172938595,0.0003086030174642832 -0.13498011230863502,0.30253195757453866,0.0,0.9999999000000099,0.0,0.004388153114193722,8.365511057674967e-05 -0.13592511414918731,0.32124567026359496,0.0,0.9999999000000099,0.0,0.0032366212946087444,4.5865769568086125e-05 -0.30360829828912506,0.03918588160797506,2.9504296213388737e-06,8.940695822239011e-08,0.999903578903685,2.9027459102869323e-05,8.940695822239011e-08 -0.10067930817187175,0.015111327168738094,2.5153157579899085e-05,8.940695822239011e-08,0.9999946547917942,5.960463881492674e-08,4.768371105194139e-07 -0.13188859819819784,0.027494788165152766,1.7464159172773534e-05,2.3841855525970696e-07,0.9999997211860935,6.258487075567308e-07,3.278255134820971e-07 -0.12569528817610018,0.03217375277921973,2.1010635182261677e-05,1.1920927762985348e-07,0.9999997807907323,1.0132788598537545e-06,5.364417493343406e-07 -0.05247443914196167,0.033791780466015414,4.500150230526969e-06,2.8312203437090202e-06,0.9999900652346054,5.0067896604538464e-06,1.9073484420776555e-05 -0.032526433466518144,0.05344325303116236,4.172324717044872e-07,5.9723848092556595e-05,0.9968458013278405,0.00011670588279962656,0.002587765196469452 -0.05473813414347011,0.05902093647899877,1.1920927762985348e-07,4.929303629994441e-05,0.6321575605520967,0.0003483295092344319,0.08631449074675526 -0.09665215015011162,0.05012965201473147,1.7881391644478022e-07,1.1980532401800274e-05,0.009380190626540873,8.43703662425288e-05,0.8194669261671684 -0.20476585625754284,0.04453492163849222,2.354383233189606e-06,1.3113020539283883e-06,3.0845400586724586e-05,4.887580382823993e-06,0.9993652894105474 -0.23833021520581427,0.03563758730278126,1.5258787536621245e-05,6.258487075567308e-07,1.847743803262729e-06,6.258487075567308e-07,0.999954779288427 -0.2259607911016359,0.032116383308633235,3.0279156517982785e-05,6.258487075567308e-07,5.066394299268773e-07,3.5762783288956044e-07,0.9999793363996188 -0.2223624288943722,0.032327413553424375,4.005431728363077e-05,6.258487075567308e-07,2.9802319407463367e-07,3.5762783288956044e-07,0.9999845220031957 -0.2331560552023664,0.17058303949296122,7.593630985021666e-05,1.1920927762985348e-07,0.00010681151275634872,0.9999993039536218,1.7881391644478022e-07 -0.013956904410737993,0.16635325548184468,0.00028991696319580364,1.7881391644478022e-07,4.6312804359198076e-05,0.9984548285526494,3.5762783288956044e-07 -0.12656462192011325,0.06640937923247908,7.188319441080164e-05,0.0,0.000719636606732018,0.99984397426487,8.940695822239011e-08 -0.15351665019353336,0.11795532701379849,3.6209818080067994e-05,0.0,3.448128355443512e-05,0.9999889923511068,5.960463881492674e-08 -0.14173981546768738,0.11310207841843813,4.410743272304579e-05,0.0,2.5898215565085667e-05,0.9999892903743008,5.960463881492674e-08 -0.14278927444820425,0.11596867440145252,4.2140479642153204e-05,0.0,2.035498415529748e-05,0.9999907208856325,5.960463881492674e-08 -0.15097820758194413,0.1177128851212161,3.647803895473517e-05,0.0,1.6659496548772024e-05,0.9999926878387133,2.980231940746337e-08 -0.15763106941524105,0.1192180812154713,3.269314438998732e-05,0.0,1.4424322593212271e-05,0.999994058745406,0.0 -0.1686539649893543,0.12197652457055926,2.723931993842152e-05,0.0,1.177191616594803e-05,0.9999958468845705,1.4901159703731684e-07 -0.18699893354595248,0.12745976445876522,2.0116565600037775e-05,0.0,8.761881905794231e-06,0.9999973966051797,5.960463881492674e-08 -0.20860201119512814,0.1355776190525595,1.4513729551434662e-05,0.0,6.526707950234478e-06,0.999998588697956,1.1920927762985348e-07 -0.22509288786909737,0.1438631713144006,1.1742113846540568e-05,0.0,5.334615173935943e-06,0.9999991847443441,2.682208746671703e-07 -0.36912578342816627,0.07663801311134281,1.5795229285955586e-06,8.940695822239011e-08,0.9980774119796733,0.0006611942583739823,0.0 -0.3139593005050355,0.35286742442764435,5.6624406874180405e-06,1.1920927762985348e-07,0.0010950862266272416,0.9999999000000099,8.642672628164378e-07 -0.41646724937621815,0.20281586047514324,9.447335252165889e-06,5.960463881492674e-08,2.74181338548663e-06,0.9999971581866245,2.682208746671703e-07 -0.5281027555247023,0.39115700118996294,0.9999914361412983,1.3113020539283883e-06,1.4901159703731684e-07,1.5169380578398855e-05,0.0 -0.40897399185394545,0.41103172295207785,0.9999999000000099,2.682208746671703e-07,1.5497206091880952e-06,0.0,0.0 -0.43627545235734677,0.44842284910152846,0.9999999000000099,1.7881391644478022e-07,2.6226041078567766e-06,0.0,0.0 -0.47409170864049466,0.43367299430096884,0.9999999000000099,1.1920927762985348e-07,1.2516974151134616e-06,0.0,0.0 -0.5049750208645576,0.42315131418611707,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 -0.5351938009040473,0.41480657451202413,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.547998726345259,0.40605747692784416,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5491593479882774,0.39441385858457734,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5500217675934967,0.38126468651918677,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.178149998180642,0.5524811743743899,1.2218950957059981e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 -0.15766158699336477,0.4113773404847488,0.0,0.9999999000000099,0.0,8.761881905794231e-06,0.0 -0.18093869089331036,0.48719128957989055,0.0,0.9999999000000099,0.0,8.910893502831548e-06,0.0 -0.17721486090879962,0.5648369192109888,0.0,0.9999999000000099,0.0,1.1116265138983837e-05,0.0 -0.17725789546232568,0.576964139839558,0.0,0.9999999000000099,0.0,1.0818241944909203e-05,2.980231940746337e-08 -0.17965617775173137,0.5794992445907108,2.980231940746337e-08,0.9999999000000099,0.0,1.0669230347871886e-05,5.960463881492674e-08 -0.18135207890713295,0.5799643396338136,2.980231940746337e-08,0.9999999000000099,0.0,1.0848044264316667e-05,1.1920927762985348e-07 -0.18256425856787986,0.5805535911519621,0.0,0.9999999000000099,0.0,1.1116265138983837e-05,0.0 -0.18361717461779356,0.5801793931921263,5.960463881492674e-08,0.9999999000000099,0.0,1.1682509207725642e-05,8.940695822239011e-08 -0.1844942271633047,0.5801554917295755,0.0,0.9999999000000099,0.0,1.2338160234689835e-05,0.0 -0.1853037178439658,0.5800011753042784,5.960463881492674e-08,0.9999999000000099,0.0,1.3142822858691347e-05,1.1920927762985348e-07 -0.18607604502861091,0.5796789525946778,5.960463881492674e-08,0.9999999000000099,0.0,1.4096497079730174e-05,2.980231940746337e-08 -0.09482771157825723,0.02093791961311391,8.642672628164378e-07,1.4305113315582417e-06,0.9957977729635576,4.0888782227039746e-05,0.0004227459007948679 -0.03603747486918953,0.03363123535534039,1.7881391644478022e-06,9.208916696906181e-06,0.9939415653015832,1.3321636775136126e-05,0.002487122763830448 -0.05418470501675352,0.05660331248267813,1.1920927762985348e-07,3.3974644124508245e-05,0.9126644413949938,0.000311613051724437,0.043062533602300716 -0.06208559870462827,0.05348205565490449,1.4901159703731684e-07,2.8431412714720055e-05,0.2636598681004133,0.0003127455398619206,0.19320342992892459 -0.14346680044533805,0.04821303485998459,8.344649434089744e-07,3.397464412450824e-06,0.0007199644322455,2.226233259737514e-05,0.9911670885740259 -0.22919195889477603,0.03663727640478293,1.4752148106694368e-05,7.152556657791209e-07,3.0100342601538e-06,7.152556657791209e-07,0.9999476267317693 -0.20957037805643142,0.030389934773009677,3.8892026826739695e-05,8.642672628164378e-07,3.278255134820971e-07,2.086162358522436e-07,0.9999851180495838 -0.20678880809881345,0.03133341669499778,5.0038094285131e-05,8.344649434089744e-07,1.4901159703731684e-07,2.9802319407463367e-07,0.9999886943279127 -0.2180428802876785,0.03404763340366997,5.099176850616983e-05,5.960463881492673e-07,1.4901159703731684e-07,5.960463881492673e-07,0.9999876214444141 -0.23082643746373913,0.03611981868125398,4.276632834970993e-05,4.172324717044872e-07,2.086162358522436e-07,9.536742210388278e-07,0.9999860717238048 -0.2423236369986329,0.03711456059774014,3.4093853402138094e-05,3.5762783288956044e-07,4.172324717044872e-07,1.5795229285955586e-06,0.999984760421751 -0.24782297014163945,0.036585837596350576,3.129243537783654e-05,2.9802319407463367e-07,5.66244068741804e-07,1.7285345256328755e-06,0.9999851180495838 -0.12750458716818222,0.46389988056822334,0.7612339093006507,2.086162358522436e-07,0.002523720012062813,0.8157171387346825,0.0 -0.17957457899303725,0.1396562754868739,0.02945819202526539,0.0,0.00010281800195574862,0.9948302108616749,0.0 -0.3048629164569503,0.1619684397896939,2.405047176182294e-05,0.0,7.808207684755402e-06,0.9999996615814547,7.152556657791209e-07 -0.327821850763098,0.19584494825824303,7.301568254828525e-06,0.0,3.0994412183761904e-06,0.9999999000000099,5.632638368010577e-06 -0.331791937337488,0.19470420476440456,5.871056923270284e-06,0.0,2.2053716361522894e-06,0.9999997807907323,6.7055218666792585e-06 -0.33467912672564365,0.18651753660822887,5.155801257491163e-06,0.0,1.5497206091880952e-06,0.9999999000000099,5.930661562085211e-06 -0.3371665477613072,0.17917737361700836,4.6193595081568225e-06,0.0,1.2516974151134616e-06,0.9999997807907323,5.155801257491163e-06 -0.3398882150509284,0.17434555289144107,4.321336314082188e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.678964146971749e-06 -0.341680973754086,0.17161080238264728,4.172324717044872e-06,0.0,1.0132788598537545e-06,0.9999999000000099,4.440545591712042e-06 -0.34535366295338155,0.1688611209103398,4.053115439415018e-06,0.0,1.0132788598537545e-06,0.9999996615814547,4.291533994674725e-06 -0.34647196529861113,0.16770538684834288,3.933906161785165e-06,0.0,9.536742210388278e-07,0.9999997807907323,4.172324717044872e-06 -0.3449637293672771,0.16801631447776047,3.993510800600092e-06,0.0,9.834765404462913e-07,0.9999998403953712,4.112720078229945e-06 -0.7047569751447678,0.41436943404731624,0.9999997807907323,3.8146968841553113e-06,2.9802319407463367e-07,6.258487075567308e-07,2.9504296213388735e-05 -0.5770453214406445,0.4391743838035058,0.9999999000000099,0.0,5.66244068741804e-07,0.0,1.1920927762985348e-07 -0.5902238487952928,0.314694166129585,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 -0.555450201011546,0.3404790758503589,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.582670509791089,0.334249287786469,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5823609232661384,0.3374053239244631,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.5812307595965991,0.3394343256369148,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5852697491403466,0.3391473888770152,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5850951671358067,0.342650115431286,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5852600931878934,0.34344866865952756,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5828932523486053,0.3462028800848372,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5807082652805196,0.3476206361652218,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5058019161014924,0.354716956554708,0.9999996615814547,7.450579851865842e-07,1.1920927762985348e-07,0.0,3.1590458571911173e-06 -0.5516133904228682,0.5520383118637846,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5894885062927293,0.5919586419045563,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.6062744855629693,0.7109869121287729,0.9999999000000099,1.4901159703731684e-07,5.960463881492674e-08,0.0,0.0 -0.6108765005812419,0.7541344760557106,0.9999999000000099,1.4901159703731684e-07,1.4901159703731684e-07,0.0,0.0 -0.44927573202180177,0.486204385674191,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.17146313189750215,0.09077933429117231,0.8576907253881539,0.0,2.324580913782143e-06,0.6928050421277294,0.0 -0.206661224356677,0.10994207857156713,3.85642013132576e-05,0.0,1.2099741679430129e-05,0.9999965025355975,1.4901159703731684e-07 -0.20992881058777338,0.13651740548657215,2.279877434670948e-05,0.0,6.377696353197161e-06,0.9999990655350666,2.9802319407463367e-07 -0.1950652301230721,0.1276786029120206,2.6047227162122984e-05,0.0,5.155801257491163e-06,0.9999982310701231,1.7881391644478022e-07 -0.13854286074064692,0.11235848067267007,7.355212429761959e-05,0.0,1.0639428028464424e-05,0.9999914361412983,0.0 -0.037533581255312275,0.12563094494575747,0.0002551972610861088,8.940695822239011e-08,1.0758637306094277e-05,0.9999156190407257,8.940695822239011e-08 -0.17698213457328374,0.5408892630604569,1.1026858180761447e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 -0.1641105711392159,0.4307878612734325,2.980231940746337e-08,0.9999999000000099,0.0,1.0162590917945008e-05,0.0 -0.17998313903063323,0.48951715222559516,0.0,0.9999999000000099,0.0,9.268521335721107e-06,2.980231940746337e-08 -0.177279204122832,0.5510600208292536,0.0,0.9999999000000099,0.0,1.0788439625501739e-05,1.1920927762985348e-07 -0.17738556861142926,0.5616660117141258,0.0,0.9999999000000099,0.0,1.0669230347871886e-05,2.980231940746337e-08 -0.17913788556310842,0.5644619463907711,5.960463881492674e-08,0.9999999000000099,0.0,1.0490416431427107e-05,1.4901159703731684e-07 -0.18056842683998095,0.5653609632477643,2.980231940746337e-08,0.9999999000000099,0.0,1.0669230347871886e-05,0.0 -0.18163424729548797,0.5655927657112562,2.980231940746337e-08,0.9999999000000099,0.0,1.0937451222539056e-05,0.0 -0.18254891037185084,0.5656794308647447,0.0,0.9999999000000099,0.0,1.1384486013651007e-05,2.980231940746337e-08 -0.1833549141807927,0.5656159519180698,0.0,0.9999999000000099,0.0,1.20401370406152e-05,8.940695822239011e-08 -0.18410187958908697,0.5653424262032424,2.980231940746337e-08,0.9999999000000099,0.0,1.272559038698686e-05,0.0 -0.184804409734703,0.5649504660592665,2.980231940746337e-08,0.9999999000000099,0.0,1.3589857649803297e-05,8.940695822239011e-08 -0.3669686317291894,0.08810546992700614,1.4603136509657052e-06,2.086162358522436e-07,0.9950912791796843,0.0016730128045767713,0.0 -0.12763532995649163,0.07660093902229888,7.483362403214052e-05,0.0,0.24678585445654638,0.9968136744275192,0.0 -0.17503252624740623,0.150766640875749,1.433491563498988e-05,0.0,0.00026610490998924045,0.9999975158144573,0.0 -0.23378214239106118,0.17712938782519902,4.261731675267262e-06,0.0,1.803040324151534e-05,0.999999542372177,2.3841855525970696e-07 -0.27500957249456337,0.22202146049512422,3.2186504960060438e-06,0.0,1.2069939360022665e-05,0.9999999000000099,1.1622904568910714e-06 -0.3006642460698561,0.2647744416737165,3.5166736900806776e-06,0.0,1.3321636775136126e-05,0.9999999000000099,4.678964146971749e-06 -0.32837289570402367,0.260846197560467,3.3378597736358976e-06,0.0,9.924172362685302e-06,0.9999999000000099,6.079673159122528e-06 -0.3841363191445552,0.19292846318756018,2.65240642726424e-06,0.0,2.8908249825239467e-06,0.9999997807907323,1.6689298868179488e-06 -0.4984640478881427,0.2551124095479906,9.271501567661854e-05,5.960463881492674e-08,1.4901159703731685e-06,0.9999383880127529,8.940695822239011e-08 -0.5338206887024135,0.44616234294880885,0.9999998403953712,4.172324717044872e-07,4.768371105194139e-07,2.3841855525970696e-07,0.0 -0.44329753516268955,0.43407851450162876,0.9999999000000099,3.5762783288956044e-07,3.397464412450824e-06,0.0,0.0 -0.44519370792452817,0.46409174791972246,0.9999999000000099,1.1920927762985348e-07,4.529952549934432e-06,0.0,0.0 -0.15059125422807831,0.10257208345564162,8.755921441912738e-05,0.0,0.05968659519329726,0.96904864157475,0.0 -0.06676366924963109,0.08463916181068686,1.9073484420776555e-05,8.940695822239011e-08,0.9956906038229684,0.00010466574575901135,3.5762783288956044e-07 -0.1803475618287749,0.01712539791767605,3.212690032124551e-05,0.0,0.9999960853031258,1.1920927762985348e-07,1.7881391644478022e-07 -0.21809002756169388,0.03549453615534482,8.821486544609157e-05,0.0,0.9999997807907323,7.152556657791209e-07,8.940695822239011e-08 -0.20206731557009353,0.030633121723651627,0.00014376638882160328,0.0,0.9999997807907323,4.172324717044872e-07,8.940695822239011e-08 -0.16701370476984825,0.02529159187837488,9.873508419692615e-05,0.0,0.9999997211860935,2.9802319407463367e-07,1.7881391644478022e-07 -0.12178742885085304,0.023187398906551963,4.607438580393837e-05,8.940695822239011e-08,0.9999996615814547,3.5762783288956044e-07,5.066394299268773e-07 -0.046874552963223216,0.0321667790357822,6.109475478529991e-06,2.8312203437090202e-06,0.9999827338640312,5.871056923270284e-06,4.1604037892818864e-05 -0.03320521116119218,0.05382460354837001,5.66244068741804e-07,5.2809709990025094e-05,0.9932291706584672,0.0001502632944524303,0.006109058246058286 -0.06262707710006789,0.056314200153244606,1.7881391644478022e-07,2.9742714768648444e-05,0.3169531505251439,0.0003062188319116861,0.26840994058149126 -0.13519865273869494,0.046225905410480495,8.344649434089744e-07,3.844499203562775e-06,0.0007248818149477315,2.601742484271552e-05,0.9879603590057828 -0.2333788573645276,0.037435054772642536,1.2606381109357005e-05,6.258487075567308e-07,3.2782551348209707e-06,1.1026858180761447e-06,0.9999330235952596 -0.18219274281701026,0.6081612109096554,2.354383233189606e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.16794681548376836,0.4423452316957241,2.980231940746337e-08,0.9999999000000099,0.0,1.4513729551434662e-05,5.960463881492674e-08 -0.18271049856383023,0.523775637060122,0.0,0.9999999000000099,0.0,1.2814997345209249e-05,2.980231940746337e-08 -0.1758367121146825,0.5892357825223932,5.960463881492674e-08,0.9999999000000099,0.0,1.1950730082392812e-05,0.0 -0.1782613992617226,0.5992655753063202,2.980231940746337e-08,0.9999999000000099,0.0,1.123547441661369e-05,0.0 -0.18112254142011242,0.6011656521721448,2.980231940746337e-08,0.9999999000000099,0.0,1.1026858180761447e-05,0.0 -0.18314257263378916,0.6004328726694016,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,1.1920927762985348e-07 -0.18451771139334525,0.5998147725031866,0.0,0.9999999000000099,0.0,1.150369529128086e-05,0.0 -0.1855715811175753,0.6000111102030431,5.960463881492674e-08,0.9999999000000099,0.0,1.2129543998837591e-05,2.980231940746337e-08 -0.1865460872572902,0.5996913908885227,2.980231940746337e-08,0.9999999000000099,0.0,1.2934206622839103e-05,2.980231940746337e-08 -0.18745049833475214,0.5989313124584771,8.940695822239011e-08,0.9999999000000099,0.0,1.3947485482692857e-05,0.0 -0.18826749920065458,0.5982649921346471,5.960463881492674e-08,0.9999999000000099,0.0,1.5020368981361538e-05,2.980231940746337e-08 -0.13575428723726812,0.022815793748763424,1.370906692743315e-06,1.1920927762985347e-06,0.858683619461533,5.459784915447289e-05,0.07352399090809895 -0.1532660424645856,0.05159631370614598,2.65240642726424e-06,1.1920927762985347e-06,0.035670068273279426,2.6762482827902106e-05,0.985176762768487 -0.20192793010829205,0.04883781074641325,4.768371105194139e-07,9.536742210388278e-07,0.0019802151130289035,8.41319476872691e-05,0.9968784050652723 -0.21500787138048605,0.0477463304914732,8.046626240015109e-07,7.748603045940476e-07,0.0003052651576906473,3.632902735769785e-05,0.9989846541870753 -0.25384977458856395,0.04397237300119841,3.069638898968727e-06,4.768371105194139e-07,3.576278328895604e-05,9.298323655128571e-06,0.9998663856090645 -0.26151019333710235,0.0388812422685802,8.22544015645989e-06,3.278255134820971e-07,8.165835517644963e-06,3.1590458571911173e-06,0.9999572230786185 -0.248982757319631,0.03520944713943294,1.776218236684817e-05,3.5762783288956044e-07,2.4735925108194595e-06,1.2218950957059981e-06,0.9999776078650932 -0.23660203813526814,0.03343701362037304,2.9236075338721565e-05,3.874301522970238e-07,9.238719016313645e-07,7.152556657791209e-07,0.9999849988403062 -0.22899514435773585,0.03293955325516281,3.94582708954815e-05,4.768371105194139e-07,4.4703479111195056e-07,6.854533463716575e-07,0.9999880982815246 -0.22919350861554014,0.033634006971321975,4.33623747378592e-05,3.874301522970238e-07,3.5762783288956044e-07,7.748603045940476e-07,0.9999886943279127 -0.22936883567813968,0.03383812307732035,4.667043219208764e-05,4.172324717044872e-07,3.278255134820971e-07,8.344649434089744e-07,0.9999891711650233 -0.23217874764434718,0.034259110683296845,4.601478116512344e-05,3.278255134820971e-07,3.5762783288956044e-07,8.940695822239011e-07,0.9999890519557456 -0.6373463868830938,0.3969355820929804,0.9999996615814547,2.324580913782143e-06,1.1920927762985348e-07,2.682208746671703e-07,1.5527008411288415e-05 -0.5514809489021827,0.4518413542927461,0.9999999000000099,0.0,3.278255134820971e-07,0.0,2.980231940746337e-08 -0.5774111151456158,0.3160485326702619,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5510131120453601,0.3388211428538929,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5793401598690467,0.33364510530480673,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5767343044042194,0.341363280953128,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5829478502032174,0.33827924722601027,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5855602621789698,0.3424698113808713,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5853796005006631,0.34534317249106655,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.588635504221384,0.34621763223441654,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5900231599563424,0.3486818670629436,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5945671200506061,0.3494172691700564,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.0941376686057211,0.10137212274722893,1.5497206091880952e-06,0.9999977542330126,0.0,0.0,2.324580913782143e-06 -0.10465961694284034,0.47609901420070166,8.940695822239011e-08,0.9999999000000099,0.0,6.258487075567308e-07,0.0 -0.1758270561622293,0.38692933314373557,0.0,0.9999999000000099,0.0,1.671910118758695e-05,2.980231940746337e-08 -0.17354941367384397,0.4881722032187912,0.0,0.9999999000000099,0.0,2.0384786474704945e-05,2.980231940746337e-08 -0.18122401832783833,0.5120397805290811,0.0,0.9999999000000099,0.0,4.0978189185262135e-05,5.960463881492674e-08 -0.17662617563469984,0.5229487418232946,0.0,0.9999999000000099,0.0,3.260373743176492e-05,8.940695822239011e-08 -0.17836984991288693,0.5267192720464954,0.0,0.9999999000000099,0.0,2.9474493893981274e-05,8.940695822239011e-08 -0.17947232722492928,0.5290668605852169,0.0,0.9999999000000099,0.0,2.6911494424939423e-05,8.940695822239011e-08 -0.1807138025685821,0.5306965111777419,0.0,0.9999999000000099,0.0,2.5302169176936402e-05,2.980231940746337e-08 -0.18186995386324248,0.5320515631718336,0.0,0.9999999000000099,0.0,2.4378297275305036e-05,0.0 -0.18296998738484915,0.5331404208224039,0.0,0.9999999000000099,0.0,2.3901460164785624e-05,8.940695822239011e-08 -0.18401378392411258,0.5340155362168464,0.0,0.9999999000000099,0.0,2.381205320656323e-05,2.980231940746337e-08 -0.11402010917191442,0.10459363458749761,0.0002829432204544572,0.0,0.002808749394875793,0.999494273848943,0.0 -0.3455273210859275,0.3073641657302969,7.301568254828525e-06,2.980231940746337e-08,4.443525823652788e-05,0.9999999000000099,8.31484711468228e-06 -0.385982304795495,0.25767377014516246,1.71661359786989e-05,0.0,4.559754869341896e-06,0.999999542372177,7.748603045940476e-07 -0.49712947008935454,0.30240058893747623,0.12005369654794455,1.1920927762985348e-07,2.086162358522436e-07,0.7432610245355918,0.0 -0.612539291356472,0.41479599468757833,0.9999999000000099,1.4901159703731684e-07,8.940695822239011e-08,0.0,0.0 -0.5362061261908706,0.4253163038956005,0.9999999000000099,0.0,3.278255134820971e-07,0.0,0.0 -0.5659934282068492,0.3973917662416907,0.9999999000000099,0.0,9.238719016313645e-07,0.0,0.0 -0.5601038336521919,0.3956154882230435,0.9999999000000099,0.0,6.258487075567308e-07,0.0,8.940695822239011e-08 -0.5614007115131611,0.3920938967987045,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 -0.5597599148518521,0.3938018678944508,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5552877783545397,0.39240103953317945,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5575836300619031,0.38376516097173097,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.43777379391764853,0.2545709013502989,6.911157870590756e-05,2.086162358522436e-07,3.0487772753835027e-05,0.9999999000000099,5.57303372919565e-06 -0.18548449873156206,0.16272884604528573,3.5673376330733654e-05,0.0,1.981854240596314e-05,0.9999994231628994,2.682208746671703e-07 -0.23840472101178042,0.15425238010626174,1.0758637306094277e-05,0.0,4.768371105194139e-06,0.999999542372177,5.66244068741804e-07 -0.2451580166715197,0.1564984023303034,1.0043381640315155e-05,0.0,4.142522397637409e-06,0.9999996615814547,6.556510269641942e-07 -0.24615600704127513,0.15860307213928446,1.0311602514982325e-05,0.0,4.2319293558597985e-06,0.9999996019768158,7.152556657791209e-07 -0.2484774589435685,0.16146227714634795,1.034140483438979e-05,0.0,4.261731675267262e-06,0.9999996615814547,9.238719016313645e-07 -0.24913927911680467,0.16280260679318265,1.0490416431427107e-05,0.0,4.291533994674725e-06,0.9999997211860935,9.238719016313645e-07 -0.24115708469345964,0.15567168590741032,1.1563299930095787e-05,0.0,4.172324717044872e-06,0.999999542372177,7.152556657791209e-07 -0.22866407035834463,0.14567479488739363,1.3470648372173444e-05,0.0,4.142522397637409e-06,0.9999993039536218,4.768371105194139e-07 -0.21018838881575946,0.13535204527444566,1.7553566130995923e-05,0.0,4.678964146971749e-06,0.9999987079072337,2.9802319407463367e-07 -0.1851658821029284,0.12544146178004895,2.6762482827902106e-05,0.0,6.1690801173449175e-06,0.9999975158144573,1.7881391644478022e-07 -0.15677362679786017,0.11668074129013979,4.610418812334583e-05,0.0,9.506939890980815e-06,0.9999945355825166,8.940695822239011e-08 -0.08856508135428864,0.3079096674391879,0.9999725414707938,3.874301522970238e-07,0.0001451372955143466,9.268521335721107e-06,0.0 -0.6863077878667841,0.5410124658611866,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5602947473293995,0.7645087240817358,0.9999999000000099,1.4901159703731684e-07,5.960463881492674e-08,0.0,0.0 -0.5434399246944468,0.6051813362992647,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.46601653097130386,0.2064712047223353,0.9999497724987666,5.960463881492674e-08,0.0,0.0019003448970169017,5.960463881492674e-08 -0.4644672274397213,0.1249950527930801,6.0170882883668546e-05,5.960463881492674e-08,3.874301522970238e-07,0.999996979372708,5.066394299268773e-07 -0.334505796418644,0.1633710562903082,6.079673159122528e-06,0.0,1.8179414838552655e-06,0.9999997807907323,2.712011066079167e-06 -0.31627917288424245,0.19022390243133994,5.871056923270284e-06,0.0,1.9073484420776557e-06,0.9999997807907323,5.900859242677747e-06 -0.30838292835866,0.1797111034085582,5.602836048603113e-06,0.0,1.4305113315582417e-06,0.9999997807907323,4.321336314082188e-06 -0.2956192791339535,0.17035439607564196,6.0200685203076e-06,0.0,1.4007090121507783e-06,0.9999997807907323,3.0100342601538e-06 -0.2784488797072506,0.1635452210623121,7.659196087718087e-06,0.0,1.7583368450403388e-06,0.9999997807907323,1.996755400300046e-06 -0.261662006367339,0.1586502492156161,9.953974682092765e-06,0.0,2.5331971496343865e-06,0.9999996615814547,1.3113020539283883e-06 -0.15502533315970318,0.027641177172696058,4.339217705726667e-05,0.7074935324801694,0.0,0.0,0.8728468737367359 -0.17629164456591181,0.1477668881163292,0.008607625100541201,2.0563600391149723e-06,0.0,8.493661031127061e-06,0.999860425145183 -0.27392953633127803,0.1501715779047358,1.7881391644478022e-07,8.165835517644963e-06,0.0,0.019940940531769594,0.9990053369967441 -0.17735144495229677,0.06696847080037652,0.00024902818096876394,3.874301522970238e-07,0.0,6.467103311419552e-06,0.9999798728413681 -0.233582705249651,0.0417907833981479,3.865360827147999e-05,4.768371105194139e-07,2.086162358522436e-07,2.5331971496343865e-06,0.99998279346867 -0.24043351410823877,0.03742119669273463,4.598497884571598e-05,2.9802319407463367e-07,3.278255134820971e-07,1.8179414838552655e-06,0.9999869657933871 -0.25082623957549033,0.036519229405825485,3.2484528154135074e-05,2.682208746671703e-07,6.258487075567308e-07,2.1159646779298993e-06,0.9999861909330825 -0.2544066905869998,0.03608036040641943,2.9772517088055905e-05,2.086162358522436e-07,8.046626240015109e-07,2.175569316744826e-06,0.9999861909330825 -0.2562805712116933,0.03589639067035169,2.8282401117682738e-05,2.086162358522436e-07,9.238719016313645e-07,2.175569316744826e-06,0.9999861909330825 -0.25658553837667397,0.03573924302442828,2.8014180243015567e-05,2.3841855525970696e-07,9.834765404462913e-07,2.2053716361522894e-06,0.9999861909330825 -0.2540223002328592,0.035175144666370575,3.030895883739025e-05,2.3841855525970696e-07,8.642672628164378e-07,1.9073484420776557e-06,0.9999869061887483 -0.2507212459937228,0.03468167781235962,3.308057454228434e-05,2.3841855525970696e-07,7.152556657791209e-07,1.5795229285955586e-06,0.9999873830258588 -0.3369945883611374,0.03299626707465689,1.2844799664616713e-05,3.278255134820971e-07,0.0027446744081497465,2.8342005756497666e-05,0.9983255460910598 -0.3179361224042849,0.045639872543149204,1.519918289780632e-06,1.1920927762985348e-07,0.0016677079917222428,6.633996300101346e-05,0.9996394111444572 -0.16223064064307793,0.040286034338728446,2.086162358522436e-07,8.344649434089744e-07,0.019763527324336963,0.0002776086052805213,0.9737479905081965 -0.070224702355338,0.04140123724228504,1.4901159703731684e-07,6.288289394974771e-06,0.24664468086951322,0.0003453492772936855,0.256853405777901 -0.050102204082321744,0.04425069688992944,2.086162358522436e-07,1.5676020008325733e-05,0.405225027808262,0.00025209781986773263,0.09025855949945838 -0.057905763385282305,0.046627700320842604,1.7881391644478022e-07,1.4990566661954075e-05,0.18430895750408655,0.00027716157048940935,0.24160573450641873 -0.06786346435265868,0.0460932254712332,1.7881391644478022e-07,1.1801718485355495e-05,0.05489590215086693,0.0002664327355027225,0.45514963486108934 -0.0793218612638053,0.04531756042658147,2.086162358522436e-07,8.40425407290467e-06,0.015101610104066283,0.0002008676328063031,0.7066767701144885 -0.10235795378261156,0.04467588662336188,3.5762783288956044e-07,4.589557188749359e-06,0.0027226802964270386,0.00011315940679013842,0.9339767356542978 -0.13734921812442438,0.044233143322046094,6.854533463716575e-07,2.264976274967216e-06,0.00048699970143735894,6.237625451982083e-05,0.9897965395091155 -0.17800858616091825,0.04313161968446311,1.4007090121507783e-06,1.0132788598537545e-06,0.00011181830241680256,3.087520290613205e-05,0.9983402684368471 -0.21382975577422683,0.04193431138274247,2.1457669973373625e-06,5.066394299268773e-07,4.643201363682793e-05,1.9311902976036264e-05,0.9995259239121537 -0.35285985468357,0.2762374281410224,0.9999998403953712,5.960463881492674e-08,8.940695822239011e-08,0.0,3.5762783288956044e-07 -0.708193898171664,0.4433244466022489,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.578341841673745,0.3817870616259088,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,0.0 -0.6004846095790171,0.3056907057238696,0.9999999000000099,0.0,4.172324717044872e-07,0.0,0.0 -0.5984557866802364,0.3419452309022929,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.1920927762985348e-07 -0.5897213220352123,0.3417226969610621,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5910774469130858,0.3444719910031786,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5898447036498923,0.34530854219245793,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5926091670744604,0.34458392852604763,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 -0.5938805937521117,0.345032483280228,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5943833589307712,0.3460816740397072,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5950004458181053,0.3473128973842992,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.18333372472957593,0.6318634151330442,3.039836579561264e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 -0.1773194968626985,0.4792903660907192,0.0,0.9999999000000099,0.0,1.946091457307358e-05,5.960463881492674e-08 -0.18155521153651907,0.5686479209879851,0.0,0.9999999000000099,0.0,1.3858078524470467e-05,1.1920927762985348e-07 -0.1761798560546402,0.6254060267331185,8.940695822239011e-08,0.9999999000000099,0.0,1.1473892971873398e-05,2.980231940746337e-08 -0.1807415783330463,0.633083939443901,0.0,0.9999999000000099,0.0,1.0788439625501739e-05,0.0 -0.18441429733466422,0.6343778370724635,0.0,0.9999999000000099,0.0,1.069903266727935e-05,0.0 -0.1868911981505254,0.6344410776005593,5.960463881492674e-08,0.9999999000000099,0.0,1.087784658372413e-05,1.1920927762985348e-07 -0.18863928317242568,0.6341705321179703,0.0,0.9999999000000099,0.0,1.1533497610688325e-05,0.0 -0.19003713130164027,0.6330140828002361,0.0,0.9999999000000099,0.0,1.2367962554097299e-05,1.1920927762985348e-07 -0.19111400841875265,0.6322691439499608,0.0,0.9999999000000099,0.0,1.344084605276598e-05,2.980231940746337e-08 -0.19211322068372594,0.6308995484225465,2.980231940746337e-08,0.9999999000000099,0.0,1.4752148106694368e-05,8.940695822239011e-08 -0.19302523135339641,0.6290391086454907,8.940695822239011e-08,0.9999999000000099,0.0,1.6242264077067537e-05,1.1920927762985348e-07 -0.14624929427495,0.45395895830964117,0.4470079392221644,1.4901159703731684e-07,0.0017921922798872173,0.9706621391474701,0.0 -0.11974793672065796,0.10468691585655512,0.0006306170786619249,0.0,0.0003737508876889981,0.9999849988403062,0.0 -0.27608859537888764,0.24628192182138378,1.4781950426101832e-05,0.0,1.4364717954397344e-05,0.9999999000000099,9.119509738683792e-06 -0.29069969056833084,0.22201949354184697,9.119509738683792e-06,0.0,4.559754869341896e-06,0.9999998403953712,8.374451753497206e-06 -0.29834038017944936,0.20931971069566346,7.539986810088233e-06,0.0,3.2782551348209707e-06,0.9999998403953712,6.973742741346429e-06 -0.2973579168196573,0.1991729139940623,7.122754338383746e-06,0.0,2.74181338548663e-06,0.9999997807907323,5.543231409788187e-06 -0.2932863831398637,0.19145825501978214,7.122754338383746e-06,0.0,2.5331971496343865e-06,0.9999999000000099,4.410743272304579e-06 -0.2871683239817919,0.18625918027549418,7.599591448903159e-06,0.0,2.65240642726424e-06,0.9999999000000099,3.695487606525458e-06 -0.27917402981555794,0.18198820945484492,8.40425407290467e-06,0.0,2.8312203437090202e-06,0.9999998403953712,2.980231940746337e-06 -0.2716295719034253,0.17912775275024134,9.477137571573351e-06,0.0,3.2484528154135075e-06,0.9999998403953712,2.5331971496343865e-06 -0.2674655914195889,0.17946609851625092,1.0371207153797252e-05,0.0,3.635882967710531e-06,0.9999998403953712,2.3841855525970694e-06 -0.2634768783937073,0.17827528712080967,1.096725354194652e-05,0.0,3.8146968841553113e-06,0.9999999000000099,2.264976274967216e-06 -0.1835406720562275,0.6368787287575212,3.2186504960060438e-06,0.9999998403953712,5.960463881492674e-08,0.0,0.0 -0.17831230162835868,0.4838718175059503,2.980231940746337e-08,0.9999999000000099,0.0,2.0325181835890017e-05,1.1920927762985348e-07 -0.18174996971331459,0.5656617878898942,0.0,0.9999999000000099,0.0,1.4275310996174954e-05,0.0 -0.17665612696869826,0.6178444622889177,5.960463881492674e-08,0.9999999000000099,0.0,1.1861323124170421e-05,8.940695822239011e-08 -0.18052810429779206,0.6256697176815597,0.0,0.9999999000000099,0.0,1.1056660500168911e-05,0.0 -0.18383464216424755,0.6272473334192046,5.960463881492674e-08,0.9999999000000099,0.0,1.0788439625501739e-05,1.1920927762985348e-07 -0.18610948323432852,0.628009974848975,2.980231940746337e-08,0.9999999000000099,0.0,1.1056660500168911e-05,1.1920927762985348e-07 -0.18781918286499505,0.62777900685051,0.0,0.9999999000000099,0.0,1.150369529128086e-05,8.940695822239011e-08 -0.1891602873723858,0.6271591185449521,0.0,0.9999999000000099,0.0,1.2397764873504761e-05,2.980231940746337e-08 -0.19028559326337618,0.6259781121135747,0.0,0.9999999000000099,0.0,1.335143909454359e-05,2.980231940746337e-08 -0.1912415623585667,0.6246929763677925,2.980231940746337e-08,0.9999999000000099,0.0,1.4722345787286905e-05,2.980231940746337e-08 -0.1921081840912426,0.6232268809205034,5.960463881492674e-08,0.9999999000000099,0.0,1.609325248003022e-05,2.980231940746337e-08 -0.7127457856836826,0.41657966368217647,0.9999997807907323,4.0829177588224814e-06,2.682208746671703e-07,6.556510269641942e-07,3.182887712717088e-05 -0.5057728290348432,0.4604211448834705,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 -0.5887072086090458,0.3013795315703262,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5343501567619313,0.3490548133252393,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5777157544850503,0.32550805801539806,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5656360387567907,0.3427501916298467,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5773602723836245,0.33003318304132606,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 -0.5772067904233342,0.33652049297292397,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.5826902985331536,0.3347706794165525,0.9999999000000099,0.0,0.0,0.0,8.940695822239011e-08 -0.5853489637132498,0.33663082117038434,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5858293175454747,0.3394652008429031,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5896389484161362,0.34071230882532505,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.18195366858682605,0.6032232045094389,2.2351739555597527e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.18357715009882852,0.5222910641729556,5.960463881492674e-08,0.9999999000000099,0.0,1.8060205560922803e-05,8.940695822239011e-08 -0.18062016367164385,0.6044594644465137,2.980231940746337e-08,0.9999999000000099,0.0,1.1652706888318178e-05,2.980231940746337e-08 -0.17836624383187816,0.6545202730965413,2.980231940746337e-08,0.9999999000000099,0.0,9.894370043277838e-06,1.1920927762985348e-07 -0.1839384436531196,0.6615464686214612,2.980231940746337e-08,0.9999999000000099,0.0,9.506939890980815e-06,8.940695822239011e-08 -0.18825727700407602,0.6621408461390597,2.980231940746337e-08,0.9999999000000099,0.0,9.566544529795742e-06,8.940695822239011e-08 -0.19105079769297098,0.6617074011623272,0.0,0.9999999000000099,0.0,1.0192393237352472e-05,2.980231940746337e-08 -0.1929609775463312,0.6607804893315838,2.980231940746337e-08,0.9999999000000099,0.0,1.0997055861353983e-05,0.0 -0.1943790316501238,0.6596050857368144,8.940695822239011e-08,0.9999999000000099,0.0,1.2129543998837591e-05,8.940695822239011e-08 -0.19557914137030422,0.6574323772258339,0.0,0.9999999000000099,0.0,1.353025301098837e-05,8.940695822239011e-08 -0.19657209514757634,0.6546673177551771,0.0,0.9999999000000099,0.0,1.5139578258991392e-05,8.940695822239011e-08 -0.19741550087111318,0.6514689325170773,5.960463881492674e-08,0.9999999000000099,0.0,1.7046926701069047e-05,8.940695822239011e-08 -0.14782026409490753,0.39451318972507854,2.9802319407463367e-07,0.9999999000000099,0.0,0.0,0.0 -0.1323705315535093,0.37946999066530707,5.960463881492674e-08,0.9999999000000099,0.0,1.7881391644478022e-06,0.0 -0.1380302309932774,0.38316616409416326,2.980231940746337e-08,0.9999999000000099,0.0,6.854533463716575e-07,0.0 -0.1777615249083345,0.4705206452994505,0.0,0.9999999000000099,0.0,4.053115439415018e-06,0.0 -0.17934411763402275,0.5061478613940426,2.980231940746337e-08,0.9999999000000099,0.0,8.67247494757184e-06,0.0 -0.1766432523654273,0.531021892933515,5.960463881492674e-08,0.9999999000000099,0.0,8.821486544609158e-06,5.960463881492674e-08 -0.1783135533258989,0.5425268410707356,2.980231940746337e-08,0.9999999000000099,0.0,9.387730613350962e-06,0.0 -0.17958348988743078,0.5459004043598003,2.980231940746337e-08,0.9999999000000099,0.0,9.834765404462912e-06,2.980231940746337e-08 -0.18081316351141857,0.5464524625796154,8.940695822239011e-08,0.9999999000000099,0.0,1.0251997876167399e-05,0.0 -0.18177759646616684,0.5474238990799983,2.980231940746337e-08,0.9999999000000099,0.0,1.0848044264316667e-05,0.0 -0.18262204527098722,0.5473627447144693,2.980231940746337e-08,0.9999999000000099,0.0,1.1354683694243543e-05,1.1920927762985348e-07 -0.18337357043460661,0.5475779770867164,0.0,0.9999999000000099,0.0,1.2010334721207738e-05,8.940695822239011e-08 -0.18279820679861358,0.6201445459257614,2.682208746671703e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 -0.16356927155771062,0.4285602866869456,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 -0.18219688533982198,0.4986147283653948,0.0,0.9999999000000099,0.0,1.2576578789949543e-05,2.980231940746337e-08 -0.17649060487016385,0.5596727131838884,0.0,0.9999999000000099,0.0,1.272559038698686e-05,5.960463881492674e-08 -0.1770740151332012,0.575659155747069,2.980231940746337e-08,0.9999999000000099,0.0,1.1831520804762957e-05,5.960463881492674e-08 -0.17897734045241256,0.5881935953086739,1.1920927762985348e-07,0.9999999000000099,0.0,1.1205672097206226e-05,1.1920927762985348e-07 -0.1809724867268966,0.5969959496429516,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,1.1920927762985348e-07 -0.18305206298070148,0.5990891455578152,2.980231940746337e-08,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 -0.184704005710583,0.5991080402302058,0.0,0.9999999000000099,0.0,1.1980532401800274e-05,2.980231940746337e-08 -0.1859284341258308,0.5990177987980313,8.940695822239011e-08,0.9999999000000099,0.0,1.2695788067579396e-05,1.1920927762985348e-07 -0.18693488835514396,0.599051654236258,8.940695822239011e-08,0.9999999000000099,0.0,1.3500450691580906e-05,8.940695822239011e-08 -0.1878760456961084,0.5983812807965839,0.0,0.9999999000000099,0.0,1.4662741148471979e-05,0.0 -0.2831676602246333,0.32749396556968446,0.0028762516483336973,1.7881391644478022e-07,0.00016885994176268746,0.9999954892567376,2.3841855525970696e-07 -0.7791748046552361,0.522037625223414,0.9999999000000099,8.940695822239011e-08,2.682208746671703e-07,7.152556657791209e-07,0.0 -0.6280127763488123,0.3891345857907578,0.9999999000000099,0.0,9.536742210388278e-07,0.0,0.0 -0.5984227061023873,0.39499461644084694,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,0.0 -0.5684668421509911,0.3872901200584992,0.9999999000000099,0.0,8.940695822239011e-07,0.0,8.940695822239011e-08 -0.5846990346666459,0.3727042078333662,0.9999999000000099,0.0,6.556510269641942e-07,0.0,8.940695822239011e-08 -0.5933113693945302,0.36633998149320846,0.9999999000000099,0.0,4.768371105194139e-07,0.0,1.4901159703731684e-07 -0.5949624776593849,0.36778250330349305,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 -0.5976475476971156,0.3624913989876877,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,2.980231940746337e-08 -0.5984320640316168,0.36201775067806113,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,1.1920927762985348e-07 -0.601152658437632,0.35841959708752125,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 -0.6025096773851771,0.3579801320416675,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.6978116631218926,0.4125581382998695,0.9999997211860935,3.725289925932921e-06,2.3841855525970696e-07,6.258487075567308e-07,2.732872689664391e-05 -0.5527924299011213,0.4374901651586984,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,1.4901159703731684e-07 -0.5872482061142942,0.3080489634940041,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,1.4901159703731684e-07 -0.540054857708503,0.34469413751421846,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.575534820532809,0.33037346595829054,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5702965855362303,0.3398871421231959,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5759192704915944,0.33325982088104456,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5730339288474268,0.33793833846027577,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5752532481909017,0.33777400845465816,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.4901159703731684e-07 -0.5780731439351087,0.33829909557271703,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5812129974124567,0.33917066449079597,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5852373242135901,0.33976387971782146,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.09664675592975967,0.020926117893450405,8.642672628164378e-07,1.6391275674104854e-06,0.9908481441517273,4.7415490177274224e-05,0.0013836918877691167 -0.27808207272331803,0.053408265104685194,1.4960764342546611e-05,2.980231940746337e-08,0.9999997211860935,1.0550021070242033e-05,1.4901159703731684e-07 -0.3011341392869234,0.04744237660549314,2.6822087466717034e-05,5.960463881492674e-08,0.9999997807907323,2.8312203437090202e-06,0.0 -0.27928626536166534,0.03807744383159931,5.2809709990025094e-05,0.0,0.9999997807907323,9.834765404462913e-07,0.0 -0.27125012873480087,0.03652858733505362,6.62207537233836e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 -0.25388211010835326,0.03340235351944209,0.00010505317591130837,0.0,0.9999999000000099,4.768371105194139e-07,0.0 -0.24752637742924938,0.03354564308545759,0.00011438130188584441,0.0,0.9999998403953712,3.874301522970238e-07,2.980231940746337e-08 -0.238189458837183,0.03266239165700471,0.0001287162175208343,0.0,0.9999999000000099,4.172324717044872e-07,0.0 -0.22783762215624567,0.031701862806613766,0.00013387201877832546,0.0,0.9999997807907323,3.874301522970238e-07,8.940695822239011e-08 -0.2126180529506381,0.03010469674548589,0.0001315772401839508,0.0,0.9999997807907323,3.5762783288956044e-07,2.980231940746337e-08 -0.1935850381771037,0.02860888838278121,0.000115126359871031,0.0,0.9999997211860935,3.278255134820971e-07,5.960463881492674e-08 -0.17696762084228154,0.028433263296980593,9.402631773054693e-05,0.0,0.9999998403953712,3.874301522970238e-07,1.1920927762985348e-07 -0.1829049587174019,0.6224090455896802,2.7716157048940933e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 -0.17626327275499992,0.4744635223529898,0.0,0.9999999000000099,0.0,1.8447635713219826e-05,5.960463881492674e-08 -0.18194162844858192,0.5543415545468009,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,2.980231940746337e-08 -0.17642197012170782,0.6083225606830347,5.960463881492674e-08,0.9999999000000099,0.0,1.1742113846540568e-05,8.940695822239011e-08 -0.17991700767725768,0.6149494646926726,5.960463881492674e-08,0.9999999000000099,0.0,1.1026858180761447e-05,2.980231940746337e-08 -0.1828651130123712,0.616741716756117,2.980231940746337e-08,0.9999999000000099,0.0,1.0788439625501739e-05,2.980231940746337e-08 -0.1849327683372215,0.6176416872874265,5.960463881492674e-08,0.9999999000000099,0.0,1.0907648903131594e-05,2.980231940746337e-08 -0.18649205564680355,0.6180542110338464,2.980231940746337e-08,0.9999999000000099,0.0,1.1473892971873398e-05,0.0 -0.18776586651024565,0.6182790993585454,2.980231940746337e-08,0.9999999000000099,0.0,1.2218950957059982e-05,2.980231940746337e-08 -0.1888842582624424,0.6180437206163677,2.980231940746337e-08,0.9999999000000099,0.0,1.317262517809881e-05,0.0 -0.1899039149205728,0.617180108918365,2.980231940746337e-08,0.9999999000000099,0.0,1.433491563498988e-05,2.980231940746337e-08 -0.19082513450786068,0.6158695815939128,2.980231940746337e-08,0.9999999000000099,0.0,1.5676020008325733e-05,0.0 -0.1188193559597406,0.10985630748775002,0.00025027987838387736,0.0,0.0014586447210788872,0.9998077346444706,0.0 -0.16848880051868853,0.12544789908168358,2.1189449098706455e-05,0.0,6.571411429345673e-05,0.9999956680706541,2.980231940746337e-08 -0.15883624553022715,0.12783572075562163,1.963972848951836e-05,0.0,2.3305413776636355e-05,0.9999948932103495,0.0 -0.1675999760558347,0.1288477182167673,1.689791510403173e-05,0.0,1.6689298868179488e-05,0.9999956084660152,0.0 -0.16653487085606497,0.12765598294933223,1.8239019477367584e-05,0.0,1.591443856358544e-05,0.9999954296520989,8.940695822239011e-08 -0.17914006113264264,0.13030371067676885,1.5407799133658562e-05,0.0,1.2964008942246566e-05,0.9999968005587916,2.980231940746337e-08 -0.1935586333194693,0.13474974033909345,1.272559038698686e-05,0.0,1.0162590917945008e-05,0.9999978734422902,0.0 -0.21054324506841504,0.14108318088023003,1.0251997876167399e-05,0.0,7.86781232357033e-06,0.9999986483025948,8.940695822239011e-08 -0.22626379131333904,0.14874327180222768,8.67247494757184e-06,0.0,6.4373009920120876e-06,0.9999991847443441,2.086162358522436e-07 -0.23496621846179766,0.15456330773567933,8.165835517644963e-06,0.0,5.871056923270284e-06,0.9999994231628994,3.874301522970238e-07 -0.23592475055671341,0.1554785966606935,8.553265669941988e-06,0.0,5.513429090380723e-06,0.9999994231628994,4.172324717044872e-07 -0.23921248315774307,0.15731993314910195,8.58306798934945e-06,0.0,5.2750105351210165e-06,0.999999542372177,4.768371105194139e-07 -0.4531635045817604,0.252702653364779,5.251168679595046e-05,1.7881391644478022e-07,2.7298924577236446e-05,0.9999999000000099,6.735324186086722e-06 -0.3256582021578409,0.20134648677239192,7.033347380161355e-06,0.0,4.589557188749359e-06,0.9999999000000099,4.202127036452335e-06 -0.33189535139616905,0.19453522559649525,4.380940952897116e-06,0.0,2.264976274967216e-06,0.9999997807907323,5.03659197986131e-06 -0.34554165600299536,0.17862865325730007,3.695487606525458e-06,0.0,1.4305113315582417e-06,0.9999997807907323,3.9637084811926284e-06 -0.35352164505448375,0.16806736585600185,3.457069051265751e-06,0.0,1.1026858180761447e-06,0.9999998403953712,3.2186504960060438e-06 -0.3545705079885529,0.16410028931668785,3.4272667318582874e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.069638898968727e-06 -0.35307127235857955,0.16347357627930434,3.6060806483030677e-06,0.0,9.536742210388278e-07,0.9999997807907323,3.129243537783654e-06 -0.3494639396522775,0.16542306539563922,3.725289925932921e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.397464412450824e-06 -0.3444648682928501,0.16839122769333348,3.844499203562775e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.6656852871179947e-06 -0.33888357876328085,0.17096099254541725,3.9637084811926284e-06,0.0,1.0132788598537545e-06,0.9999997807907323,4.023313120007555e-06 -0.3345813453058937,0.17222309109599765,3.993510800600092e-06,0.0,1.0132788598537545e-06,0.9999997807907323,4.053115439415018e-06 -0.32848650215696085,0.1729370653333174,4.112720078229945e-06,0.0,1.0132788598537545e-06,0.9999997807907323,4.053115439415018e-06 -0.346117764697048,0.11238640544874257,1.5795229285955586e-06,1.1920927762985348e-07,0.9607569210599279,0.01483365745027378,0.0 -0.12716716527412272,0.10587289927577037,5.939602257907449e-05,0.0,0.00734263585097201,0.9999142481340328,0.0 -0.1681998372008294,0.1312007009758401,1.3411043733358517e-05,0.0,7.46846124351032e-05,0.9999955488613764,0.0 -0.19210657476583376,0.14424508807573352,7.629393768310623e-06,0.0,1.937150761485119e-05,0.9999978734422902,2.980231940746337e-08 -0.2192130386738605,0.1535907983516906,5.334615173935943e-06,0.0,1.1116265138983837e-05,0.9999989463257889,5.960463881492674e-08 -0.23917257784806759,0.165129691334105,4.559754869341896e-06,0.0,8.67247494757184e-06,0.9999994231628994,2.086162358522436e-07 -0.24904748796385437,0.1748637258707072,4.649161827564286e-06,0.0,7.897614642977793e-06,0.9999996615814547,4.172324717044872e-07 -0.252472639073408,0.17960619923377147,4.917382702231456e-06,0.0,7.569789129495696e-06,0.9999996615814547,5.66244068741804e-07 -0.25160235165507855,0.1784928142718802,5.513429090380723e-06,0.0,7.122754338383746e-06,0.9999996615814547,6.258487075567308e-07 -0.25170582531840435,0.17738819119276944,5.900859242677747e-06,0.0,6.735324186086722e-06,0.9999996615814547,5.960463881492673e-07 -0.2518033981218976,0.17649137970763248,6.228684756159844e-06,0.0,6.526707950234478e-06,0.9999996615814547,6.556510269641942e-07 -0.25043344496643677,0.1739134192168935,6.765126505494185e-06,0.0,6.1690801173449175e-06,0.9999996615814547,7.450579851865842e-07 -0.11165210604205338,0.029820978636403612,8.684395875334826e-05,0.025103953950557364,0.0,0.0,0.9920544228320638 -0.1741401553081884,0.10059735177224868,0.0018669364969611353,1.043081179261218e-06,0.0,7.271765935421062e-06,0.9999581767528395 -0.25311917065525985,0.11966830489970512,1.4901159703731685e-06,1.9073484420776557e-06,0.0,0.0014452932819843435,0.999792475856934 -0.20867672561735098,0.05607843398087592,8.529423814416017e-05,2.086162358522436e-07,1.1920927762985348e-07,7.987021601200183e-06,0.9999852372588615 -0.2534618973627042,0.04191228746650173,2.3365018415451283e-05,2.086162358522436e-07,7.748603045940476e-07,5.3942198127508695e-06,0.9999841643753627 -0.26506519316529376,0.040014475577178264,1.972913544774075e-05,2.086162358522436e-07,1.937150761485119e-06,5.75184764564043e-06,0.9999845220031957 -0.2692900299914433,0.038429439061260104,1.829862411618251e-05,1.4901159703731684e-07,2.5331971496343865e-06,5.096196618676236e-06,0.9999848796310286 -0.2696849107630639,0.03764376043628783,1.874565890729446e-05,1.4901159703731684e-07,2.5629994690418497e-06,4.529952549934432e-06,0.9999852372588615 -0.26887321471054626,0.0372575819428542,1.946091457307358e-05,2.086162358522436e-07,2.354383233189606e-06,4.112720078229945e-06,0.9999853564681391 -0.2666104435810318,0.036798268550293695,2.0980832862854213e-05,1.7881391644478022e-07,2.026557719707509e-06,3.635882967710531e-06,0.9999858333052496 -0.2617815136801087,0.03595709800104503,2.4288890317082647e-05,2.086162358522436e-07,1.6093252480030219e-06,2.8014180243015566e-06,0.9999869061887483 -0.25893601774097175,0.03567889332160353,2.6375052675605083e-05,1.7881391644478022e-07,1.2814997345209249e-06,2.5033948302269232e-06,0.9999871446073035 -0.18245494364936635,0.6127530335330756,2.4437901914119963e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.18204498290261817,0.5087259410940711,5.960463881492674e-08,0.9999999000000099,0.0,1.8805263546109385e-05,0.0 -0.1808987259789901,0.5912790297449436,0.0,0.9999999000000099,0.0,1.2427567192912226e-05,2.980231940746337e-08 -0.17765322326878208,0.6421915291640211,5.960463881492674e-08,0.9999999000000099,0.0,1.0490416431427107e-05,1.1920927762985348e-07 -0.18264690040785753,0.6499199866135644,0.0,0.9999999000000099,0.0,9.924172362685302e-06,2.980231940746337e-08 -0.1866576969546275,0.6512667535620337,0.0,0.9999999000000099,0.0,9.924172362685302e-06,8.940695822239011e-08 -0.18935036658456664,0.6513459085302818,0.0,0.9999999000000099,0.0,1.0401009473204716e-05,2.980231940746337e-08 -0.1912578642289121,0.6505771874267453,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,8.940695822239011e-08 -0.19269362091220227,0.6493127940973414,0.0,0.9999999000000099,0.0,1.2159346318245055e-05,2.980231940746337e-08 -0.19383671878965736,0.6477365492665261,2.980231940746337e-08,0.9999999000000099,0.0,1.344084605276598e-05,8.940695822239011e-08 -0.19481062888292452,0.6458879708137787,2.980231940746337e-08,0.9999999000000099,0.0,1.4930962023139149e-05,8.940695822239011e-08 -0.19567570089483635,0.6438819764942064,0.0,0.9999999000000099,0.0,1.662969422936456e-05,1.4901159703731684e-07 -0.23220279811851305,0.1705147325700603,7.650255391895847e-05,1.1920927762985348e-07,0.00010883807047605623,0.9999993039536218,1.4901159703731684e-07 -0.30902644990595085,0.23171576853599046,5.513429090380723e-06,0.0,9.119509738683792e-06,0.9999998403953712,4.976987341046382e-06 -0.2897906303285766,0.20643755790036536,4.857778063416529e-06,0.0,4.172324717044872e-06,0.9999999000000099,3.069638898968727e-06 -0.3088634610048193,0.2131151556603761,4.321336314082188e-06,0.0,3.844499203562775e-06,0.9999999000000099,4.6193595081568225e-06 -0.31657630203843545,0.21311482783482988,4.321336314082188e-06,0.0,3.397464412450824e-06,0.9999998403953712,5.2750105351210165e-06 -0.3216521441803304,0.20479613539049935,3.993510800600092e-06,0.0,2.712011066079167e-06,0.9999999000000099,5.0067896604538464e-06 -0.3245046734675505,0.19533544775479023,3.8146968841553113e-06,0.0,2.026557719707509e-06,0.9999999000000099,4.380940952897116e-06 -0.32551479338251726,0.18861579891789765,3.6656852871179947e-06,0.0,1.6689298868179488e-06,0.9999997807907323,4.053115439415018e-06 -0.32482486961927065,0.18449282643020035,3.6656852871179947e-06,0.0,1.4901159703731685e-06,0.9999997807907323,3.8146968841553113e-06 -0.3191730081902902,0.1806984245467711,3.844499203562775e-06,0.0,1.4305113315582417e-06,0.9999997807907323,3.5762783288956045e-06 -0.3099952339997675,0.17654111978368903,4.172324717044872e-06,0.0,1.370906692743315e-06,0.9999998403953712,3.069638898968727e-06 -0.29697453974447785,0.17179724571147278,4.768371105194139e-06,0.0,1.4901159703731685e-06,0.9999997807907323,2.413987872004533e-06 -0.27432379125412854,0.3366755246539582,0.0039041038423777014,1.4901159703731684e-07,0.00019392369238436415,0.9999928666526298,1.7881391644478022e-07 -0.22303578256637188,0.1493914127094043,3.445148123502766e-05,0.0,2.4527308872342353e-05,0.999999542372177,4.172324717044872e-07 -0.28606379030950485,0.21567177768828913,8.970498141646475e-06,0.0,5.75184764564043e-06,0.9999998403953712,6.079673159122528e-06 -0.2897189855455595,0.19903713461328723,7.301568254828525e-06,0.0,3.129243537783654e-06,0.9999997807907323,4.589557188749359e-06 -0.2836130261303766,0.18562865254084568,7.3611728936434526e-06,0.0,2.8312203437090202e-06,0.9999997807907323,3.069638898968727e-06 -0.27172243593998147,0.17561921474310593,8.40425407290467e-06,0.0,2.980231940746337e-06,0.9999997807907323,2.1159646779298993e-06 -0.2584232687843127,0.16637465354931538,1.0132788598537546e-05,0.0,3.367662093043361e-06,0.9999996615814547,1.370906692743315e-06 -0.24030914901692008,0.1524627208448647,1.2546776470542079e-05,0.0,3.635882967710531e-06,0.999999542372177,7.152556657791209e-07 -0.21036970614515868,0.13529139754839709,1.8626449629664607e-05,0.0,4.2319293558597985e-06,0.9999988271165112,2.9802319407463367e-07 -0.1607277095251287,0.11855471132155718,4.404782808423086e-05,0.0,7.77840536534794e-06,0.99999537004746,5.960463881492674e-08 -0.08417266606936005,0.11142373083114007,0.00016966460438668895,0.0,1.770257772803324e-05,0.9999664021929959,0.0 -0.016459524630818692,0.1301556825414945,0.0004976689317852308,5.960463881492674e-08,4.285573530793233e-05,0.9987687661852876,5.66244068741804e-07 -0.12060859798885658,0.022105187173872897,1.1026858180761447e-06,1.370906692743315e-06,0.9309982322480771,5.555152337551172e-05,0.025945124415833017 -0.2200554609207586,0.054456949224683845,5.930661562085211e-06,6.854533463716575e-07,0.0012513695895999795,1.1563299930095787e-05,0.9995309903064529 -0.24773618577885007,0.03798422216718656,9.775160765647985e-06,4.768371105194139e-07,1.847743803262729e-05,2.1159646779298993e-06,0.999946732662187 -0.2504366338149321,0.037451535456920114,1.2546776470542079e-05,4.172324717044872e-07,3.904103842377701e-06,1.847743803262729e-06,0.9999745680285136 -0.24401456116619596,0.03690710663163492,1.8328426435589973e-05,4.172324717044872e-07,1.7285345256328755e-06,1.5497206091880952e-06,0.999981541771255 -0.22344905137090496,0.03323006629374832,3.6656852871179946e-05,5.364417493343406e-07,5.66244068741804e-07,6.854533463716575e-07,0.9999891711650233 -0.1857747733516062,0.02853924035537309,6.80982998460538e-05,1.0728834986686813e-06,1.7881391644478022e-07,1.4901159703731684e-07,0.9999948336057106 -0.1434119045675022,0.026220262046138833,6.0379499119520785e-05,3.8146968841553113e-06,2.980231940746337e-08,0.0,0.9999973370005409 -0.10920453071142047,0.026031702752424172,3.033876115679771e-05,1.7791984686255633e-05,0.0,2.980231940746337e-08,0.999998290674762 -0.08942091464626066,0.02712392806542379,1.4960764342546611e-05,6.452202151715819e-05,0.0,0.0,0.9999985290933172 -0.08391347527156501,0.030431449408088628,1.0281800195574863e-05,0.0001573562464714066,0.0,0.0,0.9999979926515679 -0.09144958853342947,0.04202333091969927,7.659196087718087e-06,0.00044524665194750276,0.0,0.0,0.9999935819082956 -0.41125667093481405,0.23260176177810254,3.811716652214565e-05,2.086162358522436e-07,3.09944121837619e-05,0.9999999000000099,3.9637084811926284e-06 -0.1625963151387598,0.1526953875757056,3.9905305686593454e-05,0.0,1.797079860270041e-05,0.9999987079072337,1.1920927762985348e-07 -0.21370255946228142,0.13844868538393126,1.3053415900468956e-05,0.0,5.930661562085211e-06,0.9999988271165112,1.7881391644478022e-07 -0.21366527675697597,0.1383649110557138,1.3470648372173444e-05,0.0,5.6624406874180405e-06,0.9999989463257889,2.086162358522436e-07 -0.2086153030309125,0.13609799740368195,1.4930962023139149e-05,0.0,5.692243006825504e-06,0.9999986483025948,2.086162358522436e-07 -0.1972666680731152,0.13142389056816334,1.8328426435589973e-05,0.0,6.258487075567308e-06,0.9999982310701231,8.940695822239011e-08 -0.18542546033091448,0.12674510476803066,2.3037192901969185e-05,0.0,7.271765935421062e-06,0.9999974562098185,1.7881391644478022e-07 -0.17340317367789362,0.12242639062692448,2.9295679977536493e-05,0.0,8.58306798934945e-06,0.9999964429309587,8.940695822239011e-08 -0.1663783490588913,0.11971262095308803,3.439187659621273e-05,0.0,9.685753807425595e-06,0.9999956084660152,1.4901159703731684e-07 -0.15392610430080095,0.1161775588790321,4.461407215297267e-05,0.0,1.177191616594803e-05,0.9999938203268508,2.980231940746337e-08 -0.1373538076820719,0.11230605838759909,6.341933569908205e-05,0.0,1.528858985602871e-05,0.9999897672114114,8.940695822239011e-08 -0.11020979284783819,0.1092047393134994,0.00010862945424020398,0.0,2.2172925639152747e-05,0.9999777270743708,8.940695822239011e-08 -0.1095009744121986,0.022285670038221874,1.1026858180761447e-06,7.152556657791209e-07,0.9989637329588512,2.9116866061091712e-05,4.3630595612526375e-05 -0.038916647432623165,0.03325095772173852,1.370906692743315e-06,9.030102780461401e-06,0.9148162284608514,1.0639428028464424e-05,0.01765924515561479 -0.1089742183640179,0.05813172458606936,1.4901159703731684e-07,8.910893502831548e-06,0.13639642424373463,0.0001963972848951836,0.7373111106751694 -0.09828528761456731,0.04976695775133533,8.940695822239011e-08,9.387730613350962e-06,0.019436625682756496,0.000191599111470582,0.7609781457954959 -0.16473010181698566,0.04793483018054309,7.152556657791209e-07,2.354383233189606e-06,0.0003073513200491697,2.0474193432927334e-05,0.9952787357687573 -0.24027785657841427,0.0399207770756074,7.390975213050916e-06,5.960463881492673e-07,6.556510269641941e-06,1.7583368450403388e-06,0.9999134732737283 -0.2335003018282524,0.033479273313511554,2.2143123319745282e-05,5.66244068741804e-07,1.1622904568910714e-06,5.364417493343406e-07,0.9999741507960419 -0.2217191755679828,0.031982988113648754,3.591179488599336e-05,6.258487075567308e-07,3.874301522970238e-07,3.278255134820971e-07,0.9999845220031957 -0.2135199308306972,0.03156685828622062,5.057453603446534e-05,6.854533463716575e-07,1.4901159703731684e-07,2.9802319407463367e-07,0.9999886943279127 -0.2105017304333307,0.031798928970613864,6.115435942411484e-05,5.66244068741804e-07,1.7881391644478022e-07,3.5762783288956044e-07,0.9999902440485219 -0.20869421958059184,0.03192037343432293,6.929039262235234e-05,5.66244068741804e-07,1.7881391644478022e-07,3.278255134820971e-07,0.9999910785134654 -0.20581451057535524,0.03167670964652285,7.653235623836593e-05,6.258487075567308e-07,1.1920927762985348e-07,3.278255134820971e-07,0.999991793769131 -0.17621183394656087,0.027256548400026323,2.0563600391149723e-06,2.086162358522436e-07,0.9998071385980825,2.0027158641815386e-05,1.6093252480030219e-06 -0.3557538091989073,0.2861898838983667,6.556510269641942e-07,6.258487075567308e-07,0.8018802794616302,0.9995509578604559,0.0 -0.2103357612999605,0.15766012665909923,4.947185021638919e-06,0.0,5.343555869758182e-05,0.9999984098840395,2.980231940746337e-08 -0.260205209244444,0.20537713166534796,2.9504296213388737e-06,0.0,1.564621768891827e-05,0.9999996615814547,4.768371105194139e-07 -0.27909210323131756,0.23926892872527936,3.069638898968727e-06,0.0,1.4215706357360027e-05,0.9999999000000099,1.698732206225412e-06 -0.289854973542609,0.254017770246878,3.2782551348209707e-06,0.0,1.3232229816913736e-05,0.9999998403953712,3.039836579561264e-06 -0.29458263515206284,0.2516187428997241,3.3378597736358976e-06,0.0,1.0997055861353983e-05,0.9999999000000099,3.635882967710531e-06 -0.29753428696354034,0.24289974566115055,3.397464412450824e-06,0.0,8.67247494757184e-06,0.9999998403953712,3.635882967710531e-06 -0.30046045778937747,0.23418706651492213,3.397464412450824e-06,0.0,6.973742741346429e-06,0.9999999000000099,3.5762783288956045e-06 -0.30175811051072876,0.2253675758452745,3.397464412450824e-06,0.0,5.692243006825504e-06,0.9999998403953712,3.4272667318582874e-06 -0.3023986220234586,0.2182859181984006,3.5166736900806776e-06,0.0,4.768371105194139e-06,0.9999997807907323,3.2782551348209707e-06 -0.30242449043929004,0.21315386887715107,3.695487606525458e-06,0.0,4.202127036452335e-06,0.9999999000000099,3.308057454228434e-06 -0.3335712551932493,0.20853120085006482,4.601478116512344e-05,5.960463881492674e-08,4.8071141204238414e-05,0.9999999000000099,1.2218950957059981e-06 -0.3100697398057337,0.20011776682288002,5.03659197986131e-06,0.0,5.0067896604538464e-06,0.9999999000000099,3.039836579561264e-06 -0.30223911999404623,0.2014917134893623,4.529952549934432e-06,0.0,3.2484528154135075e-06,0.9999999000000099,3.784894564747848e-06 -0.3153575360644411,0.2051641046649572,4.261731675267262e-06,0.0,2.8908249825239467e-06,0.9999997807907323,4.857778063416529e-06 -0.318009078489487,0.19979688521778666,4.142522397637409e-06,0.0,2.413987872004533e-06,0.9999999000000099,4.6193595081568225e-06 -0.3161536157000283,0.19141098853648336,4.0829177588224814e-06,0.0,1.9073484420776557e-06,0.9999999000000099,3.993510800600092e-06 -0.3064134716860731,0.1815198063539577,4.202127036452335e-06,0.0,1.6689298868179488e-06,0.9999999000000099,3.069638898968727e-06 -0.2901685535787593,0.17190235850251617,5.03659197986131e-06,0.0,1.8179414838552655e-06,0.9999997211860935,2.0563600391149723e-06 -0.2603145837676023,0.15798467394984567,7.629393768310623e-06,0.0,2.4437901914119963e-06,0.9999997211860935,9.536742210388278e-07 -0.23416149615271845,0.14619597790122038,1.1563299930095787e-05,0.0,3.5762783288956045e-06,0.9999994231628994,5.364417493343406e-07 -0.20668989419081277,0.13411116597740166,1.770257772803324e-05,0.0,4.7385687857866755e-06,0.9999987079072337,2.086162358522436e-07 -0.16034236549667175,0.11921420691356156,4.0560956713557644e-05,0.0,8.58306798934945e-06,0.9999952508381824,5.960463881492674e-08 -0.1828985810204112,0.622285246742503,2.7716157048940933e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 -0.165433347218339,0.4342467784138009,2.980231940746337e-08,0.9999999000000099,0.0,1.4513729551434662e-05,5.960463881492674e-08 -0.18304073809819463,0.515363275916543,0.0,0.9999999000000099,0.0,1.335143909454359e-05,0.0 -0.175570547573449,0.5875783561654077,2.980231940746337e-08,0.9999999000000099,0.0,1.2397764873504761e-05,0.0 -0.1776924133227203,0.6017835735244255,0.0,0.9999999000000099,0.0,1.1473892971873398e-05,8.940695822239011e-08 -0.18087083100523638,0.604675888911656,0.0,0.9999999000000099,0.0,1.1205672097206226e-05,0.0 -0.1829793751164009,0.6078644989880143,5.960463881492674e-08,0.9999999000000099,0.0,1.1175869777798764e-05,2.980231940746337e-08 -0.18476358055303355,0.6079410909565376,2.980231940746337e-08,0.9999999000000099,0.0,1.1622904568910713e-05,1.1920927762985348e-07 -0.18609926103774999,0.6083314417751048,2.980231940746337e-08,0.9999999000000099,0.0,1.2218950957059982e-05,1.1920927762985348e-07 -0.18722507356822093,0.6084876655490343,0.0,0.9999999000000099,0.0,1.3023613581061492e-05,2.980231940746337e-08 -0.18823933600599937,0.6084165572078294,2.980231940746337e-08,0.9999999000000099,0.0,1.3947485482692857e-05,0.0 -0.18917945026568028,0.6081312893779832,0.0,0.9999999000000099,0.0,1.5109775939583928e-05,2.980231940746337e-08 -0.6826315521911246,0.4081660806433797,0.9999996615814547,3.2782551348209707e-06,2.086162358522436e-07,5.066394299268773e-07,2.396106480360055e-05 -0.5448530316127232,0.44992238275453095,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,5.960463881492674e-08 -0.5871961712594075,0.3112149834099964,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.5510949492226332,0.3414241670977557,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5801916718242727,0.3327546119120149,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5828724503275796,0.3379210233109715,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5881211161369937,0.3374563753027045,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.591861724829008,0.3404734134091062,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5956815480939255,0.34432095283334363,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5980311631908741,0.34706625336426083,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5962290167561648,0.3514605163926069,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.5966964959851188,0.35316315287264677,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.1671208143165052,0.13928472993373012,0.00012940167086720596,8.940695822239011e-08,0.00026348230588138364,0.9999937011175731,2.980231940746337e-08 -0.2063812613401786,0.14311686155729572,1.2636183428764469e-05,0.0,1.8537042671442215e-05,0.9999988271165112,1.1920927762985348e-07 -0.1970496177591746,0.13952645657057533,1.2487171831727152e-05,0.0,9.715556126833059e-06,0.9999983502794008,2.086162358522436e-07 -0.21960783003851395,0.14492285249135844,9.119509738683792e-06,0.0,6.884335783124038e-06,0.9999990655350666,1.4901159703731684e-07 -0.22955861686709667,0.15035173294353857,8.344649434089744e-06,0.0,6.139277797937454e-06,0.9999993039536218,2.682208746671703e-07 -0.23027518390655674,0.15111759302412642,8.821486544609158e-06,0.0,5.7816499650478935e-06,0.9999993039536218,2.9802319407463367e-07 -0.21940627693221432,0.14486595985793008,1.0669230347871886e-05,0.0,5.811452284455357e-06,0.9999990655350666,2.3841855525970696e-07 -0.19490280746606586,0.1337903141746307,1.603364784121529e-05,0.0,7.063149699568818e-06,0.9999981118608455,1.1920927762985348e-07 -0.16195878385826862,0.12244585154344031,2.9832121726870833e-05,0.0,1.1086462819576373e-05,0.9999952508381824,0.0 -0.1318937241976483,0.11458584664290024,5.659460455477294e-05,0.0,1.8447635713219826e-05,0.9999883367000798,5.960463881492674e-08 -0.08232274651186525,0.11328184602704992,0.00013026593813002238,0.0,2.989172636568576e-05,0.999955434939454,0.0 -0.03436398506022257,0.11670428512482203,0.00021573899019062734,8.940695822239011e-08,5.236267519891314e-05,0.999684591460679,1.1920927762985348e-07 -0.18233051895340285,0.6102103589920377,2.4437901914119963e-06,0.9999999000000099,5.960463881492674e-08,2.980231940746337e-08,0.0 -0.18318814038471806,0.5181525944776193,2.980231940746337e-08,0.9999999000000099,0.0,1.8596647310257143e-05,0.0 -0.18075552581992316,0.6002354024812946,8.940695822239011e-08,0.9999999000000099,0.0,1.2069939360022665e-05,2.980231940746337e-08 -0.1781469285414362,0.6503801344711516,2.980231940746337e-08,0.9999999000000099,0.0,1.0102986279130082e-05,0.0 -0.18350204824641464,0.6576922534770101,0.0,0.9999999000000099,0.0,9.655951488018132e-06,8.940695822239011e-08 -0.1877125501554963,0.6585865019624222,2.980231940746337e-08,0.9999999000000099,0.0,9.745358446240521e-06,0.0 -0.1904772818009659,0.6583588122194192,8.940695822239011e-08,0.9999999000000099,0.0,1.0192393237352472e-05,1.1920927762985348e-07 -0.19239142536320356,0.6575545071429577,8.940695822239011e-08,0.9999999000000099,0.0,1.0997055861353983e-05,1.1920927762985348e-07 -0.19385024904402082,0.6560401915380535,2.980231940746337e-08,0.9999999000000099,0.0,1.2189148637652518e-05,2.980231940746337e-08 -0.1950207054534267,0.6538295744730024,2.980231940746337e-08,0.9999999000000099,0.0,1.353025301098837e-05,8.940695822239011e-08 -0.1959424018778728,0.6517674325780612,0.0,0.9999999000000099,0.0,1.5050171300769002e-05,5.960463881492674e-08 -0.19677799939294438,0.6495200990518347,5.960463881492674e-08,0.9999999000000099,0.0,1.689791510403173e-05,5.960463881492674e-08 -0.6917740702342641,0.4109145998251143,0.9999997211860935,3.4868713706732143e-06,1.7881391644478022e-07,5.66244068741804e-07,2.592801788449313e-05 -0.42843088505878246,0.4315069317078796,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5528081655273414,0.386029750042617,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5316830873269222,0.5152187942576322,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5467328428995717,0.6183770297898946,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5694713592293491,0.7232804893208816,0.9999999000000099,1.1920927762985348e-07,8.940695822239011e-08,0.0,0.0 -0.5191945433401651,0.6973531841037637,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.34850013254629936,0.11875826118343029,0.9999975158144573,0.0,2.980231940746337e-08,0.00011721252222955344,2.682208746671703e-07 -0.22157594560659347,0.10279360411791143,5.02765128403907e-05,0.0,5.096196618676236e-06,0.9999926878387133,1.1920927762985348e-07 -0.18778309225258505,0.12424346802491351,3.141164465546639e-05,0.0,7.063149699568818e-06,0.9999978734422902,1.7881391644478022e-07 -0.21428057550496685,0.1329828798543191,1.9311902976036264e-05,0.0,4.529952549934432e-06,0.9999988271165112,2.682208746671703e-07 -0.22866806386954444,0.14062723515009876,1.573562464714066e-05,0.0,3.874301522970238e-06,0.9999993039536218,4.768371105194139e-07 -0.29821339248376066,0.03476113080383161,3.1888481765985805e-05,1.2218950957059981e-06,0.00010469554807841882,7.95721928179272e-06,0.9996966912023584 -0.3404844999172367,0.05008804797268537,2.1457669973373625e-06,1.1920927762985348e-07,0.00020393727170527184,9.98377700150023e-05,0.9999108506696205 -0.2687401175387683,0.046599298707611994,1.6689298868179488e-06,2.086162358522436e-07,0.00025868413245678205,7.271765935421062e-05,0.9998567296575764 -0.2675443887599787,0.04618772863550839,1.996755400300046e-06,2.086162358522436e-07,0.00016891954640150237,5.501508162617738e-05,0.9998681737482289 -0.26633036135524385,0.044595062725060294,2.592801788449313e-06,1.7881391644478022e-07,0.00010263918803930385,3.811716652214565e-05,0.999895234254251 -0.2717579007036214,0.04234987496604533,4.7385687857866755e-06,2.3841855525970696e-07,3.871321291029492e-05,1.814961251914519e-05,0.9999484015920739 -0.27563327549746724,0.03991568087847997,7.718800726533013e-06,2.086162358522436e-07,1.6570089590549635e-05,9.655951488018132e-06,0.9999697400527696 -0.2777197360877434,0.039114087813355396,9.119509738683792e-06,1.1920927762985348e-07,1.0997055861353983e-05,7.838010004162866e-06,0.9999745084238748 -0.27880001066960786,0.039014250033373714,9.715556126833059e-06,1.1920927762985348e-07,8.881091183424084e-06,7.539986810088233e-06,0.9999758197259287 -0.28072577713757624,0.039164096110313386,9.685753807425595e-06,8.940695822239011e-08,8.255242475867353e-06,7.808207684755402e-06,0.9999757005166511 -0.28054434059888744,0.03889027237226213,1.034140483438979e-05,1.4901159703731684e-07,7.241963616013599e-06,7.241963616013599e-06,0.9999767734001498 -0.27725037931247903,0.03798910974805731,1.2546776470542079e-05,1.1920927762985348e-07,5.48362677097326e-06,5.692243006825504e-06,0.9999796344228129 -0.4857851564683033,0.3450981974010816,0.9999996615814547,5.66244068741804e-07,1.1920927762985348e-07,2.980231940746337e-08,2.3841855525970694e-06 -0.6151518821461588,0.4237025379409055,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5817010402438574,0.3505458235140404,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.5451785325778282,0.3399729728116577,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5668939351800785,0.3484553396105135,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5428443550838757,0.357122301994207,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5567775368459942,0.34531867498206803,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5503159165154512,0.3543820976604172,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5556730031737072,0.3474109172226155,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5460683703196432,0.3545888661731076,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5522125959167703,0.3494635223743942,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5537787675628236,0.35135602945033356,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.24328836797660505,0.027405440802649755,4.321336314082188e-06,4.768371105194139e-07,0.10393743667733177,4.0471549755335255e-05,0.9275055196228 -0.24245908855387938,0.04976978897196167,1.7583368450403388e-06,3.278255134820971e-07,0.004409580981847688,4.509090926349208e-05,0.9988099529907087 -0.23121336101528253,0.04693752526433203,8.940695822239011e-07,4.4703479111195056e-07,0.0006572901545316046,5.5998558166623674e-05,0.9992828561950664 -0.24772483109402083,0.04664823412096421,1.370906692743315e-06,4.172324717044872e-07,0.00016063450160622755,3.141164465546639e-05,0.9997042609914879 -0.2646330296883677,0.04284015297156136,4.112720078229945e-06,2.9802319407463367e-07,3.057717971205742e-05,9.834765404462912e-06,0.9999263478757123 -0.2665250003227498,0.03900530933665893,8.642672628164377e-06,2.682208746671703e-07,9.387730613350962e-06,4.2319293558597985e-06,0.9999659849605242 -0.25973206757423656,0.03687113522851913,1.41561017185451e-05,2.682208746671703e-07,3.993510800600092e-06,2.5331971496343865e-06,0.9999773694465379 -0.2570071220291528,0.03651323913902658,1.7583368450403387e-05,2.682208746671703e-07,2.5331971496343865e-06,2.264976274967216e-06,0.9999809457248667 -0.2561443447960648,0.03658434748023145,1.9699333128333287e-05,2.3841855525970696e-07,1.9073484420776557e-06,2.324580913782143e-06,0.9999826146547536 -0.2630126476178934,0.03796476125067073,1.6927717423439194e-05,2.086162358522436e-07,2.1159646779298993e-06,3.308057454228434e-06,0.9999810649341444 -0.26644235848277215,0.038245022290356624,1.618265943825261e-05,2.3841855525970696e-07,2.3841855525970694e-06,3.844499203562775e-06,0.9999810649341444 -0.2726417183763143,0.03889304398824371,1.3947485482692857e-05,1.7881391644478022e-07,2.9504296213388737e-06,4.887580382823993e-06,0.9999795152135352 -0.09707906841829768,0.02118992805118111,9.238719016313645e-07,1.2516974151134616e-06,0.9973308042738775,3.689527142643965e-05,0.00020807979410290925 -0.11296096443662197,0.02666360139390227,1.5795229285955586e-05,1.1920927762985348e-07,0.9999982310701231,8.642672628164378e-07,1.1920927762985347e-06 -0.19038382171796198,0.03909602760599154,2.7030703702569276e-05,5.960463881492674e-08,0.9999997807907323,1.6093252480030219e-06,1.7881391644478022e-07 -0.18678382038296698,0.03502994775172259,7.882713483274062e-05,0.0,0.9999999000000099,7.152556657791209e-07,1.4901159703731684e-07 -0.15107333659500172,0.026477575297590133,5.7071441665292355e-05,1.1920927762985348e-07,0.9999997807907323,3.278255134820971e-07,1.4901159703731684e-07 -0.1116421222640539,0.02595844864400776,2.6404854995012547e-05,1.1920927762985348e-07,0.9999996019768158,5.066394299268773e-07,6.854533463716575e-07 -0.04021933674645778,0.0366799533304348,2.8014180243015566e-06,7.152556657791209e-06,0.9999605013337532,1.20401370406152e-05,8.451937783956612e-05 -0.034202009438052156,0.055935710658985685,3.5762783288956044e-07,6.654857923686571e-05,0.9918862185413281,0.00016877053480446506,0.005112170661878636 -0.05595883726841956,0.05640709399211114,1.1920927762985348e-07,4.2676921391487544e-05,0.5036978813967219,0.0003458559167236124,0.10215782097623449 -0.09278953075024715,0.04870614408612696,2.086162358522436e-07,1.1563299930095787e-05,0.009256481198680493,8.726119122505275e-05,0.7995746528229912 -0.19645312427660958,0.04429438709454232,2.175569316744826e-06,1.4007090121507783e-06,3.963708481192628e-05,6.1690801173449175e-06,0.9991691305442075 -0.23994594811399625,0.03589537739139068,1.4752148106694368e-05,5.66244068741804e-07,2.0563600391149723e-06,8.344649434089744e-07,0.9999532295678178 -0.12373590468847989,0.02225148677444904,1.1622904568910714e-06,1.370906692743315e-06,0.9198316607939334,5.531310482025202e-05,0.032403525449985586 -0.06334251165127727,0.035698652261343194,1.519918289780632e-06,2.980231940746337e-06,0.9952584701915601,2.3752448567748306e-05,0.004817127699744749 -0.14402964710592875,0.0350337028443428,3.2186504960060438e-06,4.4703479111195056e-07,0.9999938203268508,7.033347380161355e-06,2.9206273019314104e-06 -0.22208157180820218,0.04470363258550007,3.543495777547395e-05,8.940695822239011e-08,0.9999997807907323,2.5033948302269232e-06,8.940695822239011e-08 -0.23784551023452086,0.03931891917509095,0.00012475250903964166,0.0,0.9999997807907323,9.536742210388278e-07,8.940695822239011e-08 -0.228699803342886,0.03297409414680424,0.00015395878205895578,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 -0.21096310018619552,0.02958792447537174,0.0001521408405751005,0.0,0.9999997807907323,3.278255134820971e-07,2.980231940746337e-08 -0.18925899266412977,0.027646988625560663,0.0001282989850491298,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 -0.16329711674967745,0.026205122466368476,9.25063994407663e-05,2.980231940746337e-08,0.9999997807907323,3.278255134820971e-07,1.1920927762985348e-07 -0.138914257282227,0.026154041285804713,5.9187406343222255e-05,2.980231940746337e-08,0.9999996615814547,3.874301522970238e-07,3.278255134820971e-07 -0.09499755501353768,0.027385085816462443,2.381205320656323e-05,2.086162358522436e-07,0.9999991847443441,1.0132788598537545e-06,2.0563600391149723e-06 -0.031775236128445,0.04083830117480026,1.937150761485119e-06,1.8060205560922803e-05,0.9997238113130192,3.2395121195912685e-05,0.0005027055237650922 -0.08550050854328883,0.3460956513289046,0.9998672796786467,4.172324717044872e-07,0.00048738713158965593,8.350609897971236e-05,0.0 -0.4770068526070487,0.45580485455337416,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5717668533088439,0.7130701540679608,0.9999999000000099,5.960463881492674e-08,0.0,0.0,0.0 -0.5360456704871419,0.3153636454995875,0.9999996615814547,0.0,0.0,5.48362677097326e-06,1.1920927762985348e-07 -0.49676203725665186,0.13146618006362423,0.024622825306043275,1.1920927762985348e-07,0.0,0.9977973893865207,8.940695822239011e-08 -0.398882567866021,0.12390995023512992,2.309679754078411e-05,0.0,7.748603045940476e-07,0.9999973966051797,4.768371105194139e-07 -0.35514360664804456,0.15822938081892912,5.3942198127508695e-06,0.0,1.4007090121507783e-06,0.9999997807907323,2.264976274967216e-06 -0.3551780581327233,0.16594088074703675,4.7385687857866755e-06,0.0,1.1920927762985347e-06,0.9999997807907323,3.5762783288956045e-06 -0.3549365997167482,0.16457003352208227,4.410743272304579e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.5762783288956045e-06 -0.3556818961949888,0.16295313832353714,4.2319293558597985e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.4272667318582874e-06 -0.3573995232434101,0.16111186143977343,4.202127036452335e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.397464412450824e-06 -0.35796886681028106,0.16039720174903888,4.172324717044872e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.367662093043361e-06 -0.43933027980892625,0.2551006078283271,6.902217174768517e-05,2.086162358522436e-07,3.030895883739025e-05,0.9999999000000099,5.513429090380723e-06 -0.3354085087637299,0.19307330247433957,7.510184490680769e-06,0.0,4.321336314082188e-06,0.9999998403953712,3.397464412450824e-06 -0.32713279126720063,0.19058457013681407,4.589557188749359e-06,0.0,2.175569316744826e-06,0.9999999000000099,4.6193595081568225e-06 -0.3388030528881926,0.18104693290471313,3.844499203562775e-06,0.0,1.4007090121507783e-06,0.9999997807907323,4.2319293558597985e-06 -0.34747725723735123,0.17229485508829492,3.635882967710531e-06,0.0,1.2516974151134616e-06,0.9999998403953712,3.6656852871179947e-06 -0.3500149249885584,0.16783693429933963,3.5762783288956045e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.457069051265751e-06 -0.3488560914848833,0.166758805484827,3.6060806483030677e-06,0.0,1.0728834986686813e-06,0.9999998403953712,3.4272667318582874e-06 -0.34753429888239895,0.16678178307538397,3.6656852871179947e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.5762783288956045e-06 -0.3456223606920179,0.16771316525448474,3.725289925932921e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.7550922453403844e-06 -0.3464425504064157,0.16729646918293134,3.725289925932921e-06,0.0,9.536742210388278e-07,0.9999997807907323,3.725289925932921e-06 -0.3444711565828737,0.1684954762170278,3.933906161785165e-06,0.0,9.536742210388278e-07,0.9999997807907323,3.904103842377701e-06 -0.3452381491518116,0.16811603304845263,3.904103842377701e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.904103842377701e-06 -0.14633697270741097,0.03172773122244185,8.666514483690348e-05,3.9398666256666575e-05,8.344649434089744e-07,1.7881391644478022e-07,0.9998728229100565 -0.24342721699660358,0.04477187990375621,3.5077329942584386e-05,3.278255134820971e-07,1.6391275674104854e-06,8.642672628164377e-06,0.9999920917923252 -0.2596843242537734,0.04455521702003477,1.6480682632327243e-05,2.086162358522436e-07,4.470347911119505e-06,1.370906692743315e-05,0.9999901248392443 -0.27384436129389755,0.04474243520924221,1.1533497610688325e-05,1.1920927762985348e-07,8.85128886401662e-06,1.8864868184924313e-05,0.9999877406536917 -0.2705220579988996,0.04175379871607111,1.406669476032271e-05,1.4901159703731684e-07,8.165835517644963e-06,1.1950730082392812e-05,0.9999890519557456 -0.2675695419200729,0.03997054695398632,1.6570089590549635e-05,1.4901159703731684e-07,6.198882436752381e-06,8.463858711719597e-06,0.999989588397495 -0.26334640382629937,0.03877043723396172,1.963972848951836e-05,2.086162358522436e-07,4.380940952897116e-06,6.258487075567308e-06,0.9999901248392443 -0.25958856939194574,0.03790527581519507,2.247094883322738e-05,2.3841855525970696e-07,3.308057454228434e-06,4.857778063416529e-06,0.9999903632577996 -0.2554629444970207,0.037089288228359704,2.5898215565085667e-05,2.3841855525970696e-07,2.3841855525970694e-06,3.844499203562775e-06,0.9999907208856325 -0.2543057799233992,0.03693041204773811,2.7000901383161812e-05,1.7881391644478022e-07,2.026557719707509e-06,3.5166736900806776e-06,0.9999906016763548 -0.2539120316400293,0.03685694932306502,2.7537343132496152e-05,2.3841855525970696e-07,1.698732206225412e-06,3.2782551348209707e-06,0.9999901844438831 -0.2525129914179192,0.03648504614205265,2.9087063741684248e-05,2.086162358522436e-07,1.519918289780632e-06,2.9504296213388737e-06,0.9999901248392443 -0.35263526438206566,0.10837233064703122,1.4901159703731685e-06,1.1920927762985348e-07,0.973265371747712,0.009758888699251511,0.0 -0.28369629381912437,0.052649468174502015,3.069638898968727e-06,5.960463881492674e-08,0.9996325566109936,9.566544529795742e-05,0.0 -0.3557243048997447,0.04461288451384508,1.370906692743315e-06,0.0,0.9999778462836484,4.6849246108532416e-05,0.0 -0.34695881603711637,0.0594000816243501,1.847743803262729e-06,1.4901159703731684e-07,0.9999886943279127,6.98864390105016e-05,0.0 -0.3582505583614779,0.06022346018713636,1.2516974151134616e-06,1.1920927762985348e-07,0.9999735547496538,0.0002902745910286932,0.0 -0.3460332751130824,0.08145892618691807,1.0132788598537545e-06,2.086162358522436e-07,0.9997437192623834,0.003959446749517361,0.0 -0.18411713837814883,0.07507869599964084,1.5258787536621245e-05,0.0,0.9304205440886828,0.6877461580129512,0.0 -0.10725784301313682,0.09122487901079206,9.405612004995439e-05,0.0,0.005739777706280408,0.9997132016873101,0.0 -0.12940439581335197,0.10774567721429246,3.352760933339629e-05,0.0,0.00017669795176685033,0.9999748064470688,0.0 -0.1222407817789959,0.11648288367184176,3.2961365264654486e-05,0.0,7.283686863184048e-05,0.9999786807485919,0.0 -0.11876502632603009,0.11869531867855825,3.4570690512657506e-05,0.0,5.957483649551928e-05,0.9999767734001498,0.0 -0.11058792471427761,0.11717784402748142,4.273652603030247e-05,0.0,6.642936995923585e-05,0.999968309541438,0.0 -0.0951894521673841,0.02087432145714946,8.046626240015109e-07,1.6391275674104854e-06,0.9931360682126382,4.512071158289954e-05,0.000895410686597237 -0.4346227347670832,0.08520275352926406,2.3841855525970696e-07,3.5762783288956044e-07,0.9999503685451547,0.02755218468756107,0.0 -0.17195135354283717,0.1046730875789696,3.367662093043361e-05,8.940695822239011e-08,0.8051722436633786,0.9450338133869384,0.0 -0.11050310730476574,0.09111201761592919,6.961821813583444e-05,0.0,0.0023745892057478665,0.9998861147445123,0.0 -0.1740849614071287,0.13535258171624853,1.1593102249503251e-05,0.0,5.6058162805438596e-05,0.999996323721681,0.0 -0.2054567038927834,0.14959672090829798,6.198882436752381e-06,0.0,1.5854833924770514e-05,0.999998588697956,0.0 -0.23054432868002886,0.16047069427603436,4.7385687857866755e-06,0.0,9.894370043277838e-06,0.9999991847443441,1.4901159703731684e-07 -0.24764317273068193,0.17367073890573204,4.321336314082188e-06,0.0,8.40425407290467e-06,0.9999996615814547,3.278255134820971e-07 -0.25454241036314773,0.18311142918312243,4.589557188749359e-06,0.0,8.016823920607646e-06,0.9999996615814547,5.066394299268773e-07 -0.25981348751899636,0.19163459536131994,4.947185021638919e-06,0.0,7.927416962385257e-06,0.9999997807907323,8.642672628164378e-07 -0.2644208073506537,0.20047762986564982,5.155801257491163e-06,0.0,8.106230878830036e-06,0.9999999000000099,1.2218950957059981e-06 -0.2690306305773915,0.2099869846938097,5.513429090380723e-06,0.0,8.22544015645989e-06,0.9999997807907323,1.7881391644478022e-06 -0.1829036474152169,0.6219070552714678,2.74181338548663e-06,0.9999999000000099,5.960463881492674e-08,2.980231940746337e-08,0.0 -0.18197387456140407,0.5074505805100304,5.960463881492674e-08,0.9999999000000099,0.0,1.963972848951836e-05,2.980231940746337e-08 -0.18087908624853744,0.5922382472931498,0.0,0.9999999000000099,0.0,1.2814997345209249e-05,2.980231940746337e-08 -0.1774738132880156,0.6444878577082446,1.1920927762985348e-07,0.9999999000000099,0.0,1.0550021070242033e-05,2.980231940746337e-08 -0.18273013829428292,0.6518152951078077,0.0,0.9999999000000099,0.0,1.0043381640315155e-05,8.940695822239011e-08 -0.18678763508023247,0.6535338758303223,0.0,0.9999999000000099,0.0,1.0043381640315155e-05,2.980231940746337e-08 -0.1895467936914158,0.6539226173234808,1.1920927762985348e-07,0.9999999000000099,0.0,1.0401009473204716e-05,1.1920927762985348e-07 -0.19155398010414398,0.6529098748042755,8.940695822239011e-08,0.9999999000000099,0.0,1.1205672097206226e-05,8.940695822239011e-08 -0.1929675638595786,0.6522665022686801,2.980231940746337e-08,0.9999999000000099,0.0,1.2099741679430129e-05,2.980231940746337e-08 -0.19420263170391835,0.6505041121322632,2.980231940746337e-08,0.9999999000000099,0.0,1.353025301098837e-05,2.980231940746337e-08 -0.19518804549362667,0.6488159893832236,5.960463881492674e-08,0.9999999000000099,0.0,1.5020368981361538e-05,1.4901159703731684e-07 -0.19609981774471807,0.6465835570181884,0.0,0.9999999000000099,0.0,1.6778705826401877e-05,1.4901159703731684e-07 -0.0893807709180061,0.3997988700182103,0.998843689216278,3.5762783288956044e-07,0.0015779732079863704,0.001731008118143695,0.0 -0.7322000264818272,0.43930530540573254,0.9999999000000099,0.0,1.1026858180761447e-06,0.0,5.960463881492674e-08 -0.7102108001414902,0.385995864802068,0.9999999000000099,0.0,2.0563600391149723e-06,0.0,1.1920927762985348e-07 -0.6228648423890645,0.3795815109556627,0.9999999000000099,0.0,1.043081179261218e-06,0.0,1.1920927762985348e-07 -0.5892623662704608,0.37262716883000724,0.9999999000000099,0.0,8.344649434089744e-07,0.0,1.1920927762985348e-07 -0.5692964792015854,0.3751599191976918,0.9999999000000099,0.0,3.278255134820971e-07,0.0,1.1920927762985348e-07 -0.5550140142210978,0.38315209739799866,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5555815100439807,0.38031584017916975,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5529062747726377,0.3733145593957617,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5541059374579822,0.3648502528042698,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5583575367696348,0.35822769993369974,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5614632963901727,0.35522669547673985,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.15747219323459882,0.02380049228260665,1.7583368450403388e-06,8.940695822239011e-07,0.6904868389103005,5.2213663601875825e-05,0.2291455039714359 -0.23890504240000432,0.03834214805900149,7.152556657791209e-06,0.0,0.9999966813495139,1.0520218750834569e-05,3.2186504960060438e-06 -0.2316050827407302,0.04138252138382877,7.191299673020911e-05,2.980231940746337e-08,0.9999997807907323,1.5497206091880952e-06,8.940695822239011e-08 -0.22702255844129834,0.034404128784010536,0.00016438959385156794,0.0,0.9999997807907323,6.258487075567308e-07,2.980231940746337e-08 -0.21127867697794575,0.030005216593372793,0.00016292928020060225,0.0,0.9999998403953712,4.172324717044872e-07,1.4901159703731684e-07 -0.1909897625367235,0.027892857785217048,0.000141173587033154,0.0,0.9999996615814547,3.278255134820971e-07,1.4901159703731684e-07 -0.17446690797083358,0.02777665853024732,0.00011360644158125036,0.0,0.9999997807907323,3.874301522970238e-07,1.1920927762985348e-07 -0.15356194972356077,0.02687996625439989,8.302926186919295e-05,5.960463881492674e-08,0.9999997807907323,3.874301522970238e-07,2.086162358522436e-07 -0.1357622444573453,0.0271886289073164,5.632638368010577e-05,2.980231940746337e-08,0.9999997807907323,5.66244068741804e-07,4.172324717044872e-07 -0.11107844113843637,0.02798554300782691,3.212690032124551e-05,8.940695822239011e-08,0.999999542372177,9.834765404462913e-07,1.2218950957059981e-06 -0.0718188583821122,0.031300693745021695,1.1473892971873398e-05,8.940695822239011e-07,0.999996323721681,3.0994412183761904e-06,9.208916696906181e-06 -0.037994772194242764,0.038987874978065114,2.5629994690418497e-06,1.0818241944909203e-05,0.999864299446706,2.1368263015151236e-05,0.00018227098549604596 -0.1323023438398891,0.022680491205146456,1.3113020539283883e-06,1.3113020539283883e-06,0.8716256938966956,5.555152337551172e-05,0.06231214973077538 -0.2308973967933413,0.05217221378386719,7.838010004162866e-06,6.258487075567308e-07,0.00039526816230118665,8.106230878830036e-06,0.9998135162944357 -0.2674537598976015,0.04065167903204047,6.079673159122528e-06,3.5762783288956044e-07,2.1785495486855723e-05,4.529952549934432e-06,0.9999478055456857 -0.2726338207608819,0.042284756891639366,6.139277797937454e-06,3.5762783288956044e-07,1.0311602514982325e-05,5.7816499650478935e-06,0.9999623490775565 -0.24253800510355872,0.036139249795447435,1.856684499084968e-05,3.874301522970238e-07,2.4437901914119963e-06,1.4603136509657052e-06,0.99998279346867 -0.19543877243186397,0.029230773443938755,5.1259989380836994e-05,8.642672628164378e-07,2.086162358522436e-07,2.086162358522436e-07,0.9999935223036568 -0.11306038498410322,0.024028927083669216,2.74181338548663e-05,1.4573334190249588e-05,0.0,0.0,0.9999984694886783 -0.08384287356983147,0.02689304947392585,1.0460614112019642e-05,0.00013282893759906423,0.0,0.0,0.999998588697956 -0.12848410009805805,0.08202630280043786,2.3841855525970694e-06,0.006069957602995694,0.0,5.960463881492674e-08,0.9999128772273401 -0.3267157673700469,0.15790915486492818,0.0,0.999043007128475,0.0,9.030102780461401e-06,0.8317049506086491 -0.2012656629002201,0.49492487302888366,0.0,0.9999994231628994,0.0,0.0015087722223222405,0.007709323588961439 -0.14704534410821476,0.3450049459343465,0.0,0.9999999000000099,0.0,0.008213549031016312,0.0001909434604436178 -0.13589847087297383,0.02432870864451571,1.5497206091880952e-06,3.874301522970238e-07,0.9995861245973567,2.3216006818413966e-05,8.195637837052427e-06 -0.3079054355493841,0.05531877278334364,1.5944240882992903e-05,0.0,0.9999997807907323,7.182358977198672e-06,0.0 -0.3379224538663174,0.048089236012807304,4.589557188749359e-06,0.0,0.9999996019768158,8.493661031127061e-06,0.0 -0.3180797397958653,0.046743482343298975,8.1360331982375e-06,1.1920927762985348e-07,0.9999994827675383,4.023313120007555e-06,0.0 -0.324255317436143,0.04553624986822493,6.079673159122528e-06,8.940695822239011e-08,0.9999994827675383,4.7385687857866755e-06,0.0 -0.32721883057193035,0.047073632470653326,5.602836048603113e-06,8.940695822239011e-08,0.9999994231628994,5.841254603862821e-06,0.0 -0.32733851669863434,0.046788126222228096,5.334615173935943e-06,0.0,0.9999994231628994,5.930661562085211e-06,0.0 -0.3132790326942422,0.043819636098987626,9.179114377498718e-06,1.1920927762985348e-07,0.9999994231628994,3.0100342601538e-06,0.0 -0.28378462790267783,0.037195175879785054,3.0905005225539514e-05,0.0,0.9999997807907323,9.238719016313645e-07,0.0 -0.2562207281483413,0.03257188200392878,7.936357658207495e-05,0.0,0.9999997807907323,3.874301522970238e-07,0.0 -0.23841449617352317,0.031249493355168398,0.00010585783853530989,0.0,0.9999997807907323,3.5762783288956044e-07,5.960463881492674e-08 -0.22616577147501,0.031268000597367986,0.00011271237199902646,0.0,0.9999999000000099,3.278255134820971e-07,2.980231940746337e-08 -0.17495897411575645,0.02712070941460647,2.026557719707509e-06,1.7881391644478022e-07,0.9998032046919206,2.0235774877667628e-05,1.7583368450403388e-06 -0.2182044088750131,0.03381535410302005,6.338953337967459e-05,0.0,0.9999997807907323,6.258487075567308e-07,0.0 -0.30108496545498575,0.05105182527621602,2.0772216627001968e-05,1.1920927762985348e-07,0.9999997807907323,3.069638898968727e-06,0.0 -0.30486962197948725,0.044919311992582894,1.680850814580934e-05,5.960463881492674e-08,0.9999997211860935,2.413987872004533e-06,0.0 -0.30412846802405835,0.043405234806257686,1.4990566661954075e-05,2.980231940746337e-08,0.9999997807907323,2.1159646779298993e-06,0.0 -0.30249378083883854,0.04279014467460337,1.5795229285955586e-05,2.980231940746337e-08,0.9999997211860935,1.9073484420776557e-06,0.0 -0.2862914800525374,0.039237558834986475,2.9623505491018588e-05,0.0,0.9999997211860935,1.0728834986686813e-06,0.0 -0.2699147760756307,0.036200672381877956,5.367397725284153e-05,0.0,0.9999998403953712,6.258487075567308e-07,0.0 -0.25524872540370686,0.03421017526994463,8.049606471955857e-05,0.0,0.9999997807907323,4.768371105194139e-07,0.0 -0.2372996807000128,0.031830787653240857,0.00010454653648138151,0.0,0.9999997807907323,3.5762783288956044e-07,0.0 -0.22850731014259185,0.032182782882901655,0.00010690091971457111,0.0,0.9999999000000099,4.172324717044872e-07,5.960463881492674e-08 -0.22016629575771385,0.032121777528984485,0.00010818241944909204,0.0,0.9999999000000099,3.874301522970238e-07,5.960463881492674e-08 -0.16583737730293224,0.4678204654846205,4.768371105194139e-07,0.9999999000000099,2.980231940746337e-08,0.0,0.0 -0.15650174021072846,0.4162393509628896,8.940695822239011e-08,0.9999999000000099,0.0,6.1690801173449175e-06,0.0 -0.17603209614024815,0.4638985394637161,0.0,0.9999999000000099,0.0,6.079673159122528e-06,0.0 -0.1786921918318189,0.5390912889511151,0.0,0.9999999000000099,0.0,9.477137571573351e-06,2.980231940746337e-08 -0.17710602282744425,0.5557375549318463,0.0,0.9999999000000099,0.0,9.953974682092765e-06,0.0 -0.1787820160314917,0.560413777732254,2.980231940746337e-08,0.9999999000000099,0.0,9.924172362685302e-06,2.980231940746337e-08 -0.1803558766767207,0.5621607302656768,5.960463881492674e-08,0.9999999000000099,0.0,1.0222195556759936e-05,0.0 -0.18149650096141773,0.5620975493422257,2.980231940746337e-08,0.9999999000000099,0.0,1.060962570905696e-05,2.980231940746337e-08 -0.18244126438339095,0.5621635912886256,2.980231940746337e-08,0.9999999000000099,0.0,1.0997055861353983e-05,2.980231940746337e-08 -0.1832560300751144,0.5615698098174747,2.980231940746337e-08,0.9999999000000099,0.0,1.1622904568910713e-05,0.0 -0.18395897745324388,0.5622996090879797,2.980231940746337e-08,0.9999999000000099,0.0,1.2367962554097299e-05,0.0 -0.18468406795690648,0.5617541073790887,8.940695822239011e-08,0.9999999000000099,0.0,1.3232229816913736e-05,2.980231940746337e-08 -0.6367861032222283,0.39748361699927387,0.9999996019768158,2.5331971496343865e-06,1.1920927762985348e-07,2.9802319407463367e-07,1.4781950426101832e-05 -0.5544050335654528,0.44180959455554175,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.5789985060452083,0.32596224540850877,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5238510370037601,0.3540826141227945,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5683129429581874,0.3381974696533924,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5446175932658702,0.3596035539488145,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5588415860898357,0.34045970434081024,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5548374056586355,0.3511083721513342,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5594480037457554,0.3447194396859213,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.561346411681773,0.34532368177222833,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5601265430218504,0.34537652128981267,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.55932867524692,0.34532442683028786,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.32950419186181373,0.1179763674534006,2.026557719707509e-06,1.4901159703731684e-07,0.9203120145781429,0.03383466263025139,0.0 -0.3242731690272525,0.30834308261359794,4.0829177588224814e-06,5.960463881492674e-08,0.00022298095380664094,0.9999999000000099,1.4901159703731685e-06 -0.34506788848401776,0.20713126655846495,1.937150761485119e-06,0.0,4.976987341046382e-06,0.9999999000000099,1.6093252480030219e-06 -0.37346071003321135,0.1737840175331083,5.1259989380836994e-06,0.0,1.5795229285955586e-06,0.9999987079072337,3.278255134820971e-07 -0.3978731036021468,0.2418258785787386,0.00013738869246840614,0.0,1.2218950957059981e-06,0.9998802138852696,8.940695822239011e-08 -0.3915347456769942,0.30288827414094494,0.9993497325998167,2.9802319407463367e-07,1.1920927762985348e-07,0.0003535151128113305,0.0 -0.5430102944149237,0.43094998590719374,0.9999999000000099,1.1920927762985348e-07,2.086162358522436e-07,0.0,0.0 -0.5009512305052272,0.4545339047130461,0.9999999000000099,2.980231940746337e-08,3.278255134820971e-07,0.0,0.0 -0.5536084770927074,0.401052892139425,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 -0.561120152450215,0.402350246837384,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,0.0 -0.5667304396394663,0.39562541239639687,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.573928415751534,0.3942913114349401,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.6797603368477682,0.4079155325191093,0.9999997211860935,3.3378597736358976e-06,1.7881391644478022e-07,4.768371105194139e-07,2.273916970789455e-05 -0.5651589631800282,0.4432670771316624,0.9999999000000099,0.0,4.768371105194139e-07,0.0,8.940695822239011e-08 -0.595969617342113,0.31133729214105454,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 -0.5457878708613418,0.3408572375190716,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5825273394343444,0.32938057178579205,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5800571441410202,0.3350835441969249,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.584586918329828,0.33213025325809953,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5900012254470659,0.3332807719136795,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5913133620970971,0.3371030687708589,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5937210321180545,0.3388807773009805,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5970848798504591,0.3421890437017049,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.597556352590613,0.3453464507465286,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.31284278629914913,0.03094071149296236,8.523463350534524e-06,3.278255134820971e-07,0.010892390115594973,3.367662093043361e-05,0.9943111736668745 -0.29019981621494273,0.04891252516862641,3.308057454228434e-06,2.3841855525970696e-07,0.000296950310575965,2.9504296213388735e-05,0.999903578903685 -0.2758485674743871,0.04292035102109291,5.453824451565797e-06,2.086162358522436e-07,3.600120184421575e-05,1.0669230347871886e-05,0.999962527891473 -0.2687677740939429,0.04044196008943417,8.94069582223901e-06,2.682208746671703e-07,1.1175869777798764e-05,5.841254603862821e-06,0.9999764157723169 -0.24911203979414345,0.03668624162045753,1.892447282373924e-05,2.682208746671703e-07,3.308057454228434e-06,2.2053716361522894e-06,0.9999858333052496 -0.23325276373851048,0.034182220691549754,3.2514330473542534e-05,3.5762783288956044e-07,1.1026858180761447e-06,1.1026858180761447e-06,0.9999900652346054 -0.22683188318266978,0.03376451134103534,4.2051072683930815e-05,4.172324717044872e-07,6.258487075567308e-07,8.344649434089744e-07,0.9999912573273818 -0.2242649197485567,0.0337779521884299,4.887580382823993e-05,4.172324717044872e-07,4.172324717044872e-07,9.238719016313645e-07,0.999991793769131 -0.223784357300075,0.033840239042209515,5.2839512309432554e-05,4.172324717044872e-07,2.9802319407463367e-07,9.238719016313645e-07,0.9999919129784087 -0.22551360725422706,0.03411200642001637,5.340575637817436e-05,3.5762783288956044e-07,3.5762783288956044e-07,9.536742210388278e-07,0.999991793769131 -0.22793254255304657,0.03434208034880998,5.2213663601875825e-05,2.9802319407463367e-07,3.278255134820971e-07,9.536742210388278e-07,0.9999914361412983 -0.23122173546787314,0.03463718294504241,4.944204789698173e-05,3.5762783288956044e-07,3.5762783288956044e-07,1.1622904568910714e-06,0.9999909593041877 -0.42300212381518704,0.25988313551267356,9.989737465381722e-05,1.4901159703731684e-07,3.5077329942584386e-05,0.9999999000000099,4.380940952897116e-06 -0.37602043150298453,0.2126462459200084,2.7984377923608103e-05,0.0,4.798173424601603e-06,0.9999994231628994,8.940695822239011e-07 -0.3888878524142407,0.18723332878721397,2.226233259737514e-05,0.0,1.4305113315582417e-06,0.9999977542330126,5.066394299268773e-07 -0.4786576628486796,0.2610064744502406,0.0006193816042453112,5.960463881492674e-08,9.238719016313645e-07,0.9996437026784519,8.940695822239011e-08 -0.6950119137476188,0.4669104813729904,0.9999999000000099,8.940695822239011e-08,5.960463881492674e-08,0.0,0.0 -0.6331321596837138,0.4144921302085654,0.9999999000000099,1.4901159703731684e-07,1.7583368450403388e-06,0.0,0.0 -0.5525543093452535,0.4415170251567118,0.9999999000000099,8.940695822239011e-08,1.6391275674104854e-06,0.0,0.0 -0.5571340918310258,0.4121155142078432,0.9999999000000099,0.0,1.5497206091880952e-06,0.0,0.0 -0.5442960858119651,0.3985283076080733,0.9999999000000099,0.0,7.152556657791209e-07,0.0,0.0 -0.5510938763390274,0.3927663265986229,0.9999999000000099,0.0,4.172324717044872e-07,0.0,2.980231940746337e-08 -0.5602627992398013,0.38759329908409734,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5644347071413924,0.3837079405127564,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.18253943323333197,0.6148706673522931,2.592801788449313e-06,0.9999999000000099,5.960463881492674e-08,5.960463881492674e-08,0.0 -0.16002494096093353,0.4177673756360899,2.980231940746337e-08,0.9999999000000099,0.0,1.2218950957059982e-05,0.0 -0.18346202372744963,0.5054374932377311,0.0,0.9999999000000099,0.0,1.2248753276467444e-05,0.0 -0.1760341525004928,0.5785249470673791,2.980231940746337e-08,0.9999999000000099,0.0,1.2576578789949543e-05,0.0 -0.17723885177832072,0.5951667426997528,5.960463881492674e-08,0.9999999000000099,0.0,1.1622904568910713e-05,1.1920927762985348e-07 -0.18023824691026136,0.5991370676922065,5.960463881492674e-08,0.9999999000000099,0.0,1.1205672097206226e-05,2.980231940746337e-08 -0.1824325919075765,0.6001505254671489,5.960463881492674e-08,0.9999999000000099,0.0,1.1324881374836081e-05,8.940695822239011e-08 -0.1840078234596353,0.6005324720308042,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,8.940695822239011e-08 -0.18523153661914576,0.6013901232643305,0.0,0.9999999000000099,0.0,1.2129543998837591e-05,2.980231940746337e-08 -0.1863446533602801,0.6013730763359276,0.0,0.9999999000000099,0.0,1.299381126165403e-05,8.940695822239011e-08 -0.18733635544001198,0.6010013221665271,2.980231940746337e-08,0.9999999000000099,0.0,1.3828276205063004e-05,2.980231940746337e-08 -0.18821406363661566,0.6008660196229102,0.0,0.9999999000000099,0.0,1.4960764342546611e-05,0.0 -0.29196208714229893,0.029728442425405663,6.8247311443091115e-06,3.5762783288956044e-07,0.02331509953044378,3.582238792777097e-05,0.9873548950847009 -0.22122210263289901,0.03789952396697523,2.2351739555597528e-05,3.874301522970238e-07,2.7000901383161812e-05,1.8179414838552655e-06,0.9999630643332224 -0.21790379284910086,0.032373458141505475,3.373622556924853e-05,5.66244068741804e-07,1.6689298868179488e-06,6.854533463716575e-07,0.999989588397495 -0.1196708083103218,0.02416667341772156,3.418326036036048e-05,9.357928293943498e-06,0.0,2.980231940746337e-08,0.9999984694886783 -0.08192357420582098,0.026824355120833972,1.1295079055428617e-05,0.00014540551638901378,0.0,0.0,0.9999989463257889 -0.16307845711032798,0.11583748457832434,8.642672628164378e-07,0.04026412561225931,0.0,1.7881391644478022e-07,0.9997163011285285 -0.3190706968175375,0.16953435537296255,0.0,0.9999328447813431,0.0,2.6583668911457325e-05,0.5789272802305935 -0.16240254043860303,0.47428879133686064,0.0,0.9999996615814547,0.0,0.0035418864522993917,0.0022191403077185374 -0.13677644729047897,0.3438904284842047,0.0,0.9999999000000099,0.0,0.0081979326156468,0.00014349816794693613 -0.13560116290484647,0.3582082092148615,0.0,0.9999999000000099,0.0,0.0040385719075441764,5.739926717877445e-05 -0.1389655172767317,0.37037140124654644,0.0,0.9999999000000099,0.0,0.002387106179899001,3.495812066495453e-05 -0.14290341734294437,0.38016229861425466,0.0,0.9999999000000099,0.0,0.0014976857595026642,2.4795529747009523e-05 -0.08361232280384981,0.033919006580266704,0.00035962458828986047,0.0011941491363376498,0.0,0.0,0.9992141916511516 -0.21844223140765706,0.08851185439501517,7.992982065081675e-05,7.748603045940476e-07,5.960463881492674e-08,7.423757764399125e-05,0.9999712897733788 -0.25905582307696534,0.08107870815796096,4.261731675267262e-06,3.278255134820971e-07,6.258487075567308e-07,0.00032222267743349395,0.9999466134529094 -0.26088941096179236,0.04883825778124899,1.3947485482692857e-05,1.4901159703731684e-07,4.470347911119505e-06,2.2619960430264698e-05,0.9999833299104194 -0.2697796225436081,0.0402739643981635,1.603364784121529e-05,8.940695822239011e-08,5.334615173935943e-06,8.85128886401662e-06,0.9999877406536917 -0.26563358305784834,0.03790840505904525,2.0295379516482556e-05,1.1920927762985348e-07,3.904103842377701e-06,5.602836048603113e-06,0.9999892903743008 -0.2567437291039013,0.03612580894805288,2.706050602197674e-05,1.7881391644478022e-07,2.413987872004533e-06,3.397464412450824e-06,0.9999907208856325 -0.24642518161706964,0.03459206222895516,3.629922503829038e-05,1.7881391644478022e-07,1.3113020539283883e-06,2.086162358522436e-06,0.9999919129784087 -0.24043944477039367,0.034141808742398964,4.2021270364523355e-05,2.682208746671703e-07,8.642672628164378e-07,1.6093252480030219e-06,0.999992151396964 -0.2353714406392864,0.033785402769025544,4.7475094816089145e-05,3.278255134820971e-07,6.258487075567308e-07,1.3113020539283883e-06,0.9999923898155193 -0.23180451988214038,0.03357136248967377,5.143880329728178e-05,2.9802319407463367e-07,5.364417493343406e-07,1.1622904568910714e-06,0.9999923898155193 -0.22909325360303207,0.03340923785591247,5.474686075151021e-05,3.5762783288956044e-07,4.172324717044872e-07,1.0728834986686813e-06,0.9999923898155193 -0.08683207630751592,0.033556133502936264,0.00029104945133328724,0.0019322333787828876,0.0,0.0,0.9987724020682553 -0.24818074702188891,0.28070363397560005,0.0,0.986069819071851,0.0,1.1920927762985348e-07,0.5784068125244616 -0.17403107880825397,0.4457784294318763,0.0,0.9999999000000099,0.0,0.0006652473738133973,0.00013819335509240765 -0.15042978524538847,0.43252143256410547,0.0,0.9999999000000099,0.0,0.0006263553469866576,7.003545060753892e-06 -0.16107869147587403,0.4607934950993186,0.0,0.9999999000000099,0.0,0.003633826607671416,7.599591448903159e-06 -0.16457182168279116,0.4646665751138379,0.0,0.9999999000000099,0.0,0.0021459160089344,5.185603576898626e-06 -0.16622769831922773,0.4788619875087918,0.0,0.9999999000000099,0.0,0.001495092957714215,3.7550922453403844e-06 -0.1694543659616875,0.48502659789363095,0.0,0.9999999000000099,0.0,0.0010004042578697304,2.9206273019314104e-06 -0.17227369546176913,0.491238087331578,0.0,0.9999999000000099,0.0,0.0007190405603438687,2.413987872004533e-06 -0.17493745683899342,0.49661764494021493,0.0,0.9999999000000099,0.0,0.0005418955737859064,1.996755400300046e-06 -0.17735993861417693,0.5015809535121342,0.0,0.9999999000000099,0.0,0.00042602415592968886,1.8179414838552655e-06 -0.1796000003740329,0.5058286189166803,0.0,0.9999999000000099,0.0,0.00034606453295946463,1.6391275674104854e-06 -0.11593258380409842,0.10711148379399091,0.00026822087466717035,0.0,0.0019992289928108652,0.9996898366688947,0.0 -0.05242615937969561,0.09310436247185024,0.0003995000916570465,0.0,0.004719852929198789,0.9931785067154745,0.0 -0.09864118694850643,0.06652471422009971,0.00017759202134907422,0.0,0.010535626549968228,0.9965990977277854,0.0 -0.09874629973956348,0.08389613030904407,0.0001698136159837263,0.0,0.003899812308383027,0.998291988679407,0.0 -0.09782198071074738,0.08418017624367255,0.00015264748000502737,0.0,0.0016810594308167863,0.9993424608338813,0.0 -0.10115790366707593,0.09310290215805349,0.00011584161553681011,0.0,0.0005351304472804122,0.9997751905116776,0.0 -0.09773847460342051,0.09975555537422999,0.00010794400089383233,0.0,0.0002814829068034915,0.9998461200318675,0.0 -0.08206588029521633,0.10308116672658106,0.00013929604091048378,0.0,0.00031784173648059685,0.9997159435006956,0.0 -0.053339093921360076,0.09820485113369658,0.00028625127790868566,0.0,0.0015236137773871573,0.9970072702943901,0.0 -0.09311467408748345,0.08000877498210351,0.0001608431178420798,0.0,0.43913783211999974,0.3168109636592509,8.940695822239011e-08 -0.2621689438711327,0.031814575189864726,3.871321291029492e-05,0.0,0.99997474684243,2.65240642726424e-06,8.940695822239011e-08 -0.20245057343598344,0.019756495949223195,0.0001745223824501055,0.0,0.9999991847443441,1.1920927762985348e-07,8.940695822239011e-08 -0.34106621144789806,0.2711395620835457,0.9999996615814547,1.1920927762985348e-07,5.960463881492674e-08,0.0,2.9802319407463367e-07 -0.6652250289641537,0.4926170705905429,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.6046331524598573,0.39550405733965494,0.9999999000000099,0.0,4.172324717044872e-07,0.0,1.1920927762985348e-07 -0.590317487692231,0.31875550741459513,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.4901159703731684e-07 -0.5739749073744569,0.3624039887761395,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5718334913017,0.34672951692365994,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5724120735885109,0.3523027896277837,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5748352408171092,0.34460252517521434,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5776608586072144,0.34302580350724093,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5795619487522468,0.34103953832508593,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5797827839611305,0.34131988877173897,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5837706327196628,0.3405930995357947,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 -0.314080178724635,0.031041502947260286,8.761881905794231e-06,3.5762783288956044e-07,0.0101218213449956,3.3378597736358976e-05,0.9946483571086505 -0.2953580617782362,0.04835617541438818,1.9073484420776557e-06,2.086162358522436e-07,0.0010391472730994329,4.887580382823993e-05,0.9997481300056557 -0.25175398587138087,0.04616823791667018,9.536742210388278e-07,3.5762783288956044e-07,0.0005215703919500165,6.496905630827015e-05,0.9995880319457988 -0.1920000910679469,0.04439640044405793,2.9802319407463367e-07,6.854533463716575e-07,0.0027140972284376893,0.00017449258013069803,0.9941176374046424 -0.08884948491682265,0.04100871085418392,1.4901159703731684e-07,4.291533994674725e-06,0.09166811980047317,0.00044420357076824154,0.4861554315308649 -0.04386490583238165,0.03971356152808123,2.086162358522436e-07,1.582503160536305e-05,0.6148006301245512,0.00017639992857277568,0.020274011253467405 -0.039474964140211136,0.04219120740168041,3.5762783288956044e-07,2.2888181304931868e-05,0.7826736382777411,0.00015529988643229163,0.015232710507139716 -0.04025915264916609,0.04349973797053289,2.682208746671703e-07,2.6166436439752837e-05,0.769673389715095,0.00018334386899471466,0.0172224325600596 -0.04111617803403356,0.043562978498628745,2.086162358522436e-07,2.601742484271552e-05,0.6704322025299914,0.00018814204241931624,0.02345964077956998 -0.04542645811846506,0.04362717270104085,2.086162358522436e-07,2.2619960430264698e-05,0.4288784432686193,0.00019907949364185532,0.05270987222001009 -0.0528712570645374,0.043653130523836084,1.1920927762985348e-07,1.8119810199737728e-05,0.17727787510020016,0.00020757315467298236,0.1332356200496985 -0.06528338789669556,0.04342898725719661,2.086162358522436e-07,1.2159346318245055e-05,0.04015287355391125,0.00017163155746758153,0.4077373335319917 -0.10367372631597382,0.021800607439122804,9.536742210388278e-07,8.642672628164378e-07,0.9985698655055623,3.16500632107261e-05,7.51018449068077e-05 -0.39029386637978913,0.06679981945801343,1.2218950957059981e-06,1.7881391644478022e-07,0.9999985290933172,0.0002446472400158668,0.0 -0.37003266809838625,0.061607271422327255,1.2516974151134616e-06,1.7881391644478022e-07,0.999992151396964,0.00014382599346041822,0.0 -0.325505673871867,0.05041778086752637,2.9206273019314104e-06,1.1920927762985348e-07,0.9999934626990179,1.41561017185451e-05,0.0 -0.32016628979310857,0.04270145296319277,5.364417493343406e-06,1.1920927762985348e-07,0.9999984694886783,4.440545591712042e-06,0.0 -0.30616092680617024,0.041128963224997685,1.2099741679430129e-05,2.980231940746337e-08,0.9999994827675383,2.0563600391149723e-06,0.0 -0.2921804487584245,0.039020419114106905,2.4527308872342353e-05,0.0,0.9999997211860935,1.132488137483608e-06,0.0 -0.28047385810644343,0.037592113011598795,4.1604037892818864e-05,0.0,0.9999997211860935,8.642672628164378e-07,0.0 -0.27332615851224173,0.0370699465211334,5.581974425017889e-05,0.0,0.9999997807907323,8.046626240015109e-07,0.0 -0.2678602337726304,0.03665360807744859,6.794928824901649e-05,0.0,0.9999999000000099,6.556510269641942e-07,0.0 -0.26721435784187103,0.037145644419985184,7.066129931509565e-05,0.0,0.9999999000000099,7.450579851865842e-07,0.0 -0.2601190805327471,0.03574088215215932,8.580087757408705e-05,0.0,0.9999998403953712,6.258487075567308e-07,0.0 -0.18358629941180118,0.6381395458082391,3.2782551348209707e-06,0.9999999000000099,8.940695822239011e-08,5.960463881492674e-08,0.0 -0.16624835132864155,0.43639102570690597,5.960463881492674e-08,0.9999999000000099,0.0,1.600384552180783e-05,8.940695822239011e-08 -0.18354931472971958,0.5281151532222512,0.0,0.9999999000000099,0.0,1.4275310996174954e-05,0.0 -0.1752057969497611,0.598763286964884,0.0,0.9999999000000099,0.0,1.2665985748171932e-05,8.940695822239011e-08 -0.17826429008699407,0.609908223047723,0.0,0.9999999000000099,0.0,1.1742113846540568e-05,0.0 -0.18163755535327286,0.6111845373060798,2.980231940746337e-08,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 -0.18386900424195915,0.6109064816382502,5.960463881492674e-08,0.9999999000000099,0.0,1.141428833305847e-05,1.1920927762985348e-07 -0.18542218207545197,0.6104634403137106,2.980231940746337e-08,0.9999999000000099,0.0,1.1831520804762957e-05,2.980231940746337e-08 -0.1866308450621573,0.6101400851158595,0.0,0.9999999000000099,0.0,1.2487171831727152e-05,0.0 -0.18767389654336106,0.6095618008523477,0.0,0.9999999000000099,0.0,1.3321636775136126e-05,1.1920927762985348e-07 -0.18862724303418155,0.6084691881091571,2.980231940746337e-08,0.9999999000000099,0.0,1.4394520273804807e-05,0.0 -0.18947786091973592,0.6073710321340033,2.980231940746337e-08,0.9999999000000099,0.0,1.555681073069588e-05,2.980231940746337e-08 -0.17998445033281824,0.5737904905290357,1.6093252480030219e-06,0.9999999000000099,0.0,0.0,0.0 -0.1448459923207387,0.3821454047502371,2.980231940746337e-08,0.9999999000000099,0.0,6.139277797937454e-06,0.0 -0.1017985343890953,0.5281236170818079,0.0016187129786163728,0.04375052014582201,0.0,0.00014781950426101832,2.086162358522436e-06 -0.027597248553086998,0.14734354612688447,2.086162358522436e-07,0.0002329349284887337,1.9490716892481042e-05,0.013743190583154695,0.00045803184697330455 -0.11599898337837546,0.04330867528173809,1.5586613050103344e-05,2.1159646779298993e-06,3.904103842377701e-06,6.675719547271795e-06,0.9983227446730355 -0.2233844101336487,0.038193821900503334,1.8388031074404898e-05,6.258487075567308e-07,7.152556657791209e-07,2.1159646779298993e-06,0.9999381495941977 -0.24701079725196362,0.0353954434334227,2.765655241012601e-05,2.682208746671703e-07,9.238719016313645e-07,1.6689298868179488e-06,0.9999740315867642 -0.26227292417393905,0.03556239604340998,1.972913544774075e-05,2.086162358522436e-07,1.5497206091880952e-06,2.354383233189606e-06,0.9999752236795405 -0.2646323740372752,0.03505524992342541,2.0802018946409432e-05,1.7881391644478022e-07,1.6391275674104854e-06,2.264976274967216e-06,0.9999789191671471 -0.26298660038812766,0.03449276089077637,2.3394820734858744e-05,2.086162358522436e-07,1.4305113315582417e-06,1.9669530808925826e-06,0.9999817801898102 -0.25827518104437436,0.033968478435421806,2.7537343132496152e-05,2.086162358522436e-07,1.1026858180761447e-06,1.6093252480030219e-06,0.999984104770724 -0.25259977578070864,0.03355365991017851,3.224610959887537e-05,2.682208746671703e-07,7.748603045940476e-07,1.3113020539283883e-06,0.9999858333052496 -0.18339326976970408,0.6331337093222799,3.0994412183761904e-06,0.9999999000000099,5.960463881492674e-08,8.940695822239011e-08,0.0 -0.17937159537526307,0.48997497550203656,8.940695822239011e-08,0.9999999000000099,0.0,2.0235774877667628e-05,5.960463881492674e-08 -0.1812821924611367,0.577404022117925,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 -0.1766016185210534,0.6322665809502359,0.0,0.9999999000000099,0.0,1.1295079055428617e-05,1.1920927762985348e-07 -0.18143171071254957,0.6396626829005686,0.0,0.9999999000000099,0.0,1.0639428028464424e-05,0.0 -0.18521836399265096,0.6412618159149737,0.0,0.9999999000000099,0.0,1.043081179261218e-05,8.940695822239011e-08 -0.18780294059929442,0.6415449975822531,8.940695822239011e-08,0.9999999000000099,0.0,1.0788439625501739e-05,1.1920927762985348e-07 -0.18968865274597538,0.6405357121324442,5.960463881492674e-08,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 -0.19107663630648003,0.6392754315235292,1.1920927762985348e-07,0.9999999000000099,0.0,1.2397764873504761e-05,2.980231940746337e-08 -0.1921806633392865,0.6378600596289351,5.960463881492674e-08,0.9999999000000099,0.0,1.3560055330395832e-05,8.940695822239011e-08 -0.1931230127731464,0.6364380120141273,0.0,0.9999999000000099,0.0,1.4901159703731685e-05,2.980231940746337e-08 -0.19399169086606696,0.6348611115322197,2.980231940746337e-08,0.9999999000000099,0.0,1.645088031291978e-05,8.940695822239011e-08 -0.7018045186705858,0.41342890255524406,0.9999997211860935,3.8146968841553113e-06,2.682208746671703e-07,6.258487075567308e-07,2.8699633589387225e-05 -0.43685561416724406,0.428442537711212,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5540542006263194,0.3304263650805196,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5337710380333176,0.36994463199002775,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5785911679028302,0.32638823980464554,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5682818889382607,0.35412377113000487,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.579825937723946,0.34408825630018036,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5898265838378813,0.35854512446939674,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5977641343822914,0.3809793888870182,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.6057027578103074,0.4180889128922757,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,5.960463881492674e-08 -0.6026992797601998,0.49044358721918047,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5914930104964427,0.651442348845512,0.9999999000000099,1.1920927762985348e-07,8.940695822239011e-08,0.0,0.0 -0.23493564127902916,0.031813502306258956,2.682208746671703e-06,1.4901159703731684e-07,0.9998926116501431,2.0176170238852703e-05,2.682208746671703e-07 -0.3919492363767451,0.06409940122460438,9.238719016313645e-07,1.1920927762985348e-07,0.9999975158144573,0.00016999242990017107,0.0 -0.3777964413009609,0.07757833598715837,6.854533463716575e-07,2.9802319407463367e-07,0.9999557925672868,0.0018758473904639669,0.0 -0.2709677815325115,0.09200173614833909,1.9669530808925826e-06,1.1920927762985348e-07,0.995810528356264,0.1053731038101475,0.0 -0.11757308244218356,0.10108950732407482,6.392597512900893e-05,0.0,0.021982846445971947,0.9998258544546703,0.0 -0.18820512293989972,0.1461634039628562,8.04662624001511e-06,0.0,8.0138436886669e-05,0.9999977542330126,1.1920927762985348e-07 -0.22367924450901797,0.1656166910841589,4.2319293558597985e-06,0.0,1.636147335469739e-05,0.9999993039536218,5.960463881492674e-08 -0.25022697447694336,0.18220490214088875,3.3378597736358976e-06,0.0,1.069903266727935e-05,0.9999996019768158,3.5762783288956044e-07 -0.25884139536739476,0.1942695974970992,3.4868713706732143e-06,0.0,9.953974682092765e-06,0.9999997807907323,5.960463881492673e-07 -0.26074504851215236,0.1986383199351634,3.933906161785165e-06,0.0,9.626149168610668e-06,0.9999997807907323,7.748603045940476e-07 -0.26036867498273375,0.19781097766350025,4.440545591712042e-06,0.0,9.000300461053937e-06,0.9999997807907323,8.046626240015109e-07 -0.25783982871895295,0.19246715303940004,4.827975744009066e-06,0.0,8.22544015645989e-06,0.9999997211860935,7.450579851865842e-07 -0.11599770187851284,0.1070731580074069,0.00026610490998924045,0.0,0.0019772348810881573,0.9996994926203827,0.0 -0.2179094552903543,0.19078251716207925,1.141428833305847e-05,0.0,5.686282542944011e-05,0.9999997211860935,2.682208746671703e-07 -0.24369642137472047,0.18858313557256634,5.692243006825504e-06,0.0,1.1444090652465934e-05,0.9999997807907323,5.66244068741804e-07 -0.2675999998935519,0.20472627874683455,4.678964146971749e-06,0.0,8.702277266979305e-06,0.9999998403953712,1.3113020539283883e-06 -0.2776858210448676,0.22463080283133208,4.857778063416529e-06,0.0,9.179114377498718e-06,0.9999997807907323,2.5331971496343865e-06 -0.28490257262003876,0.2359925806118267,5.1259989380836994e-06,0.0,8.94069582223901e-06,0.9999999000000099,3.904103842377701e-06 -0.29139345883116524,0.24001419540110083,5.185603576898626e-06,0.0,8.1360331982375e-06,0.9999999000000099,4.917382702231456e-06 -0.2976108193274288,0.2388011514731622,5.096196618676236e-06,0.0,7.092952018976282e-06,0.9999999000000099,5.75184764564043e-06 -0.30159229038897045,0.23133710022779724,4.917382702231456e-06,0.0,5.632638368010577e-06,0.9999999000000099,5.6624406874180405e-06 -0.3062327206007992,0.22357180710778904,4.589557188749359e-06,0.0,4.589557188749359e-06,0.9999999000000099,5.334615173935943e-06 -0.307526171194694,0.21322217580005198,4.380940952897116e-06,0.0,3.6060806483030677e-06,0.9999997807907323,4.678964146971749e-06 -0.307056844221752,0.20405760403953632,4.261731675267262e-06,0.0,2.980231940746337e-06,0.9999999000000099,4.053115439415018e-06 -0.35271069406002575,0.28665953869679395,0.00048503274835646636,2.086162358522436e-07,7.119774106442998e-05,0.9999996615814547,1.1026858180761447e-06 -0.31421416996608453,0.17488798496112665,1.0818241944909203e-05,0.0,5.930661562085211e-06,0.9999997807907323,1.9669530808925826e-06 -0.3303927183014437,0.20195671912549787,5.632638368010577e-06,0.0,2.9206273019314104e-06,0.9999998403953712,6.407498672604624e-06 -0.34860119222151187,0.180738300054119,4.321336314082188e-06,0.0,1.4901159703731685e-06,0.9999997211860935,4.410743272304579e-06 -0.35841056703037083,0.16610062119500743,3.8146968841553113e-06,0.0,1.1622904568910714e-06,0.9999997807907323,3.367662093043361e-06 -0.3634809851495914,0.15777605769316752,3.904103842377701e-06,0.0,8.940695822239011e-07,0.9999997211860935,2.65240642726424e-06 -0.36749404667286273,0.15333822366949812,4.2319293558597985e-06,0.0,8.642672628164378e-07,0.9999997807907323,2.324580913782143e-06 -0.3704485893096117,0.15249454972516932,4.947185021638919e-06,0.0,8.642672628164378e-07,0.9999996615814547,1.9073484420776557e-06 -0.37452787159322576,0.15601244566153286,6.675719547271795e-06,0.0,8.046626240015109e-07,0.999999542372177,1.4305113315582417e-06 -0.3793518841109551,0.1710148155396402,1.2308357915282372e-05,0.0,8.344649434089744e-07,0.9999986483025948,8.046626240015109e-07 -0.3846518397171962,0.19088220593044902,2.3901460164785624e-05,0.0,8.642672628164378e-07,0.9999966217448751,5.066394299268773e-07 -0.39463049171721026,0.21022960540032637,4.887580382823993e-05,0.0,8.046626240015109e-07,0.9999903632577996,2.9802319407463367e-07 -0.4540750384142727,0.33147454256103775,0.9999996615814547,3.5762783288956044e-07,2.980231940746337e-08,0.0,1.8775461226701922e-06 -0.5823618769404548,0.4720369576599544,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5616631507640963,0.3445932566529534,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5682095288995064,0.3240887820165719,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5761791467428043,0.35011860722268595,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5813463926074585,0.3474802672267998,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5882411002869216,0.35001808398928946,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.5893328189605824,0.35568845265973575,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5901355147117393,0.35789725178312154,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5930605530493257,0.35892891877703975,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5924597382300146,0.36045518511321945,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5916404723876109,0.36109483235851697,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.09545442461572212,0.020918071266407105,8.642672628164378e-07,1.4603136509657052e-06,0.9941003520593861,4.389881648719354e-05,0.0007168649910271239 -0.16362863778390443,0.050729125729457314,5.543231409788187e-06,1.1026858180761447e-06,0.008939116299310415,8.22544015645989e-06,0.9949909645725588 -0.2567471861732981,0.04146161674743217,5.0067896604538464e-06,4.4703479111195056e-07,4.6849246108532416e-05,3.635882967710531e-06,0.9998913003480892 -0.25126737355145473,0.03723526000338964,1.0371207153797252e-05,4.4703479111195056e-07,5.21540589630609e-06,1.519918289780632e-06,0.999964792867748 -0.24115660785630147,0.035878092044408776,1.7553566130995923e-05,4.768371105194139e-07,1.698732206225412e-06,1.1026858180761447e-06,0.9999782039114813 -0.2377476692101261,0.035711824887836294,2.378225088715577e-05,3.874301522970238e-07,9.834765404462913e-07,1.1026858180761447e-06,0.99998279346867 -0.23772180079429467,0.03575178980215135,2.846121503412752e-05,3.874301522970238e-07,7.152556657791209e-07,1.2516974151134616e-06,0.9999849988403062 -0.23188024758332437,0.03434607386000925,3.7819143328071015e-05,4.172324717044872e-07,4.768371105194139e-07,9.238719016313645e-07,0.9999880386768858 -0.22260189055474738,0.032675117248662074,5.099176850616983e-05,3.874301522970238e-07,2.682208746671703e-07,6.258487075567308e-07,0.9999906016763548 -0.2157200872808777,0.03197517990518452,6.189941740930142e-05,5.066394299268773e-07,1.7881391644478022e-07,4.4703479111195056e-07,0.9999917341644923 -0.20873811840146708,0.031419038767202964,7.26580547153957e-05,4.768371105194139e-07,1.7881391644478022e-07,3.5762783288956044e-07,0.9999926282340745 -0.20793902873131892,0.03189751505305548,7.578729825317935e-05,5.66244068741804e-07,1.1920927762985348e-07,4.172324717044872e-07,0.9999925090247969 -0.7034359574026655,0.4138351678139635,0.9999996615814547,3.784894564747848e-06,2.682208746671703e-07,6.258487075567308e-07,2.9146668380499176e-05 -0.48620501158608376,0.44455158702867453,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5703236460449572,0.3045013546422251,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5121624469545005,0.36359482997390313,0.9999999000000099,0.0,2.980231940746337e-08,0.0,5.960463881492674e-08 -0.5692796706917594,0.3275834917461218,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5404403209462495,0.3647761642308267,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5608558058506471,0.3359025716206433,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5513003468285208,0.3532829582086248,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5566065907247855,0.34479546541031925,0.9999999000000099,0.0,2.980231940746337e-08,0.0,5.960463881492674e-08 -0.5552207231291701,0.348249733388396,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5555225610503003,0.34720253938451645,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5603541135555934,0.3453855215911722,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.6862041949941688,0.4090703725114347,0.9999997211860935,3.397464412450824e-06,2.3841855525970696e-07,4.4703479111195056e-07,2.4735925108194598e-05 -0.5022844671995079,0.45754951230797347,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5783995389698852,0.30227017397473,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5304191708345124,0.3499490916129738,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5739073157072844,0.32549726957469555,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5639697313075188,0.34557723993105943,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5753529071569621,0.33078092330990533,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5743181705237042,0.33835116022991946,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5740282535315286,0.3380398153679885,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5744261741400326,0.339394539536534,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.575056314444572,0.34102755779148813,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.576756954169233,0.3417261242281361,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.6972918510148278,0.4123636781463231,0.9999997211860935,3.6656852871179947e-06,2.3841855525970696e-07,5.66244068741804e-07,2.7298924577236446e-05 -0.5767946243047295,0.4278260468704057,0.9999999000000099,0.0,6.258487075567308e-07,0.0,1.7881391644478022e-07 -0.5849464535470983,0.3132616877019433,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.55236494538881,0.34128975862381017,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5805754065273208,0.33205834025419034,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5772652625798566,0.3373761772531729,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5750548839330974,0.33777251833853905,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5769037008046639,0.3383649587051826,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5777569412945883,0.3402684926404035,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5793671607731289,0.3403159379376366,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5820496082064894,0.34126409882423875,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5837607383486305,0.34245842689372114,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.3160087466109077,0.04139524697548614,2.8610226631164835e-06,2.980231940746337e-08,0.9998932076965312,3.388523716628585e-05,1.1920927762985348e-07 -0.2882383465647554,0.03797969221418441,2.9385086935758882e-05,0.0,0.9999996615814547,1.1026858180761447e-06,0.0 -0.31140229104659956,0.04439935087397381,1.0788439625501739e-05,0.0,0.9999997807907323,2.5629994690418497e-06,0.0 -0.3142695426810786,0.045526206485582,1.0281800195574863e-05,2.980231940746337e-08,0.9999996615814547,3.2484528154135075e-06,0.0 -0.3241834342345469,0.046274751416865566,6.467103311419552e-06,2.980231940746337e-08,0.999999542372177,4.7385687857866755e-06,0.0 -0.33196467159804,0.047967642537486324,4.678964146971749e-06,2.980231940746337e-08,0.9999994231628994,7.3611728936434526e-06,0.0 -0.3378512859204586,0.04918998479000834,3.6060806483030677e-06,5.960463881492674e-08,0.9999990655350666,1.0907648903131594e-05,0.0 -0.34501510857107137,0.0511633157642493,2.5629994690418497e-06,8.940695822239011e-08,0.9999984694886783,1.9401309934258653e-05,0.0 -0.34766286610117414,0.05330300330202988,2.1457669973373625e-06,5.960463881492674e-08,0.9999973966051797,3.0457970434427562e-05,0.0 -0.3544637560697646,0.056454479684699466,1.519918289780632e-06,1.7881391644478022e-07,0.9999944163732389,7.373093821406438e-05,0.0 -0.3615155815928491,0.0665690898781274,9.536742210388278e-07,1.4901159703731684e-07,0.9999748660517077,0.0004509686972737357,0.0 -0.3345520496229878,0.08784678576872525,8.642672628164378e-07,2.086162358522436e-07,0.9993645741548817,0.015675245148021138,0.0 -0.2628924846540312,0.03425106405625354,2.8908249825239467e-06,0.0,0.9999065591356258,2.1964309403300505e-05,1.1920927762985348e-07 -0.14141130446802141,0.017949104306008514,4.565715333223388e-05,0.0,0.9999988867211501,1.7881391644478022e-07,1.4901159703731684e-07 -0.19008904694723747,0.03527319430700931,4.5329327818751785e-05,5.960463881492674e-08,0.9999999000000099,6.556510269641942e-07,5.960463881492674e-08 -0.1872997879904438,0.03422898053536804,7.593630985021666e-05,2.980231940746337e-08,0.9999997807907323,5.66244068741804e-07,8.940695822239011e-08 -0.1649673283031819,0.029053211207183273,5.942582489848196e-05,0.0,0.9999998403953712,4.172324717044872e-07,1.4901159703731684e-07 -0.15107765793174774,0.02927920221781047,4.512071158289954e-05,1.1920927762985348e-07,0.9999997807907323,4.768371105194139e-07,1.7881391644478022e-07 -0.145920395845093,0.030595839018351004,3.713368998169936e-05,1.4901159703731684e-07,0.9999998403953712,6.258487075567308e-07,2.086162358522436e-07 -0.1404236555041341,0.03077676891753572,3.212690032124551e-05,8.940695822239011e-08,0.9999997807907323,7.152556657791209e-07,2.086162358522436e-07 -0.139803171152048,0.03127160667837628,2.95340985327962e-05,1.4901159703731684e-07,0.9999997807907323,7.748603045940476e-07,2.682208746671703e-07 -0.13662803172499438,0.0310805141872591,2.8163191840052885e-05,1.1920927762985348e-07,0.9999997211860935,8.344649434089744e-07,2.9802319407463367e-07 -0.13855364918135082,0.03145840763507037,2.8014180243015567e-05,1.1920927762985348e-07,0.9999997807907323,8.046626240015109e-07,2.9802319407463367e-07 -0.1422692239225605,0.031737655395795254,3.024935419857532e-05,8.940695822239011e-08,0.9999997211860935,8.046626240015109e-07,2.682208746671703e-07 -0.3382471799710403,0.2917903661228258,0.0006537436785221165,8.940695822239011e-08,8.293985491097056e-05,0.9999994827675383,8.344649434089744e-07 -0.3225923180446561,0.16631940004361806,1.3381241413951053e-05,0.0,5.364417493343406e-06,0.9999996615814547,1.2814997345209249e-06 -0.33912414310958433,0.18688589331287772,5.57303372919565e-06,0.0,2.4735925108194595e-06,0.9999997807907323,4.529952549934432e-06 -0.34839290379035287,0.17618343231045316,4.470347911119505e-06,0.0,1.5497206091880952e-06,0.9999998403953712,3.993510800600092e-06 -0.3542088270040708,0.16729015109058623,4.112720078229945e-06,0.0,1.1920927762985347e-06,0.9999997807907323,3.457069051265751e-06 -0.35587155817465627,0.16294008490633355,3.993510800600092e-06,0.0,1.1026858180761447e-06,0.9999998403953712,3.2484528154135075e-06 -0.35748666523406813,0.1601831614696871,3.993510800600092e-06,0.0,9.536742210388278e-07,0.9999997211860935,3.039836579561264e-06 -0.36036610601840324,0.1574769913880582,4.053115439415018e-06,0.0,9.238719016313645e-07,0.9999996615814547,2.8908249825239467e-06 -0.3634681701509652,0.1552190184327411,4.142522397637409e-06,0.0,9.238719016313645e-07,0.9999997807907323,2.712011066079167e-06 -0.367534399017374,0.15295016762975439,4.500150230526969e-06,0.0,9.238719016313645e-07,0.9999997807907323,2.324580913782143e-06 -0.3725674748266444,0.15254068372021756,5.3942198127508695e-06,0.0,8.046626240015109e-07,0.9999996615814547,1.8775461226701922e-06 -0.3775780796848353,0.16057035324208174,8.434056392312133e-06,0.0,7.748603045940476e-07,0.9999991847443441,1.2218950957059981e-06 -0.4479882716947066,0.25128611917961197,5.316733782291465e-05,1.4901159703731684e-07,2.7805564007163326e-05,0.9999999000000099,6.377696353197161e-06 -0.19674655794282667,0.17057132718026485,2.819299415946035e-05,0.0,1.609325248003022e-05,0.999999542372177,3.874301522970238e-07 -0.25220060347466433,0.16373354193744769,8.85128886401662e-06,0.0,4.321336314082188e-06,0.9999996615814547,8.642672628164378e-07 -0.25674426554570423,0.16767680642117797,8.67247494757184e-06,0.0,4.172324717044872e-06,0.9999997211860935,1.1026858180761447e-06 -0.25311833619023305,0.16682288047794958,9.417532932758424e-06,0.0,4.202127036452335e-06,0.9999997807907323,1.0728834986686813e-06 -0.24702766536643433,0.1613507568559923,1.0311602514982325e-05,0.0,4.261731675267262e-06,0.9999996615814547,8.046626240015109e-07 -0.2374531328579807,0.15260985491046755,1.1563299930095787e-05,0.0,4.172324717044872e-06,0.999999542372177,5.66244068741804e-07 -0.22224122284922646,0.14209201929520315,1.4126299399137637e-05,0.0,4.380940952897116e-06,0.9999991847443441,3.5762783288956044e-07 -0.1936424672523424,0.12937650082280164,2.2113321000337822e-05,0.0,5.57303372919565e-06,0.9999980522562066,1.1920927762985348e-07 -0.15063589810701325,0.11643937228116318,4.9471850216389196e-05,0.0,1.0251997876167399e-05,0.9999936415129344,2.980231940746337e-08 -0.09758895635200765,0.11023372409840317,0.00013470648372173444,0.0,2.0384786474704945e-05,0.9999726010754327,8.940695822239011e-08 -0.027910530566013475,0.1262319683812472,0.00027236339706480776,0.0,2.2083518680930358e-05,0.9997532560045937,1.1920927762985348e-07 -0.689573407144603,0.41008582704197677,0.9999996615814547,3.367662093043361e-06,2.3841855525970696e-07,5.66244068741804e-07,2.5689599329233425e-05 -0.5622217654949081,0.4341092704983276,0.9999999000000099,0.0,5.364417493343406e-07,0.0,8.940695822239011e-08 -0.5799249410389139,0.3133740424573257,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 -0.5495926737557766,0.34232234948972223,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5776225328206254,0.33335912221922337,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5757641792058952,0.3395555018797224,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5809078216312193,0.33663296693759587,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5817934274432555,0.3395551740541762,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.583700478052765,0.3410486876380574,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5856894254441928,0.34217542404037604,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5874040722603754,0.3442229031927049,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5904430150741229,0.34535783523367874,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.08607077598215378,0.03297784923942444,0.0003422796383947168,0.00039234753499925527,0.0,2.980231940746337e-08,0.9997475339592675 -0.27278268336120226,0.09776514766926381,7.271765935421062e-06,5.66244068741804e-07,1.4901159703731684e-07,0.000940114165708432,0.9999423815235535 -0.25115022062215353,0.06027978657643946,1.1205672097206226e-05,2.086162358522436e-07,3.2782551348209707e-06,6.41941960036761e-05,0.9999816609805325 -0.28199297188544853,0.04654148220218977,8.344649434089744e-06,8.940695822239011e-08,1.2278555595874908e-05,3.0040737962723075e-05,0.9999827338640312 -0.2977597713347163,0.04536092280564814,4.947185021638919e-06,1.7881391644478022e-07,3.07559936285022e-05,4.2647119072080084e-05,0.9999730779125432 -0.28750818966628705,0.04279568790656653,1.8775461226701922e-06,1.7881391644478022e-07,0.00016194580366015596,8.699297035038557e-05,0.9998758031419973 -0.14527770876282897,0.029895782465583918,1.4901159703731684e-07,4.4703479111195056e-07,0.2064540477769127,0.000533759540587669,0.5659062296490011 -0.18752136825738713,0.03669509291020516,1.7464159172773534e-05,8.940695822239011e-08,0.9999805880970339,9.745358446240521e-06,1.2516974151134616e-06 -0.3131735920776389,0.04742044209621955,9.980796769559483e-05,0.0,0.9999996615814547,6.3180917143822346e-06,2.980231940746337e-08 -0.3532074391695633,0.041196614496806165,1.856684499084968e-05,2.980231940746337e-08,0.9999985290933172,1.7255542936921292e-05,0.0 -0.35799229143567685,0.05200317501131312,1.2546776470542079e-05,8.940695822239011e-08,0.9999916149552147,6.237625451982083e-05,0.0 -0.3606962263434781,0.05928882955489589,6.526707950234478e-06,8.940695822239011e-08,0.9999144269479493,0.0005311965411186271,0.0 -0.43822211025330804,0.2555674612084504,7.122754338383745e-05,1.4901159703731684e-07,3.060698203146488e-05,0.9999999000000099,5.543231409788187e-06 -0.45931527016645135,0.32944649452290237,0.0005950033069700061,5.960463881492674e-08,1.0550021070242033e-05,0.9999656869373301,5.960463881492674e-08 -0.3929245471791644,0.28632110352381723,0.00836664354581245,0.0,2.65240642726424e-06,0.9924740990939597,0.0 -0.3746533393704728,0.311073571390291,0.9995569779289762,3.874301522970238e-07,4.172324717044872e-07,0.00022557375559509026,0.0 -0.7201376557051966,0.5079116820419339,0.9999999000000099,1.1920927762985348e-07,5.960463881492674e-08,0.0,0.0 -0.7629979848545754,0.6226083039171303,0.9999999000000099,3.278255134820971e-07,1.1920927762985348e-07,0.0,0.0 -0.7485330700564378,0.5578370093344104,0.9999999000000099,2.3841855525970696e-07,2.3841855525970696e-07,0.0,0.0 -0.7150611281098868,0.4983288048844562,0.9999999000000099,1.1920927762985348e-07,8.940695822239011e-08,0.0,0.0 -0.6530489921299412,0.47258436671747783,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.617482185338201,0.4220217763654944,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.6268519758918596,0.37215119593923485,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 -0.6343514919018335,0.35928347700642543,0.9999999000000099,0.0,9.536742210388278e-07,0.0,1.4901159703731684e-07 -0.10741001367124209,0.0221224725208548,1.1026858180761447e-06,8.344649434089744e-07,0.9988670542346935,2.9683110129833516e-05,5.0693745312095194e-05 -0.1474837958751644,0.028439581389325702,2.8073784881830496e-05,2.980231940746337e-08,0.9999994827675383,6.258487075567308e-07,2.9802319407463367e-07 -0.2459758222001266,0.04760083555360138,4.276632834970993e-05,5.960463881492674e-08,0.9999999000000099,2.026557719707509e-06,0.0 -0.257620513428511,0.04193666576621069,8.645652860105124e-05,0.0,0.9999998403953712,1.0728834986686813e-06,2.980231940746337e-08 -0.2539591193093999,0.03680589794482363,8.943676054179758e-05,0.0,0.9999997807907323,6.258487075567308e-07,0.0 -0.24672085045746572,0.03476724027992004,0.00010016559552848438,0.0,0.9999997807907323,5.066394299268773e-07,0.0 -0.23334354161249962,0.03239199518602745,0.00011295079055428617,0.0,0.9999997807907323,4.172324717044872e-07,0.0 -0.22151598333395192,0.031463563436842555,0.000113904464775325,0.0,0.9999999000000099,3.278255134820971e-07,5.960463881492674e-08 -0.22106191515007179,0.03324198722270136,0.0001111328490704309,0.0,0.9999997807907323,4.768371105194139e-07,0.0 -0.2243463694956389,0.03450676798229618,0.00011217593024969213,0.0,0.9999997807907323,5.364417493343406e-07,1.1920927762985348e-07 -0.2211451232341748,0.03351420163534395,0.00011491774363517876,0.0,0.9999997807907323,4.768371105194139e-07,8.940695822239011e-08 -0.20554500817401447,0.03059324621630372,0.0001108944305151712,0.0,0.9999997807907323,4.172324717044872e-07,2.980231940746337e-08 -0.6731059550960296,0.40573537342753313,0.9999996615814547,3.039836579561264e-06,1.1920927762985348e-07,3.874301522970238e-07,2.1964309403300505e-05 -0.5286674499292809,0.4449541269970962,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.5839239954706635,0.30842328066312946,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5414279699101369,0.34410226339170014,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.579870581602881,0.32755643123739836,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5742709040403992,0.34070056671030635,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5826795696970944,0.3331409990217052,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5769439935445304,0.340647101343952,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5782925486325178,0.3410055636775698,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5770292281865558,0.3430546223529849,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5793958306072646,0.3437283038504434,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5794471502064141,0.3448884784584753,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.25199377535730233,0.11783927677044068,7.68899840712555e-06,8.940695822239011e-08,0.5445988825747187,0.37768747605952996,0.0 -0.11533600091456624,0.0892570316638695,6.72042302638299e-05,0.0,0.0024051961877793312,0.9998467160782556,0.0 -0.143351584666992,0.11715051529785658,2.3245809137821427e-05,0.0,9.655951488018132e-05,0.9999877406536917,0.0 -0.1385996937694379,0.12264946100995819,2.273916970789455e-05,0.0,4.398822344541593e-05,0.9999886943279127,0.0 -0.1157217323732142,0.12002217767567601,3.656744591295756e-05,0.0,5.1796431130171335e-05,0.9999774886558155,0.0 -0.0755779743163285,0.11964216826297558,7.003545060753892e-05,0.0,8.517502886653031e-05,0.9999143077386717,0.0 -0.04285341501058516,0.11107775567060056,0.0001288652291178716,0.0,0.00038367506005168345,0.9990697100066642,8.940695822239011e-08 -0.0751399099795699,0.0814047753671489,0.00018563864758908933,0.0,0.047111148891485204,0.9416814100814317,2.980231940746337e-08 -0.2632409334073737,0.06792068480282272,7.3611728936434526e-06,0.0,0.9976501063240091,0.0003614127274543083,0.0 -0.2622777521501657,0.02521747350260937,6.347894033789698e-05,0.0,0.9999977542330126,4.172324717044872e-07,0.0 -0.2600265145194148,0.03104382752840613,0.00011891125443577884,0.0,0.9999997807907323,4.768371105194139e-07,0.0 -0.26979064940289105,0.03620499371862343,0.00012370942786038046,0.0,0.9999997807907323,8.046626240015109e-07,5.960463881492674e-08 -0.35670188067866543,0.27769786114705897,0.9999997807907323,1.1920927762985348e-07,5.960463881492674e-08,0.0,3.5762783288956044e-07 -0.6656716465674373,0.5164187549660448,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.6089150905356993,0.4040122925543388,0.9999999000000099,0.0,3.874301522970238e-07,0.0,2.980231940746337e-08 -0.5902450084441871,0.3244428038041547,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,1.4901159703731684e-07 -0.5670477747682373,0.3713413476308103,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5591174363858448,0.3560088276253486,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5564175843962105,0.3630062341068469,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.5528748631248422,0.35566860431302894,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5544762611159564,0.35245758289023893,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5512521266708995,0.35252067440672286,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.555228888965504,0.34902855747922024,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.554881632305057,0.34994128340450953,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5922549962752197,0.3854696153934362,0.9999996615814547,1.6093252480030219e-06,8.940695822239011e-08,1.4901159703731684e-07,1.0013579320907693e-05 -0.5553012490042584,0.45546686641523315,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 -0.581359386420019,0.32177680725309754,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5584835409886848,0.3359722196480514,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5840098857637813,0.33678501838639185,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5886791944260025,0.34133774036284614,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.5935059785597138,0.3440536856062165,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5971747636547767,0.3490504621861715,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5966561436406075,0.3544988035548674,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5959424972287414,0.3570114373549438,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5972091555348107,0.3586736916881552,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5982469916095968,0.35917240375090553,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.3670026659813547,0.0633902549635106,1.9073484420776557e-06,0.0,0.9993708326419573,0.00022786853418946493,0.0 -0.22247695921930336,0.02478560804896323,9.42945386052141e-05,0.0,0.9999993039536218,2.086162358522436e-07,0.0 -0.281477868545321,0.04144042729621815,3.382563252747093e-05,0.0,0.9999997807907323,1.2218950957059981e-06,0.0 -0.28848269580600194,0.04225909709206796,3.5077329942584386e-05,0.0,0.9999998403953712,1.4007090121507783e-06,0.0 -0.2741788029557184,0.037636488669626475,5.254148911535792e-05,0.0,0.9999998403953712,8.344649434089744e-07,0.0 -0.26623344420284306,0.03638234733912224,6.645917227864332e-05,0.0,0.9999998403953712,6.258487075567308e-07,0.0 -0.2580551504981951,0.03533908724179722,8.305906418860042e-05,0.0,0.9999997807907323,5.960463881492673e-07,0.0 -0.2472430169479989,0.033778905862746136,0.00010132788598537545,0.0,0.9999997807907323,4.768371105194139e-07,2.980231940746337e-08 -0.23016151784897476,0.03130486607015526,0.00011712311527133104,0.0,0.9999997211860935,3.5762783288956044e-07,2.980231940746337e-08 -0.21771159767203058,0.030868768686730785,0.00011515616219043845,0.0,0.9999999000000099,3.278255134820971e-07,0.0 -0.20222333072778667,0.02987790107215436,0.00010752676842212784,0.0,0.9999999000000099,3.278255134820971e-07,8.940695822239011e-08 -0.18856030701810156,0.02969554066149528,9.387730613350961e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 -0.09173029660798754,0.03232601284427239,0.0002716779437184361,0.00027632710554600036,0.0,1.1920927762985348e-07,0.9998059465053062 -0.23598256706214316,0.06265011428713892,3.7908550286293404e-05,5.364417493343406e-07,2.086162358522436e-07,3.540515545606648e-05,0.9999875022351364 -0.2305389642619993,0.0446864664478077,3.8951631465554624e-05,2.682208746671703e-07,1.1026858180761447e-06,7.3611728936434526e-06,0.9999935223036568 -0.2608608603369461,0.04453000425529909,1.761317076981085e-05,1.7881391644478022e-07,3.7550922453403844e-06,1.406669476032271e-05,0.9999900056299666 -0.262028694141982,0.04131680726297516,1.901387978196163e-05,2.086162358522436e-07,4.887580382823993e-06,9.626149168610668e-06,0.9999909593041877 -0.26400613783696847,0.039851963513225994,1.919269369840641e-05,1.1920927762985348e-07,4.708766466379212e-06,7.987021601200183e-06,0.9999907208856325 -0.26009237765188886,0.03842833637533195,2.247094883322738e-05,1.7881391644478022e-07,3.6656852871179947e-06,5.722045326232967e-06,0.9999911381181041 -0.2573002874744684,0.037640362971536216,2.4795529747009523e-05,1.7881391644478022e-07,2.8014180243015566e-06,4.649161827564286e-06,0.9999911977227429 -0.25553160904779915,0.037261664861020616,2.6434657314420008e-05,1.7881391644478022e-07,2.2947785943746796e-06,4.053115439415018e-06,0.9999909593041877 -0.2540306448831274,0.036932200187081064,2.7805564007163326e-05,2.3841855525970696e-07,1.9073484420776557e-06,3.546476009488141e-06,0.99999084009491 -0.24911901353758187,0.03593423961977758,3.2305714237690296e-05,2.086162358522436e-07,1.4603136509657052e-06,2.712011066079167e-06,0.9999913765366594 -0.2455357611077681,0.03538370131840396,3.576278328895604e-05,2.3841855525970696e-07,1.1622904568910714e-06,2.264976274967216e-06,0.999991495745937 -0.29512548445433223,0.02995043992483359,7.063149699568818e-06,4.172324717044872e-07,0.019854901235640245,3.531574849784409e-05,0.9890231693204918 -0.5476515292894568,0.05896371602002419,4.4703479111195056e-07,2.980231940746337e-08,0.9999211026674966,0.0028539595134169145,1.5705822327733197e-05 -0.3227888345584724,0.044210672370969616,8.31484711468228e-06,2.980231940746337e-08,0.9999957276752929,4.291533994674725e-06,0.0 -0.28012013434203853,0.032601475710054686,8.589028453230944e-05,0.0,0.999999542372177,7.748603045940476e-07,0.0 -0.30031326411911075,0.03881984948447206,4.175304948985618e-05,0.0,0.9999996615814547,1.698732206225412e-06,0.0 -0.3094134628644614,0.04105588793051557,3.260373743176492e-05,0.0,0.9999996615814547,2.5629994690418497e-06,0.0 -0.3281656801564706,0.04335388540479248,1.4692543467879441e-05,2.980231940746337e-08,0.9999994231628994,5.57303372919565e-06,0.0 -0.33739876745734254,0.0457191467206869,9.655951488018132e-06,0.0,0.9999988867211501,9.983777001500229e-06,0.0 -0.3511545657966167,0.04891696571466141,5.2750105351210165e-06,1.7881391644478022e-07,0.999997277395902,2.8103587201237956e-05,0.0 -0.36626243589791985,0.05983269213605581,2.592801788449313e-06,1.1920927762985348e-07,0.9999830914918642,0.0002637505267560508,0.0 -0.33249977229648886,0.08850276468668848,2.413987872004533e-06,1.1920927762985348e-07,0.9989743425845603,0.025043842672312508,0.0 -0.10910907387281663,0.0939391851264314,0.0002368390323311114,0.0,0.04140504780613523,0.9996805383452395,0.0 -0.43777981398677057,0.31923216575878227,0.9999996615814547,3.278255134820971e-07,8.940695822239011e-08,0.0,1.132488137483608e-06 -0.6399948596689338,0.4813291727672347,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.6038649677980239,0.3691078721844917,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.5752908587217535,0.32684102648860425,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 -0.575566589808473,0.35362717503214375,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5722295641662162,0.3415791987787899,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.5765326618909525,0.34307682508315995,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5772551297902451,0.33944493526368297,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.580662250494755,0.3384174703972207,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5822508334872428,0.3380588292496686,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5865871906037625,0.33806866401605484,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.588667511915627,0.33946707838921325,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.3276243209703205,0.03205573558258466,1.0579823389649495e-05,3.278255134820971e-07,0.005214034989613346,3.108381914198429e-05,0.9971064524133781 -0.3128204047550369,0.04004716872483197,9.536742210388278e-07,1.1920927762985348e-07,0.03574773311765528,7.417797300517633e-05,0.9922560653251746 -0.07857307791384546,0.03214111923621079,1.4901159703731684e-07,2.324580913782143e-06,0.8167502063346229,0.0002183615942984841,0.07003282800343107 -0.03365638851980082,0.036319464438894965,8.642672628164378e-07,1.6391275674104854e-05,0.9859640804425933,5.2809709990025094e-05,0.0016568003428191111 -0.035471826790294494,0.04531076549707824,6.258487075567308e-07,2.9325482296943957e-05,0.9743173936227955,0.00013816355277300018,0.006955712338104913 -0.040326118467568464,0.047821611157811625,2.9802319407463367e-07,3.281235366761717e-05,0.8389221782995546,0.00024113056632578612,0.026242849586713576 -0.049153774974694996,0.04659563302195893,1.7881391644478022e-07,2.396106480360055e-05,0.38617726278913406,0.00026154515511989855,0.09395529880339895 -0.06292611360289364,0.04505622386160852,2.086162358522436e-07,1.4513729551434662e-05,0.06715797706410952,0.00020223853949904644,0.3555728437571382 -0.09267717599485019,0.04413262008864961,3.5762783288956044e-07,6.1690801173449175e-06,0.004744201424154686,9.787081693410971e-05,0.8856033989312677 -0.16093724965382789,0.04257732629046927,1.5795229285955586e-06,1.4603136509657052e-06,0.0001335739955842508,2.0921228224039285e-05,0.9975513414374927 -0.23714837430925675,0.03717038034756274,1.1980532401800274e-05,3.874301522970238e-07,4.7385687857866755e-06,2.413987872004533e-06,0.9999388648498635 -0.23578837512947298,0.031011372799331485,3.9428468576074036e-05,3.5762783288956044e-07,8.344649434089744e-07,5.066394299268773e-07,0.9999841643753627 -0.2994711995000813,0.03857645391757343,2.9504296213388737e-06,2.980231940746337e-08,0.9999053670428495,2.777576168775586e-05,8.940695822239011e-08 -0.12573522328809802,0.016317456957883978,3.8862224507332235e-05,0.0,0.9999979926515679,1.4901159703731684e-07,2.3841855525970696e-07 -0.16006076335244207,0.03023466467339637,3.156065625250371e-05,0.0,0.9999997807907323,5.66244068741804e-07,1.7881391644478022e-07 -0.13630145787628356,0.02949398755522181,3.5673376330733654e-05,5.960463881492674e-08,0.9999997807907323,5.66244068741804e-07,2.086162358522436e-07 -0.0515916645505523,0.031674176449120336,5.03659197986131e-06,2.324580913782143e-06,0.9999904824670772,3.6656852871179947e-06,1.7374752214551145e-05 -0.03551420569272804,0.05732953547449714,3.5762783288956044e-07,6.294249858856264e-05,0.992967387084792,0.00017195938298106365,0.006576895056116646 -0.07782137393629175,0.058888226737429085,1.1920927762985348e-07,2.476572742760206e-05,0.1321016715985639,0.00020042059801519117,0.5271242329855137 -0.19321337341462214,0.045147091142553046,2.2947785943746796e-06,1.7881391644478022e-06,6.005167360603869e-05,5.0067896604538464e-06,0.9990924789786915 -0.22544983028432003,0.03348666428946244,2.193450708389304e-05,7.152556657791209e-07,1.0132788598537545e-06,3.278255134820971e-07,0.9999656869373301 -0.2078293859872591,0.03057646750880232,3.987550336718599e-05,9.238719016313645e-07,2.086162358522436e-07,2.086162358522436e-07,0.9999851180495838 -0.20640274881461923,0.031497567886681094,5.3256744781137045e-05,8.344649434089744e-07,5.960463881492674e-08,2.3841855525970696e-07,0.9999882174908022 -0.20961606501664987,0.03255021571555663,6.17504058122641e-05,6.258487075567308e-07,1.1920927762985348e-07,3.278255134820971e-07,0.9999890519557456 -0.18328058718876086,0.630848884474496,3.069638898968727e-06,0.9999999000000099,5.960463881492674e-08,5.960463881492674e-08,0.0 -0.16880598663584764,0.4447922705842363,5.960463881492674e-08,0.9999999000000099,0.0,1.645088031291978e-05,5.960463881492674e-08 -0.18304798006253453,0.5337415336648608,0.0,0.9999999000000099,0.0,1.406669476032271e-05,1.1920927762985348e-07 -0.175679743282673,0.5959879158906828,0.0,0.9999999000000099,0.0,1.2516974151134616e-05,2.980231940746337e-08 -0.17857643961166988,0.6054958700096906,0.0,0.9999999000000099,0.0,1.1563299930095787e-05,2.980231940746337e-08 -0.18161070346080266,0.606187999144704,0.0,0.9999999000000099,0.0,1.123547441661369e-05,8.940695822239011e-08 -0.18360170721247498,0.6063811181937432,5.960463881492674e-08,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 -0.18504822253414666,0.6062828301345253,0.0,0.9999999000000099,0.0,1.1712311527133104e-05,0.0 -0.18623012303534892,0.6059073208725047,0.0,0.9999999000000099,0.0,1.2397764873504761e-05,8.940695822239011e-08 -0.1872409582060529,0.6053464411652644,0.0,0.9999999000000099,0.0,1.3202427497506273e-05,2.980231940746337e-08 -0.18814492224867907,0.6047695874132268,0.0,0.9999999000000099,0.0,1.4185904037952563e-05,2.980231940746337e-08 -0.1889993846338213,0.6039721964755582,0.0,0.9999999000000099,0.0,1.5407799133658562e-05,2.980231940746337e-08 -0.43270072339173554,0.3164641856605319,0.9999997211860935,2.682208746671703e-07,0.0,0.0,1.1622904568910714e-06 -0.6475930809706517,0.46854212872111495,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5991187691440456,0.36409005516493465,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,2.980231940746337e-08 -0.5730271339179226,0.32230615610325714,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5786744355915779,0.34770023816830575,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.5770601033925481,0.3379969000237576,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5769906043767429,0.34086790675048456,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5753952860593956,0.33924514049443005,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5737864970923297,0.340360522211921,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5736057758093781,0.3401327132596284,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5730618238211804,0.3412032126796111,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5724475383521507,0.3419997095476083,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.44885405896235575,0.32532387966307363,0.9999996615814547,4.172324717044872e-07,8.940695822239011e-08,2.980231940746337e-08,1.370906692743315e-06 -0.6334647536015467,0.4688093363435973,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.6031600236642946,0.36208158725260464,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.7881391644478022e-07 -0.5690673589470783,0.32837313407997093,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5790100693462943,0.34941238158918564,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.575195670104051,0.3399443625821704,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.579794168448282,0.3406046926392015,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5813542604205685,0.3378812074082684,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5812600254771826,0.33887517446437254,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.582909882044497,0.3384240269081449,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5840210914369987,0.3397907018079658,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5856829881425573,0.3407132624996413,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.2232213020232276,0.03341642021560667,5.030631515979817e-05,5.7816499650478935e-06,1.069903266727935e-05,1.5795229285955586e-06,0.9998287154773334 -0.31730264423963833,0.05562123655320457,3.367662093043361e-06,1.1920927762985348e-07,3.4630295151472434e-05,0.00011450051116347426,0.9999590112177829 -0.2894522845625231,0.04817888139853414,2.74181338548663e-06,1.1920927762985348e-07,9.06288533180961e-05,6.896256710887023e-05,0.9999466134529094 -0.2622830271612281,0.04282256960135562,8.642672628164378e-07,1.1920927762985348e-07,0.000720471071675427,0.00013914702931344647,0.9995014264056007 -0.11561653017519,0.03092744945950211,1.4901159703731684e-07,8.642672628164378e-07,0.5269974539187543,0.00043076272471547557,0.2004458107774099 -0.11926725506288673,0.03141748904643907,1.2010334721207738e-05,2.086162358522436e-07,0.9999643756352763,5.900859242677747e-06,4.053115439415018e-06 -0.21011912821853332,0.03614130615569183,0.00014072655224204203,0.0,0.9999997211860935,1.996755400300046e-06,2.9802319407463367e-07 -0.2436860799688524,0.036357223981353715,0.00034323331261575563,0.0,0.9999998403953712,1.1920927762985347e-06,2.086162358522436e-07 -0.23674505948040078,0.03055655955745075,0.0004614889160245703,0.0,0.9999997807907323,6.258487075567308e-07,1.7881391644478022e-07 -0.217155933371135,0.026716291899874695,0.00045531983590722536,0.0,0.9999997807907323,3.874301522970238e-07,1.1920927762985348e-07 -0.19021394848035914,0.02424675225796358,0.0003690421212226189,0.0,0.9999997807907323,3.5762783288956044e-07,2.086162358522436e-07 -0.15908756851491218,0.022788256402881908,0.0002439021820306802,0.0,0.9999997211860935,3.5762783288956044e-07,5.066394299268773e-07 -0.5802457928417265,0.38278204196097404,0.9999996019768158,1.5497206091880952e-06,8.940695822239011e-08,1.7881391644478022e-07,8.016823920607646e-06 -0.5817970037219418,0.4090807735219462,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.5682499408486624,0.3341255187416141,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5316935181397574,0.3523826002471243,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.568215131736115,0.34143200510854227,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5464963912737575,0.3591383694987446,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5587286948926358,0.3434511720546077,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5508586764107534,0.3548653721201733,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5557494759329508,0.3484539687036839,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5562447905310137,0.35050788515764736,0.9999999000000099,0.0,2.980231940746337e-08,0.0,2.980231940746337e-08 -0.5565269589193688,0.349891155898262,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5484118461381802,0.3544682263721029,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.22709873317731816,0.026734739537429518,3.6060806483030677e-06,5.364417493343406e-07,0.1589380045739577,4.243850283622784e-05,0.8740656693912235 -0.28058856724530895,0.03456795215014764,2.324580913782143e-06,2.980231940746337e-08,0.9999178244123618,2.3305413776636355e-05,0.00011110304675102345 -0.25730246304400267,0.04610186814472415,4.130601469874423e-05,0.0,0.9999997211860935,2.9206273019314104e-06,1.1920927762985348e-07 -0.2482452690498556,0.0362545251784233,0.00018391011306345646,0.0,0.9999999000000099,6.854533463716575e-07,8.940695822239011e-08 -0.23650941251729102,0.03151246904787239,0.0001926421926498432,0.0,0.9999997807907323,4.4703479111195056e-07,8.940695822239011e-08 -0.23126009105678452,0.03151088952478611,0.00019893048204481798,0.0,0.9999998403953712,4.768371105194139e-07,1.1920927762985348e-07 -0.2203374802975017,0.030170887703497625,0.00020116565600037775,0.0,0.9999997807907323,3.874301522970238e-07,5.960463881492674e-08 -0.20317381619565808,0.02834242581835845,0.00018528101975619977,0.0,0.9999997807907323,3.5762783288956044e-07,0.0 -0.18941903113534506,0.02820733189099816,0.00016018746681511562,0.0,0.9999997807907323,3.874301522970238e-07,5.960463881492674e-08 -0.17057397960910206,0.027131676669243265,0.00012800096185505518,0.0,0.9999997807907323,4.172324717044872e-07,1.1920927762985348e-07 -0.14826023578029887,0.026144206519418456,8.925794662535279e-05,0.0,0.9999997211860935,4.4703479111195056e-07,3.5762783288956044e-07 -0.12130817770455636,0.026122659440335844,5.137919865846685e-05,1.4901159703731684e-07,0.9999996615814547,6.258487075567308e-07,8.642672628164378e-07 -0.11021691560288856,0.03146207332072343,0.00015437601453066024,0.00012770293866098053,1.4901159703731684e-07,8.940695822239011e-08,0.999859471470962 -0.26947128771619777,0.06821915506148438,1.0788439625501739e-05,3.278255134820971e-07,1.132488137483608e-06,0.00013759730870425838,0.9999773694465379 -0.2560689747227494,0.04754874109407661,1.6599891909957096e-05,2.086162358522436e-07,4.887580382823993e-06,1.8954275143146702e-05,0.9999898268160502 -0.2674162983783617,0.04242250322569171,1.5228985217213781e-05,1.4901159703731684e-07,7.063149699568818e-06,1.272559038698686e-05,0.9999897672114114 -0.25977301596519553,0.03922358154578904,2.0980832862854213e-05,1.7881391644478022e-07,4.887580382823993e-06,6.884335783124038e-06,0.9999915553505758 -0.24958243965069135,0.03670781850186253,2.9653307810426052e-05,2.3841855525970696e-07,2.712011066079167e-06,3.6656852871179947e-06,0.9999927474433521 -0.23938149212799667,0.0350312888562298,3.9845701047778526e-05,2.682208746671703e-07,1.4603136509657052e-06,2.264976274967216e-06,0.9999935819082956 -0.23304858802784081,0.03437232970602831,4.708766466379212e-05,2.9802319407463367e-07,8.046626240015109e-07,1.7285345256328755e-06,0.999993760722212 -0.23095273970601293,0.03443658351308518,4.976987341046383e-05,2.682208746671703e-07,6.854533463716575e-07,1.4305113315582417e-06,0.9999935223036568 -0.23038414119720163,0.034532815212058574,5.0723547631502654e-05,2.9802319407463367e-07,6.258487075567308e-07,1.4603136509657052e-06,0.9999932242804627 -0.2334052026175172,0.035113722079940055,4.726647858023691e-05,2.682208746671703e-07,5.364417493343406e-07,1.6391275674104854e-06,0.9999926282340745 -0.2336942851446659,0.034907490009052515,4.7445292496681685e-05,2.9802319407463367e-07,5.66244068741804e-07,1.519918289780632e-06,0.9999922706062416 -0.42513209579614747,0.2583796083484718,9.262560871839615e-05,1.4901159703731684e-07,3.412365572154556e-05,0.9999999000000099,4.470347911119505e-06 -0.233026623716242,0.17311820384875878,1.7374752214551145e-05,0.0,1.0937451222539056e-05,0.9999997211860935,8.642672628164378e-07 -0.26344799994331486,0.17315509912386845,8.076428559422574e-06,0.0,3.844499203562775e-06,0.9999997807907323,1.4603136509657052e-06 -0.26972973345593315,0.17765006419954527,7.86781232357033e-06,0.0,3.725289925932921e-06,0.9999997211860935,1.847743803262729e-06 -0.2619789242635966,0.17435932156438183,8.94069582223901e-06,0.0,3.874301522970238e-06,0.9999996615814547,1.5795229285955586e-06 -0.2516798972979281,0.16518098113092541,1.0162590917945008e-05,0.0,3.993510800600092e-06,0.9999997211860935,1.043081179261218e-06 -0.23625025152181836,0.15149763223914922,1.2069939360022665e-05,0.0,4.023313120007555e-06,0.9999994827675383,6.258487075567308e-07 -0.20937177538004803,0.13582587239800648,1.743435685336607e-05,0.0,4.589557188749359e-06,0.9999987079072337,2.086162358522436e-07 -0.16848629712360808,0.12119129298042272,3.540515545606648e-05,0.0,7.4803821712733056e-06,0.9999962045124035,1.4901159703731684e-07 -0.11864495276913503,0.11070165036213224,9.545682906210517e-05,0.0,1.618265943825261e-05,0.9999842835846404,2.980231940746337e-08 -0.04781466722290414,0.11999368665547826,0.00022295115148723347,8.940695822239011e-08,1.8388031074404898e-05,0.9999133540644507,0.0 -0.01805940270349109,0.10277041791109777,0.0005712806607216654,2.980231940746337e-08,0.0002884268472254305,0.9954229789946893,1.3411043733358516e-06 -0.14902234076836546,0.02528226375146913,1.6689298868179488e-06,2.682208746671703e-07,0.9996924592730025,2.1696088528633335e-05,4.589557188749359e-06 -0.22130963205374804,0.036931872361534855,5.5074686264992304e-05,0.0,0.9999998403953712,8.642672628164378e-07,0.0 -0.29216122626048524,0.049590557805152764,2.8550621992349908e-05,0.0,0.9999997807907323,2.5331971496343865e-06,0.0 -0.2603720426451634,0.03613203763343085,7.686018175184803e-05,0.0,0.9999998403953712,5.66244068741804e-07,0.0 -0.23507231472949347,0.030924856657454824,0.0001015365022212277,0.0,0.9999997807907323,2.682208746671703e-07,0.0 -0.20897045730679195,0.028387069697287572,0.00010308622283041579,0.0,0.9999999000000099,2.086162358522436e-07,8.940695822239011e-08 -0.1746061742233455,0.025663107629196272,7.56680889755495e-05,0.0,0.9999998403953712,2.3841855525970696e-07,1.4901159703731684e-07 -0.1434270739495969,0.02544149755995932,4.5865769568086125e-05,8.940695822239011e-08,0.9999998403953712,3.278255134820971e-07,1.4901159703731684e-07 -0.1153189241838388,0.027597069735569822,2.3841855525970695e-05,1.7881391644478022e-07,0.9999996615814547,6.258487075567308e-07,5.960463881492673e-07 -0.05503448843728108,0.03445720672017393,4.529952549934432e-06,2.682208746671703e-06,0.9999915553505758,5.3942198127508695e-06,1.8805263546109385e-05 -0.031671106814026705,0.05150109528613359,5.66244068741804e-07,5.42700236409908e-05,0.9981067374619702,9.405612004995439e-05,0.0016020534820676009 -0.05056670307903713,0.05845761298132301,1.1920927762985348e-07,5.245208215713553e-05,0.7435784788419202,0.0003291666178554329,0.060396307627666596 -0.11066967248458368,0.0223919451198382,1.1026858180761447e-06,7.748603045940476e-07,0.9990396692687015,2.8520819672942444e-05,3.811716652214565e-05 -0.06657168268881751,0.02240610122296993,8.553265669941988e-06,4.4703479111195056e-07,0.9999821378176431,7.748603045940476e-07,6.228684756159844e-06 -0.19463664292483238,0.04027757047917179,1.1354683694243543e-05,1.7881391644478022e-07,0.9999997807907323,2.5033948302269232e-06,2.3841855525970696e-07 -0.24890244006079945,0.04773935674803567,6.580352125167911e-05,2.980231940746337e-08,0.9999999000000099,1.7583368450403388e-06,2.980231940746337e-08 -0.22699415682806406,0.03349766134642162,0.00011172889545858017,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 -0.20229330658075007,0.02887347340089386,0.00010368226921856506,0.0,0.9999997807907323,2.9802319407463367e-07,2.980231940746337e-08 -0.1728999912667206,0.026555538172942993,7.757543741762715e-05,0.0,0.9999998403953712,2.682208746671703e-07,1.4901159703731684e-07 -0.1381158530654937,0.02507787942456931,4.467367679178759e-05,2.980231940746337e-08,0.9999997807907323,3.278255134820971e-07,2.086162358522436e-07 -0.09447830915059836,0.02789083122729503,1.680850814580934e-05,2.682208746671703e-07,0.9999993039536218,9.238719016313645e-07,1.5795229285955586e-06 -0.034902274607166835,0.04133871196992636,1.519918289780632e-06,1.654028727114217e-05,0.9998662663997868,2.6434657314420008e-05,0.00024047491529882194 -0.0372011363490913,0.057799667110082525,2.3841855525970696e-07,7.078050859272551e-05,0.9787811850236453,0.00022542474399805292,0.009298532271364424 -0.06363505124782277,0.05445861815473727,1.1920927762985348e-07,3.1888481765985805e-05,0.2313309378559046,0.000263184282687309,0.21830735407716254 -0.527498841263863,0.3644374012323038,0.9999996019768158,8.940695822239011e-07,0.0,8.940695822239011e-08,4.887580382823993e-06 -0.545603036857901,0.44990754119798443,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5603850483662305,0.3234825133723428,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.545068621612867,0.3356067537686737,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.578507482981569,0.3313811718850131,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5770272016286334,0.34342083329042217,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.1920927762985348e-07 -0.5878213643784306,0.33518657082540154,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5858997106309516,0.34443113201919207,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5893712043518161,0.3457785844210762,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5904781222098942,0.3488414883016247,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.5914812683814223,0.35154438012779154,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.592916905855423,0.35291033977187525,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.1815522611066028,0.5968597530296631,2.1457669973373625e-06,0.9999999000000099,2.980231940746337e-08,5.960463881492674e-08,0.0 -0.12691193818520508,0.3321178852943108,8.940695822239011e-08,0.9999999000000099,0.0,3.367662093043361e-06,0.0 -0.1555758714611483,0.7971640823906582,1.1920927762985348e-07,0.9999996615814547,0.0,1.9073484420776557e-06,1.4901159703731684e-07 -0.25356668232821494,0.6932868956332381,0.32662954640427555,0.0013194082848072184,0.0,7.152556657791209e-07,0.10042061397565405 -0.18105515836919664,0.1638851761537303,5.0067896604538464e-05,7.390975213050916e-06,0.0,8.946656286120503e-05,0.9994416429528693 -0.13844025134467033,0.06601235269369819,0.00041422243744433337,2.1159646779298993e-06,0.0,7.748603045940476e-07,0.9999820782130042 -0.15957328676516672,0.04508584737005682,9.217857392728421e-05,3.0100342601538e-06,0.0,3.5762783288956044e-07,0.9999879790722469 -0.16900745033518014,0.03865444659524868,0.00014272330764234208,1.4305113315582417e-06,0.0,2.086162358522436e-07,0.9999910785134654 -0.1775819063113113,0.03516709803932728,0.00010597704781293974,1.2814997345209249e-06,0.0,2.9802319407463367e-07,0.99999185337377 -0.18780928849396275,0.03433308004745044,0.00010359286226034267,9.536742210388278e-07,0.0,2.682208746671703e-07,0.9999915553505758 -0.19952437280782395,0.034560888999742974,9.053944635987371e-05,7.152556657791209e-07,8.940695822239011e-08,3.278255134820971e-07,0.9999906016763548 -0.21493938564364196,0.0358376502929356,7.113813642561506e-05,4.4703479111195056e-07,0.0,6.854533463716575e-07,0.9999885751186351 -0.17155098914389744,0.4997436403372474,7.748603045940476e-07,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.1673728227546051,0.44594833247177945,2.980231940746337e-08,0.9999999000000099,0.0,9.417532932758424e-06,0.0 -0.17933371662350986,0.49163290849850255,0.0,0.9999999000000099,0.0,8.642672628164377e-06,5.960463881492674e-08 -0.17732116579275214,0.554062306786076,8.940695822239011e-08,0.9999999000000099,0.0,9.953974682092765e-06,5.960463881492674e-08 -0.177677124731336,0.564387559794104,0.0,0.9999999000000099,0.0,1.0102986279130082e-05,5.960463881492674e-08 -0.1794897019788806,0.5669665335638041,2.980231940746337e-08,0.9999999000000099,0.0,1.0132788598537546e-05,5.960463881492674e-08 -0.18095013498510676,0.5682758091907161,5.960463881492674e-08,0.9999999000000099,0.0,1.034140483438979e-05,0.0 -0.18204003571710203,0.5687589048365379,0.0,0.9999999000000099,0.0,1.069903266727935e-05,8.940695822239011e-08 -0.18297129868703416,0.5694904922463858,0.0,0.9999999000000099,0.0,1.123547441661369e-05,2.980231940746337e-08 -0.18381750582887535,0.5696509479500936,2.980231940746337e-08,0.9999999000000099,0.0,1.1861323124170421e-05,0.0 -0.1846043169422003,0.5692815779664838,0.0,0.9999999000000099,0.0,1.2636183428764469e-05,1.1920927762985348e-07 -0.18531560897059798,0.5691799520471592,0.0,0.9999999000000099,0.0,1.3589857649803297e-05,0.0 -0.6323356628156133,0.3964170216835233,0.9999996615814547,2.3841855525970694e-06,1.1920927762985348e-07,2.682208746671703e-07,1.406669476032271e-05 -0.5658563971285162,0.43451079718778823,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 -0.5797106623409551,0.3242445289533433,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.530869185902548,0.3504626154299482,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.575462639307989,0.3348452448271537,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5525802373657297,0.3528400956980195,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.564214050746443,0.3369510173220629,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5593127012021208,0.3462065755728126,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5628880262141799,0.3413962721240056,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5636227130656509,0.34260940545891133,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5651109218363413,0.3421083986173376,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5650720596079493,0.3426889180550281,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.32884681223461315,0.032121032470924925,1.069903266727935e-05,3.278255134820971e-07,0.005093663421526602,3.117322610020669e-05,0.9972151116699377 -0.2612835168730309,0.042832225553807585,9.655951488018132e-06,2.3841855525970696e-07,5.692243006825504e-05,8.016823920607646e-06,0.9999608589615862 -0.24239093064258155,0.03612229227401174,1.946091457307358e-05,3.5762783288956044e-07,5.30481285452848e-06,2.0563600391149723e-06,0.9999858929098884 -0.25958603619454285,0.04044228791498038,1.32620321363212e-05,2.682208746671703e-07,4.261731675267262e-06,5.066394299268773e-06,0.9999833895150582 -0.25664210318456343,0.03978478907857563,1.630186871588246e-05,2.682208746671703e-07,3.4868713706732143e-06,4.470347911119505e-06,0.9999855948866944 -0.261030733574549,0.039841413491102554,1.5795229285955586e-05,2.3841855525970696e-07,3.3378597736358976e-06,5.03659197986131e-06,0.999985058444945 -0.2601839899909048,0.03895515202808903,1.7732380047440704e-05,2.086162358522436e-07,3.0100342601538e-06,4.440545591712042e-06,0.9999860717238048 -0.2592940330398003,0.03819343447031236,1.9580123850703434e-05,2.3841855525970696e-07,2.5033948302269232e-06,3.904103842377701e-06,0.9999867869794706 -0.26186680792677874,0.03838109969435554,1.901387978196163e-05,2.3841855525970696e-07,2.5033948302269232e-06,4.202127036452335e-06,0.9999860717238048 -0.26318335532052306,0.0382548272544205,1.910328674018402e-05,1.7881391644478022e-07,2.413987872004533e-06,4.291533994674725e-06,0.9999859525145273 -0.2623746991048888,0.037669807666050215,2.0384786474704945e-05,2.086162358522436e-07,2.1457669973373625e-06,3.7550922453403844e-06,0.999986369746999 -0.2603732943427036,0.037011086934427784,2.2441146513819917e-05,2.086162358522436e-07,1.847743803262729e-06,3.3378597736358976e-06,0.9999869061887483 -0.11795318126190049,0.1090452074817854,0.00025442240078151477,0.0,0.0015810726492047466,0.9997843696260552,0.0 -0.14816030859333706,0.11331522462811842,3.150105161368878e-05,0.0,9.393691077232455e-05,0.9999892307696621,0.0 -0.15213096141185245,0.12383604047562109,2.2768972027302015e-05,0.0,2.9742714768648444e-05,0.9999932242804627,0.0 -0.1701475381780742,0.12921896574668726,1.600384552180783e-05,0.0,1.722574061751383e-05,0.9999957872799317,2.980231940746337e-08 -0.17260894178629443,0.12966704366370954,1.609325248003022e-05,0.0,1.4871357384324222e-05,0.9999962045124035,8.940695822239011e-08 -0.16863599418895528,0.1278717219610598,1.829862411618251e-05,0.0,1.4752148106694368e-05,0.9999956680706541,2.980231940746337e-08 -0.1470923721729406,0.12165981529059945,2.9355284616351418e-05,0.0,1.9669530808925823e-05,0.9999922110016028,2.980231940746337e-08 -0.09532257914148443,0.11567482350276015,7.987021601200183e-05,0.0,3.784894564747848e-05,0.999966044565163,0.0 -0.023626506327604442,0.1294780969398039,0.00017872450948655782,1.4901159703731684e-07,6.699561402797765e-05,0.9993565275286416,8.940695822239011e-08 -0.09499844908320927,0.12670728562092717,5.245208215713553e-06,2.086162358522436e-07,0.5610210930563685,0.032592472155028904,5.066394299268773e-07 -0.09516033529841253,0.019985198971187206,2.2858378985524404e-05,0.0,0.9997343613340894,7.152556657791209e-07,3.725289925932921e-06 -0.09487342834079807,0.0165002644033788,2.4616715830564745e-05,5.960463881492674e-08,0.9999909593041877,2.682208746671703e-07,2.6226041078567766e-06 -0.24205717443417557,0.17479619380818825,7.188319441080164e-05,8.940695822239011e-08,9.876488651633361e-05,0.9999994827675383,1.7881391644478022e-07 -0.2201307713894292,0.14751797911978978,1.123547441661369e-05,0.0,1.0550021070242033e-05,0.999999244348983,1.7881391644478022e-07 -0.230808615674952,0.15409520265801596,9.000300461053937e-06,0.0,6.467103311419552e-06,0.9999993635582606,3.278255134820971e-07 -0.2509106397524888,0.1667656302166526,7.241963616013599e-06,0.0,5.3942198127508695e-06,0.9999996615814547,6.854533463716575e-07 -0.2568912505997143,0.1760688125785697,7.390975213050916e-06,0.0,5.453824451565797e-06,0.9999997211860935,1.0132788598537545e-06 -0.25691458581814286,0.17780727145011346,7.808207684755402e-06,0.0,5.334615173935943e-06,0.9999997807907323,1.1026858180761447e-06 -0.2556497454537391,0.17623510953746457,8.22544015645989e-06,0.0,5.185603576898626e-06,0.9999997807907323,1.1026858180761447e-06 -0.2528827190294457,0.17221739885242257,8.732079586386767e-06,0.0,4.917382702231456e-06,0.9999997807907323,1.0728834986686813e-06 -0.2490108907119638,0.1667250692558899,9.208916696906181e-06,0.0,4.798173424601603e-06,0.9999996615814547,8.046626240015109e-07 -0.24464681743562472,0.16105505821331223,9.80496308505545e-06,0.0,4.649161827564286e-06,0.9999996019768158,6.556510269641942e-07 -0.23551973699548143,0.15249225494634586,1.1086462819576373e-05,0.0,4.470347911119505e-06,0.999999542372177,5.066394299268773e-07 -0.21680647133883135,0.14047384259679555,1.4245508676767491e-05,0.0,4.857778063416529e-06,0.9999989463257889,2.682208746671703e-07 -0.1868610680025927,0.028015762562722858,2.175569316744826e-06,1.4901159703731684e-07,0.9998327685927729,1.972913544774075e-05,1.132488137483608e-06 -0.3863771557647932,0.24322211738236305,3.278255134820971e-07,9.536742210388278e-07,0.9621657363029575,0.9899497234308698,0.0 -0.18853104113751806,0.1538460254405751,7.95721928179272e-06,0.0,0.00014182923806011817,0.9999971581866245,2.980231940746337e-08 -0.2527081072225834,0.19573906060681767,3.0994412183761904e-06,0.0,1.734494989514368e-05,0.9999997807907323,3.5762783288956044e-07 -0.27411639689264117,0.23036122318137925,3.039836579561264e-06,0.0,1.4007090121507784e-05,0.9999997807907323,1.2516974151134616e-06 -0.2873592972636443,0.2519283890292792,3.2782551348209707e-06,0.0,1.361965996921076e-05,0.9999999000000099,2.7716157048940933e-06 -0.29377940295910293,0.2541273831886012,3.457069051265751e-06,0.0,1.1742113846540568e-05,0.9999998403953712,3.635882967710531e-06 -0.2988501191015474,0.24850544329202662,3.457069051265751e-06,0.0,9.536742210388277e-06,0.9999999000000099,3.904103842377701e-06 -0.3044196665160964,0.24080762262989258,3.397464412450824e-06,0.0,7.450579851865842e-06,0.9999999000000099,4.202127036452335e-06 -0.31172943113943574,0.23341652746972022,3.2782551348209707e-06,0.0,5.930661562085211e-06,0.9999997807907323,4.321336314082188e-06 -0.319682419286842,0.22390940781573904,3.129243537783654e-06,0.0,4.529952549934432e-06,0.9999999000000099,4.321336314082188e-06 -0.32652723787863014,0.21159014102173648,3.069638898968727e-06,0.0,3.367662093043361e-06,0.9999999000000099,3.9637084811926284e-06 -0.2858311235786337,0.02942660450431477,6.407498672604624e-06,3.5762783288956044e-07,0.028029617844468634,3.638863199651277e-05,0.9843105881572285 -0.22761663793575007,0.03923550247474208,1.8864868184924313e-05,4.4703479111195056e-07,3.445148123502766e-05,2.413987872004533e-06,0.9999592496363382 -0.24126347898437933,0.03588634728770876,1.9490716892481042e-05,4.172324717044872e-07,4.0829177588224814e-06,1.7583368450403388e-06,0.9999843431892792 -0.24491071700035685,0.03807961940113324,1.9699333128333287e-05,3.5762783288956044e-07,2.264976274967216e-06,2.5033948302269232e-06,0.9999863101423602 -0.23431354760153417,0.035899549716524246,3.0487772753835027e-05,3.5762783288956044e-07,1.1920927762985347e-06,1.5795229285955586e-06,0.9999899460253279 -0.22606101631182157,0.034248232835627196,4.2080875003338276e-05,4.172324717044872e-07,6.258487075567308e-07,1.0132788598537545e-06,0.999991793769131 -0.22512003778479145,0.034291893237917696,4.726647858023691e-05,3.278255134820971e-07,4.768371105194139e-07,9.536742210388278e-07,0.9999920321876864 -0.22711569069875603,0.0346683561742546,4.8488373675942904e-05,4.172324717044872e-07,4.172324717044872e-07,1.1026858180761447e-06,0.999991793769131 -0.2389449477096798,0.03674730657901946,3.740191085636653e-05,2.9802319407463367e-07,5.66244068741804e-07,1.9073484420776557e-06,0.9999897672114114 -0.2506633996859707,0.03822115063012817,2.792477328479318e-05,2.086162358522436e-07,9.536742210388278e-07,3.0994412183761904e-06,0.9999876214444141 -0.2592771351230072,0.03860864042574663,2.2500751152634845e-05,1.7881391644478022e-07,1.4901159703731685e-06,4.023313120007555e-06,0.9999863101423602 -0.26047909258717555,0.03759804367375293,2.282857666611694e-05,2.086162358522436e-07,1.5497206091880952e-06,3.546476009488141e-06,0.9999866677701931 -0.1684690713812687,0.02666687964936436,1.937150761485119e-06,2.086162358522436e-07,0.9997829391147236,2.0474193432927334e-05,2.1457669973373625e-06 -0.17544758319128248,0.026572376485089158,5.263089607358031e-05,0.0,0.9999996615814547,2.682208746671703e-07,5.960463881492674e-08 -0.23913836478196793,0.04338151215764114,6.073712695241035e-05,0.0,0.9999998403953712,1.2516974151134616e-06,5.960463881492674e-08 -0.24594235419208657,0.03933092951101114,9.405612004995439e-05,0.0,0.9999999000000099,7.152556657791209e-07,0.0 -0.24078822134928243,0.03538188337673862,9.667872415781117e-05,0.0,0.9999999000000099,5.364417493343406e-07,5.960463881492674e-08 -0.23156151174540118,0.033377528184897386,0.00010323523442745311,0.0,0.9999999000000099,3.874301522970238e-07,2.980231940746337e-08 -0.2213528752235308,0.03221428393766005,0.0001044571295231591,0.0,0.9999997807907323,4.172324717044872e-07,5.960463881492674e-08 -0.20640161632636853,0.0306282043404585,9.977816537618736e-05,0.0,0.9999999000000099,3.278255134820971e-07,0.0 -0.20156422256588769,0.0319214463179287,9.319185278713795e-05,0.0,0.9999997807907323,3.874301522970238e-07,0.0 -0.20550391077144353,0.0339640378893868,9.366868989765737e-05,0.0,0.9999999000000099,5.066394299268773e-07,2.980231940746337e-08 -0.20839413999648257,0.03430759906181332,9.709595662951567e-05,0.0,0.9999999000000099,5.66244068741804e-07,8.940695822239011e-08 -0.2036252021705234,0.032852917903996616,9.739397982359029e-05,0.0,0.9999999000000099,4.768371105194139e-07,1.7881391644478022e-07 -0.22120425104178953,0.030628025526524206,2.5331971496343865e-06,1.1920927762985348e-07,0.9998821212337117,1.9699333128333287e-05,4.172324717044872e-07 -0.08209094404834336,0.015608072278211139,1.4871357384324222e-05,8.940695822239011e-08,0.9999898268160502,1.4901159703731684e-07,1.1026858180761447e-06 -0.09428453445044159,0.029064118857175303,7.510184490680769e-06,4.4703479111195056e-07,0.9999986483025948,1.4603136509657052e-06,2.2053716361522894e-06 -0.03197219967709712,0.04663339256441768,8.642672628164378e-07,3.1948086404800733e-05,0.9996512128629426,4.9024815425277245e-05,0.0005501806185811812 -0.05169987678313755,0.06250420211675375,1.4901159703731684e-07,5.2750105351210165e-05,0.7986258661823352,0.0003112852262109549,0.08644743889363196 -0.1477179825244772,0.049981087437654254,8.642672628164378e-07,4.261731675267262e-06,0.0008528827768027867,1.7553566130995923e-05,0.9915634594221452 -0.2269661426450208,0.03578785061223429,1.5467403772473487e-05,8.642672628164378e-07,2.026557719707509e-06,4.768371105194139e-07,0.9999449445230225 -0.21118208765109123,0.031040191645075453,3.492831834554707e-05,9.238719016313645e-07,2.682208746671703e-07,2.086162358522436e-07,0.9999823166315596 -0.21434634923047377,0.032657235855232516,4.3183560821414424e-05,7.152556657791209e-07,1.1920927762985348e-07,2.682208746671703e-07,0.9999854756774167 -0.22486683725379605,0.034906804555637716,4.348158401548906e-05,5.960463881492673e-07,2.086162358522436e-07,6.854533463716575e-07,0.9999849988403062 -0.23397693037017908,0.03592652081828049,3.9428468576074036e-05,4.172324717044872e-07,2.682208746671703e-07,1.0132788598537545e-06,0.9999846412124733 -0.24132290481521793,0.03615397214270443,3.528594617843663e-05,3.5762783288956044e-07,3.278255134820971e-07,1.2516974151134616e-06,0.9999844623985569 -0.340232193455913,0.2897067665557692,0.0006078183043152154,5.960463881492674e-08,8.043646008074363e-05,0.9999996019768158,9.238719016313645e-07 -0.6032356023538665,0.5142618416859271,0.9999999000000099,3.5762783288956044e-07,2.264976274967216e-06,5.453824451565797e-06,0.0 -0.4596412181663921,0.416662663150012,0.9999999000000099,0.0,8.702277266979305e-06,0.0,0.0 -0.48837730286483294,0.4409129916866615,0.9999999000000099,8.940695822239011e-08,3.933906161785165e-06,0.0,0.0 -0.5049634575634717,0.4161159395459033,0.9999999000000099,0.0,1.1026858180761447e-06,0.0,0.0 -0.5208867788099132,0.40654435746860856,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 -0.5433573722614363,0.3976177572523179,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.5564304589994814,0.38974469893457425,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5629316568141537,0.377252995903266,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 -0.5607920884853848,0.3693150877320178,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5622330307727702,0.360763460335945,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5533905029067728,0.3593475818018704,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.2890210151552686,0.32532042259367727,0.002535164102715279,1.4901159703731684e-07,0.00015747545574903646,0.9999964429309587,2.086162358522436e-07 -0.46089178321837276,0.2795116304872635,0.061121189442614327,1.4901159703731684e-07,1.2874601984024175e-05,0.9846903293111183,0.0 -0.6768954992014025,0.41976773731673184,0.9999999000000099,1.1920927762985348e-07,1.7881391644478022e-07,0.0,0.0 -0.7558346986457656,0.3688626288736053,0.9999999000000099,0.0,4.380940952897116e-06,0.0,2.980231940746337e-08 -0.6282812952735143,0.4193585216280965,0.9999999000000099,5.960463881492674e-08,2.2947785943746796e-06,0.0,2.980231940746337e-08 -0.5999667048205852,0.39818602793550917,0.9999999000000099,0.0,1.4007090121507783e-06,0.0,1.1920927762985348e-07 -0.574775457358402,0.38534730666237804,0.9999999000000099,0.0,9.238719016313645e-07,0.0,8.940695822239011e-08 -0.5557011961706847,0.3860152363116167,0.9999999000000099,0.0,3.278255134820971e-07,0.0,2.980231940746337e-08 -0.5518708824882872,0.3866744636827196,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5529417991409222,0.38560515635563225,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5497857332001961,0.3780900239297035,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5521967410812607,0.3683028816546155,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.10533544420759813,0.031579643482522755,0.00017493961492181,0.00015309451479613933,1.7881391644478022e-07,2.980231940746337e-08,0.9998521997050266 -0.25671786068806984,0.06415730713699375,1.7583368450403387e-05,3.5762783288956044e-07,8.344649434089744e-07,7.247924079895091e-05,0.9999832107011417 -0.24907872079771537,0.046237379304597793,2.175569316744826e-05,2.3841855525970696e-07,3.0994412183761904e-06,1.3828276205063004e-05,0.9999913169320206 -0.26442539690830125,0.04266655444368276,1.654028727114217e-05,2.086162358522436e-07,5.632638368010577e-06,1.2338160234689835e-05,0.9999902440485219 -0.2615303993116804,0.040052294724281776,1.9758937767148216e-05,1.7881391644478022e-07,5.066394299268773e-06,8.04662624001511e-06,0.9999911977227429 -0.2557569146050408,0.03797793387716383,2.4795529747009523e-05,1.7881391644478022e-07,3.457069051265751e-06,5.1259989380836994e-06,0.9999920321876864 -0.2504291832343355,0.03680071234072906,2.9623505491018588e-05,2.3841855525970696e-07,2.413987872004533e-06,3.6656852871179947e-06,0.9999923898155193 -0.24744963644910425,0.03631436824176754,3.269314438998732e-05,1.7881391644478022e-07,1.7285345256328755e-06,3.069638898968727e-06,0.9999923898155193 -0.24331086873000682,0.035588026040659006,3.71038876622919e-05,2.3841855525970696e-07,1.3113020539283883e-06,2.413987872004533e-06,0.9999925090247969 -0.24203190206479183,0.03543895482410128,3.859400363266506e-05,2.9802319407463367e-07,1.043081179261218e-06,2.175569316744826e-06,0.9999922706062416 -0.24012297390897183,0.035101532930085576,4.1067596143484524e-05,2.086162358522436e-07,8.642672628164378e-07,1.9073484420776557e-06,0.999992151396964 -0.2382530867954781,0.034750014537582904,4.339217705726667e-05,2.682208746671703e-07,7.152556657791209e-07,1.6689298868179488e-06,0.999992151396964 -0.7099630832378139,0.4158289729836813,0.9999997807907323,3.993510800600092e-06,2.9802319407463367e-07,6.556510269641942e-07,3.0934807544946974e-05 -0.48665699360739684,0.4437732695773307,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.5798867940662592,0.30668449396603953,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5219146609090223,0.360902428565215,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5740038752318165,0.3262363671697838,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5537689327964361,0.3538170456280432,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5672778486970609,0.3330709933664285,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5658156871561363,0.34215110534531185,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5679359435799987,0.33874526614110684,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5690020918610519,0.33952188486007484,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5679612159493824,0.34100782865407087,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5690442919495512,0.34125500911591206,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.4243012070480129,0.31670433277429083,0.9999997807907323,2.086162358522436e-07,2.980231940746337e-08,2.980231940746337e-08,1.2516974151134616e-06 -0.570167243457073,0.4760840534348656,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.565038800216166,0.3420176505456826,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5718488693000515,0.3210201858924483,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5815147757289421,0.34862041467419064,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5904732346290227,0.3467071055772282,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.6014787554491847,0.3515217899674255,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.6049901842820471,0.3594665526728217,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.6094071268782998,0.3633202313754699,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 -0.6098978519187153,0.366213679250951,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 -0.6098480820403298,0.36757105582618854,0.9999999000000099,0.0,2.682208746671703e-07,0.0,5.960463881492674e-08 -0.6122630834325943,0.36682587855733423,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 -0.5995647907008814,0.38813644640952005,0.9999996615814547,1.8179414838552655e-06,0.0,1.7881391644478022e-07,9.983777001500229e-06 -0.5413320064320524,0.4642172156969532,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5754446387052676,0.364777982172492,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5620768069988203,0.35451096290239953,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.5747813582182345,0.35134094947520794,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5679323673013122,0.3532098233094979,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.4901159703731684e-07 -0.5679337382081421,0.353038221537219,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5688829421761509,0.35318964713724493,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5713626742126388,0.35306477540646186,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5690355896714143,0.35432958596837905,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5652574300531931,0.35531276458378075,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5568683743246281,0.35690361255256353,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.6287943124510749,0.39486086361799383,0.9999996615814547,2.175569316744826e-06,5.960463881492674e-08,2.9802319407463367e-07,1.433491563498988e-05 -0.5522742867241103,0.44922617070135124,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 -0.5786327123402369,0.31753697985933804,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5527522563705444,0.3383815287964273,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.4901159703731684e-07 -0.579537987685048,0.3341714143180833,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5834472775217697,0.3394508957281595,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5882150530571558,0.33931636804492443,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.5909187793487003,0.34355795377570447,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5916565060370548,0.34769663208729745,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5937047004453867,0.3496820926067481,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 -0.5926733016722361,0.35284712904610177,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5968563556423998,0.3532549142232628,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.3097481727471838,0.2600506543667861,0.9999997807907323,1.1920927762985348e-07,5.960463881492674e-08,0.0,1.4901159703731684e-07 -0.6828418373778835,0.48272901765186743,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5785682201145926,0.4015918671397142,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,0.0 -0.5855889916177504,0.3100742995208027,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 -0.5701523422958797,0.365724414524396,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.560344755626364,0.3529565333715683,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5590489506490007,0.3568855821475221,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5608395337826241,0.35132008784954016,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5638729929690524,0.3479010462165196,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.563427150226151,0.34659481042649065,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5648648738627186,0.34477835887727165,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5650538205866488,0.34453099960149614,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.11940443515283161,0.11031657455462678,0.00024640557686090713,0.0,0.0013829170274645228,0.999824662361894,0.0 -0.10364070534276963,0.09809201954115608,9.882449115514854e-05,0.0,0.000298559635823968,0.9998992873696904,0.0 -0.10367253422307837,0.1055463850317467,7.337331038117481e-05,0.0,0.00012898443839550147,0.9999398185240845,0.0 -0.08868592977156575,0.11193832753172028,8.64863309204587e-05,0.0,0.00011575220857858772,0.999906797554181,0.0 -0.0718215107888046,0.10822975633675291,0.0001260936134129775,0.0,0.00024342534492016081,0.9997043802007656,0.0 -0.06178987025958742,0.09504774211209668,0.0002463459722220922,0.0,0.001670688223662989,0.9975611165982584,0.0 -0.07419067620923872,0.07493281363157805,0.0004413127457857176,0.0,0.14687095603891756,0.7737501681961196,1.1920927762985348e-07 -0.2675089836009836,0.043011963360097,2.1427867653966164e-05,0.0,0.9998795582342426,1.4990566661954075e-05,5.960463881492674e-08 -0.21042126416288726,0.020311206575730382,0.0001745819870889204,0.0,0.9999989463257889,2.086162358522436e-07,5.960463881492674e-08 -0.18901464342288316,0.022935837503320504,0.00017315147575736219,0.0,0.9999996615814547,2.3841855525970696e-07,1.1920927762985348e-07 -0.1719247996735908,0.025880455966332518,0.0001615881758272664,0.0,0.9999997211860935,3.874301522970238e-07,1.7881391644478022e-07 -0.15964359044367638,0.026962190861853464,0.00012850760128498205,5.960463881492674e-08,0.9999997807907323,5.364417493343406e-07,2.9802319407463367e-07 -0.09501045941913101,0.4266527890428478,0.995717783538268,2.3841855525970696e-07,0.002379178762936616,0.010693191412675487,0.0 -0.7125751971903425,0.43299102775788795,0.9999999000000099,0.0,1.2516974151134616e-06,0.0,5.960463881492674e-08 -0.6393667459223168,0.38766840093650146,0.9999999000000099,0.0,8.046626240015109e-07,0.0,0.0 -0.5965182780972478,0.36887884133698146,0.9999999000000099,0.0,8.046626240015109e-07,0.0,1.1920927762985348e-07 -0.5793866514919696,0.36780542128940524,0.9999999000000099,0.0,5.66244068741804e-07,0.0,8.940695822239011e-08 -0.569082140898982,0.3735667466477632,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.5629727840190469,0.3750224708868633,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.5603666305309957,0.37215527885740124,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5621521472698133,0.3621855973577199,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5611611604458188,0.3572255372389403,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5599321126706011,0.35300898545896164,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5607774853474154,0.3499310314056099,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.3131995200981151,0.034866750234355516,2.7894970965385714e-05,9.238719016313645e-07,0.0001812577066361922,1.0818241944909203e-05,0.9996339275176863 -0.24835792182847644,0.03866419195466778,2.1338460695743772e-05,2.3841855525970696e-07,1.1652706888318178e-05,4.321336314082188e-06,0.9999854756774167 -0.25369930266283475,0.03902369736956899,1.770257772803324e-05,2.9802319407463367e-07,5.1259989380836994e-06,4.768371105194139e-06,0.9999887539325515 -0.27405476568994597,0.04405313729485524,9.566544529795742e-06,1.7881391644478022e-07,7.95721928179272e-06,1.344084605276598e-05,0.9999832107011417 -0.2704670429117742,0.04214173554652531,1.1801718485355495e-05,1.7881391644478022e-07,7.4803821712733056e-06,9.983777001500229e-06,0.9999852372588615 -0.27086994050811675,0.040899723761230786,1.2844799664616713e-05,2.086162358522436e-07,6.407498672604624e-06,8.463858711719597e-06,0.9999855948866944 -0.2692357897646999,0.0399757325580809,1.4394520273804807e-05,1.7881391644478022e-07,5.30481285452848e-06,7.063149699568818e-06,0.9999861909330825 -0.2674098610767262,0.039185702794040767,1.6063450160622756e-05,1.7881391644478022e-07,4.261731675267262e-06,5.960463881492674e-06,0.9999865485609154 -0.26485288142061264,0.038401007645707114,1.814961251914519e-05,1.7881391644478022e-07,3.3378597736358976e-06,4.976987341046382e-06,0.9999871446073035 -0.26179587839949897,0.037636816495172684,2.068280966877958e-05,2.086162358522436e-07,2.6226041078567766e-06,4.112720078229945e-06,0.9999877406536917 -0.2585855126273846,0.03695887326561348,2.3394820734858744e-05,2.3841855525970696e-07,2.086162358522436e-06,3.397464412450824e-06,0.9999883367000798 -0.2576310932529582,0.03680670260752797,2.4557111191749817e-05,2.3841855525970696e-07,1.7285345256328755e-06,3.1590458571911173e-06,0.9999882174908022 -0.18294239043431929,0.622941672695302,2.8312203437090202e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.17846184968209394,0.4856819211605018,5.960463881492674e-08,0.9999999000000099,0.0,1.9043682101369094e-05,1.4901159703731684e-07 -0.18123647569859586,0.5750046967475473,0.0,0.9999999000000099,0.0,1.3291834455728662e-05,8.940695822239011e-08 -0.17641797661050804,0.6309084891192612,5.960463881492674e-08,0.9999999000000099,0.0,1.1086462819576373e-05,8.940695822239011e-08 -0.1812247335835756,0.6387236117222931,2.980231940746337e-08,0.9999999000000099,0.0,1.0550021070242033e-05,0.0 -0.18505552410313134,0.6401833890772373,8.940695822239011e-08,0.9999999000000099,0.0,1.0371207153797252e-05,2.980231940746337e-08 -0.1876147985380687,0.6408153771256825,2.980231940746337e-08,0.9999999000000099,0.0,1.0728834986686813e-05,0.0 -0.18948292731454164,0.6405813096856896,1.1920927762985348e-07,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 -0.19093841313525162,0.639687955269949,0.0,0.9999999000000099,0.0,1.2248753276467444e-05,2.980231940746337e-08 -0.19212299584546869,0.6382318137983356,0.0,0.9999999000000099,0.0,1.344084605276598e-05,8.940695822239011e-08 -0.19310590624009658,0.6366713045937383,2.980231940746337e-08,0.9999999000000099,0.0,1.4841555064916758e-05,1.1920927762985348e-07 -0.19397562741430066,0.6350997089252147,2.980231940746337e-08,0.9999999000000099,0.0,1.6391275674104854e-05,5.960463881492674e-08 -0.25938087700723444,0.0339847505034427,2.8014180243015566e-06,5.960463881492674e-08,0.9999048902057389,2.1576879251003478e-05,1.4901159703731684e-07 -0.19817915557994387,0.02472925185733775,7.995962297022422e-05,0.0,0.9999996615814547,2.086162358522436e-07,0.0 -0.27025228737665735,0.04608368872807077,4.500150230526969e-05,0.0,0.9999999000000099,1.4603136509657052e-06,0.0 -0.2802126407507261,0.042759120457003086,4.497169998586222e-05,0.0,0.9999999000000099,1.2814997345209249e-06,0.0 -0.307602286326069,0.045610278837023295,1.4513729551434662e-05,0.0,0.9999997211860935,2.682208746671703e-06,0.0 -0.3385015129902864,0.04827219246991404,4.112720078229945e-06,0.0,0.999999542372177,9.298323655128571e-06,0.0 -0.36425369976442756,0.054735511531993936,1.4305113315582417e-06,1.1920927762985348e-07,0.9999981118608455,6.154178957641186e-05,0.0 -0.36858671902083995,0.07229089735700603,8.642672628164378e-07,2.086162358522436e-07,0.9999787403532306,0.0006890594270199605,0.0 -0.2969075441237531,0.09400853513061569,1.5795229285955586e-06,1.4901159703731684e-07,0.9975367979056219,0.11606498392076905,0.0 -0.1191673874805697,0.11092022059448617,6.502866094708507e-05,0.0,0.0178194028201105,0.9998948766264181,0.0 -0.1881113946359943,0.14427587387475474,8.255242475867353e-06,0.0,6.881355551183292e-05,0.9999976946283737,0.0 -0.2117229998024055,0.15716639158418683,5.03659197986131e-06,0.0,1.7046926701069047e-05,0.9999988867211501,5.960463881492674e-08 -0.18341475724414472,0.6337785123693496,3.1888481765985805e-06,0.9999999000000099,8.940695822239011e-08,2.980231940746337e-08,0.0 -0.17770650982120909,0.48107978693353715,0.0,0.9999999000000099,0.0,1.987814704477807e-05,5.960463881492674e-08 -0.18162584304057497,0.567592501543128,0.0,0.9999999000000099,0.0,1.397728780210032e-05,2.980231940746337e-08 -0.17628484963640773,0.6236985324745302,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,1.1920927762985348e-07 -0.1806640624925191,0.63181245316177,2.980231940746337e-08,0.9999999000000099,0.0,1.0848044264316667e-05,2.980231940746337e-08 -0.18431073426437128,0.6329307555068544,0.0,0.9999999000000099,0.0,1.0639428028464424e-05,2.980231940746337e-08 -0.18674424289883776,0.6330735682357118,0.0,0.9999999000000099,0.0,1.0937451222539056e-05,0.0 -0.18848651646787268,0.6326204537262068,1.4901159703731684e-07,0.9999999000000099,0.0,1.1473892971873398e-05,2.980231940746337e-08 -0.18985486029792467,0.6314965485445145,0.0,0.9999999000000099,0.0,1.2367962554097299e-05,8.940695822239011e-08 -0.19094941019221223,0.6302110551708638,2.980231940746337e-08,0.9999999000000099,0.0,1.3470648372173444e-05,1.1920927762985348e-07 -0.19188648461500973,0.628898918521003,5.960463881492674e-08,0.9999999000000099,0.0,1.4722345787286905e-05,2.980231940746337e-08 -0.19275137781298723,0.627393185984945,5.960463881492674e-08,0.9999999000000099,0.0,1.618265943825261e-05,2.980231940746337e-08 -0.09032723307235534,0.032377570861994276,0.0002820491508722333,0.0003072023084521324,2.980231940746337e-08,0.0,0.9997916413919906 -0.21131825446207497,0.050394386044456035,0.00010025500248670677,6.854533463716575e-07,1.1920927762985348e-07,5.871056923270284e-06,0.9999937011175731 -0.28768727182150733,0.06537103651834719,3.6656852871179947e-06,2.3841855525970696e-07,3.2186504960060438e-06,0.00020897386368513314,0.9999625874961118 -0.2706603109724504,0.04884514211771937,9.953974682092765e-06,2.086162358522436e-07,1.1742113846540568e-05,3.382563252747093e-05,0.9999844623985569 -0.2817566990735687,0.04296183585384948,1.0102986279130082e-05,8.940695822239011e-08,1.3649462288618223e-05,1.9133089059591483e-05,0.9999859525145273 -0.2727220058328234,0.03981587290082067,1.5228985217213781e-05,1.7881391644478022e-07,8.165835517644963e-06,9.745358446240521e-06,0.9999889327464679 -0.2622364759336604,0.037396162741933255,2.2172925639152747e-05,1.1920927762985348e-07,4.2319293558597985e-06,5.245208215713553e-06,0.99999084009491 -0.254209905852282,0.036185592406752363,2.8342005756497666e-05,2.086162358522436e-07,2.4735925108194595e-06,3.546476009488141e-06,0.9999915553505758 -0.24610754846507474,0.035147547715844295,3.5583969372511265e-05,2.9802319407463367e-07,1.4901159703731685e-06,2.354383233189606e-06,0.9999922110016028 -0.24359372257177672,0.03517267107361282,3.7729736369848626e-05,2.682208746671703e-07,1.1622904568910714e-06,2.1457669973373625e-06,0.9999920321876864 -0.24035888909298306,0.034851193422071804,4.118680542111438e-05,2.682208746671703e-07,8.642672628164378e-07,1.847743803262729e-06,0.9999920917923252 -0.23917925356828215,0.0347977876603622,4.240870051682038e-05,2.682208746671703e-07,7.748603045940476e-07,1.6689298868179488e-06,0.9999919129784087 -0.45475426314378253,0.2529482543035339,5.185603576898626e-05,1.4901159703731684e-07,2.7000901383161812e-05,0.9999999000000099,7.003545060753892e-06 -0.27526345847897365,0.19607898589591352,9.655951488018132e-06,0.0,6.526707950234478e-06,0.9999998403953712,2.592801788449313e-06 -0.30189377068223194,0.19906622167993265,5.30481285452848e-06,0.0,2.9504296213388737e-06,0.9999997807907323,4.261731675267262e-06 -0.31254857777255,0.201058745349788,4.947185021638919e-06,0.0,2.6226041078567766e-06,0.9999999000000099,5.21540589630609e-06 -0.32078230379683675,0.20126780864130187,4.768371105194139e-06,0.0,2.324580913782143e-06,0.9999997807907323,5.841254603862821e-06 -0.32959687708443564,0.1953652798794952,4.440545591712042e-06,0.0,1.9669530808925826e-06,0.9999997807907323,5.513429090380723e-06 -0.3366717100004024,0.18608012792261958,3.993510800600092e-06,0.0,1.5497206091880952e-06,0.9999997807907323,4.827975744009066e-06 -0.341549336896105,0.17802691456607314,3.784894564747848e-06,0.0,1.2516974151134616e-06,0.9999998403953712,4.202127036452335e-06 -0.34446442125801435,0.17277726528070195,3.695487606525458e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.874301522970238e-06 -0.3471227586125643,0.16919094321214795,3.6060806483030677e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.635882967710531e-06 -0.34899258612141326,0.16692149636271356,3.695487606525458e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.546476009488141e-06 -0.3509060740325584,0.16502439972912727,3.6656852871179947e-06,0.0,1.0132788598537545e-06,0.9999998403953712,3.5166736900806776e-06 -0.14219793676741208,0.12549638746020006,0.0001707672902047651,0.0,0.0004718005185395526,0.9999764157723169,0.0 -0.19954216479428868,0.14262202379645517,1.3500450691580906e-05,0.0,2.65240642726424e-05,0.999998588697956,1.4901159703731684e-07 -0.2191291153340202,0.1531309187150048,8.40425407290467e-06,0.0,9.596346849203206e-06,0.9999991847443441,1.1920927762985348e-07 -0.24450835584581723,0.16459342834515261,6.258487075567308e-06,0.0,6.616114908456868e-06,0.999999542372177,4.172324717044872e-07 -0.25626355408561063,0.17789652940564932,6.139277797937454e-06,0.0,6.3180917143822346e-06,0.9999997807907323,7.748603045940476e-07 -0.264134883869678,0.191731423106741,6.258487075567308e-06,0.0,6.496905630827015e-06,0.9999997807907323,1.370906692743315e-06 -0.26588958500714804,0.19716796275577345,6.645917227864331e-06,0.0,6.556510269641941e-06,0.9999997807907323,1.6689298868179488e-06 -0.2676315903552815,0.20063030716321584,7.033347380161355e-06,0.0,6.526707950234478e-06,0.9999997807907323,2.0563600391149723e-06 -0.26926904915648325,0.20356771346421126,7.2121612966061355e-06,0.0,6.467103311419552e-06,0.9999998403953712,2.354383233189606e-06 -0.27133396266767396,0.20693078633579726,7.4803821712733056e-06,0.0,6.407498672604624e-06,0.9999997807907323,2.8312203437090202e-06 -0.271650910366254,0.20691004391941897,7.718800726533013e-06,0.0,6.139277797937454e-06,0.9999999000000099,2.9504296213388737e-06 -0.2715521454698652,0.20555654164609116,7.95721928179272e-06,0.0,6.0498708397150644e-06,0.9999999000000099,3.0100342601538e-06 -0.5133962631013,0.35876578086431743,0.9999996615814547,6.556510269641942e-07,0.0,5.960463881492674e-08,4.112720078229945e-06 -0.5735315084219911,0.4618228077097686,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5724628567458574,0.3356113433263206,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5669540762666543,0.3298932611377398,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.584496378874418,0.3444728254682053,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5927590727560643,0.3451573252086887,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.6019932031382198,0.34980201715201564,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.6056594848382022,0.35682225221245906,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.6072080731140476,0.36196294420719954,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.6087501048789679,0.36429607861956553,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.6108602881178636,0.36537200206222187,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.6118995547041243,0.36554014676510443,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.35029417274931957,0.109988182764293,1.5795229285955586e-06,1.4901159703731684e-07,0.9690057858394421,0.011441855478510374,0.0 -0.12486669420678939,0.050757557145010304,6.848572999835082e-05,0.0,0.6155331115309478,0.8135992667083106,0.0 -0.11019933223268054,0.0925576090654192,8.732079586386767e-05,0.0,0.005026369784304549,0.9996538950716893,0.0 -0.12635397910548574,0.10543346403223905,3.4987922984362e-05,0.0,0.00021979210563004235,0.999970574517713,0.0 -0.1487771868644144,0.12447327373280567,1.7911193963885486e-05,0.0,4.6938653066754805e-05,0.9999913169320206,0.0 -0.16694021224284325,0.13167980311046265,1.2546776470542079e-05,0.0,2.4259087997675183e-05,0.9999952508381824,2.980231940746337e-08 -0.18529656528659302,0.13732534644636424,9.685753807425595e-06,0.0,1.6212461757660073e-05,0.9999971581866245,2.980231940746337e-08 -0.20499363540754256,0.14416781065379547,7.539986810088233e-06,0.0,1.1473892971873398e-05,0.9999984694886783,0.0 -0.21995782851262055,0.1505976617078397,6.556510269641941e-06,0.0,9.059905099868864e-06,0.9999990655350666,1.1920927762985348e-07 -0.2304788529777458,0.15620517728038108,6.228684756159844e-06,0.0,7.718800726533013e-06,0.9999993039536218,2.3841855525970696e-07 -0.23301467298496503,0.15771415826957888,6.4373009920120876e-06,0.0,7.122754338383746e-06,0.9999994231628994,2.086162358522436e-07 -0.22741499542248328,0.1534854471420681,7.450579851865842e-06,0.0,6.794928824901648e-06,0.9999993039536218,2.9802319407463367e-07 -0.13031688332018065,0.11808329818610934,0.00020220873717963897,0.0,0.0007202922577589822,0.9999432755931358,0.0 -0.03974562883212497,0.11024647949238292,0.0002810954766511945,0.0,0.0006502866094708508,0.9981188968082885,0.0 -0.09349408745378548,0.06917864083059193,0.00017538664971292192,0.0,0.004479586630135819,0.9982910946098248,8.940695822239011e-08 -0.09471559524143937,0.09173956511833943,0.0002149641298860333,0.0,0.0032178458333820426,0.9976420596977691,0.0 -0.0782179534402884,0.07316324113546688,0.0004718005185395526,0.0,0.018478421509167734,0.9855230061153629,0.0 -0.0850924849474958,0.05896705388013104,0.0007270871865838838,0.0,0.28841152883325505,0.7074107416368555,0.0 -0.2734993100053071,0.05019506811236126,1.1026858180761447e-05,0.0,0.9992182447665909,0.00012469290440082675,0.0 -0.264552235592378,0.025774687524196697,8.58306798934945e-05,0.0,0.9999981118608455,3.874301522970238e-07,5.960463881492674e-08 -0.2544812559976107,0.029005676502983038,0.00017023084845543078,0.0,0.9999997807907323,4.172324717044872e-07,1.1920927762985348e-07 -0.24715074895789044,0.030923634762237136,0.00023391840502918,0.0,0.9999997807907323,4.768371105194139e-07,2.980231940746337e-08 -0.22915408014302283,0.028670728201725084,0.0002663731308639076,0.0,0.9999997807907323,4.172324717044872e-07,0.0 -0.2127611935050603,0.02775466441632897,0.00025200841290951026,0.0,0.9999997807907323,3.278255134820971e-07,1.4901159703731684e-07 -0.11297255754003031,0.022575318809458286,1.1920927762985347e-06,7.450579851865842e-07,0.9991297914825896,2.7894970965385714e-05,3.215670264065298e-05 -0.032356441019625766,0.024897277350930804,2.5331971496343865e-06,4.6193595081568225e-06,0.9991524412453393,3.5166736900806776e-06,0.00016561148894727394 -0.07107469439212226,0.03930348157209677,1.0132788598537545e-06,5.0067896604538464e-06,0.9999224139695505,1.564621768891827e-05,4.1961665725708426e-05 -0.042273908851780416,0.04267627000077948,9.536742210388278e-07,1.5616415369510804e-05,0.9997959925306241,2.9057261422276787e-05,0.0001278817525774253 -0.03204044699536212,0.0483922660267935,4.172324717044872e-07,5.349516333639675e-05,0.9966265158616403,7.936357658207495e-05,0.0010196267538875442 -0.03947627544239614,0.053010791531068566,1.1920927762985348e-07,6.318091714382234e-05,0.9380743757589076,0.00021329519999921533,0.008098184252590021 -0.050417453048525726,0.05062344669428864,8.940695822239011e-08,4.1097398462891984e-05,0.4744227650195765,0.00023663041609525915,0.04658892284850823 -0.07521444558785843,0.048134058705670724,5.960463881492674e-08,1.7017124381661583e-05,0.03182452598853739,0.00011852382428348182,0.46648494704771803 -0.15257138013207958,0.04592508076835061,7.152556657791209e-07,2.980231940746337e-06,0.0002748369895756272,1.6510484951734707e-05,0.9930988749180177 -0.2352985441587291,0.03923821448607889,7.629393768310623e-06,6.854533463716575e-07,5.245208215713553e-06,1.5795229285955586e-06,0.9998965455563048 -0.23487716912250692,0.033226460212740026,2.309679754078411e-05,5.66244068741804e-07,1.0132788598537545e-06,4.4703479111195056e-07,0.9999718858197669 -0.22448539732957176,0.03176251053266234,3.641843431592024e-05,5.66244068741804e-07,3.278255134820971e-07,3.5762783288956044e-07,0.9999830914918642 -0.6889280676556466,0.4098063110603504,0.9999996615814547,3.367662093043361e-06,2.086162358522436e-07,5.066394299268773e-07,2.545118077397372e-05 -0.4723105728430678,0.4435838162139446,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5687796473267593,0.3070966600845908,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.516861319520529,0.36416643851720126,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5758024453878394,0.3226938247128099,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5565593838461252,0.35582882159815776,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.57249498364939,0.32983762020185153,0.9999999000000099,0.0,0.0,0.0,8.940695822239011e-08 -0.5719301104308769,0.3398773073568096,0.9999999000000099,0.0,0.0,0.0,1.1920927762985348e-07 -0.5731455683470864,0.33697795862149676,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5787069201229792,0.336235940398815,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5795166492222193,0.3385549187080492,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5800844430683262,0.339896500052424,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.44834020731976837,0.2451834976253286,4.005431728363077e-05,1.1920927762985348e-07,2.65240642726424e-05,0.9999999000000099,6.467103311419552e-06 -0.17532172798384443,0.16616022583977264,3.7193294620514286e-05,0.0,1.892447282373924e-05,0.9999993039536218,2.086162358522436e-07 -0.23646771906827235,0.1511956453064464,1.007318395972262e-05,0.0,4.768371105194139e-06,0.9999994231628994,4.768371105194139e-07 -0.23884359001124345,0.15249651667844658,1.0192393237352472e-05,0.0,4.470347911119505e-06,0.9999994827675383,5.066394299268773e-07 -0.23771411179511895,0.1522540449835418,1.0669230347871886e-05,0.0,4.410743272304579e-06,0.9999994827675383,5.066394299268773e-07 -0.2336361408136899,0.1494131088000988,1.1444090652465934e-05,0.0,4.500150230526969e-06,0.9999994231628994,4.768371105194139e-07 -0.2329843342207756,0.14832156894051401,1.1742113846540568e-05,0.0,4.351138633489652e-06,0.9999994231628994,4.4703479111195056e-07 -0.23115745185848555,0.14691644904481954,1.2338160234689835e-05,0.0,4.351138633489652e-06,0.9999994231628994,4.4703479111195056e-07 -0.23009619115830365,0.14586731788998517,1.272559038698686e-05,0.0,4.351138633489652e-06,0.9999993039536218,3.874301522970238e-07 -0.2255486845876759,0.14301663634712308,1.3738869246840614e-05,0.0,4.410743272304579e-06,0.999999244348983,4.172324717044872e-07 -0.2198623716740167,0.13955637810224744,1.5020368981361538e-05,0.0,4.470347911119505e-06,0.9999990655350666,2.9802319407463367e-07 -0.2174852788358278,0.13780444858098678,1.576542696654812e-05,0.0,4.589557188749359e-06,0.9999989463257889,2.9802319407463367e-07 -0.6355933546756773,0.397211849621467,0.999999542372177,2.413987872004533e-06,1.1920927762985348e-07,3.278255134820971e-07,1.4543531870842124e-05 -0.5558492541083007,0.4316838978981875,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.5746850371122815,0.32673254603513163,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5346575975196701,0.353062063395125,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5695264339211193,0.3388552069083762,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5475295781862514,0.35567948216069856,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5563119649656728,0.34272313112112335,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5530039667854204,0.35060697787956946,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5497078895341226,0.34951972955440774,0.9999999000000099,0.0,2.980231940746337e-08,0.0,5.960463881492674e-08 -0.5500719547043956,0.3498482107517087,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5511783361206706,0.35023179644309504,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5510172247658494,0.35042053455074396,0.9999999000000099,0.0,2.980231940746337e-08,0.0,2.980231940746337e-08 -0.2006431519902117,0.4031723439003078,0.04844808094010401,1.7881391644478022e-07,0.0006368159610986773,0.9995662166479925,0.0 -0.4535182714274488,0.38663476698930604,0.9999999000000099,1.7881391644478022e-07,5.21540589630609e-06,8.940695822239011e-08,0.0 -0.5238824486515555,0.39713752262944485,0.9999999000000099,1.7881391644478022e-07,1.600384552180783e-05,0.0,0.0 -0.4831905364790156,0.4602253138230945,0.9999999000000099,5.960463881492674e-08,1.603364784121529e-05,0.0,0.0 -0.5132603645112177,0.4344709514827627,0.9999999000000099,5.960463881492674e-08,4.172324717044872e-06,0.0,0.0 -0.5322711467522518,0.4084234833017982,0.9999999000000099,0.0,1.4007090121507783e-06,0.0,0.0 -0.5346998572128141,0.4022117852475945,0.9999999000000099,0.0,5.066394299268773e-07,0.0,0.0 -0.5522816777000622,0.39523047202018274,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.5595558881527944,0.3891484140683434,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5588676929242462,0.38258242600565545,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5597652196652368,0.37239447229684397,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5672674774888703,0.36184424155714967,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.1832219064159819,0.6291621922369308,3.0100342601538e-06,0.9999999000000099,0.0,2.980231940746337e-08,0.0 -0.17667722701294786,0.47646734110302813,5.960463881492674e-08,0.9999999000000099,0.0,1.9133089059591483e-05,0.0 -0.18135565518581934,0.5721898673985115,0.0,0.9999999000000099,0.0,1.3560055330395832e-05,2.980231940746337e-08 -0.17595830559001926,0.6302812694423972,5.960463881492674e-08,0.9999999000000099,0.0,1.1354683694243543e-05,8.940695822239011e-08 -0.18086981772627522,0.6388912199833728,5.960463881492674e-08,0.9999999000000099,0.0,1.060962570905696e-05,8.940695822239011e-08 -0.18481984733769918,0.6406219004487747,2.980231940746337e-08,0.9999999000000099,0.0,1.0520218750834569e-05,8.940695822239011e-08 -0.18752852081475987,0.6404253243303392,8.940695822239011e-08,0.9999999000000099,0.0,1.0788439625501739e-05,2.980231940746337e-08 -0.1894284188668968,0.6391750573017446,0.0,0.9999999000000099,0.0,1.150369529128086e-05,2.980231940746337e-08 -0.19079545139476378,0.6379214524130432,2.980231940746337e-08,0.9999999000000099,0.0,1.2457369512319688e-05,2.980231940746337e-08 -0.19188407062689644,0.636637866388025,0.0,0.9999999000000099,0.0,1.353025301098837e-05,0.0 -0.19282686709559213,0.6353740691050688,2.980231940746337e-08,0.9999999000000099,0.0,1.4871357384324222e-05,2.980231940746337e-08 -0.19373729824217614,0.6334537266600241,2.980231940746337e-08,0.9999999000000099,0.0,1.6421077993512318e-05,1.4901159703731684e-07 -0.29666945337020767,0.2562655508079402,0.9999997807907323,5.960463881492674e-08,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.7025886177725736,0.5913842319429542,0.9999999000000099,2.980231940746337e-08,5.960463881492674e-08,0.0,0.0 -0.7700124382653872,0.5873845218606313,0.9999999000000099,1.4901159703731684e-07,4.4703479111195056e-07,0.0,0.0 -0.7120701670351816,0.3921598791404595,0.9999999000000099,0.0,7.748603045940476e-07,0.0,8.940695822239011e-08 -0.6830589174941465,0.3761784433674393,0.9999999000000099,0.0,1.043081179261218e-06,0.0,5.960463881492674e-08 -0.6910362839412649,0.35946375125451774,0.9999999000000099,0.0,2.2351739555597527e-06,0.0,2.682208746671703e-07 -0.6979330777832949,0.35670912259669474,0.9999999000000099,0.0,3.2782551348209707e-06,0.0,4.4703479111195056e-07 -0.7059043645566465,0.3589462041240216,0.9999999000000099,0.0,3.3378597736358976e-06,0.0,4.768371105194139e-07 -0.7233614921270296,0.35798129433224046,0.9999999000000099,0.0,3.844499203562775e-06,0.0,5.066394299268773e-07 -0.741307020156682,0.3529379665247239,0.9999999000000099,0.0,5.871056923270284e-06,0.0,8.642672628164378e-07 -0.7418498992612739,0.35128104680721894,0.9999999000000099,0.0,7.718800726533013e-06,0.0,1.3113020539283883e-06 -0.732744753330407,0.35244697326347074,0.9999999000000099,0.0,8.076428559422574e-06,0.0,1.4007090121507783e-06 -0.21466049551074945,0.026226133103648203,3.2186504960060438e-06,5.066394299268773e-07,0.21757162421795048,4.4077630403638326e-05,0.8096812153804502 -0.22031173109095978,0.04158484935048419,1.8179414838552656e-05,6.258487075567308e-07,5.406140740513855e-05,2.413987872004533e-06,0.9999405933843891 -0.25589475034607817,0.03828534483254027,1.1861323124170421e-05,3.5762783288956044e-07,6.943940421938965e-06,2.8908249825239467e-06,0.9999752236795405 -0.21731767057472634,0.03285753726396592,3.4719702109694823e-05,5.66244068741804e-07,8.642672628164378e-07,5.66244068741804e-07,0.9999906612809936 -0.13953107594865957,0.02533492445511917,4.6879048427939884e-05,4.440545591712042e-06,0.0,8.940695822239011e-08,0.9999977542330126 -0.08314728736533147,0.025169044728737662,1.1205672097206226e-05,0.00010564922229945764,0.0,0.0,0.9999990655350666 -0.1194469332645547,0.072304993855493,3.2186504960060438e-06,0.003688990700894631,0.0,2.980231940746337e-08,0.9999556733580093 -0.32712924479083666,0.150513946984267,0.0,0.9988722994429091,0.0,6.079673159122528e-06,0.8859854050614325 -0.20806202291580783,0.46122422806471425,0.0,0.9999994231628994,0.0,0.0010911821227848639,0.011816411028823373 -0.145295679563228,0.3335686921502177,0.0,0.9999999000000099,0.0,0.009447633275359963,0.0002308189638108038 -0.13834184407615024,0.349052607953383,0.0,0.9999999000000099,0.0,0.005079715936043909,7.65621585577734e-05 -0.14024373888388703,0.36462262266591156,0.0,0.9999999000000099,0.0,0.0030464526944697207,4.4763083750009984e-05 -0.5324981808441919,0.3662916421263039,0.9999996019768158,8.642672628164378e-07,8.940695822239011e-08,1.4901159703731684e-07,5.066394299268773e-06 -0.5530570745239131,0.4598556756185832,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5691072940590761,0.32421326631716396,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5525632500419695,0.3330005108739936,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5770972370862416,0.33582437032671136,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5760811567067976,0.3436132668860466,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5843517780061988,0.3395372628584242,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5842875241991335,0.34629124397070155,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5820584296939159,0.34902220958455277,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5847442149873837,0.3496499359008973,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5781217217205986,0.3533566295495546,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5746569633245934,0.35394954675335627,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.4557014405538691,0.3290088176163916,0.9999997211860935,4.172324717044872e-07,2.980231940746337e-08,0.0,1.519918289780632e-06 -0.6363207101558414,0.5011895298099612,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.6165404915554336,0.373939931328638,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 -0.5787031054257137,0.3317686020759868,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 -0.5734366774321573,0.3588213323932386,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.5741722583533,0.34249573940134415,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5767490267514782,0.3459958433512453,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5779808759450002,0.33968120807553215,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5818900465724324,0.3387129604236441,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5854923724885734,0.33731114858573413,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5894387960189886,0.33788686984952104,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5919287204497328,0.33938503259569397,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.6981662511536466,0.4126346110591032,0.9999997211860935,3.725289925932921e-06,2.9802319407463367e-07,6.258487075567308e-07,2.7567145451903616e-05 -0.5434339046253248,0.4326052664969677,0.9999999000000099,0.0,4.172324717044872e-07,0.0,0.0 -0.5791491865871943,0.30690962070931765,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.5381184220091203,0.3474898933769294,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5786997079609617,0.32779616111864396,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5682119130852973,0.3414319753062199,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5767936706304131,0.33142709726380465,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5776585340260683,0.33628261083566613,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5789907574413878,0.3363559245487273,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5811696648357068,0.3372346758265004,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5800154804943239,0.3401141762151064,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5831587910410687,0.3406311869037997,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.38456082342462794,0.22442248459787775,4.029273583889048e-05,1.4901159703731684e-07,3.5166736900806775e-05,0.9999999000000099,2.7716157048940933e-06 -0.37924695013383236,0.37260109179792245,0.9999966813495139,3.874301522970238e-06,3.5762783288956045e-06,2.4199483358860258e-05,0.0 -0.39978450535072485,0.4302494823195909,0.9999999000000099,3.5762783288956044e-07,6.407498672604624e-06,0.0,0.0 -0.45180863140142713,0.45257022969125715,0.9999999000000099,5.960463881492674e-08,3.0100342601538e-06,0.0,0.0 -0.4725227057738146,0.4281485676032301,0.9999999000000099,0.0,9.238719016313645e-07,0.0,0.0 -0.5105468034532856,0.4138464032895018,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 -0.5287007093210643,0.41133633248915036,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5438641309512957,0.40537294738503843,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5564859509237651,0.3856645225818183,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5623992085223971,0.37428414815215694,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5663137435678588,0.3653033673137747,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5706556439163424,0.3612394928313621,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.18380826710893555,0.6437708138317194,3.457069051265751e-06,0.9999998403953712,5.960463881492674e-08,2.980231940746337e-08,0.0 -0.15904158353146985,0.4146368800883776,0.0,0.9999999000000099,0.0,1.3649462288618223e-05,0.0 -0.18331119417385175,0.495480060492549,0.0,0.9999999000000099,0.0,1.3321636775136126e-05,0.0 -0.17637154459222992,0.5664732455237275,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 -0.17682901024086212,0.5847509502363264,0.0,0.9999999000000099,0.0,1.2427567192912226e-05,0.0 -0.17932721971722962,0.5925511120735222,5.960463881492674e-08,0.9999999000000099,0.0,1.177191616594803e-05,2.980231940746337e-08 -0.18153572081767833,0.5950109361583366,2.980231940746337e-08,0.9999999000000099,0.0,1.1652706888318178e-05,8.940695822239011e-08 -0.18320065736012037,0.5963261126450804,5.960463881492674e-08,0.9999999000000099,0.0,1.1861323124170421e-05,0.0 -0.18459302186201584,0.5959078668527631,8.940695822239011e-08,0.9999999000000099,0.0,1.2338160234689835e-05,1.1920927762985348e-07 -0.18571078776544245,0.5947903393680607,0.0,0.9999999000000099,0.0,1.3023613581061492e-05,0.0 -0.186606377355478,0.594071626561482,0.0,0.9999999000000099,0.0,1.388788084387793e-05,8.940695822239011e-08 -0.1874144971293093,0.5935665368017419,0.0,0.9999999000000099,0.0,1.4871357384324222e-05,2.980231940746337e-08 -0.08641871809601571,0.14621379969000517,4.172324717044872e-07,0.9999996615814547,0.0,0.0,1.4901159703731684e-07 -0.1128400564147001,0.469033032575401,1.4901159703731684e-07,0.9999999000000099,0.0,5.066394299268773e-07,0.0 -0.38745683430020994,0.9053556917547614,5.528330250084455e-05,0.9999712897733788,0.0,0.0,0.00012451409048438197 -0.31601104138973146,0.6795204280643368,0.36721467279887265,0.0012456475442737464,0.0,6.854533463716575e-07,0.5473646570250089 -0.1909095942895039,0.16146397587872377,4.178285180926364e-05,7.95721928179272e-06,0.0,8.177756445407949e-05,0.999469120691363 -0.1529393792089076,0.08375522492881918,0.0005614160929977949,1.1026858180761447e-06,0.0,3.3378597736358976e-06,0.9999638391935269 -0.19237712024845804,0.057102560987231314,7.295607790947034e-05,1.3411043733358516e-06,0.0,2.413987872004533e-06,0.9999727202847103 -0.20042058824662962,0.04424232243733993,0.00012436507888734463,5.960463881492673e-07,5.960463881492674e-08,1.0132788598537545e-06,0.9999849988403062 -0.220706194630067,0.039298504584258875,6.332992874085967e-05,4.768371105194139e-07,1.4901159703731684e-07,1.1026858180761447e-06,0.9999854756774167 -0.2278067469502533,0.03609347342826777,5.879997619092523e-05,3.278255134820971e-07,1.4901159703731684e-07,9.536742210388278e-07,0.9999875022351364 -0.2381729185482585,0.03590729832034372,4.434585127830549e-05,2.682208746671703e-07,2.086162358522436e-07,1.2218950957059981e-06,0.9999864293516377 -0.2472951710121752,0.036403357976401964,3.486871370673214e-05,2.682208746671703e-07,4.768371105194139e-07,1.6391275674104854e-06,0.9999851180495838 -0.09305450319858517,0.4198853968854983,0.9970579342373828,2.9802319407463367e-07,0.0021715162013054108,0.0063569837412089745,0.0 -0.7350741624527776,0.43789046995294134,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,0.0 -0.7272620796856145,0.38481572263803976,0.9999999000000099,0.0,2.8312203437090202e-06,0.0,2.086162358522436e-07 -0.6545674204555313,0.37761336558551634,0.9999999000000099,0.0,1.9073484420776557e-06,0.0,2.3841855525970696e-07 -0.6061784624802401,0.37471473210594064,0.9999999000000099,0.0,1.1920927762985347e-06,0.0,1.1920927762985348e-07 -0.5798698067424989,0.37172812217069157,0.9999999000000099,0.0,5.960463881492673e-07,0.0,8.940695822239011e-08 -0.580890834307459,0.3693854808174855,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.5773347615956618,0.36902517073988,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5778229832409968,0.3651382326454528,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5788494348286313,0.3588410317283335,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.577392697310381,0.3554329275476274,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5752900242567266,0.35250473016424816,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.15104645490020913,0.02351206540658792,1.6093252480030219e-06,1.0132788598537545e-06,0.747348233828409,5.30481285452848e-05,0.17082698425053824 -0.08649703859924733,0.03623092173909628,1.2814997345209249e-06,1.6391275674104854e-06,0.9896310174271264,3.206729568243058e-05,0.013797997048545022 -0.08691781758902177,0.03426635264763581,1.996755400300046e-06,1.4603136509657052e-06,0.999932546758149,1.3381241413951053e-05,3.427266731858287e-05 -0.1108135878993879,0.0333622693958375,1.087784658372413e-05,4.172324717044872e-07,0.9999979330469291,2.712011066079167e-06,2.026557719707509e-06 -0.14045524596586376,0.032033473247764864,2.890824982523947e-05,2.086162358522436e-07,0.9999996615814547,1.2814997345209249e-06,5.960463881492673e-07 -0.1593419909411254,0.03242713212411653,5.459784915447289e-05,0.0,0.9999997807907323,9.238719016313645e-07,2.9802319407463367e-07 -0.16075605153371822,0.030948489899104217,7.340311270058228e-05,2.980231940746337e-08,0.9999998403953712,7.450579851865842e-07,2.086162358522436e-07 -0.15235874056185217,0.029180049891243585,7.069110163450312e-05,8.940695822239011e-08,0.9999997807907323,6.258487075567308e-07,2.682208746671703e-07 -0.13129666447095795,0.027346372599687457,5.099176850616983e-05,5.960463881492674e-08,0.9999997807907323,5.66244068741804e-07,5.066394299268773e-07 -0.0864471495115724,0.02849212288368621,2.0116565600037775e-05,2.682208746671703e-07,0.9999987079072337,1.4305113315582417e-06,3.546476009488141e-06 -0.03375902771809979,0.039505511515528356,2.413987872004533e-06,1.3917683163285393e-05,0.9998036815290312,2.6434657314420008e-05,0.00033718344177604057 -0.034440696238045326,0.05301499365852451,4.768371105194139e-07,5.590915120840128e-05,0.9850970713663915,0.00017797945150137124,0.006625443034431404 -0.15409070252734136,0.02565294503726381,1.7285345256328755e-06,2.086162358522436e-07,0.9997220827784936,2.1308658376336308e-05,3.725289925932921e-06 -0.205922067156848,0.03337791561508836,5.674361615181025e-05,0.0,0.9999997807907323,6.854533463716575e-07,2.980231940746337e-08 -0.2944803833839549,0.051409453144807125,2.6166436439752837e-05,0.0,0.9999997807907323,2.8312203437090202e-06,0.0 -0.3013371825093424,0.04481643437571819,2.0265577197075092e-05,2.980231940746337e-08,0.9999997807907323,2.2351739555597527e-06,0.0 -0.3100759386887901,0.0446664392871666,1.2367962554097299e-05,8.940695822239011e-08,0.9999997807907323,2.65240642726424e-06,0.0 -0.33195635675009416,0.0474934577860569,5.03659197986131e-06,8.940695822239011e-08,0.999999542372177,6.854533463716575e-06,0.0 -0.35325002668825356,0.05176025628157262,2.2053716361522894e-06,1.4901159703731684e-07,0.9999988271165112,2.6494261953234936e-05,0.0 -0.3642043173162332,0.06111270188238814,1.1920927762985347e-06,1.4901159703731684e-07,0.999994058745406,0.00014770029498338845,0.0 -0.3608863651603037,0.07644021509768956,8.344649434089744e-07,2.3841855525970696e-07,0.9999305202004294,0.0016922054982751776,0.0 -0.19916769861350278,0.08647930620620001,1.0192393237352472e-05,8.940695822239011e-08,0.958896064236126,0.7990630066034039,0.0 -0.13192063569476328,0.122031420448388,3.850459667444267e-05,0.0,0.0021221635603666518,0.9999739123774867,0.0 -0.18690153955639352,0.142569273685838,8.04662624001511e-06,0.0,4.285573530793233e-05,0.999997635023735,2.980231940746337e-08 -0.4306256770909334,0.25541245932973855,7.808207684755403e-05,8.940695822239011e-08,3.209709800183805e-05,0.9999999000000099,4.947185021638919e-06 -0.44693306086596923,0.48541322342190035,0.9999993039536218,2.65240642726424e-06,7.063149699568818e-06,6.9975845968724e-05,0.0 -0.3681507408466484,0.4374864100660782,0.9999999000000099,3.874301522970238e-07,3.254413279295e-05,2.980231940746337e-08,0.0 -0.4028151631188489,0.4803361891877691,0.9999999000000099,2.086162358522436e-07,2.115964677929899e-05,2.980231940746337e-08,0.0 -0.45520395038627187,0.44148361675332093,0.9999999000000099,8.940695822239011e-08,3.5762783288956045e-06,0.0,0.0 -0.48480677602667815,0.4208016692871511,0.9999999000000099,2.980231940746337e-08,1.0132788598537545e-06,0.0,0.0 -0.5194668173574879,0.4106529950392399,0.9999999000000099,0.0,4.768371105194139e-07,0.0,0.0 -0.5476888417970847,0.3983433841976893,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.5656208991770184,0.38492816680038927,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5725331306220446,0.373374640877685,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5796161889789901,0.36322581761816186,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5802311300991123,0.35813879960603245,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.4382253289041258,0.2537837624115299,6.675719547271795e-05,1.4901159703731684e-07,3.015994724035293e-05,0.9999999000000099,5.6624406874180405e-06 -0.32503384350384457,0.1932879686024614,7.301568254828525e-06,0.0,4.351138633489652e-06,0.9999997807907323,3.4272667318582874e-06 -0.31909173725714235,0.19019326564393063,4.529952549934432e-06,0.0,2.0563600391149723e-06,0.9999997807907323,4.321336314082188e-06 -0.32762643693521,0.1847839653175559,4.053115439415018e-06,0.0,1.519918289780632e-06,0.9999998403953712,4.261731675267262e-06 -0.33107018469393273,0.18106964227436867,3.904103842377701e-06,0.0,1.2814997345209249e-06,0.9999999000000099,4.142522397637409e-06 -0.33135515450059205,0.1785075366191372,3.844499203562775e-06,0.0,1.2516974151134616e-06,0.9999997807907323,4.053115439415018e-06 -0.33437019585178557,0.1766796409781233,3.784894564747848e-06,0.0,1.1920927762985347e-06,0.9999999000000099,4.053115439415018e-06 -0.340197801575879,0.17437076565617676,3.784894564747848e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.053115439415018e-06 -0.3433237671709949,0.17200371620093938,3.725289925932921e-06,0.0,1.043081179261218e-06,0.9999997807907323,3.993510800600092e-06 -0.34813746808517854,0.16827380654314605,3.725289925932921e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.725289925932921e-06 -0.35296672581164784,0.16431820389794938,3.695487606525458e-06,0.0,9.834765404462913e-07,0.9999997807907323,3.546476009488141e-06 -0.3572267591805358,0.160525739165475,3.725289925932921e-06,0.0,8.642672628164378e-07,0.9999997807907323,3.1590458571911173e-06 -0.2853674292446228,0.19163128730353549,5.6475395277143086e-05,8.940695822239011e-08,6.729363722205229e-05,0.9999997211860935,5.066394299268773e-07 -0.21512916683259894,0.14609980580689175,1.2606381109357005e-05,0.0,9.655951488018132e-06,0.9999990655350666,2.086162358522436e-07 -0.21669158338603156,0.14402267334379223,1.1205672097206226e-05,0.0,6.526707950234478e-06,0.9999989463257889,2.086162358522436e-07 -0.22763192652713432,0.14701163766250955,9.894370043277838e-06,0.0,5.424022132158334e-06,0.999999244348983,2.682208746671703e-07 -0.2297980785274719,0.14845272896131978,1.007318395972262e-05,0.0,5.245208215713553e-06,0.9999993039536218,3.278255134820971e-07 -0.22974070905687793,0.1483073234304151,1.0490416431427107e-05,0.0,5.03659197986131e-06,0.9999993039536218,3.278255134820971e-07 -0.22892403601652175,0.14746803042747655,1.096725354194652e-05,0.0,4.976987341046382e-06,0.9999993039536218,3.5762783288956044e-07 -0.2301647961044373,0.14772725102756035,1.11460674583913e-05,0.0,4.887580382823993e-06,0.9999993039536218,3.5762783288956044e-07 -0.22868281601912574,0.14664182064406397,1.1712311527133104e-05,0.0,4.798173424601603e-06,0.999999244348983,4.172324717044872e-07 -0.2275179624463285,0.14547783133876707,1.2189148637652518e-05,0.0,4.678964146971749e-06,0.9999993039536218,3.5762783288956044e-07 -0.21890458463716062,0.14066347477411598,1.3917683163285393e-05,0.0,4.887580382823993e-06,0.9999990655350666,3.278255134820971e-07 -0.20101171731116507,0.13248771426793235,1.8507240352034754e-05,0.0,5.602836048603113e-06,0.9999983502794008,1.4901159703731684e-07 -0.1716569662023037,0.14187014100506476,0.00012379883481860283,5.960463881492674e-08,0.00024363396115601306,0.9999948932103495,2.980231940746337e-08 -0.1375076174679084,0.11533376572541378,4.33623747378592e-05,0.0,4.0352340477705406e-05,0.9999870253980259,0.0 -0.13639593123824864,0.11585336921615426,4.059075903296511e-05,0.0,2.8491017353534983e-05,0.9999882174908022,2.980231940746337e-08 -0.10898554324652475,0.11429664490649956,6.934999726116726e-05,0.0,3.597139952480829e-05,0.9999745084238748,0.0 -0.0717836320370514,0.11639076469335717,0.00012102721911370875,0.0,5.2273268240690753e-05,0.9999168707381407,0.0 -0.04312971234143004,0.10890477893871862,0.00020679829436838832,5.960463881492674e-08,0.00018706915892064758,0.9993694021306256,8.940695822239011e-08 -0.06091374158607023,0.07957366107531767,0.0004243552260428709,0.0,0.00914254693158576,0.9843791930965045,8.940695822239011e-08 -0.20566704868418703,0.07816803454014272,2.1427867653966164e-05,0.0,0.9762307621333934,0.0032216605302661976,5.960463881492674e-08 -0.25128531454953135,0.023670494552373782,0.00010776518697738755,0.0,0.9999952508381824,4.172324717044872e-07,8.940695822239011e-08 -0.22401040791537633,0.023285359140223543,0.0002495348203986908,0.0,0.9999996615814547,2.086162358522436e-07,0.0 -0.22012263535541768,0.028163015837615248,0.0003110468076556952,0.0,0.9999998403953712,3.874301522970238e-07,1.1920927762985348e-07 -0.2084318697366238,0.027896136040679136,0.00030988451719880415,0.0,0.9999997807907323,4.172324717044872e-07,1.1920927762985348e-07 -0.2910059392331741,0.12052273748241403,3.8146968841553113e-06,8.940695822239011e-08,0.7703750555232244,0.1373606484858437,0.0 -0.07705074548402263,0.03666782378522509,3.597139952480829e-05,1.4901159703731684e-07,0.9998580409596304,2.0563600391149723e-06,7.152556657791209e-07 -0.16106697916317617,0.017213255164059933,2.2917983624339332e-05,0.0,0.9999979926515679,1.1920927762985348e-07,1.7881391644478022e-07 -0.20610660313706494,0.0376991033489523,8.401273840963924e-05,2.980231940746337e-08,0.9999997807907323,8.642672628164378e-07,8.940695822239011e-08 -0.18763464688477807,0.030402779573956575,0.00011110304675102345,0.0,0.9999997807907323,3.874301522970238e-07,0.0 -0.158832609646896,0.02641570567632387,7.611512376666144e-05,5.960463881492674e-08,0.9999996615814547,3.5762783288956044e-07,1.4901159703731684e-07 -0.1199237108180933,0.024987399573815763,3.811716652214565e-05,5.960463881492674e-08,0.9999996615814547,4.4703479111195056e-07,5.066394299268773e-07 -0.04365181922731845,0.03378841280358619,4.589557188749359e-06,4.172324717044872e-06,0.9999758197259287,7.718800726533013e-06,5.528330250084455e-05 -0.035096138714290764,0.056199252595814944,4.4703479111195056e-07,5.787610428929386e-05,0.9883103574449041,0.00018373129914701168,0.009360103863260243 -0.07694613933244615,0.055757164945591575,1.7881391644478022e-07,2.008676328063031e-05,0.10029037783984343,0.00019261239033043577,0.5853890191245197 -0.192069500676785,0.0432384610102047,3.367662093043361e-06,1.4007090121507783e-06,4.6491618275642854e-05,4.678964146971749e-06,0.9993189170015494 -0.22464853524231523,0.03224301337643687,2.9146668380499176e-05,6.854533463716575e-07,8.344649434089744e-07,2.9802319407463367e-07,0.9999736739589313 -0.33552175758879843,0.03281489014063643,1.2308357915282372e-05,3.5762783288956044e-07,0.0031233128762215684,2.899765678346186e-05,0.99814095052465 -0.29174876211865663,0.047342061988353334,4.202127036452335e-06,1.7881391644478022e-07,0.0001496970503836885,2.4974343663454304e-05,0.9999417258725266 -0.26987722514942375,0.041392266743247884,7.987021601200183e-06,2.086162358522436e-07,2.0921228224039285e-05,7.86781232357033e-06,0.9999755217027346 -0.25873085855366335,0.03878381847671151,1.3679264608025687e-05,2.9802319407463367e-07,6.377696353197161e-06,4.112720078229945e-06,0.99998380674753 -0.24593016504223053,0.0366337299284194,2.226233259737514e-05,2.3841855525970696e-07,2.5331971496343865e-06,2.324580913782143e-06,0.9999882174908022 -0.23673063515636572,0.03522679209105961,3.16500632107261e-05,3.278255134820971e-07,1.2218950957059981e-06,1.5497206091880952e-06,0.9999903632577996 -0.23641294239972604,0.03549581765520727,3.486871370673214e-05,3.874301522970238e-07,9.238719016313645e-07,1.5795229285955586e-06,0.9999904824670772 -0.23844629525150954,0.0358583629069915,3.55541670531038e-05,2.682208746671703e-07,8.344649434089744e-07,1.7583368450403388e-06,0.9999903632577996 -0.24194830655049782,0.03617596625662279,3.43322719573978e-05,2.682208746671703e-07,9.238719016313645e-07,1.9669530808925826e-06,0.9999897672114114 -0.2405197322269028,0.03536322712292712,3.764032941162624e-05,2.682208746671703e-07,7.748603045940476e-07,1.6689298868179488e-06,0.9999904228624383 -0.23960462211570413,0.0349097549855536,3.981589872837106e-05,2.682208746671703e-07,6.556510269641942e-07,1.5497206091880952e-06,0.9999906016763548 -0.24032264946896112,0.034950643771862515,3.9964910325408376e-05,2.3841855525970696e-07,6.258487075567308e-07,1.519918289780632e-06,0.9999903632577996 -0.18272575735289212,0.6180849074259004,2.65240642726424e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.18264546989638297,0.5129073857382831,1.1920927762985348e-07,0.9999999000000099,0.0,1.934170529544373e-05,2.980231940746337e-08 -0.18076375126090183,0.597325324909924,0.0,0.9999999000000099,0.0,1.2546776470542079e-05,0.0 -0.17789447306850048,0.6474479435765731,2.980231940746337e-08,0.9999999000000099,0.0,1.0371207153797252e-05,8.940695822239011e-08 -0.18315023183064247,0.6548413037132466,2.980231940746337e-08,0.9999999000000099,0.0,9.864567723870376e-06,0.0 -0.18729418515383514,0.6557846068213004,0.0,0.9999999000000099,0.0,9.894370043277838e-06,2.980231940746337e-08 -0.1900236010472768,0.6556982992956804,0.0,0.9999999000000099,0.0,1.0401009473204716e-05,0.0 -0.1919444501320514,0.6548219918083427,0.0,0.9999999000000099,0.0,1.1175869777798764e-05,2.980231940746337e-08 -0.19337823986206404,0.6535688637567995,1.1920927762985348e-07,0.9999999000000099,0.0,1.2159346318245055e-05,8.940695822239011e-08 -0.19454067944674797,0.6518128513173723,1.1920927762985348e-07,0.9999999000000099,0.0,1.3500450691580906e-05,8.940695822239011e-08 -0.19552820920134575,0.6496288775285313,0.0,0.9999999000000099,0.0,1.5079973620176466e-05,5.960463881492674e-08 -0.19638827442309664,0.6472182272756482,2.980231940746337e-08,0.9999999000000099,0.0,1.6838310465216805e-05,8.940695822239011e-08 -0.16653820871617225,0.1393029391527059,0.00013005732189417014,5.960463881492674e-08,0.0002682506769865778,0.9999937011175731,0.0 -0.12097582220530255,0.11248818037967911,6.210803364515366e-05,0.0,5.632638368010577e-05,0.9999762369584004,0.0 -0.1354223489705277,0.11401414869263497,4.172324717044872e-05,0.0,3.334879541695151e-05,0.9999867273748319,0.0 -0.12789896130032227,0.11520484087878667,4.81605481624608e-05,0.0,3.007054028213054e-05,0.9999848200263898,0.0 -0.1262543499417478,0.1146728694242574,5.146860561668924e-05,0.0,2.971291244924098e-05,0.9999837471428911,0.0 -0.1346730589810873,0.11492687461792424,4.54783394157891e-05,0.0,2.598762252330806e-05,0.9999872042119423,2.980231940746337e-08 -0.14176672696480236,0.11609256265559695,4.0531154394150184e-05,0.0,2.1964309403300505e-05,0.9999900056299666,0.0 -0.14215421676047113,0.11631762979423028,4.136561933755916e-05,0.0,2.041458879411241e-05,0.9999904824670772,5.960463881492674e-08 -0.1386005580367871,0.11545225975920696,4.5746560290456275e-05,0.0,2.0563600391149726e-05,0.9999894691882173,0.0 -0.1428703665674178,0.11562815306590901,4.345178169608159e-05,0.0,1.910328674018402e-05,0.9999907208856325,2.980231940746337e-08 -0.13805586099052974,0.11459240315382441,4.926323398053695e-05,0.0,1.9788740086555676e-05,0.9999894095835785,0.0 -0.1426541805208264,0.11484748123109702,4.622339740097569e-05,0.0,1.8417833393812362e-05,0.9999906612809936,5.960463881492674e-08 -0.22623124717729304,0.03097990154689547,2.65240642726424e-06,5.960463881492674e-08,0.9998870684187333,1.987814704477807e-05,4.172324717044872e-07 -0.17641237377389937,0.02315816282829464,6.33001264214522e-05,0.0,0.9999996019768158,1.7881391644478022e-07,8.940695822239011e-08 -0.22909015416150388,0.040124148123546206,6.44326145589358e-05,0.0,0.9999999000000099,9.238719016313645e-07,1.1920927762985348e-07 -0.23126602171893942,0.037178844207119394,0.00010135768830478292,0.0,0.9999998403953712,6.258487075567308e-07,2.980231940746337e-08 -0.21640586852131255,0.03211376070426357,0.00010088085119426351,0.0,0.9999997807907323,3.874301522970238e-07,2.980231940746337e-08 -0.19973349570400975,0.03020498156030331,9.208916696906182e-05,0.0,0.9999997807907323,3.278255134820971e-07,0.0 -0.180048823349173,0.028880774969877593,7.59959144890316e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 -0.16431647538458397,0.029067873949795507,5.969404577314913e-05,0.0,0.9999997807907323,3.874301522970238e-07,1.1920927762985348e-07 -0.15727490186040044,0.030419588083780355,4.962086181342651e-05,2.980231940746337e-08,0.9999997807907323,5.066394299268773e-07,2.086162358522436e-07 -0.1569547057086803,0.031625121826478586,4.5746560290456275e-05,0.0,0.9999998403953712,6.258487075567308e-07,1.1920927762985348e-07 -0.15191105007496275,0.031081110233706754,4.282593298852486e-05,8.940695822239011e-08,0.9999997807907323,6.258487075567308e-07,2.086162358522436e-07 -0.14232823252088567,0.030179738993245254,3.647803895473517e-05,8.940695822239011e-08,0.9999997807907323,5.960463881492673e-07,2.3841855525970696e-07 -0.14481508731242393,0.12684994933817262,0.00016584990750253365,0.0,0.0004357397120565219,0.9999793960042576,0.0 -0.1688356101442998,0.12340295312675727,2.2351739555597528e-05,0.0,3.540515545606648e-05,0.99999537004746,0.0 -0.16353783010759287,0.12650990483978725,2.1070239821076602e-05,0.0,1.803040324151534e-05,0.99999537004746,0.0 -0.17823413013673897,0.12973660228415052,1.636147335469739e-05,0.0,1.2516974151134616e-05,0.9999968005587916,1.1920927762985348e-07 -0.1861485242766548,0.1317766606582061,1.4990566661954075e-05,0.0,1.0550021070242033e-05,0.9999973966051797,0.0 -0.19422706960827524,0.134057521797113,1.370906692743315e-05,0.0,9.030102780461401e-06,0.9999979330469291,1.1920927762985348e-07 -0.20582631229502027,0.13792771098636117,1.1950730082392812e-05,0.0,7.68899840712555e-06,0.999998588697956,1.7881391644478022e-07 -0.2181366383939063,0.14311474559240656,1.0490416431427107e-05,0.0,6.526707950234478e-06,0.9999989463257889,1.7881391644478022e-07 -0.22721701859487,0.14796468612998245,9.655951488018132e-06,0.0,5.871056923270284e-06,0.9999993039536218,2.682208746671703e-07 -0.22917741536145145,0.14928588268584753,9.80496308505545e-06,0.0,5.48362677097326e-06,0.9999993039536218,3.5762783288956044e-07 -0.2309140860938777,0.1499257087450794,1.007318395972262e-05,0.0,5.30481285452848e-06,0.9999993039536218,3.5762783288956044e-07 -0.23203289507858785,0.15025851127912582,1.0251997876167399e-05,0.0,5.096196618676236e-06,0.9999993635582606,3.5762783288956044e-07 -0.4380809664544858,0.2568696736849578,7.46846124351032e-05,1.1920927762985348e-07,3.096460986435444e-05,0.9999999000000099,5.513429090380723e-06 -0.31474798916467084,0.19656085964651765,7.599591448903159e-06,0.0,4.947185021638919e-06,0.9999999000000099,3.6656852871179947e-06 -0.32750409840181355,0.19768637415361862,4.649161827564286e-06,0.0,2.413987872004533e-06,0.9999997807907323,5.453824451565797e-06 -0.34113654492873013,0.18301567432130716,3.844499203562775e-06,0.0,1.519918289780632e-06,0.9999997807907323,4.380940952897116e-06 -0.34607684610841144,0.17429685589666793,3.635882967710531e-06,0.0,1.2218950957059981e-06,0.9999998403953712,3.8146968841553113e-06 -0.3470706343507104,0.16990706321667925,3.635882967710531e-06,0.0,1.1026858180761447e-06,0.9999998403953712,3.546476009488141e-06 -0.34603101013658105,0.16870343682261352,3.6060806483030677e-06,0.0,1.0728834986686813e-06,0.9999999000000099,3.546476009488141e-06 -0.34356522558697,0.169260352820977,3.6656852871179947e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.635882967710531e-06 -0.34118098019140836,0.1701036989397596,3.784894564747848e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.8146968841553113e-06 -0.33673685787713925,0.17160144445341916,3.844499203562775e-06,0.0,9.536742210388278e-07,0.9999998403953712,3.993510800600092e-06 -0.3309296071392358,0.17261046168232658,4.023313120007555e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.993510800600092e-06 -0.32140195368389607,0.17210024592313658,4.202127036452335e-06,0.0,1.0132788598537545e-06,0.9999997807907323,3.784894564747848e-06 -0.31827086208932964,0.03486254810689957,2.6434657314420008e-05,7.450579851865842e-07,0.00022375581411123498,1.2189148637652518e-05,0.9996027542915861 -0.4325957894146128,0.0425033271239933,1.370906692743315e-06,0.0,0.0057499104948789456,0.00010001658393144707,0.9982972338876227 -0.11850801109776923,0.02743047475345113,2.682208746671703e-07,4.768371105194139e-07,0.9532909632112478,0.00014996527125835568,0.02114346411986074 -0.06702172755917546,0.02820628880971477,8.553265669941988e-06,8.642672628164378e-07,0.9999282552241544,4.947185021638919e-06,1.92821006566288e-05 -0.07660916447322244,0.029439091677393076,1.8328426435589973e-05,5.066394299268773e-07,0.9999903632577996,3.6060806483030677e-06,1.707672902047651e-05 -0.06944134831140987,0.030925422901580093,1.4722345787286905e-05,8.642672628164378e-07,0.9999886943279127,5.03659197986131e-06,2.226233259737514e-05 -0.06054720282303914,0.03210622071670077,1.1861323124170421e-05,1.4305113315582417e-06,0.9999777270743708,6.675719547271795e-06,3.6120411121845605e-05 -0.04956835508141306,0.03357794880292032,7.539986810088233e-06,3.129243537783654e-06,0.9999308778282623,1.1175869777798764e-05,8.538364510238256e-05 -0.03750303387486615,0.0367530584272393,3.9637084811926284e-06,9.179114377498718e-06,0.9996043636168341,2.5182959899306546e-05,0.0003261267812758717 -0.0313785672174812,0.04151752590422192,1.7285345256328755e-06,2.4527308872342353e-05,0.9962582187984029,6.53266841411597e-05,0.001645862891596572 -0.03376665711263073,0.04490035771554757,7.152556657791209e-07,3.3468004694581365e-05,0.9657103645686425,0.00013929604091048378,0.007088660484981607 -0.03915444016294474,0.04467481373975611,4.172324717044872e-07,2.8967854464054395e-05,0.7984965241161068,0.00019443033181429102,0.02185460706556163 -0.2776679992560805,0.1889682113800718,5.8770173871517764e-05,2.980231940746337e-08,7.203220600783897e-05,0.9999997807907323,4.172324717044872e-07 -0.24233329295108613,0.16023293134806604,8.67247494757184e-06,0.0,7.987021601200183e-06,0.999999542372177,4.172324717044872e-07 -0.25125229357632717,0.1703108846849634,7.450579851865842e-06,0.0,5.602836048603113e-06,0.9999996615814547,7.748603045940476e-07 -0.26672363280145556,0.18727353212010808,6.884335783124038e-06,0.0,5.424022132158334e-06,0.9999997807907323,1.519918289780632e-06 -0.26751947401846365,0.19314044710666756,7.301568254828525e-06,0.0,5.6624406874180405e-06,0.9999998403953712,1.937150761485119e-06 -0.2679386138805068,0.19538193937770706,7.659196087718087e-06,0.0,5.513429090380723e-06,0.9999998403953712,2.175569316744826e-06 -0.2681440710910391,0.1965464055201621,7.987021601200183e-06,0.0,5.57303372919565e-06,0.9999999000000099,2.324580913782143e-06 -0.26912057398635386,0.19855666157183507,8.285044795274818e-06,0.0,5.57303372919565e-06,0.9999997807907323,2.592801788449313e-06 -0.2687883973010344,0.19820907708588692,8.553265669941988e-06,0.0,5.513429090380723e-06,0.9999999000000099,2.682208746671703e-06 -0.2684385180362173,0.1972522735257938,8.761881905794231e-06,0.0,5.3942198127508695e-06,0.9999998403953712,2.74181338548663e-06 -0.2666534483322355,0.19391274448889004,9.030102780461401e-06,0.0,5.185603576898626e-06,0.9999998403953712,2.5331971496343865e-06 -0.2658401131519865,0.1918779313235738,9.208916696906181e-06,0.0,5.096196618676236e-06,0.9999998403953712,2.4735925108194595e-06 -0.18359148501589642,0.6381464003423871,3.2186504960060438e-06,0.9999998403953712,5.960463881492674e-08,2.980231940746337e-08,0.0 -0.1777399480269267,0.48089295617452066,5.960463881492674e-08,0.9999999000000099,0.0,2.0295379516482556e-05,0.0 -0.18184494971476026,0.5627968310346109,0.0,0.9999999000000099,0.0,1.433491563498988e-05,0.0 -0.17642548679574943,0.6172660588161163,0.0,0.9999999000000099,0.0,1.1861323124170421e-05,8.940695822239011e-08 -0.1803933083936381,0.6245727537993012,1.1920927762985348e-07,0.9999999000000099,0.0,1.1086462819576373e-05,2.980231940746337e-08 -0.1837009489460219,0.6258963941456016,2.980231940746337e-08,0.9999999000000099,0.0,1.0818241944909203e-05,2.980231940746337e-08 -0.18590831755821993,0.6272432803033605,5.960463881492674e-08,0.9999999000000099,0.0,1.1056660500168911e-05,2.980231940746337e-08 -0.1876253485601935,0.6275253294823894,2.980231940746337e-08,0.9999999000000099,0.0,1.1593102249503251e-05,2.980231940746337e-08 -0.1890141367834026,0.627206087005027,5.960463881492674e-08,0.9999999000000099,0.0,1.2338160234689835e-05,0.0 -0.19016289710211112,0.6266739367365635,0.0,0.9999999000000099,0.0,1.335143909454359e-05,0.0 -0.19119367002649168,0.6256067751766876,2.980231940746337e-08,0.9999999000000099,0.0,1.4632938829064515e-05,8.940695822239011e-08 -0.19211587309041833,0.6242751478079887,5.960463881492674e-08,0.9999999000000099,0.0,1.5974043202400367e-05,8.940695822239011e-08 -0.09573104977211326,0.020882964130640412,8.344649434089744e-07,1.6093252480030219e-06,0.9918222627638796,4.652142059505032e-05,0.0011633633403897402 -0.09108713268856532,0.0460764467637318,2.9206273019314104e-06,3.069638898968727e-06,0.24735212832760758,1.460313650965705e-05,0.7703674261294561 -0.11870625614628398,0.04894667863007686,1.1920927762985348e-07,6.198882436752381e-06,0.15601389040065564,0.0005750655552864131,0.603285133114785 -0.0502451658228096,0.045180886976134906,5.960463881492674e-08,2.4527308872342353e-05,0.4866761674578715,0.00025838610926270743,0.027177837753483924 -0.04866462945736601,0.04756063222070727,1.4901159703731684e-07,3.0040737962723075e-05,0.4372809688069983,0.00020790098018646448,0.03581946730046904 -0.053192019460382885,0.048580974332120073,8.940695822239011e-08,2.9563900852203663e-05,0.320418653632802,0.00026789304915368823,0.05195885377094201 -0.050158709285566476,0.047492444507095895,8.940695822239011e-08,3.1888481765985805e-05,0.3457184386241858,0.00026136634120345375,0.03130820080480309 -0.046681582925770876,0.046308815471348866,5.960463881492674e-08,3.3050772222876875e-05,0.42435462999648277,0.0002174675247162602,0.020835725369659275 -0.04683190583988819,0.04583185910393786,1.1920927762985348e-07,3.141164465546639e-05,0.40211903007961614,0.00019586084314584927,0.026558187928363945 -0.04892760515010414,0.046012163154352546,5.960463881492674e-08,3.0189749559760392e-05,0.34188535370895606,0.0002083480149775764,0.03375547786758576 -0.05075833201198207,0.04596465825247469,1.1920927762985348e-07,2.7984377923608103e-05,0.2605955936189379,0.00020822880569994657,0.04730224136352586 -0.05296859144945159,0.04611060022518225,5.960463881492674e-08,2.6434657314420008e-05,0.20036716245649358,0.00021994111722707966,0.05969157218063831 -0.6857213973715082,0.40939727418564936,0.9999997211860935,3.397464412450824e-06,2.086162358522436e-07,5.364417493343406e-07,2.431869263649011e-05 -0.4633905291365432,0.4302213191249394,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5670244097474864,0.3365976809878949,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5401079654469957,0.367727190193151,0.9999999000000099,0.0,0.0,0.0,0.0 -0.583469271635691,0.3290135263833281,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5640816092257577,0.3569090067729148,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5674453973535175,0.3459497987631642,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.562735497928206,0.35333043330818026,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5623672008281541,0.3524456321589635,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5556493997343771,0.3548376261580351,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5601106881863408,0.35183107846911205,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.561720192409144,0.3521391450755809,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.23076051472662026,0.17015367743439522,7.736682118177491e-05,0.0,0.00011116265138983837,0.9999994231628994,1.1920927762985348e-07 -0.05019506811887796,0.13727223870787844,0.00013062356596291194,0.0,2.413987872004533e-05,0.9999274207592109,2.980231940746337e-08 -0.0210993289938773,0.10011807082369184,0.0002807974534571199,8.940695822239011e-08,0.00039812918496430315,0.9970056609691421,4.768371105194139e-07 -0.089030116792807,0.09292101858455253,1.2248753276467444e-05,1.1920927762985348e-07,0.9443558106204186,0.001306265461948527,2.7716157048940933e-06 -0.07637006044071586,0.013848513362420519,1.972913544774075e-05,5.960463881492674e-08,0.9998024894362549,2.3841855525970696e-07,5.841254603862821e-06 -0.02990782260770934,0.030643701548097448,3.039836579561264e-06,9.208916696906181e-06,0.9968934254342536,1.8537042671442215e-05,0.0019347367736131146 -0.05915912985556732,0.0527025759129878,7.748603045940476e-07,1.6152857118845148e-05,0.44090889455542703,0.00017490981260240252,0.3874191850434819 -0.1622251868180812,0.04206010698551939,3.933906161785165e-06,1.4603136509657052e-06,0.00019085405348539543,1.1116265138983837e-05,0.9985922768497566 -0.22226259111437754,0.02986970543349915,5.340575637817436e-05,3.874301522970238e-07,6.258487075567308e-07,2.682208746671703e-07,0.9999833299104194 -0.1974469423212309,0.02735891937741053,7.56680889755495e-05,8.046626240015109e-07,1.1920927762985348e-07,1.7881391644478022e-07,0.9999924494201581 -0.20116347073675694,0.03037974237875483,7.456540315747335e-05,7.152556657791209e-07,8.940695822239011e-08,2.086162358522436e-07,0.9999914361412983 -0.20804962514969508,0.03256621956267608,7.385014749169422e-05,5.66244068741804e-07,5.960463881492674e-08,3.278255134820971e-07,0.9999903036531608 -0.2900378107904499,0.32381612056909354,0.0024263558345586304,1.1920927762985348e-07,0.00015464423540532743,0.9999965621402362,2.086162358522436e-07 -0.39754977820657605,0.229593694170738,0.000804990449514993,0.0,1.0251997876167399e-05,0.9999034000897685,2.980231940746337e-08 -0.4381455778894196,0.28935301298908783,0.033214714781937334,2.980231940746337e-08,1.5795229285955586e-06,0.9682502970424629,0.0 -0.4401318132695101,0.40799993269609675,0.9999999000000099,2.9802319407463367e-07,6.854533463716575e-07,1.1920927762985348e-07,0.0 -0.6087918281303089,0.4466031192968474,0.9999999000000099,1.7881391644478022e-07,3.278255134820971e-07,0.0,0.0 -0.6667321920118818,0.4066725670594985,0.9999999000000099,8.940695822239011e-08,1.043081179261218e-06,0.0,0.0 -0.5966259240857077,0.4245707093942328,0.9999999000000099,0.0,8.642672628164378e-07,0.0,0.0 -0.5758470892667743,0.40528282516215347,0.9999999000000099,0.0,8.642672628164378e-07,0.0,0.0 -0.5845756530519659,0.3860526978308516,0.9999999000000099,0.0,1.2516974151134616e-06,0.0,2.980231940746337e-08 -0.5720403790237069,0.3851037024792227,0.9999999000000099,0.0,6.854533463716575e-07,0.0,0.0 -0.5701256394150215,0.38526013486940897,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,2.980231940746337e-08 -0.5647797584299828,0.3884323834707792,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.18261316417891607,0.6163518427747079,2.5629994690418497e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 -0.16634449362066026,0.43697029344705646,0.0,0.9999999000000099,0.0,1.4483927232027197e-05,2.980231940746337e-08 -0.18311816453175464,0.5236908196506211,0.0,0.9999999000000099,0.0,1.317262517809881e-05,1.1920927762985348e-07 -0.17552608250844842,0.5933479665693879,0.0,0.9999999000000099,0.0,1.2129543998837591e-05,2.980231940746337e-08 -0.17824038862444014,0.6031773685376145,8.940695822239011e-08,0.9999999000000099,0.0,1.1354683694243543e-05,2.980231940746337e-08 -0.18129619955265833,0.6048443912424072,0.0,0.9999999000000099,0.0,1.1116265138983837e-05,0.0 -0.18333998321727707,0.6054087876236887,5.960463881492674e-08,0.9999999000000099,0.0,1.1205672097206226e-05,8.940695822239011e-08 -0.18485477565953612,0.6050817965425069,0.0,0.9999999000000099,0.0,1.1563299930095787e-05,8.940695822239011e-08 -0.18604534863655287,0.6046329735674251,5.960463881492674e-08,0.9999999000000099,0.0,1.2248753276467444e-05,0.0 -0.18703940509975328,0.6042782067217827,0.0,0.9999999000000099,0.0,1.3023613581061492e-05,0.0 -0.1879540383737938,0.6036443709293497,8.940695822239011e-08,0.9999999000000099,0.0,1.4096497079730174e-05,2.980231940746337e-08 -0.1888063251894018,0.6028282045285801,0.0,0.9999999000000099,0.0,1.528858985602871e-05,8.940695822239011e-08 -0.5988045334568027,0.38798105710061725,0.9999996615814547,1.8775461226701922e-06,5.960463881492674e-08,1.4901159703731684e-07,9.924172362685302e-06 -0.6466801762313096,0.4137894212491063,0.9999999000000099,0.0,5.960463881492673e-07,0.0,1.1920927762985348e-07 -0.5840660333391574,0.3283673822317511,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.556853175140211,0.33321452135102303,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5796084999798145,0.33477228874196113,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5706737041237085,0.339773893298142,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5725173949958245,0.3375486134904786,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5733107924223969,0.33904418343460424,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5751274823904309,0.3390968739405767,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5775349139928092,0.33899739378846355,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5787356495617597,0.3401137589825931,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5806614160297281,0.3408147692096764,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.19022008775877075,0.24646392460417427,0.9999996615814547,1.7881391644478022e-07,7.152556657791209e-07,8.940695822239011e-08,0.0 -0.7196636795699622,0.4721973537590175,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.591062724565827,0.45053726426992863,0.9999999000000099,0.0,4.172324717044872e-07,0.0,0.0 -0.6123952269300559,0.3238166570108964,0.9999999000000099,0.0,5.364417493343406e-07,0.0,5.960463881492674e-08 -0.6062704920517695,0.3638540505739869,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 -0.6028144359339012,0.36352881782982566,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 -0.614250183080034,0.3761500715565311,0.9999999000000099,0.0,3.278255134820971e-07,0.0,0.0 -0.6282470822074147,0.3835849761306058,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 -0.6491245031088023,0.39136585586522016,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 -0.6784626245217721,0.39357426755841496,0.9999999000000099,0.0,5.960463881492673e-07,0.0,8.940695822239011e-08 -0.7052363156980316,0.39775428169115257,0.9999999000000099,0.0,5.66244068741804e-07,0.0,8.940695822239011e-08 -0.7274408340152885,0.40700459473316297,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 -0.11865171789631676,0.4640832542578434,0.8789749458625762,2.086162358522436e-07,0.002866267871332197,0.5760269185058592,0.0 -0.13021323084292055,0.10452049968837072,0.007512449466955736,0.0,0.0002546608193367745,0.9992706968487481,0.0 -0.28246614335797837,0.21533486243375394,1.8507240352034754e-05,0.0,1.5318392175436174e-05,0.9999999000000099,4.112720078229945e-06 -0.3066691756121489,0.22223111983308574,8.67247494757184e-06,0.0,4.351138633489652e-06,0.9999999000000099,9.953974682092765e-06 -0.31357538698805315,0.20959725972401255,6.8247311443091115e-06,0.0,2.712011066079167e-06,0.9999999000000099,8.493661031127061e-06 -0.31383848189008084,0.1947262286806453,5.930661562085211e-06,0.0,1.9073484420776557e-06,0.9999999000000099,6.288289394974771e-06 -0.31123369930885936,0.18491047617606998,5.602836048603113e-06,0.0,1.5795229285955586e-06,0.9999997807907323,4.947185021638919e-06 -0.3061603605620449,0.17962819334768984,5.632638368010577e-06,0.0,1.4901159703731685e-06,0.9999996615814547,4.142522397637409e-06 -0.29939222334575716,0.1769280731375046,5.960463881492674e-06,0.0,1.6093252480030219e-06,0.9999997807907323,3.5762783288956045e-06 -0.29111531375633243,0.1754213571248079,6.794928824901648e-06,0.0,1.7881391644478022e-06,0.9999997807907323,3.0994412183761904e-06 -0.28443488477482803,0.1768839060957336,7.718800726533013e-06,0.0,2.2053716361522894e-06,0.9999997807907323,2.9504296213388737e-06 -0.2785652875784921,0.17946019765641916,8.761881905794231e-06,0.0,2.7716157048940933e-06,0.9999997807907323,2.980231940746337e-06 -0.10747432708295207,0.022135764356637437,1.1026858180761447e-06,7.748603045940476e-07,0.9988892867649714,2.9474493893981274e-05,4.875659455061007e-05 -0.19201612471739085,0.036195874207974356,3.650784127414263e-05,2.980231940746337e-08,0.9999997211860935,1.2516974151134616e-06,1.4901159703731684e-07 -0.2597146034133181,0.04702696203380219,5.632638368010577e-05,0.0,0.9999997807907323,1.6689298868179488e-06,8.940695822239011e-08 -0.2570191025627522,0.03891053795148229,8.794664457142441e-05,0.0,0.9999999000000099,7.748603045940476e-07,0.0 -0.24248766898104798,0.033729881042426774,0.00010398029241263969,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 -0.22624200581567455,0.031307280058268244,0.0001133382207065832,0.0,0.9999999000000099,3.5762783288956044e-07,5.960463881492674e-08 -0.21845880149890393,0.03181329369000228,0.00011026858180761446,0.0,0.9999997807907323,4.172324717044872e-07,2.980231940746337e-08 -0.21163755654412353,0.03198063373018053,0.00010824202408790696,0.0,0.9999999000000099,3.874301522970238e-07,8.940695822239011e-08 -0.199098080388408,0.03069269656609443,0.00010126828134656053,0.0,0.9999999000000099,3.874301522970238e-07,8.940695822239011e-08 -0.18495845793911864,0.029823958868641868,8.794664457142441e-05,0.0,0.9999999000000099,3.278255134820971e-07,5.960463881492674e-08 -0.1669847369124886,0.028721153731196433,7.003545060753892e-05,2.980231940746337e-08,0.9999997807907323,3.874301522970238e-07,1.7881391644478022e-07 -0.14720660447464792,0.02800244092461784,4.997848964631607e-05,8.940695822239011e-08,0.9999998403953712,4.4703479111195056e-07,1.7881391644478022e-07 -0.3272441923482812,0.30094957346531254,0.0009215473207175824,1.1920927762985348e-07,9.629129400551415e-05,0.9999993039536218,6.854533463716575e-07 -0.4566494524289824,0.2736679315098401,0.002360462906348729,1.1920927762985348e-07,1.0460614112019642e-05,0.9996906711338381,2.980231940746337e-08 -0.41432523725701365,0.31789496535579775,0.9999886943279127,5.066394299268773e-07,8.642672628164378e-07,1.662969422936456e-05,0.0 -0.5225859880230996,0.39383691542557275,0.9999999000000099,1.7881391644478022e-07,2.1457669973373625e-06,0.0,0.0 -0.5441161393893956,0.42734929911925135,0.9999999000000099,1.1920927762985348e-07,1.1384486013651007e-05,5.960463881492674e-08,0.0 -0.5049629211216687,0.45166471592798446,0.9999999000000099,1.1920927762985348e-07,3.844499203562775e-06,0.0,0.0 -0.5308135747689748,0.41538077585736954,0.9999999000000099,0.0,1.7881391644478022e-06,0.0,0.0 -0.532937288262234,0.4021645485666181,0.9999999000000099,0.0,8.344649434089744e-07,0.0,0.0 -0.5423802733196739,0.39959552877259386,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.5537254214057519,0.3955106138505791,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5533634423980459,0.3929500579161116,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5593450665242325,0.3815531133952055,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.18011295794694868,0.02749183773523689,2.1159646779298993e-06,1.4901159703731684e-07,0.9998171521774034,1.9937751683592993e-05,1.4305113315582417e-06 -0.07056999206250754,0.01680162548731157,1.1026858180761447e-05,1.1920927762985348e-07,0.99998279346867,2.086162358522436e-07,2.324580913782143e-06 -0.11599308251854293,0.03035295009093288,8.493661031127061e-06,2.9802319407463367e-07,0.9999993039536218,1.3411043733358516e-06,1.0132788598537545e-06 -0.08598163723589587,0.03439527749426291,7.808207684755402e-06,7.748603045940476e-07,0.999998588697956,2.712011066079167e-06,3.039836579561264e-06 -0.03402706980564363,0.04211303591007087,1.2516974151134616e-06,2.0116565600037775e-05,0.9998180462469856,2.6762482827902106e-05,0.00022026894274056178 -0.036266177891183235,0.05647611617074923,2.3841855525970696e-07,7.41183683663614e-05,0.9844936340030291,0.00019562242459058955,0.005566507021245416 -0.05362331866995975,0.054825991382747484,5.960463881492674e-08,4.643201363682793e-05,0.5218291952917509,0.00030952688936591454,0.06506290381208425 -0.08536070584897396,0.049021005622099045,1.4901159703731684e-07,1.4513729551434662e-05,0.015884904465052644,9.700654967129326e-05,0.6663918424832828 -0.19031956791089677,0.04453232883644494,1.9669530808925826e-06,1.6093252480030219e-06,4.97102687716489e-05,5.7816499650478935e-06,0.9989160492477993 -0.22810408472070304,0.03388988971129891,2.068280966877958e-05,7.152556657791209e-07,1.1920927762985347e-06,3.874301522970238e-07,0.9999623490775565 -0.20249089597817232,0.029361933464744545,4.4196839681268176e-05,1.0132788598537545e-06,2.086162358522436e-07,1.7881391644478022e-07,0.9999867273748319 -0.1893398761670866,0.02923092245555067,6.157159189581933e-05,1.1622904568910714e-06,8.940695822239011e-08,1.7881391644478022e-07,0.9999914361412983 -0.18739435075937605,0.41887369744757647,0.0853662405478486,5.960463881492674e-08,0.0008209942950368009,0.9989137842715243,0.0 -0.35647767780735207,0.2518617808387541,0.9999349309437017,3.5762783288956044e-07,1.4811752745509294e-05,0.0001585781415671126,0.0 -0.6988667845436628,0.4546344279464426,0.9999999000000099,8.940695822239011e-08,1.4901159703731684e-07,0.0,0.0 -0.7928560971885441,0.43588843934224597,0.9999999000000099,8.940695822239011e-08,6.258487075567308e-07,0.0,0.0 -0.8117023706100049,0.361040383515524,0.9999999000000099,2.980231940746337e-08,1.1920927762985347e-06,0.0,0.0 -0.7611198424977806,0.3812019526305714,0.9999999000000099,0.0,1.1622904568910714e-06,0.0,8.940695822239011e-08 -0.6538766026226132,0.39570596807379704,0.9999999000000099,0.0,6.258487075567308e-07,0.0,1.4901159703731684e-07 -0.6472810506552654,0.37270987027461894,0.9999999000000099,0.0,1.3411043733358516e-06,0.0,1.1920927762985348e-07 -0.6316735744214756,0.3631110190723441,0.9999999000000099,0.0,1.847743803262729e-06,0.0,2.9802319407463367e-07 -0.6143451332791573,0.3644682168336474,0.9999999000000099,0.0,1.2516974151134616e-06,0.0,2.086162358522436e-07 -0.59989982840915,0.370450973447308,0.9999999000000099,0.0,5.66244068741804e-07,0.0,1.7881391644478022e-07 -0.5864332914109588,0.3785187303371771,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 -0.16564768552094242,0.026492089028590453,1.937150761485119e-06,1.7881391644478022e-07,0.9997734023725132,2.0533798071742262e-05,2.354383233189606e-06 -0.13268309831069852,0.02068862318638353,3.2514330473542534e-05,5.960463881492674e-08,0.9999991847443441,2.086162358522436e-07,2.086162358522436e-07 -0.24892407654685203,0.04854774474266348,3.52263415396217e-05,0.0,0.9999998403953712,2.1457669973373625e-06,0.0 -0.2655804157147109,0.043863266698955745,7.072090395391057e-05,0.0,0.9999998403953712,1.1920927762985347e-06,0.0 -0.26149308680405253,0.03796067833250431,7.125734570324492e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 -0.24627983569079087,0.03401109575642891,9.399651541113947e-05,0.0,0.9999997807907323,4.768371105194139e-07,0.0 -0.22408637403513942,0.03042113780454425,0.00010791419857442486,0.0,0.9999997807907323,2.9802319407463367e-07,2.980231940746337e-08 -0.20586752890688076,0.029475539917666986,9.995697929263214e-05,0.0,0.9999998403953712,2.9802319407463367e-07,0.0 -0.18450450896452805,0.02836966514101614,8.353590129911983e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 -0.15682470797843057,0.026750415559002764,5.787610428929386e-05,2.980231940746337e-08,0.9999997807907323,3.278255134820971e-07,2.3841855525970696e-07 -0.12441086768588847,0.026258796448979525,3.120302841961415e-05,1.4901159703731684e-07,0.9999997807907323,3.874301522970238e-07,3.5762783288956044e-07 -0.06583455204691079,0.03184053301265997,7.2121612966061355e-06,1.2516974151134616e-06,0.9999965621402362,2.8312203437090202e-06,7.808207684755402e-06 -0.3338858783106832,0.03262737392820516,1.1891125443577885e-05,3.5762783288956044e-07,0.0035699304348618148,2.9623505491018588e-05,0.9979276851269702 -0.2730813026315146,0.04450300335122046,7.2121612966061355e-06,2.086162358522436e-07,7.519125186503009e-05,1.2308357915282372e-05,0.9999578787296454 -0.25435537098785027,0.038233011954436444,1.388788084387793e-05,2.682208746671703e-07,9.000300461053937e-06,3.6656852871179947e-06,0.9999830318872253 -0.259429424990402,0.03975269197736958,1.344084605276598e-05,2.9802319407463367e-07,5.096196618676236e-06,4.708766466379212e-06,0.9999839259568075 -0.25338649748706643,0.03868210315041972,1.8060205560922803e-05,2.682208746671703e-07,3.2186504960060438e-06,3.6060806483030677e-06,0.9999865485609154 -0.25288924573804833,0.03821888565362709,2.0235774877667628e-05,2.682208746671703e-07,2.4735925108194595e-06,3.4868713706732143e-06,0.9999872638165812 -0.25333034991169034,0.03798294066732411,2.1725890848040795e-05,2.9802319407463367e-07,2.1159646779298993e-06,3.3378597736358976e-06,0.9999875618397752 -0.25087970494185163,0.03707498311361606,2.5182959899306546e-05,2.086162358522436e-07,1.6391275674104854e-06,2.8014180243015566e-06,0.9999885751186351 -0.2510150968924533,0.03685203193987189,2.634525035619762e-05,2.086162358522436e-07,1.4603136509657052e-06,2.712011066079167e-06,0.9999885155139963 -0.2500244080916826,0.036447972053008704,2.8342005756497666e-05,2.086162358522436e-07,1.3113020539283883e-06,2.4437901914119963e-06,0.9999888731418292 -0.2526391148462587,0.036797493689911746,2.706050602197674e-05,2.3841855525970696e-07,1.2516974151134616e-06,2.682208746671703e-06,0.9999882174908022 -0.25341698526286777,0.03666141628591283,2.7269122257828982e-05,2.086162358522436e-07,1.3113020539283883e-06,2.682208746671703e-06,0.9999880982815246 -0.21184235810356328,0.1617482900342537,8.82744700849065e-05,0.0,0.00013735889014899867,0.9999988867211501,5.960463881492674e-08 -0.20417588948358045,0.13960087296956467,1.3589857649803297e-05,0.0,1.3679264608025687e-05,0.999998588697956,5.960463881492674e-08 -0.20606872438531176,0.14091926810712577,1.1980532401800274e-05,0.0,8.165835517644963e-06,0.9999987079072337,1.4901159703731684e-07 -0.21494960784022052,0.14216959474036503,1.0669230347871886e-05,0.0,6.616114908456868e-06,0.9999988867211501,2.086162358522436e-07 -0.20769721268747515,0.13874644038685574,1.2367962554097299e-05,0.0,6.645917227864331e-06,0.9999987079072337,1.1920927762985348e-07 -0.19303494691049441,0.13255837557430147,1.6272066396475e-05,0.0,7.4803821712733056e-06,0.9999979926515679,1.7881391644478022e-07 -0.16764575242302032,0.12389141319060795,2.661347123086479e-05,0.0,1.0520218750834569e-05,0.9999958468845705,8.940695822239011e-08 -0.12739157676169277,0.11436662075945389,6.0707324633002886e-05,0.0,1.9401309934258653e-05,0.9999869061887483,0.0 -0.058031529185753175,0.11878785488955619,0.00015667079312503494,2.980231940746337e-08,2.7090308341384204e-05,0.9999261094571571,2.980231940746337e-08 -0.019101977347536665,0.10912382600823067,0.000385642013132576,0.0,0.00021615622266233183,0.9973150686492304,6.556510269641942e-07 -0.0795620083775954,0.08549594877686399,1.5795229285955586e-05,1.4901159703731684e-07,0.9293108249232265,0.001301437486204518,4.380940952897116e-06 -0.07217735051809894,0.01365917920832391,2.1785495486855723e-05,8.940695822239011e-08,0.9996788694153528,2.682208746671703e-07,9.685753807425595e-06 -0.42258983848729276,0.2610772251635769,0.00010439752488434418,1.7881391644478022e-07,3.552436473369634e-05,0.9999999000000099,4.321336314082188e-06 -0.3070844411722819,0.1923229097990683,8.374451753497206e-06,0.0,5.334615173935943e-06,0.9999997807907323,3.2186504960060438e-06 -0.3147362470496506,0.1994482278482327,5.155801257491163e-06,0.0,2.5629994690418497e-06,0.9999997807907323,5.30481285452848e-06 -0.3254733681544001,0.1919074058204102,4.410743272304579e-06,0.0,1.8775461226701922e-06,0.9999999000000099,4.976987341046382e-06 -0.3293171524865163,0.1858029067198167,4.112720078229945e-06,0.0,1.5497206091880952e-06,0.9999997807907323,4.708766466379212e-06 -0.33102956412851997,0.18113440272090603,4.023313120007555e-06,0.0,1.3411043733358516e-06,0.9999999000000099,4.380940952897116e-06 -0.33203488586958246,0.17826294895934328,3.933906161785165e-06,0.0,1.2218950957059981e-06,0.9999997807907323,4.2319293558597985e-06 -0.33195114134367654,0.17669412490680125,3.933906161785165e-06,0.0,1.1920927762985347e-06,0.9999998403953712,4.172324717044872e-06 -0.3322820365291334,0.1758794486221507,3.933906161785165e-06,0.0,1.1622904568910714e-06,0.9999998403953712,4.142522397637409e-06 -0.3307391404968639,0.1755129098591672,4.023313120007555e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.2319293558597985e-06 -0.32670319078999976,0.1750967800317391,4.112720078229945e-06,0.0,1.043081179261218e-06,0.9999997807907323,4.112720078229945e-06 -0.32216140626527023,0.17471939322340832,4.261731675267262e-06,0.0,1.1026858180761447e-06,0.9999997807907323,4.023313120007555e-06 -0.08645421266197799,0.3721510767299453,0.9996292187512199,3.874301522970238e-07,0.0009153782406002374,0.0003519653922021424,0.0 -0.09393739699928409,0.16766729948033793,0.9901292526029805,0.0,0.0002295970687150978,0.013034610636922846,0.0 -0.2044614851390099,0.12559089062447526,0.0002055167946338674,0.0,4.962086181342651e-05,0.9999966217448751,8.940695822239011e-08 -0.30202573536575916,0.23266044255087387,1.1533497610688325e-05,0.0,7.68899840712555e-06,0.9999999000000099,1.0490416431427107e-05 -0.31490010021813136,0.220418035946296,7.897614642977793e-06,0.0,3.5166736900806776e-06,0.9999998403953712,1.0907648903131594e-05 -0.31974199412929255,0.20235568281523364,6.258487075567308e-06,0.0,2.264976274967216e-06,0.9999998403953712,7.897614642977793e-06 -0.31975674627887385,0.18861514326680523,5.424022132158334e-06,0.0,1.519918289780632e-06,0.9999997807907323,5.960463881492674e-06 -0.3167847394812064,0.18099859353780856,5.1259989380836994e-06,0.0,1.3113020539283883e-06,0.9999998403953712,4.857778063416529e-06 -0.3119434714188153,0.1771944760972826,5.185603576898626e-06,0.0,1.2814997345209249e-06,0.9999997807907323,4.202127036452335e-06 -0.3063386678568831,0.17568814751477685,5.424022132158334e-06,0.0,1.4305113315582417e-06,0.9999997807907323,3.784894564747848e-06 -0.3009918928021728,0.17623227831683821,5.990266200900137e-06,0.0,1.5497206091880952e-06,0.9999997807907323,3.6656852871179947e-06 -0.2948764264461486,0.1773382425004562,6.586312589049405e-06,0.0,1.7881391644478022e-06,0.9999998403953712,3.5166736900806776e-06 -0.6161654591305223,0.3924135565085802,0.9999996019768158,2.1457669973373625e-06,1.1920927762985348e-07,1.4901159703731684e-07,1.1831520804762957e-05 -0.591831803297332,0.444231629295575,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,8.940695822239011e-08 -0.5993382930507443,0.3221488594457218,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.5493808388482536,0.33723095053620256,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5795556306599008,0.33345001930249024,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5778817534207429,0.33482819789875085,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5816949605700905,0.33260208362606075,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5848413705583636,0.3329382836248588,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5878672599549057,0.33485475176799373,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5928648710005362,0.33558952802633657,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,8.940695822239011e-08 -0.5943820476285863,0.3392996787443902,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5962533354512322,0.34203144902094573,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.27189651130504083,0.028711557383389236,5.632638368010577e-06,3.278255134820971e-07,0.0446293905451481,3.76701317310337e-05,0.9737724880147495 -0.26952785252408723,0.0483393669045644,4.976987341046382e-06,2.9802319407463367e-07,0.00019779799390733438,1.5795229285955586e-05,0.9999134732737283 -0.2575894594085843,0.03881302475264645,1.0520218750834569e-05,2.682208746671703e-07,1.3738869246840614e-05,3.6656852871179947e-06,0.9999734355403761 -0.25303167103673324,0.03805217146221887,1.4454124912619735e-05,3.278255134820971e-07,4.380940952897116e-06,2.8312203437090202e-06,0.9999821378176431 -0.24592557548458302,0.03714695572217002,2.0503995752334798e-05,3.5762783288956044e-07,2.175569316744826e-06,2.2053716361522894e-06,0.9999859525145273 -0.24275022744127273,0.03657716512053724,2.5421378454566255e-05,3.5762783288956044e-07,1.3411043733358516e-06,1.937150761485119e-06,0.9999876810490529 -0.24113461374238027,0.036155700677402626,2.9593703171611127e-05,3.5762783288956044e-07,1.1026858180761447e-06,1.7881391644478022e-06,0.9999886943279127 -0.23975306748351108,0.03569102286681325,3.34382023751739e-05,2.682208746671703e-07,8.642672628164378e-07,1.6093252480030219e-06,0.9999894095835785 -0.23662221430752378,0.034911692136508465,3.874301522970238e-05,3.278255134820971e-07,6.854533463716575e-07,1.3113020539283883e-06,0.9999903036531608 -0.22980526088716702,0.03363025187870177,4.8011536565423486e-05,3.278255134820971e-07,4.768371105194139e-07,1.0132788598537545e-06,0.9999915553505758 -0.22005930542034646,0.03224256634160113,6.0826533910632736e-05,4.172324717044872e-07,2.3841855525970696e-07,6.258487075567308e-07,0.9999927474433521 -0.2136222422034499,0.03182411193302716,6.964802045524189e-05,4.768371105194139e-07,2.682208746671703e-07,5.066394299268773e-07,0.9999932242804627 -0.3114230632653029,0.0348773896634461,2.8431412714720055e-05,8.642672628164378e-07,0.00016859172088802028,1.0460614112019642e-05,0.9996447159573117 -0.3594958484023962,0.04743340610645598,1.6391275674104854e-06,1.4901159703731684e-07,0.0005392133650392347,0.00010642408260405169,0.9998171521774034 -0.15838930010139737,0.03609696029998653,2.086162358522436e-07,5.066394299268773e-07,0.051139349591875584,0.0003628134364664591,0.9381923929437611 -0.0732651054828824,0.030132949347104584,8.642672628164378e-07,1.519918289780632e-06,0.9940784175523022,4.7415490177274224e-05,0.0007044374238342117 -0.08028987049723996,0.029512315983487105,1.4096497079730174e-05,5.066394299268773e-07,0.9999782635161201,4.112720078229945e-06,1.2606381109357005e-05 -0.09835547208378742,0.028594285244813736,2.9295679977536493e-05,2.682208746671703e-07,0.9999971581866245,2.264976274967216e-06,5.722045326232967e-06 -0.0992274582344929,0.028588265175692452,3.600120184421575e-05,2.086162358522436e-07,0.9999981118608455,1.996755400300046e-06,4.678964146971749e-06 -0.09322473406405664,0.028508990998154758,3.4064051082730634e-05,2.086162358522436e-07,0.9999977542330126,2.0563600391149723e-06,5.871056923270284e-06 -0.08062133192682218,0.0291004180858373,2.5421378454566255e-05,3.874301522970238e-07,0.9999956084660152,2.8908249825239467e-06,1.0669230347871886e-05 -0.058864891526645785,0.03104254602854368,1.397728780210032e-05,1.2516974151134616e-06,0.9999804688877563,5.871056923270284e-06,3.817677116096058e-05 -0.03764680027805844,0.0356633663116422,5.30481285452848e-06,7.2121612966061355e-06,0.999757666747866,2.059340271055719e-05,0.0002874433706849842 -0.030668526886623762,0.042574435465198165,1.7285345256328755e-06,2.6732680508494642e-05,0.9955035644663671,7.489322867095545e-05,0.002327829366597556 -0.09429299830999935,0.03241974114816564,0.00018718836819827742,0.004422544990789934,0.0,0.0,0.9976183370515207 -0.27003055809810206,0.1715777218048026,2.1547076931596017e-05,7.450579851865842e-07,0.0,0.004845588914778876,0.9994835450139562 -0.2189488410859045,0.09230583904593105,6.616114908456868e-06,4.4703479111195056e-07,2.682208746671703e-07,0.0002788901050150422,0.9999238444808821 -0.2394765615364095,0.04060825704832903,4.178285180926364e-05,2.086162358522436e-07,9.238719016313645e-07,3.784894564747848e-06,0.9999890519557456 -0.2557055950058913,0.03749832510306078,2.688169210553196e-05,2.086162358522436e-07,1.4305113315582417e-06,3.5762783288956045e-06,0.9999883367000798 -0.2595536708724312,0.03732118009881865,2.4646518149972206e-05,2.086162358522436e-07,1.7285345256328755e-06,3.725289925932921e-06,0.9999880982815246 -0.25625333188903204,0.03605946897842923,2.7894970965385714e-05,2.086162358522436e-07,1.5497206091880952e-06,2.8908249825239467e-06,0.9999889327464679 -0.2604413628470343,0.03680294751490776,2.4437901914119964e-05,2.086162358522436e-07,1.6093252480030219e-06,3.3378597736358976e-06,0.9999875618397752 -0.27496692537122835,0.03959426283158372,1.5109775939583928e-05,1.4901159703731684e-07,2.8312203437090202e-06,6.586312589049405e-06,0.9999828530733089 -0.3015537261838024,0.043886154882545575,5.513429090380723e-06,8.940695822239011e-08,9.268521335721107e-06,2.300739058256172e-05,0.9999662233790795 -0.2945534586784465,0.04112365841161358,1.1920927762985347e-06,1.7881391644478022e-07,0.0001315772401839508,9.024142316579908e-05,0.9996956779234986 -0.15797799825014183,0.02693754434124306,1.1920927762985348e-07,3.5762783288956044e-07,0.6066472519764186,0.00032716986245513285,0.06592708166794246 -0.08585289120318636,0.35884326690251217,0.9997807933477263,4.172324717044872e-07,0.0006730555814981528,0.00016885994176268746,0.0 -0.5956093072644607,0.4728198646689451,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.7419099807432049,0.6915299295194948,0.9999999000000099,1.1920927762985348e-07,1.4901159703731684e-07,0.0,0.0 -0.6952913403223143,0.7478426693589426,0.9999999000000099,4.4703479111195056e-07,1.4901159703731684e-07,0.0,0.0 -0.7047768234914772,0.754874825348339,0.9999999000000099,5.66244068741804e-07,1.4901159703731684e-07,0.0,0.0 -0.6896074413967683,0.7689379452342365,0.9999999000000099,6.556510269641942e-07,2.086162358522436e-07,0.0,0.0 -0.6962039470384325,0.7641063927295707,0.9999999000000099,5.960463881492673e-07,1.1920927762985348e-07,0.0,0.0 -0.7143816351594755,0.7551983593601245,0.9999999000000099,6.556510269641942e-07,1.4901159703731684e-07,0.0,0.0 -0.7637524604481111,0.7024003266085452,0.9999999000000099,6.258487075567308e-07,1.4901159703731684e-07,0.0,0.0 -0.7571880817099795,0.5694723724343772,0.9999999000000099,1.1920927762985348e-07,2.086162358522436e-07,0.0,0.0 -0.6540940999713896,0.4028796850945108,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.6305111646391142,0.3607996999599622,0.9999999000000099,0.0,7.748603045940476e-07,0.0,2.3841855525970696e-07 -0.15532582997632588,0.023706167932265744,1.7285345256328755e-06,9.536742210388278e-07,0.7094369417287301,5.254148911535792e-05,0.20892007049860267 -0.2379308342835133,0.05342197417298119,5.30481285452848e-06,5.364417493343406e-07,0.0006892084386169979,1.3917683163285393e-05,0.9997400237747769 -0.2594633698356002,0.039690226309655664,7.510184490680769e-06,4.172324717044872e-07,2.2649762749672162e-05,3.695487606525458e-06,0.9999507857776264 -0.2652193605789989,0.04019963740614131,8.255242475867353e-06,2.682208746671703e-07,7.718800726533013e-06,3.904103842377701e-06,0.9999690247971038 -0.25356695054911643,0.03817319869341458,1.4096497079730174e-05,3.278255134820971e-07,3.367662093043361e-06,2.4437901914119963e-06,0.99997927679498 -0.2522285580530629,0.03784921764679342,1.707672902047651e-05,3.278255134820971e-07,2.1457669973373625e-06,2.2947785943746796e-06,0.9999817801898102 -0.25486302374738123,0.03826346992791145,1.788139164447802e-05,2.9802319407463367e-07,1.9073484420776557e-06,2.8312203437090202e-06,0.999982495445476 -0.25893408059001666,0.03860297798449394,1.7553566130995923e-05,2.682208746671703e-07,1.937150761485119e-06,3.367662093043361e-06,0.999982495445476 -0.2594347000014644,0.037998676293542116,1.8984077462554166e-05,2.086162358522436e-07,1.9073484420776557e-06,3.2186504960060438e-06,0.9999836279336135 -0.2628587484250897,0.03814762830081032,1.8268821796775045e-05,2.086162358522436e-07,1.9669530808925826e-06,3.635882967710531e-06,0.9999833299104194 -0.2628337144742851,0.03763875364612755,1.934170529544373e-05,2.086162358522436e-07,1.8775461226701922e-06,3.397464412450824e-06,0.9999840451660852 -0.25892966984630345,0.03647133707375666,2.2917983624339332e-05,2.682208746671703e-07,1.5497206091880952e-06,2.6226041078567766e-06,0.9999855948866944 -0.42972934244283817,0.25761270518660057,8.520483118593778e-05,8.940695822239011e-08,3.2931562945247025e-05,0.9999999000000099,4.827975744009066e-06 -0.3951215743854944,0.25447940822058435,8.10325064688929e-05,0.0,6.377696353197161e-06,0.9999973966051797,3.278255134820971e-07 -0.3833910226663146,0.19587382670863177,4.005431728363077e-05,0.0,1.7583368450403388e-06,0.9999956084660152,2.682208746671703e-07 -0.382190048678785,0.20516467090908247,4.464387447238013e-05,0.0,1.1920927762985347e-06,0.9999928666526298,2.682208746671703e-07 -0.39795038102409486,0.2215498089410973,9.906290971040823e-05,0.0,9.238719016313645e-07,0.9999733163310984,2.086162358522436e-07 -0.39583337305337263,0.23386162515450423,0.0002135634208738825,0.0,7.152556657791209e-07,0.9999186588773051,5.960463881492674e-08 -0.40533584354629576,0.2522281407878033,0.0009971260027349094,0.0,6.258487075567308e-07,0.9993328644870321,8.940695822239011e-08 -0.4078943431208511,0.288977175901521,0.10599188936800466,8.940695822239011e-08,2.682208746671703e-07,0.8084608700053534,0.0 -0.4155598282641952,0.42859905950836535,0.999999542372177,3.874301522970238e-07,3.5762783288956044e-07,7.748603045940476e-07,0.0 -0.7178924679458901,0.5247262715394819,0.9999999000000099,2.086162358522436e-07,0.0,0.0,0.0 -0.743969678847978,0.510901093395487,0.9999999000000099,1.1920927762985348e-07,2.3841855525970696e-07,0.0,0.0 -0.7266275882420067,0.4057838320037272,0.9999999000000099,5.960463881492674e-08,1.7881391644478022e-07,0.0,0.0 -0.12182977795096421,0.11225476859077865,0.000235140300124886,0.0,0.001148491983005416,0.9998688890038947,0.0 -0.03193560242520655,0.16587927934667193,1.9431112253666117e-05,8.344649434089744e-07,0.5471761275524373,0.005924581888926088,2.980231940746337e-06 -0.09259000420186979,0.01409423351046499,6.765126505494185e-06,1.1920927762985348e-07,0.9997152878496687,3.874301522970238e-07,7.808207684755402e-06 -0.047139227388337375,0.028410881752871264,4.649161827564286e-06,2.592801788449313e-06,0.9999382688034752,5.632638368010577e-06,6.073712695241035e-05 -0.03269237279756596,0.051375776520514796,8.940695822239011e-07,4.357099097371145e-05,0.9857114759832957,0.00013133882162869108,0.010593681468173967 -0.09017053246124732,0.05340525507012455,4.768371105194139e-07,1.0639428028464424e-05,0.034087952542895414,0.0001170039059937012,0.8638102144460049 -0.21381434797355303,0.03837606310187288,1.1086462819576373e-05,7.748603045940476e-07,9.685753807425595e-06,1.7583368450403388e-06,0.9998655511441211 -0.21673583983477546,0.029550284142202527,4.810094352364588e-05,6.258487075567308e-07,3.5762783288956044e-07,1.7881391644478022e-07,0.9999851180495838 -0.20805716513725883,0.03007298707447081,5.63859883189207e-05,7.152556657791209e-07,1.4901159703731684e-07,1.7881391644478022e-07,0.9999891711650233 -0.21848034857798934,0.03322023152736207,5.4448837557435575e-05,5.66244068741804e-07,2.086162358522436e-07,4.4703479111195056e-07,0.9999875618397752 -0.22852402924545065,0.03512638806695266,4.783272264897871e-05,4.172324717044872e-07,1.7881391644478022e-07,8.344649434089744e-07,0.9999864293516377 -0.2336444854639581,0.03510984777803032,4.506110694408462e-05,3.278255134820971e-07,2.682208746671703e-07,8.940695822239011e-07,0.9999866081655542 -0.21164482831078582,0.16124057767014385,8.82744700849065e-05,0.0,0.00013637541360855238,0.9999988271165112,1.1920927762985348e-07 -0.24589946865017245,0.168416351051102,8.076428559422574e-06,0.0,1.0579823389649495e-05,0.9999996019768158,5.066394299268773e-07 -0.24300691484398732,0.16699832674981588,7.539986810088233e-06,0.0,6.198882436752381e-06,0.9999996019768158,5.066394299268773e-07 -0.2653754949459816,0.18575474616684642,6.377696353197161e-06,0.0,5.7816499650478935e-06,0.9999998403953712,1.3411043733358516e-06 -0.27322161196531003,0.20399013158166213,6.645917227864331e-06,0.0,6.3180917143822346e-06,0.9999999000000099,2.4735925108194595e-06 -0.27613407372284937,0.21149367090418403,6.943940421938965e-06,0.0,6.377696353197161e-06,0.9999999000000099,3.1888481765985805e-06 -0.2777208089713493,0.21377897258912595,7.122754338383746e-06,0.0,6.228684756159844e-06,0.9999997807907323,3.635882967710531e-06 -0.2779599726085007,0.21276840563945462,7.301568254828525e-06,0.0,5.871056923270284e-06,0.9999999000000099,3.7550922453403844e-06 -0.27679795025633014,0.20932951565972732,7.599591448903159e-06,0.0,5.57303372919565e-06,0.9999997807907323,3.6656852871179947e-06 -0.27488180993849265,0.20518562194171744,7.748603045940476e-06,0.0,5.453824451565797e-06,0.9999999000000099,3.2782551348209707e-06 -0.2735263109093892,0.20273306962356438,8.076428559422574e-06,0.0,5.364417493343406e-06,0.9999999000000099,3.2484528154135075e-06 -0.27218967675035644,0.2009309827937338,8.40425407290467e-06,0.0,5.245208215713553e-06,0.9999999000000099,3.0994412183761904e-06 -0.1286200284904627,0.11697864530467618,0.0002077221662700197,0.0,0.0007783173736453134,0.9999345733158688,0.0 -0.01678150892188202,0.11380973456341277,0.0004363357584446712,8.940695822239011e-08,0.0014100669404447218,0.9854175655092993,1.4901159703731684e-07 -0.26927405594664416,0.06885412334216788,4.112720078229945e-06,0.0,0.9888122285037259,0.005188196378687076,1.1920927762985348e-07 -0.24928617476384754,0.029235601420164736,4.06801659911875e-05,0.0,0.9999895287928562,7.152556657791209e-07,8.940695822239011e-08 -0.22609782217996885,0.023751974101767787,0.00013881920379996439,0.0,0.9999996615814547,2.3841855525970696e-07,2.980231940746337e-08 -0.22387990354564602,0.029705494637171065,0.00021353361855447505,0.0,0.9999997807907323,4.172324717044872e-07,1.7881391644478022e-07 -0.21388474105902985,0.029402256006928192,0.00022104380304515582,0.0,0.9999997807907323,4.172324717044872e-07,5.960463881492674e-08 -0.19005894660162714,0.026616871352406368,0.00018832085633576102,0.0,0.9999997807907323,2.682208746671703e-07,1.7881391644478022e-07 -0.16207012533470444,0.02495816349555844,0.00013071297292113434,0.0,0.9999997211860935,3.5762783288956044e-07,2.682208746671703e-07 -0.12818062304919672,0.024122655387562468,7.206200832724643e-05,8.940695822239011e-08,0.9999996615814547,4.4703479111195056e-07,6.556510269641942e-07 -0.07967889308599511,0.02781018614292774,2.3305413776636355e-05,3.278255134820971e-07,0.9999978734422902,1.698732206225412e-06,6.288289394974771e-06 -0.03280282020433019,0.03921955823226739,2.980231940746337e-06,1.3828276205063004e-05,0.9997121288038114,3.015994724035293e-05,0.0004980861642569353 -0.21432220934934074,0.03324639796641398,5.292891926765494e-05,7.033347380161355e-06,8.22544015645989e-06,1.3113020539283883e-06,0.9998371793360452 -0.2267195582295952,0.0360870957312779,4.994868732690861e-05,3.874301522970238e-07,2.026557719707509e-06,2.086162358522436e-06,0.9999937011175731 -0.2252779304887949,0.03572899102552867,4.3630595612526375e-05,3.5762783288956044e-07,1.132488137483608e-06,1.9669530808925826e-06,0.9999945355825166 -0.20820334552856443,0.03303089737326546,6.750225345790453e-05,4.4703479111195056e-07,5.364417493343406e-07,9.238719016313645e-07,0.9999960853031258 -0.18706128000438496,0.03035596012549352,9.268521335721107e-05,7.152556657791209e-07,2.086162358522436e-07,3.5762783288956044e-07,0.9999970985819856 -0.17172324656729118,0.02949351071806369,0.00010380147849619491,1.1026858180761447e-06,8.940695822239011e-08,2.086162358522436e-07,0.9999975158144573 -0.16308155655185616,0.029594689602552588,0.00010624526868760691,1.519918289780632e-06,0.0,1.1920927762985348e-07,0.9999975158144573 -0.1702354252267919,0.03127741813124089,0.00011074541891813388,1.3113020539283883e-06,0.0,2.086162358522436e-07,0.9999970389773468 -0.1748965382503568,0.03185242413929062,0.00011250375576317421,1.043081179261218e-06,2.980231940746337e-08,2.682208746671703e-07,0.9999965621402362 -0.1942967176356924,0.03452786802654306,9.760259605944253e-05,6.854533463716575e-07,8.940695822239011e-08,5.66244068741804e-07,0.9999948932103495 -0.20673617719747894,0.03528255223623744,8.279084331393324e-05,4.4703479111195056e-07,1.7881391644478022e-07,8.046626240015109e-07,0.9999939395361285 -0.22020694612544897,0.036140888923178474,6.338953337967459e-05,4.172324717044872e-07,2.3841855525970696e-07,1.2218950957059981e-06,0.9999926878387133 -0.7084072827999511,0.4152714311365478,0.9999997211860935,3.9637084811926284e-06,2.3841855525970696e-07,6.854533463716575e-07,3.054737739264995e-05 -0.5114663839128423,0.454099237841096,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,5.960463881492674e-08 -0.5865874290223416,0.301857560821343,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5366575717703808,0.3478223084807848,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5772181153058411,0.32610383624214845,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.569963574385884,0.34073957795030513,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5777338146924165,0.3312549888520452,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5789394378422383,0.33607664698568,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.578843474364154,0.3373789786714769,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5826146006342919,0.3376540541070682,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5808446407077601,0.34119769924997034,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5818508863208165,0.34235429757931635,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.6988189220139102,0.41268315904226444,0.9999996615814547,3.695487606525458e-06,2.3841855525970696e-07,6.258487075567308e-07,2.792477328479318e-05 -0.4594514369774351,0.4211757480376974,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5367760658041894,0.33834516996312053,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5512066483269378,0.3640180825563807,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5848382711168354,0.35305351012860126,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5947349071256419,0.4026344417836244,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.622364938233354,0.43894112102621724,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.6659507751189089,0.4715429245618181,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.7303471564944162,0.49589788905235294,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.7577100991889008,0.5319962500614914,0.9999999000000099,8.940695822239011e-08,1.1920927762985348e-07,0.0,0.0 -0.7243001460729136,0.6653277872853645,0.9999999000000099,2.086162358522436e-07,1.4901159703731684e-07,0.0,0.0 -0.5925093292944658,0.7766062615972118,0.9999999000000099,2.086162358522436e-07,2.086162358522436e-07,0.0,0.0 -0.15426844357805422,0.023650288577798384,1.6689298868179488e-06,1.0132788598537545e-06,0.7216234677622747,5.248188447654299e-05,0.1974989872367193 -0.4066952168773094,0.06383013724187765,2.3841855525970694e-06,8.940695822239011e-08,0.9999975158144573,0.0002389549970090413,2.086162358522436e-07 -0.362694144233944,0.051828294983572075,2.6226041078567766e-06,5.960463881492674e-08,0.999997635023735,3.0428168115020102e-05,0.0 -0.333727002130041,0.05037847160430373,5.900859242677747e-06,8.940695822239011e-08,0.999997635023735,1.3053415900468956e-05,0.0 -0.35438019035779295,0.04872298239827313,2.592801788449313e-06,2.086162358522436e-07,0.9999962045124035,4.059075903296511e-05,0.0 -0.3563680052609699,0.061897337426077025,2.264976274967216e-06,5.960463881492674e-08,0.9999877406536917,0.00014606116741597798,0.0 -0.35659509895755476,0.0681865811231202,1.370906692743315e-06,1.1920927762985348e-07,0.9999065591356258,0.0011645256308466312,0.0 -0.26014482973928904,0.08597394822555839,4.7385687857866755e-06,8.940695822239011e-08,0.9920063814931789,0.14928235110913365,0.0 -0.10811999439745476,0.09040868280770001,0.0001402497151315226,0.0,0.015911219913089435,0.9996894790410618,0.0 -0.16012573241524455,0.12195172903833694,2.2053716361522894e-05,0.0,9.09566788315782e-05,0.9999935819082956,0.0 -0.17756989597538952,0.13397726414293668,1.3142822858691347e-05,0.0,2.0802018946409432e-05,0.9999969197680691,2.980231940746337e-08 -0.19010433553862174,0.1375154256585204,1.060962570905696e-05,0.0,1.3023613581061492e-05,0.9999977542330126,1.4901159703731684e-07 -0.0816965699162033,0.0340275466383841,0.0004212557848244947,0.0006936787865281174,0.0,0.0,0.9995491101166526 -0.19038650392697676,0.05226296185552218,0.00021001694486439437,1.0132788598537545e-06,0.0,2.9206273019314104e-06,0.9999941779546837 -0.24012869595487005,0.06070718168172821,1.8447635713219826e-05,3.278255134820971e-07,4.172324717044872e-07,3.647803895473517e-05,0.9999840451660852 -0.24345612524931845,0.04489350318139957,3.0040737962723075e-05,2.3841855525970696e-07,1.5795229285955586e-06,9.357928293943498e-06,0.9999915553505758 -0.24694761632850432,0.03846466540631633,3.129243537783654e-05,2.086162358522436e-07,2.026557719707509e-06,4.589557188749359e-06,0.9999927474433521 -0.24469318984925806,0.036727279418378354,3.483891138732468e-05,2.9802319407463367e-07,1.6689298868179488e-06,3.308057454228434e-06,0.9999930454665462 -0.2420647740263841,0.035993695252930856,3.7789341008663554e-05,2.3841855525970696e-07,1.3411043733358516e-06,2.6226041078567766e-06,0.999993105071185 -0.23599001764273977,0.03484150766729746,4.4763083750009984e-05,2.682208746671703e-07,9.238719016313645e-07,1.8179414838552655e-06,0.9999934626990179 -0.23271733521451532,0.03445661067372628,4.8518175995350365e-05,2.9802319407463367e-07,7.450579851865842e-07,1.519918289780632e-06,0.9999934030943791 -0.22100326417961522,0.03261569141783119,6.359814961552683e-05,3.278255134820971e-07,4.172324717044872e-07,8.046626240015109e-07,0.9999944163732389 -0.2095061242493662,0.031390845770229034,7.781385597288686e-05,4.768371105194139e-07,2.3841855525970696e-07,5.066394299268773e-07,0.9999950124196271 -0.17756628989438078,0.02810704707618074,0.00010091065351367098,1.0132788598537545e-06,0.0,1.4901159703731684e-07,0.9999968005587916 -0.10279056429437343,0.031676501030266174,0.00018832085633576102,0.00016859172088802028,1.7881391644478022e-07,8.940695822239011e-08,0.9998474313339214 -0.06862694024755504,0.02881565689547163,3.6656852871179946e-05,0.00020965931703150481,0.0,0.0,0.9999981714654843 -0.2610352337252293,0.1859323382059243,0.0,0.9961147504327754,0.0,3.278255134820971e-07,0.900620966494605 -0.21137225627023926,0.4184502660511646,0.0,0.9999996615814547,0.0,0.0002097487239897272,0.007686375803017693 -0.1424497067869329,0.3611762821055886,0.0,0.9999999000000099,0.0,0.003785281994900145,0.00012099741679430128 -0.1389527320804279,0.36757856601142896,0.0,0.9999999000000099,0.0,0.003101229357540638,3.79979572445158e-05 -0.14181214570411932,0.38040244572801357,0.0,0.9999999000000099,0.0,0.002047657761847993,2.0653007349372115e-05 -0.1456696689068557,0.38884937756555643,0.0,0.9999999000000099,0.0,0.001318365203627957,1.3738869246840614e-05 -0.14947423338271137,0.39509391777902575,0.0,0.9999999000000099,0.0,0.0008829235147655098,1.0222195556759936e-05 -0.1527311503823934,0.4019087552336083,0.0,0.9999999000000099,0.0,0.0006302892531484428,8.195637837052427e-06 -0.15569502114604936,0.40784609310795783,0.0,0.9999999000000099,0.0,0.0004735886577040004,6.8247311443091115e-06 -0.15837618707954734,0.4131701587923184,0.0,0.9999999000000099,0.0,0.00036966796993017563,5.990266200900137e-06 -0.11037743091126204,0.031519562000599445,0.000155389293390514,0.0001254677647054208,1.7881391644478022e-07,5.960463881492674e-08,0.9998602463312666 -0.24880471824569425,0.056649833907917356,2.5779006287455814e-05,3.5762783288956044e-07,8.642672628164378e-07,3.147124929428132e-05,0.9999880982815246 -0.2461619973080748,0.044350028030430616,2.4974343663454304e-05,3.278255134820971e-07,2.712011066079167e-06,1.034140483438979e-05,0.9999922706062416 -0.26260372995242875,0.042765408747025814,1.7315147575736217e-05,2.086162358522436e-07,5.096196618676236e-06,1.1891125443577885e-05,0.9999906016763548 -0.2614041566740513,0.04040196537279673,1.9580123850703434e-05,1.7881391644478022e-07,5.03659197986131e-06,8.40425407290467e-06,0.9999911977227429 -0.258604824532291,0.038736075156254594,2.247094883322738e-05,2.3841855525970696e-07,3.874301522970238e-06,6.079673159122528e-06,0.9999915553505758 -0.25428748129745393,0.03754869102788736,2.6315448036790155e-05,2.086162358522436e-07,2.8908249825239467e-06,4.500150230526969e-06,0.99999185337377 -0.25150221585186,0.0369340181287464,2.8967854464054395e-05,2.3841855525970696e-07,2.175569316744826e-06,3.6656852871179947e-06,0.99999185337377 -0.24787023662494437,0.036222845309730606,3.263353975117239e-05,1.7881391644478022e-07,1.6093252480030219e-06,2.9504296213388737e-06,0.9999920321876864 -0.242151290168272,0.03518411516540774,3.853439899385014e-05,2.9802319407463367e-07,1.1622904568910714e-06,2.2053716361522894e-06,0.9999925090247969 -0.24128472804024087,0.0352324545323123,3.957748017311135e-05,2.086162358522436e-07,9.536742210388278e-07,1.9669530808925826e-06,0.9999922110016028 -0.24435231088580173,0.03590387105326972,3.647803895473517e-05,2.682208746671703e-07,9.536742210388278e-07,2.324580913782143e-06,0.9999911977227429 -0.17654523252709822,0.5369359253917613,1.043081179261218e-06,0.9999999000000099,8.940695822239011e-08,0.0,0.0 -0.12592762708142502,0.32568472618248206,2.980231940746337e-08,0.9999999000000099,0.0,2.4437901914119963e-06,0.0 -0.1409592628420636,0.41804543130391947,2.980231940746337e-08,0.9999999000000099,0.0,6.258487075567308e-07,0.0 -0.19353038071784692,0.5163381694863223,2.980231940746337e-08,0.9999999000000099,0.0,1.0043381640315155e-05,0.0 -0.17676132916672246,0.5523192881592077,2.980231940746337e-08,0.9999999000000099,0.0,1.0818241944909203e-05,0.0 -0.17794537543513655,0.5632465480793641,0.0,0.9999999000000099,0.0,1.0490416431427107e-05,1.1920927762985348e-07 -0.179655224077415,0.5655284522995545,2.980231940746337e-08,0.9999999000000099,0.0,1.060962570905696e-05,0.0 -0.1809729337617324,0.56409668912765,0.0,0.9999999000000099,0.0,1.087784658372413e-05,0.0 -0.18196120857438983,0.565074205301799,0.0,0.9999999000000099,0.0,1.1175869777798764e-05,8.940695822239011e-08 -0.18284732102590648,0.5655650495514403,2.980231940746337e-08,0.9999999000000099,0.0,1.1712311527133104e-05,2.980231940746337e-08 -0.18370985984041543,0.5648768543229815,2.980231940746337e-08,0.9999999000000099,0.0,1.2367962554097299e-05,8.940695822239011e-08 -0.18446108698081098,0.5645466445909824,0.0,0.9999999000000099,0.0,1.3202427497506273e-05,2.980231940746337e-08 -0.3620810508578098,0.2802353500840024,0.9999997211860935,1.1920927762985348e-07,8.940695822239011e-08,0.0,3.5762783288956044e-07 -0.6289048194624839,0.5402251481084832,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.609561920140775,0.43741059295793683,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,5.960463881492674e-08 -0.6074551939712761,0.34179812663901243,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 -0.6105126738295479,0.36750096076394473,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.6125910877927797,0.35858577483712656,0.9999999000000099,0.0,3.278255134820971e-07,0.0,8.940695822239011e-08 -0.612633526299858,0.37290656560234403,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,1.4901159703731684e-07 -0.6265627741554214,0.37437111132886935,0.9999999000000099,0.0,3.874301522970238e-07,0.0,8.940695822239011e-08 -0.6390091180536792,0.3825538753808129,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,8.940695822239011e-08 -0.6552619933810702,0.3906720876024758,0.9999999000000099,0.0,5.066394299268773e-07,0.0,5.960463881492674e-08 -0.6864870190336163,0.39199826114617875,0.9999999000000099,0.0,6.258487075567308e-07,0.0,1.1920927762985348e-07 -0.7227056026159484,0.3860638737017451,0.9999999000000099,0.0,8.344649434089744e-07,0.0,1.1920927762985348e-07 -0.0987726747948755,0.02135479449860161,9.834765404462913e-07,1.1026858180761447e-06,0.9978224233348231,3.5166736900806775e-05,0.0001502036898136154 -0.041863858698065096,0.026868820185828802,3.5166736900806776e-06,2.8908249825239467e-06,0.9997616006540279,3.6656852871179947e-06,9.053944635987371e-05 -0.05406507849469427,0.04078486561076827,1.0132788598537545e-06,8.761881905794231e-06,0.9998618556565145,2.3692843928933378e-05,0.00010928510526716817 -0.03300076722962106,0.0504483878526133,3.874301522970238e-07,5.269050071239524e-05,0.996805687405918,0.00010323523442745311,0.001543462122112528 -0.046723723409625335,0.05554845928194628,1.7881391644478022e-07,4.988908268809368e-05,0.7803051287451523,0.0002756714545190362,0.04322638675440295 -0.09817028045247796,0.04979446529489446,2.9802319407463367e-07,1.0102986279130082e-05,0.00988578697528849,6.878375319242546e-05,0.8695090139631 -0.2182354926972622,0.041011512272487886,6.0200685203076e-06,1.0132788598537545e-06,1.1324881374836081e-05,1.937150761485119e-06,0.9998064233424167 -0.2170445620923768,0.03117832540931877,3.257393511235746e-05,7.748603045940476e-07,5.66244068741804e-07,2.086162358522436e-07,0.9999785615393142 -0.1997782587922342,0.02974116801706303,4.923343166112949e-05,9.536742210388278e-07,1.1920927762985348e-07,8.940695822239011e-08,0.9999888135371904 -0.20081034301879977,0.03120341896476491,6.276368467211785e-05,9.238719016313645e-07,8.940695822239011e-08,1.7881391644478022e-07,0.9999901248392443 -0.20925763248530788,0.03313666581540128,6.553530037701195e-05,6.854533463716575e-07,1.4901159703731684e-07,4.172324717044872e-07,0.9999895287928562 -0.2206070721058096,0.034850686782591296,5.787610428929386e-05,4.768371105194139e-07,2.3841855525970696e-07,6.258487075567308e-07,0.9999880982815246 -0.3493616580818472,0.04981780051332003,2.4437901914119963e-06,8.940695822239011e-08,0.9998095227836351,6.890296247005531e-05,0.0 -0.24309104680008428,0.027147114272237448,7.90059487491854e-05,0.0,0.999999542372177,1.4901159703731684e-07,5.960463881492674e-08 -0.28473192452205387,0.041833192102898334,3.066658667027981e-05,0.0,0.9999997807907323,1.2516974151134616e-06,0.0 -0.26877948640664084,0.03753244876218885,6.237625451982083e-05,0.0,0.9999999000000099,6.556510269641942e-07,0.0 -0.25869369505764744,0.035387158387800335,7.504224026799276e-05,0.0,0.9999998403953712,5.66244068741804e-07,0.0 -0.25387445091149996,0.035414457315102794,8.484720335304821e-05,0.0,0.9999999000000099,5.066394299268773e-07,0.0 -0.2420870363612068,0.03346079587363435,0.0001018643277347098,0.0,0.9999999000000099,4.768371105194139e-07,0.0 -0.22442623971963463,0.03096953033870633,0.00011137126762569061,0.0,0.9999997807907323,3.5762783288956044e-07,2.980231940746337e-08 -0.19909784196982894,0.02820456027501658,0.00010105966511070829,0.0,0.9999997807907323,2.682208746671703e-07,8.940695822239011e-08 -0.17820188402391685,0.027933508152946904,7.972120441496452e-05,0.0,0.9999997807907323,3.278255134820971e-07,0.0 -0.15239781140650083,0.026921063656965484,5.51640932232147e-05,5.960463881492674e-08,0.9999997807907323,3.5762783288956044e-07,1.1920927762985348e-07 -0.12453958391627559,0.02702987193598433,3.117322610020669e-05,8.940695822239011e-08,0.9999997807907323,4.4703479111195056e-07,3.874301522970238e-07 -0.4480928182416383,0.2532852291627139,5.7518476456404306e-05,1.4901159703731684e-07,2.8222796478867813e-05,0.9999999000000099,6.4373009920120876e-06 -0.3995061516596353,0.2574908732927005,6.726383490264483e-05,0.0,6.109475478529991e-06,0.9999982310701231,3.874301522970238e-07 -0.4252169728103041,0.23218753929930688,0.00013598798345625535,0.0,1.6093252480030219e-06,0.9999664021929959,1.7881391644478022e-07 -0.5037578940182945,0.3180439769677107,0.9997492028891544,7.748603045940476e-07,1.1920927762985348e-07,0.00023624298594296213,0.0 -0.5163118839050123,0.3959423898972581,0.9999999000000099,2.086162358522436e-07,1.0132788598537545e-06,0.0,0.0 -0.5063484310894153,0.44862058751053696,0.9999999000000099,1.4901159703731684e-07,4.112720078229945e-06,0.0,0.0 -0.49682307241289936,0.4420383273798281,0.9999999000000099,8.940695822239011e-08,2.0563600391149723e-06,0.0,0.0 -0.5190788507246609,0.4139145612007908,0.9999999000000099,0.0,1.2218950957059981e-06,0.0,0.0 -0.5274987816592183,0.40507867925383273,0.9999999000000099,0.0,5.364417493343406e-07,0.0,0.0 -0.546706259228003,0.4009894131927501,0.9999999000000099,0.0,3.874301522970238e-07,0.0,0.0 -0.5585503577954752,0.3968425988471467,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5722633003951576,0.3888948559095123,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.3553616404386239,0.2806525229927139,0.0004058777880102436,8.940695822239011e-08,6.69658117085702e-05,0.9999997211860935,1.1622904568910714e-06 -0.018414258956146685,0.17032766339246477,0.0004629194273561285,8.940695822239011e-08,3.2514330473542534e-05,0.99951805609983,1.1920927762985348e-07 -0.11821404098974919,0.09840735791428629,9.030102780461401e-06,5.960463881492674e-08,0.4574907560621426,0.08856101938600926,2.9802319407463367e-07 -0.2210783362297067,0.031452178949692405,3.8415189716220283e-05,0.0,0.999804396784697,3.784894564747848e-06,3.874301522970238e-07 -0.21616944669782076,0.020190626379370413,0.00018283722956478776,0.0,0.9999984098840395,2.3841855525970696e-07,1.7881391644478022e-07 -0.1996429264462773,0.024446487422571717,0.00039672847595215236,0.0,0.9999997211860935,3.278255134820971e-07,2.086162358522436e-07 -0.17863577603554132,0.024215251203205182,0.00033426281447410913,0.0,0.9999997211860935,3.874301522970238e-07,3.5762783288956044e-07 -0.16247069834990088,0.024790704246090655,0.0002584755162209298,0.0,0.9999997211860935,4.4703479111195056e-07,5.066394299268773e-07 -0.14597493409506024,0.02474698423915539,0.0001901387978196163,2.980231940746337e-08,0.9999996615814547,5.66244068741804e-07,8.642672628164378e-07 -0.11991247534255361,0.02436894177973221,0.00011575220857858772,8.940695822239011e-08,0.9999994231628994,8.344649434089744e-07,2.2351739555597527e-06 -0.06918999552440246,0.026820331807312324,3.743171317577399e-05,3.874301522970238e-07,0.9999938203268508,2.74181338548663e-06,2.202391404211543e-05 -0.03287342190606371,0.035286188119568115,7.063149699568818e-06,8.04662624001511e-06,0.9996199800322035,2.5629994690418497e-05,0.0006746947090655632 -0.3681892156448493,0.06636333464439799,1.847743803262729e-06,2.980231940746337e-08,0.9991846873549382,0.0002922415441095858,0.0 -0.2897983491300747,0.08454591034395173,2.0563600391149723e-06,5.960463881492674e-08,0.9941222269618312,0.1672421228536533,0.0 -0.10400968789623641,0.08403879402628954,0.00010368226921856506,0.0,0.04659449588223742,0.9988759949305157,0.0 -0.130245268339486,0.1074417531306348,2.9861924046278297e-05,0.0,0.00032994147816002697,0.9999699784713248,0.0 -0.13534483313000054,0.12041136620367028,2.1368263015151236e-05,0.0,7.385014749169422e-05,0.9999858333052496,0.0 -0.13325229286595755,0.12350675461561583,2.1874902445078112e-05,0.0,5.039572211802056e-05,0.9999860717238048,0.0 -0.12505856155831344,0.12179422376454493,2.7209517619014057e-05,0.0,5.2332872879505675e-05,0.9999818993990878,0.0 -0.12224355339497785,0.11993423102232498,3.120302841961415e-05,0.0,5.471705843210275e-05,0.9999792171903411,0.0 -0.11400032042984981,0.11786493657001208,3.9428468576074036e-05,0.0,6.19888243675238e-05,0.9999721242383222,0.0 -0.10407996177242368,0.11586055157584847,5.099176850616983e-05,0.0,7.554887969791964e-05,0.9999582363574783,0.0 -0.09253677725408757,0.11353513596497958,6.774067201316424e-05,0.0,0.00010511278055012331,0.9999256326200465,0.0 -0.08493611216193403,0.10933414099728463,8.895992343127815e-05,0.0,0.00018033383473456085,0.9998495771009187,0.0 -0.7078694104855202,0.41524434082550205,0.9999996615814547,3.933906161785165e-06,2.9802319407463367e-07,6.258487075567308e-07,3.030895883739025e-05 -0.5412584543004026,0.4447991549207067,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 -0.5887584686035505,0.30584383005627136,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.4901159703731684e-07 -0.541405081726544,0.3445116876965922,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5795087218044646,0.3284998535547417,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5721994638206058,0.33945453161149014,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5691156387093443,0.3366284965892385,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5724236368895967,0.3379911183732153,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5693150758507546,0.34117442363618955,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5713651180030744,0.3401965498341719,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5699003338577798,0.34270256751867934,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.570773065066545,0.34277793759198494,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.18313461541371198,0.6270658372758946,2.8908249825239467e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.18074020742621652,0.4986124633888937,0.0,0.9999999000000099,0.0,1.990794936418553e-05,2.980231940746337e-08 -0.1810228526517297,0.5852069257687801,0.0,0.9999999000000099,0.0,1.3232229816913736e-05,0.0 -0.17705759405356628,0.6381335257391177,1.1920927762985348e-07,0.9999999000000099,0.0,1.0907648903131594e-05,2.980231940746337e-08 -0.18205246328553717,0.6457591055717964,5.960463881492674e-08,0.9999999000000099,0.0,1.0281800195574863e-05,0.0 -0.18602401017372416,0.6468141673887849,8.940695822239011e-08,0.9999999000000099,0.0,1.0281800195574863e-05,2.980231940746337e-08 -0.18864977358990573,0.6469840406263657,2.980231940746337e-08,0.9999999000000099,0.0,1.0579823389649495e-05,2.980231940746337e-08 -0.19051146506474317,0.6466122864569652,0.0,0.9999999000000099,0.0,1.1354683694243543e-05,0.0 -0.19194743036429004,0.6458281277504345,2.980231940746337e-08,0.9999999000000099,0.0,1.2308357915282372e-05,8.940695822239011e-08 -0.19314184784089464,0.6444287895052823,1.1920927762985348e-07,0.9999999000000099,0.0,1.3500450691580906e-05,0.0 -0.19414776562840486,0.6428014038892584,1.4901159703731684e-07,0.9999999000000099,0.0,1.4990566661954075e-05,2.980231940746337e-08 -0.195027977220089,0.6412039994095515,2.980231940746337e-08,0.9999999000000099,0.0,1.6599891909957096e-05,8.940695822239011e-08 -0.14272063969974821,0.03165367245132111,9.018181852698416e-05,4.380940952897115e-05,7.152556657791209e-07,1.1920927762985348e-07,0.9998731805378894 -0.24699378012588094,0.04656228422321281,3.0934807544946974e-05,2.9802319407463367e-07,1.698732206225412e-06,1.1295079055428617e-05,0.9999912573273818 -0.26018252967710787,0.04476687311359594,1.6123054799437684e-05,1.7881391644478022e-07,4.678964146971749e-06,1.4245508676767491e-05,0.9999900056299666 -0.2625455558191304,0.04205834864849882,1.7017124381661583e-05,1.1920927762985348e-07,5.990266200900137e-06,1.0669230347871886e-05,0.9999906016763548 -0.25859576462628553,0.03953716158189867,2.0831821265816896e-05,1.1920927762985348e-07,4.589557188749359e-06,6.8247311443091115e-06,0.9999914361412983 -0.25314974783802835,0.03787824510879406,2.5600192371011033e-05,2.086162358522436e-07,3.129243537783654e-06,4.678964146971749e-06,0.9999920321876864 -0.24751266836095162,0.03668907284108387,3.087520290613205e-05,2.3841855525970696e-07,2.0563600391149723e-06,3.2782551348209707e-06,0.9999923898155193 -0.23680061100932914,0.034770041698224,4.220008428096813e-05,2.682208746671703e-07,1.1026858180761447e-06,1.8775461226701922e-06,0.9999934626990179 -0.22934973238948997,0.03384879230873332,5.105137314498475e-05,2.682208746671703e-07,7.152556657791209e-07,1.3113020539283883e-06,0.9999938799314896 -0.22076365350762808,0.03286027907762512,6.219744060337605e-05,4.172324717044872e-07,4.768371105194139e-07,9.238719016313645e-07,0.9999944163732389 -0.21172028779106833,0.03193563222338282,7.417797300517633e-05,3.874301522970238e-07,2.682208746671703e-07,6.258487075567308e-07,0.9999948932103495 -0.20651039480307912,0.03177982568196663,8.091329719126304e-05,4.4703479111195056e-07,2.3841855525970696e-07,5.960463881492673e-07,0.9999948932103495 -0.15570893883060383,0.2503829896021299,0.9999994231628994,1.1920927762985348e-07,2.1457669973373625e-06,8.940695822239011e-08,0.0 -0.7273793816265276,0.4699445366054726,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.6403427123758286,0.43708223096992543,0.9999999000000099,0.0,7.152556657791209e-07,0.0,5.960463881492674e-08 -0.6081426143394422,0.33303597563762893,0.9999999000000099,0.0,8.344649434089744e-07,0.0,1.1920927762985348e-07 -0.586779713606379,0.3646595477433436,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 -0.5706723332168787,0.3647921084733014,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5595954060322789,0.37947493785082254,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5603874921566662,0.36719593399435885,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5608617663151244,0.36277890199171253,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5567995309599154,0.35721692436777175,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.560732722259191,0.351657599150523,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5571902990110467,0.3513029813164925,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5575825571782973,0.3751659094644907,0.9999996019768158,1.132488137483608e-06,8.940695822239011e-08,1.1920927762985348e-07,6.8247311443091115e-06 -0.5692676305535153,0.45466428987346996,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 -0.5742616653204594,0.3292773663433812,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5616595744854099,0.3333778976823244,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5820149779078764,0.3408349751842518,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5850396156068783,0.3437657653696783,0.9999999000000099,0.0,0.0,0.0,8.940695822239011e-08 -0.5909751057380107,0.34577244514266536,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5930099487059135,0.35103023046204707,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5960665940991585,0.3543942570079493,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.594806790327238,0.35727286332688385,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.4901159703731684e-07 -0.5958375334492962,0.3588639497142457,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5958442091695108,0.3594336807112337,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5837037563082276,0.3836756347952937,0.9999996019768158,1.6391275674104854e-06,8.940695822239011e-08,8.940695822239011e-08,8.255242475867353e-06 -0.5914806127303299,0.4542466103252779,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.5842681526895824,0.3353925048730652,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5348736047523271,0.34436756366555,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.566783010936156,0.3431953191169531,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5530521869430417,0.3520527481429938,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5620261430507634,0.34060293430218097,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5562406778105244,0.3479831218123613,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5599924325711113,0.3433637618430595,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5590342879063865,0.34544312948033773,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5630670785670777,0.3430116474041092,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5617443918949218,0.3444727062589158,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 -0.1767458319590815,0.14454099533467027,0.00011798738253414749,0.0,0.0002234875932365678,0.9999959064892093,0.0 -0.10737964510473029,0.11361292002639814,8.228420388400636e-05,0.0,5.9753650411964056e-05,0.9999644948445539,0.0 -0.11402547358994398,0.1095950901320666,6.812810216546127e-05,0.0,5.102157082557729e-05,0.9999708129362682,0.0 -0.09441825747098964,0.11230668423636912,9.453295716047381e-05,0.0,5.5432314097881866e-05,0.9999495340802114,0.0 -0.06521737575260955,0.11310687659234173,0.0001475810857057586,0.0,9.211896928846927e-05,0.9998310996628861,0.0 -0.060094565150633564,0.09782984851115642,0.0002403259037017846,0.0,0.00048744673622847087,0.999106784092007,2.980231940746337e-08 -0.07890900969178566,0.08151283858810818,0.0003797709562093057,0.0,0.0038887258455634504,0.9958470063952187,5.960463881492674e-08 -0.09207737445450027,0.07126989959450081,0.0004175304948985618,0.0,0.0094980886021168,0.9930837353397587,0.0 -0.09097218513112074,0.07075166701058991,0.00044393534989357436,0.0,0.007568150001928286,0.9951410490530948,0.0 -0.08604538440348052,0.07322415708241689,0.0004949569207191516,0.0,0.00585147679941958,0.995750625694255,0.0 -0.07963851093916145,0.07222753761962063,0.0006659626294791764,0.0,0.010175763543123108,0.9903915130137662,0.0 -0.07907253503472017,0.061890304077994736,0.0010065733379870754,0.0,0.057598138056180456,0.9392694487671469,0.0 -0.4275653064073901,0.2375169992040187,3.743171317577399e-05,1.7881391644478022e-07,2.8878447505832006e-05,0.9999999000000099,4.947185021638919e-06 -0.29888126252844127,0.1969369053503412,6.3180917143822346e-06,0.0,4.678964146971749e-06,0.9999997807907323,3.0100342601538e-06 -0.3121305703987575,0.2008101343764724,4.470347911119505e-06,0.0,2.682208746671703e-06,0.9999997807907323,4.529952549934432e-06 -0.33096355198443395,0.1988384425299625,4.112720078229945e-06,0.0,2.2053716361522894e-06,0.9999999000000099,5.185603576898626e-06 -0.3501771688316303,0.1821334361718153,3.5762783288956045e-06,0.0,1.6093252480030219e-06,0.9999997807907323,4.0829177588224814e-06 -0.36538103221334023,0.1620430946072623,3.3378597736358976e-06,0.0,1.043081179261218e-06,0.9999997211860935,2.65240642726424e-06 -0.37073400615110685,0.15332978961226384,3.874301522970238e-06,0.0,8.642672628164378e-07,0.9999997807907323,1.9669530808925826e-06 -0.3687854409065129,0.1534560620521989,4.529952549934432e-06,0.0,8.642672628164378e-07,0.9999996615814547,1.847743803262729e-06 -0.3685742616500824,0.1542514562342679,5.245208215713553e-06,0.0,8.642672628164378e-07,0.9999996615814547,1.7881391644478022e-06 -0.3690827786769626,0.15629526970094368,5.930661562085211e-06,0.0,8.642672628164378e-07,0.9999996019768158,1.698732206225412e-06 -0.37033024428741507,0.15870583054685963,6.735324186086722e-06,0.0,8.642672628164378e-07,0.999999542372177,1.5497206091880952e-06 -0.37160372732531094,0.16153299805736185,7.599591448903159e-06,0.0,9.238719016313645e-07,0.9999994231628994,1.4603136509657052e-06 -0.33801025150806796,0.03412151336085641,1.7493961492181e-05,4.4703479111195056e-07,0.0009198187861919494,2.148747229278109e-05,0.9991811706812481 -0.30533581970857865,0.0482655763543451,3.457069051265751e-06,1.4901159703731684e-07,0.00015404818901717816,3.817677116096058e-05,0.9999434544070522 -0.2938074171421462,0.046449869863185674,2.8014180243015566e-06,2.086162358522436e-07,8.39531337708243e-05,3.4630295151472434e-05,0.9999474479178528 -0.2918831705926196,0.04591050743270553,2.8908249825239467e-06,1.4901159703731684e-07,6.69658117085702e-05,3.236531887650522e-05,0.9999438120348851 -0.28828018902538594,0.04516389965237683,2.5629994690418497e-06,1.4901159703731684e-07,7.271765935421062e-05,3.427266731858287e-05,0.9999271823406557 -0.28081792591839516,0.04425615071492545,2.74181338548663e-06,1.7881391644478022e-07,7.03036714822061e-05,3.114342378079922e-05,0.9999165727149467 -0.2771648764495523,0.04197287558790554,5.155801257491163e-06,1.7881391644478022e-07,2.9116866061091712e-05,1.4483927232027197e-05,0.9999546004745106 -0.27194809912509177,0.038404703133682556,1.0669230347871886e-05,2.086162358522436e-07,9.566544529795742e-06,5.692243006825504e-06,0.9999762965630392 -0.25524348019496684,0.03474292158485585,2.2858378985524404e-05,2.086162358522436e-07,2.8908249825239467e-06,2.026557719707509e-06,0.9999861313284437 -0.23271667956342282,0.0317064225619383,4.4167037361860715e-05,3.278255134820971e-07,7.450579851865842e-07,7.152556657791209e-07,0.9999913169320206 -0.21614807843266967,0.030604720110421018,6.288289394974771e-05,4.4703479111195056e-07,2.682208746671703e-07,4.4703479111195056e-07,0.999993105071185 -0.20877715944379335,0.030948489899104217,7.280706631243301e-05,5.066394299268773e-07,1.1920927762985348e-07,3.874301522970238e-07,0.9999935223036568 -0.35985118149220996,0.05565366147995683,2.2351739555597527e-06,2.980231940746337e-08,0.9996851875070671,0.00011485813899636382,0.0 -0.2762702107315107,0.03175544738225766,3.3378597736358976e-05,0.0,0.9999991847443441,5.66244068741804e-07,0.0 -0.32287764547918407,0.04568073152713574,6.973742741346429e-06,0.0,0.9999996615814547,3.784894564747848e-06,0.0 -0.3222502469883043,0.04703041910319857,7.718800726533013e-06,0.0,0.9999996019768158,4.678964146971749e-06,0.0 -0.33791255949528515,0.047938674680130446,3.844499203562775e-06,5.960463881492674e-08,0.9999993039536218,9.626149168610668e-06,0.0 -0.3614004850237925,0.05453377961178617,1.5795229285955586e-06,1.7881391644478022e-07,0.9999977542330126,5.85019529968506e-05,0.0 -0.3709493875349938,0.07332852481540074,8.642672628164378e-07,1.7881391644478022e-07,0.9999711705641011,0.0010380445872813567,0.0 -0.22116559742965428,0.09359988568610558,7.033347380161355e-06,0.0,0.9792865727561572,0.7237557045066011,0.0 -0.1366134583893474,0.1301863491312262,3.698467838466204e-05,0.0,0.0022740957847059,0.9999823166315596,0.0 -0.21310549973559106,0.1604432165347976,5.513429090380723e-06,0.0,3.117322610020669e-05,0.9999990655350666,1.4901159703731684e-07 -0.24058258532481586,0.17690595981429671,3.784894564747848e-06,0.0,1.2159346318245055e-05,0.999999542372177,1.4901159703731684e-07 -0.2551862597359848,0.1886126696740475,3.6060806483030677e-06,0.0,9.894370043277838e-06,0.9999997807907323,4.768371105194139e-07 -0.14769384264334418,0.12873828408897844,0.00015959142042696635,0.0,0.00040510292770564956,0.9999830914918642,0.0 -0.1751789450572909,0.1266125738403953,2.0027158641815386e-05,0.0,3.114342378079922e-05,0.999996323721681,1.4901159703731684e-07 -0.19476136564401972,0.137993752932761,1.2367962554097299e-05,0.0,1.2159346318245055e-05,0.9999981118608455,5.960463881492674e-08 -0.2221733331588301,0.14777895805689414,8.255242475867353e-06,0.0,7.420777532458379e-06,0.9999990655350666,1.1920927762985348e-07 -0.2403036057849562,0.15896034238000697,6.973742741346429e-06,0.0,6.1690801173449175e-06,0.999999542372177,3.278255134820971e-07 -0.24773454665111883,0.1666935682011315,6.943940421938965e-06,0.0,5.841254603862821e-06,0.9999996019768158,5.66244068741804e-07 -0.2465751767056407,0.166395813198207,7.450579851865842e-06,0.0,5.6624406874180405e-06,0.9999996019768158,5.364417493343406e-07 -0.24028429388004977,0.16007766124845274,8.22544015645989e-06,0.0,5.334615173935943e-06,0.999999542372177,4.768371105194139e-07 -0.22669592498794275,0.14931344983405143,1.0102986279130082e-05,0.0,5.334615173935943e-06,0.9999991847443441,2.682208746671703e-07 -0.2013132274067489,0.1360699832206423,1.4930962023139149e-05,0.0,6.3180917143822346e-06,0.9999984694886783,1.1920927762985348e-07 -0.17632371186479967,0.12604430315720402,2.3752448567748306e-05,0.0,8.67247494757184e-06,0.9999968005587916,8.940695822239011e-08 -0.14462924003002198,0.11683931944753756,4.535913013815925e-05,0.0,1.4275310996174954e-05,0.999992151396964,2.980231940746337e-08 -0.18319776653484887,0.6285080312606329,2.9206273019314104e-06,0.9999999000000099,1.4901159703731684e-07,0.0,0.0 -0.18083196877684443,0.4990989564994671,2.980231940746337e-08,0.9999999000000099,0.0,2.008676328063031e-05,2.980231940746337e-08 -0.18102321027959836,0.5857241152714076,0.0,0.9999999000000099,0.0,1.3291834455728662e-05,0.0 -0.1771873831675593,0.6372019647460827,2.980231940746337e-08,0.9999999000000099,0.0,1.1056660500168911e-05,8.940695822239011e-08 -0.1820563673897698,0.6448404787866754,0.0,0.9999999000000099,0.0,1.043081179261218e-05,2.980231940746337e-08 -0.18594288825218822,0.6462101935233793,8.940695822239011e-08,0.9999999000000099,0.0,1.0281800195574863e-05,2.980231940746337e-08 -0.1885512173097737,0.6466658114279644,0.0,0.9999999000000099,0.0,1.0639428028464424e-05,8.940695822239011e-08 -0.19045513867543276,0.6460596321907025,0.0,0.9999999000000099,0.0,1.1324881374836081e-05,1.1920927762985348e-07 -0.19188070296446677,0.6452558039513991,2.980231940746337e-08,0.9999999000000099,0.0,1.2278555595874908e-05,8.940695822239011e-08 -0.19308653473054538,0.6435343622059359,2.980231940746337e-08,0.9999999000000099,0.0,1.3560055330395832e-05,0.0 -0.19408598541409774,0.6414194105957328,0.0,0.9999999000000099,0.0,1.4960764342546611e-05,0.0 -0.1949082612910626,0.6396755575038379,2.980231940746337e-08,0.9999999000000099,0.0,1.6570089590549635e-05,5.960463881492674e-08 -0.21304959057879405,0.0332511663379952,5.352496565580421e-05,7.2121612966061355e-06,7.95721928179272e-06,1.3113020539283883e-06,0.9998386694520156 -0.24402618407192667,0.03971508144652275,3.1918284085393266e-05,2.682208746671703e-07,3.695487606525458e-06,4.857778063416529e-06,0.9999916745598535 -0.24233210085819068,0.038427442305660475,2.777576168775586e-05,2.3841855525970696e-07,2.682208746671703e-06,4.112720078229945e-06,0.9999927474433521 -0.253043681372655,0.040538251393052324,2.1308658376336308e-05,2.3841855525970696e-07,3.367662093043361e-06,6.526707950234478e-06,0.9999909593041877 -0.24601316451007682,0.03796893357580429,2.8491017353534983e-05,2.3841855525970696e-07,2.4437901914119963e-06,3.9637084811926284e-06,0.9999923898155193 -0.24040120839077184,0.036289870732769056,3.501772530376946e-05,2.682208746671703e-07,1.4901159703731685e-06,2.65240642726424e-06,0.9999929858619074 -0.23897415398561853,0.03601959347108132,3.758072477281131e-05,2.682208746671703e-07,1.2814997345209249e-06,2.3841855525970694e-06,0.9999928666526298 -0.24051651357608506,0.036268621676910265,3.704428302347697e-05,2.086162358522436e-07,1.1026858180761447e-06,2.3841855525970694e-06,0.9999923898155193 -0.2404521107574079,0.03598412870744604,3.811716652214565e-05,2.682208746671703e-07,9.536742210388278e-07,2.2351739555597527e-06,0.9999922706062416 -0.24433967470110984,0.036491274827430614,3.474950442910229e-05,2.682208746671703e-07,1.043081179261218e-06,2.5629994690418497e-06,0.9999913765366594 -0.24488893150269234,0.036190479987623106,3.5077329942584386e-05,2.086162358522436e-07,1.0728834986686813e-06,2.413987872004533e-06,0.9999911381181041 -0.24685862659385835,0.03624376654004318,3.3587213972211215e-05,2.3841855525970696e-07,1.043081179261218e-06,2.4735925108194595e-06,0.9999906016763548 -0.3539713322969731,0.05217793582976465,2.3841855525970694e-06,2.980231940746337e-08,0.9997677995364647,8.398293609023177e-05,0.0 -0.10015255212369104,0.016029030081865254,3.102421450316937e-05,5.960463881492674e-08,0.9999928666526298,1.4901159703731684e-07,4.768371105194139e-07 -0.09945380687301807,0.02268433570473381,1.1175869777798764e-05,2.086162358522436e-07,0.9999987079072337,5.364417493343406e-07,1.2218950957059981e-06 -0.03488087653969336,0.041792511932846096,1.4603136509657052e-06,1.7106531339883975e-05,0.9998828364893774,2.6136634120345377e-05,0.00022646782517731415 -0.04403507709320834,0.06168743966953643,2.086162358522436e-07,6.213783596456113e-05,0.9290559554876539,0.0002858936500757961,0.03621473546277022 -0.13278275727675884,0.05166473983833641,7.152556657791209e-07,5.692243006825504e-06,0.0022045669735282877,2.61962387591603e-05,0.9828796595931986 -0.2178783714681052,0.034286737436145506,2.0325181835890017e-05,1.0132788598537545e-06,1.5795229285955586e-06,2.9802319407463367e-07,0.9999504281497935 -0.19343698023948777,0.029142528767363902,4.2557712113857695e-05,1.3411043733358516e-06,1.4901159703731684e-07,1.1920927762985348e-07,0.9999872638165812 -0.18491968511769383,0.02969655394045629,5.948542953729689e-05,1.4603136509657052e-06,2.980231940746337e-08,1.1920927762985348e-07,0.999991495745937 -0.16052153705885913,0.028080582613904996,6.920098566412995e-05,2.413987872004533e-06,5.960463881492674e-08,5.960463881492674e-08,0.9999949528149883 -0.13087001442367338,0.02700334786906382,4.6849246108532416e-05,7.271765935421062e-06,0.0,8.940695822239011e-08,0.9999968005587916 -0.09280577301594777,0.026382774110091108,1.4275310996174954e-05,5.736946485936699e-05,0.0,0.0,0.9999981118608455 -0.08890739082921954,0.032584667200230906,0.0003020763095140487,0.00032687183926105823,8.940695822239011e-08,8.940695822239011e-08,0.999782164254419 -0.20566329359156635,0.048652470103515914,0.00011807678949236988,7.450579851865842e-07,1.7881391644478022e-07,4.291533994674725e-06,0.9999945355825166 -0.24440070985735732,0.05257841943794192,2.0921228224039285e-05,3.278255134820971e-07,1.0132788598537545e-06,2.1785495486855723e-05,0.9999889327464679 -0.24863561986847346,0.04313856362557825,2.625584339797523e-05,2.086162358522436e-07,2.74181338548663e-06,9.208916696906181e-06,0.9999922110016028 -0.24874794482154805,0.038612335913722075,2.917647069990664e-05,2.086162358522436e-07,2.592801788449313e-06,5.155801257491163e-06,0.9999930454665462 -0.24465802310884205,0.0368574857648679,3.418326036036048e-05,2.086162358522436e-07,2.026557719707509e-06,3.457069051265751e-06,0.9999934626990179 -0.23952355979881296,0.0357417762218308,3.987550336718599e-05,2.9802319407463367e-07,1.370906692743315e-06,2.4735925108194595e-06,0.9999937011175731 -0.23970201610526307,0.03589835762362894,3.975629408955614e-05,2.086162358522436e-07,1.1920927762985347e-06,2.4437901914119963e-06,0.9999931646758239 -0.2390688657661627,0.035728603595337693,4.082917758822482e-05,2.682208746671703e-07,1.0132788598537545e-06,2.2947785943746796e-06,0.9999929262572685 -0.24051615594821643,0.03587093948703696,3.957748017311135e-05,2.9802319407463367e-07,9.536742210388278e-07,2.2351739555597527e-06,0.9999922706062416 -0.24384510516110652,0.036302536719781654,3.629922503829038e-05,2.9802319407463367e-07,1.0132788598537545e-06,2.5033948302269232e-06,0.9999916745598535 -0.2513831853762485,0.03744748234107608,2.9355284616351418e-05,2.682208746671703e-07,1.2814997345209249e-06,3.367662093043361e-06,0.9999900056299666 -0.19887760280739297,0.025549978013431954,2.8014180243015566e-06,6.258487075567308e-07,0.3241642985428902,4.610418812334583e-05,0.6847253949178108 -0.2474662661449959,0.05306419729277817,3.2782551348209707e-06,4.172324717044872e-07,0.0011323689282059781,2.4467704233527428e-05,0.9996440603062848 -0.278006881463937,0.04613214730426486,1.2814997345209249e-06,2.682208746671703e-07,0.0002025067603737136,3.1918284085393266e-05,0.9997997476228694 -0.27381253241358877,0.04629519581002002,1.698732206225412e-06,2.682208746671703e-07,0.00010049342104196648,2.548098309338118e-05,0.9998443318927029 -0.2755438089256631,0.044293910257384196,2.8312203437090202e-06,2.086162358522436e-07,4.509090926349208e-05,1.4901159703731685e-05,0.9999095989722053 -0.2807490825536824,0.04324099420760722,3.2782551348209707e-06,2.3841855525970696e-07,3.156065625250371e-05,1.3113020539283883e-05,0.9999254538061301 -0.28045246003896995,0.04216393827670034,4.291533994674725e-06,1.7881391644478022e-07,2.2143123319745282e-05,1.0490416431427107e-05,0.9999407721983056 -0.27919274567401664,0.04073113202351246,5.722045326232967e-06,2.3841855525970696e-07,1.4007090121507784e-05,7.68899840712555e-06,0.9999556733580093 -0.2776612043265764,0.0395680963925318,7.629393768310623e-06,2.086162358522436e-07,9.179114377498718e-06,5.930661562085211e-06,0.999965090890942 -0.2744413316136207,0.03850156068142598,1.007318395972262e-05,2.086162358522436e-07,6.079673159122528e-06,4.589557188749359e-06,0.9999718858197669 -0.27732196449085134,0.03889906405736499,9.924172362685302e-06,2.086162358522436e-07,5.3942198127508695e-06,5.185603576898626e-06,0.9999723626568774 -0.27989590166840284,0.039298504584258875,9.655951488018132e-06,2.3841855525970696e-07,5.424022132158334e-06,5.841254603862821e-06,0.9999722434475998 -0.11153659224048344,0.46105051032754607,0.9408726943419907,2.086162358522436e-07,0.0030656751904875345,0.310101150258577,0.0 -0.15172749757138454,0.13855591413986384,0.16591934690675303,8.940695822239011e-08,0.00015315411943495427,0.9513496401250456,0.0 -0.3226748108730218,0.15900865194458916,6.735324186086722e-05,0.0,6.556510269641941e-06,0.999997635023735,2.086162358522436e-07 -0.3525106310698455,0.1699456870264871,8.493661031127061e-06,0.0,1.996755400300046e-06,0.9999997211860935,1.847743803262729e-06 -0.358861327156466,0.17082935568745333,6.0200685203076e-06,0.0,1.4007090121507783e-06,0.9999997807907323,2.9504296213388737e-06 -0.36394643782062314,0.165390878887466,5.453824451565797e-06,0.0,1.1920927762985347e-06,0.9999997211860935,2.8014180243015566e-06 -0.3639777898637737,0.1626337170322405,5.1259989380836994e-06,0.0,1.043081179261218e-06,0.9999997211860935,2.8014180243015566e-06 -0.35972163079679603,0.16349905726494146,4.887580382823993e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.0994412183761904e-06 -0.35411381720030277,0.16657909748085997,4.678964146971749e-06,0.0,1.1920927762985347e-06,0.9999997807907323,3.6060806483030677e-06 -0.34838610886084875,0.17010718581147835,4.589557188749359e-06,0.0,1.2218950957059981e-06,0.9999998403953712,4.172324717044872e-06 -0.3431785702563281,0.17242234942344764,4.351138633489652e-06,0.0,1.1920927762985347e-06,0.9999997807907323,4.529952549934432e-06 -0.33831897376566933,0.1733720898331361,4.380940952897116e-06,0.0,1.1026858180761447e-06,0.9999998403953712,4.649161827564286e-06 -0.19987833499080795,0.03296315669448983,5.778669733107147e-05,9.80496308505545e-06,5.334615173935943e-06,9.238719016313645e-07,0.9998489214498917 -0.2661220133194401,0.04603955148862215,1.609325248003022e-05,2.3841855525970696e-07,6.765126505494185e-06,1.591443856358544e-05,0.9999873830258588 -0.2517697512999233,0.04005104302674171,2.1278856056928847e-05,2.3841855525970696e-07,4.857778063416529e-06,6.3180917143822346e-06,0.9999916745598535 -0.26123106478563074,0.04111918806325619,1.6838310465216805e-05,2.086162358522436e-07,5.21540589630609e-06,8.40425407290467e-06,0.9999899460253279 -0.25534671543971355,0.03914645313546289,2.1636483889818406e-05,1.4901159703731684e-07,3.8146968841553113e-06,5.692243006825504e-06,0.9999911381181041 -0.2556439936055185,0.0385951697760297,2.2590158110857234e-05,1.7881391644478022e-07,3.1590458571911173e-06,5.03659197986131e-06,0.9999907804902712 -0.2559426426781532,0.03834035991965854,2.3245809137821427e-05,2.086162358522436e-07,2.74181338548663e-06,4.7385687857866755e-06,0.9999906016763548 -0.2580419778717003,0.03839522599516489,2.2500751152634845e-05,2.3841855525970696e-07,2.682208746671703e-06,4.827975744009066e-06,0.999989886420689 -0.25843322275998976,0.038055658333937634,2.2977588263154257e-05,2.086162358522436e-07,2.5331971496343865e-06,4.470347911119505e-06,0.9999896480021337 -0.2576228678119795,0.03752630948377803,2.4110076400637865e-05,2.3841855525970696e-07,2.175569316744826e-06,3.933906161785165e-06,0.9999895287928562 -0.254471719254447,0.03668314217892974,2.7179715299606593e-05,1.7881391644478022e-07,1.7285345256328755e-06,3.2484528154135075e-06,0.9999899460253279 -0.2523936033144391,0.036251783364764104,2.92062730193141e-05,2.3841855525970696e-07,1.519918289780632e-06,2.8610226631164835e-06,0.9999900056299666 -0.3230840563640327,0.034810632461309096,2.4735925108194598e-05,7.152556657791209e-07,0.0002806484418600825,1.3589857649803297e-05,0.9995614482768873 -0.27878731488027125,0.04428806900219721,8.642672628164377e-06,1.7881391644478022e-07,3.689527142643965e-05,1.4960764342546611e-05,0.9999748660517077 -0.2394517063995392,0.03607133030273751,2.44080995947125e-05,2.9802319407463367e-07,4.261731675267262e-06,2.3841855525970694e-06,0.9999907208856325 -0.25828337668303064,0.040331393473394754,1.576542696654812e-05,2.086162358522436e-07,4.053115439415018e-06,5.75184764564043e-06,0.9999871446073035 -0.25710284708865816,0.040024489157498816,1.776218236684817e-05,2.086162358522436e-07,3.5762783288956045e-06,5.3942198127508695e-06,0.9999879790722469 -0.2609466314207744,0.03985005616459351,1.7195938298106364e-05,2.086162358522436e-07,3.635882967710531e-06,5.692243006825504e-06,0.9999873830258588 -0.2602666914355273,0.038991153233527205,1.883506586551685e-05,1.7881391644478022e-07,3.2484528154135075e-06,4.976987341046382e-06,0.9999878598629693 -0.25900739430308733,0.038195252411977694,2.0742414307594504e-05,1.7881391644478022e-07,2.712011066079167e-06,4.261731675267262e-06,0.9999882174908022 -0.2600200772177793,0.03810086845699203,2.0921228224039285e-05,2.086162358522436e-07,2.4437901914119963e-06,4.261731675267262e-06,0.9999879194676081 -0.26052045821064795,0.037909716361230084,2.1249053737521383e-05,2.086162358522436e-07,2.2947785943746796e-06,4.142522397637409e-06,0.9999877406536917 -0.2595342397582352,0.03740897774055777,2.2709367388487087e-05,1.4901159703731684e-07,2.0563600391149723e-06,3.6656852871179947e-06,0.9999879790722469 -0.2588386535537352,0.037078350776045294,2.3692843928933378e-05,2.086162358522436e-07,1.8179414838552655e-06,3.367662093043361e-06,0.9999879790722469 -0.12462809681376338,0.028104811902002043,5.933641794025957e-05,0.08534508090106929,0.0,0.0,0.9824162335264125 -0.09103894233326641,0.07563391326562853,0.00014597176045775558,0.0001576840719848887,0.0,1.1920927762985348e-07,0.9999872638165812 -0.14152118563066032,0.07743594049081434,2.062320502996465e-05,1.955032153129597e-05,0.0,5.57303372919565e-06,0.9999848796310286 -0.08859235047927226,0.04288357495527279,5.09321638673549e-05,3.328919077813659e-05,0.0,5.960463881492674e-08,0.9999973966051797 -0.08291226625099184,0.034937828773238,8.761881905794231e-06,0.0002160966180235169,0.0,2.980231940746337e-08,0.9999978734422902 -0.15663656591720482,0.12926319239310302,8.642672628164378e-07,0.03803386903940179,0.0,1.1920927762985348e-07,0.9995343877708653 -0.3255873918398507,0.13547587392394533,0.0,0.9999696804481307,0.0,2.989172636568576e-05,0.5918284658835291 -0.16222050785346653,0.3772376179049166,0.0,0.9999997211860935,0.0,0.0008728205284863797,0.00130987154259683 -0.1399186849536179,0.2760873436455037,0.0,0.9999999000000099,0.0,0.0048247272911936525,0.0001279711595356477 -0.13680860399633396,0.2942272126170832,0.0,0.9999999000000099,0.0,0.0035287436294407005,5.570053497254904e-05 -0.1387764215411896,0.3085300325819039,0.0,0.9999999000000099,0.0,0.00271138521737161,3.6686655190587406e-05 -0.14125058054339124,0.3180363177708584,0.0,0.9999999000000099,0.0,0.0018823740984142013,2.6404854995012547e-05 -0.6351277231907113,0.39706492417212086,0.9999996615814547,2.4437901914119963e-06,1.1920927762985348e-07,2.9802319407463367e-07,1.4454124912619735e-05 -0.5644434690241741,0.4509648381891517,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.5850470661874749,0.32542619103581305,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.538875520207026,0.34709805244224307,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5705356597664144,0.33813464635780993,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5617988705402442,0.3455528020267057,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5690566301110191,0.33637836569748136,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5694193839791072,0.33944857114701366,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.572648286795746,0.3373293876070323,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5738719105482892,0.3379360436814523,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5704534649612726,0.340401887835388,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 -0.5645089149241347,0.34343320125421095,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.35815089939541755,0.10342872141020686,1.4007090121507783e-06,5.960463881492674e-08,0.9826569170579471,0.006154625992432298,0.0 -0.13458755611816056,0.1213132142812899,5.412101204395348e-05,0.0,0.00859740290498444,0.9999525739167909,0.0 -0.17378219961400462,0.13508912918638644,1.1831520804762957e-05,0.0,6.827711376249858e-05,0.9999964429309587,0.0 -0.1945111155429406,0.14613628384948804,7.2121612966061355e-06,0.0,1.8537042671442215e-05,0.9999981714654843,2.980231940746337e-08 -0.2177639305501412,0.1532300412392493,5.334615173935943e-06,0.0,1.1175869777798764e-05,0.9999988867211501,5.960463881492674e-08 -0.23728278278321968,0.16381013390597093,4.559754869341896e-06,0.0,8.85128886401662e-06,0.9999994231628994,2.3841855525970696e-07 -0.2484416663543824,0.1741556524932192,4.589557188749359e-06,0.0,7.987021601200183e-06,0.9999996019768158,4.172324717044872e-07 -0.25555664299860376,0.1835247575922466,4.857778063416529e-06,0.0,7.748603045940476e-06,0.9999997807907323,6.258487075567308e-07 -0.26030081509465974,0.1915853917270663,5.155801257491163e-06,0.0,7.718800726533013e-06,0.9999997211860935,9.834765404462913e-07 -0.26312905548913496,0.19718438383540624,5.543231409788187e-06,0.0,7.68899840712555e-06,0.9999997807907323,1.1622904568910714e-06 -0.26517337559555665,0.201044023002531,5.811452284455357e-06,0.0,7.4803821712733056e-06,0.9999997807907323,1.4603136509657052e-06 -0.2650188803563052,0.20056667920492902,6.258487075567308e-06,0.0,7.2121612966061355e-06,0.9999998403953712,1.6689298868179488e-06 -0.19163393973510687,0.246368169742359,0.9999996019768158,1.7881391644478022e-07,6.556510269641942e-07,5.960463881492674e-08,0.0 -0.7201658487021741,0.4700159727722237,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.6094878911719671,0.4313837587094724,0.9999999000000099,0.0,5.960463881492673e-07,0.0,0.0 -0.5991741418590396,0.32179057592603827,0.9999999000000099,0.0,5.364417493343406e-07,0.0,5.960463881492674e-08 -0.5774804949521315,0.3682623504961752,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.567264437651987,0.3622601627683211,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5553858279951912,0.3753483294797946,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5580608844525999,0.3623458146428487,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5466526150477073,0.36326175921895526,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5478242635500087,0.35699814551916115,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5531330108413538,0.35318064683588535,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5548848509558748,0.35195285075836735,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.44454371927327946,0.2435391544878691,3.910064306259194e-05,1.7881391644478022e-07,2.6822087466717034e-05,0.9999999000000099,6.139277797937454e-06 -0.19818404316081525,0.1713056862060943,2.4557111191749817e-05,0.0,1.4007090121507784e-05,0.999999542372177,3.874301522970238e-07 -0.24918296932142323,0.16064277288547144,8.58306798934945e-06,0.0,4.380940952897116e-06,0.9999996019768158,6.556510269641942e-07 -0.25734829901583306,0.1688299476811276,8.374451753497206e-06,0.0,4.291533994674725e-06,0.9999996615814547,1.0132788598537545e-06 -0.2585979998004645,0.17432972785825593,8.821486544609158e-06,0.0,4.529952549934432e-06,0.9999997211860935,1.2814997345209249e-06 -0.25810486077193573,0.17578372356265784,9.119509738683792e-06,0.0,4.6193595081568225e-06,0.9999997211860935,1.3411043733358516e-06 -0.2561242580307763,0.17386144396665826,9.566544529795742e-06,0.0,4.589557188749359e-06,0.9999997807907323,1.3411043733358516e-06 -0.25570175050630345,0.17299777266401073,9.80496308505545e-06,0.0,4.529952549934432e-06,0.9999997807907323,1.3113020539283883e-06 -0.25595748423470166,0.17320078608408096,1.007318395972262e-05,0.0,4.410743272304579e-06,0.9999997807907323,1.370906692743315e-06 -0.25698575376400173,0.1745513081251705,1.0132788598537546e-05,0.0,4.470347911119505e-06,0.9999997807907323,1.4603136509657052e-06 -0.2584076225650598,0.1766993701155406,1.0251997876167399e-05,0.0,4.470347911119505e-06,0.9999997807907323,1.6391275674104854e-06 -0.25955724715111755,0.1786662637881469,1.0311602514982325e-05,0.0,4.6193595081568225e-06,0.9999997211860935,1.7285345256328755e-06 -0.1007694303947684,0.021108925338945223,8.046626240015109e-07,1.6689298868179488e-06,0.9826332540163376,5.1707024171948946e-05,0.0035109218424350373 -0.1998080015099759,0.054084002962388085,6.109475478529991e-06,8.344649434089744e-07,0.0025748607921660203,9.745358446240521e-06,0.9989565804021935 -0.28459087013019874,0.045789360992220286,1.4305113315582417e-06,3.5762783288956044e-07,0.00014120338935256146,1.820921715796012e-05,0.9998049928310851 -0.27376836537181204,0.043355435125556376,3.695487606525458e-06,3.278255134820971e-07,2.5779006287455814e-05,6.854533463716575e-06,0.999929030084459 -0.257984042156981,0.03828036784470238,9.775160765647985e-06,3.5762783288956044e-07,5.722045326232967e-06,2.264976274967216e-06,0.999967355867217 -0.2473980486290533,0.036240547889225865,1.6599891909957096e-05,3.874301522970238e-07,2.1159646779298993e-06,1.370906692743315e-06,0.9999784423300365 -0.24096640943483108,0.035442054265629075,2.3663041609525914e-05,4.172324717044872e-07,1.1026858180761447e-06,1.132488137483608e-06,0.9999833895150582 -0.23693102597209229,0.03490999340413266,3.060698203146488e-05,3.874301522970238e-07,7.152556657791209e-07,1.1026858180761447e-06,0.9999862505377213 -0.2358995079896521,0.03479653596282213,3.528594617843663e-05,3.5762783288956044e-07,5.066394299268773e-07,1.1026858180761447e-06,0.9999875022351364 -0.23713514207811717,0.0349652171075076,3.713368998169936e-05,3.5762783288956044e-07,5.066394299268773e-07,1.1920927762985347e-06,0.9999878598629693 -0.23740684985131452,0.0347763895928915,3.933906161785165e-05,3.278255134820971e-07,4.4703479111195056e-07,1.1920927762985347e-06,0.9999883963047187 -0.24183768032979927,0.0354074239670205,3.650784127414263e-05,3.5762783288956044e-07,5.364417493343406e-07,1.4603136509657052e-06,0.9999877406536917 -0.31080842016840454,0.040380954735517005,2.8908249825239467e-06,8.940695822239011e-08,0.9998986913233022,3.150105161368878e-05,2.980231940746337e-08 -0.28432697056546663,0.03751924633337336,3.3378597736358976e-05,0.0,0.9999996615814547,8.940695822239011e-07,0.0 -0.3198840618001088,0.04605340956853005,7.86781232357033e-06,8.940695822239011e-08,0.9999997211860935,3.6656852871179947e-06,0.0 -0.3088127970567623,0.044662296764355416,1.2457369512319688e-05,5.960463881492674e-08,0.9999996615814547,2.65240642726424e-06,0.0 -0.31875714658370957,0.04514071344556317,7.897614642977793e-06,2.980231940746337e-08,0.9999996615814547,3.635882967710531e-06,0.0 -0.3315373658996629,0.04773977398054903,4.887580382823993e-06,2.980231940746337e-08,0.9999994827675383,7.003545060753892e-06,0.0 -0.33776241539510216,0.04932031034578742,3.6060806483030677e-06,8.940695822239011e-08,0.9999991847443441,1.0728834986686813e-05,0.0 -0.3441246151781639,0.05095434187970256,2.6226041078567766e-06,8.940695822239011e-08,0.999998588697956,1.797079860270041e-05,0.0 -0.34156155584828346,0.05153426527094542,2.592801788449313e-06,5.960463881492674e-08,0.9999979926515679,1.883506586551685e-05,0.0 -0.3325554132323844,0.04841378330355373,3.5166736900806776e-06,1.1920927762985348e-07,0.9999982310701231,1.0401009473204716e-05,0.0 -0.3065613508097547,0.041303664438804434,1.034140483438979e-05,5.960463881492674e-08,0.9999993039536218,2.2947785943746796e-06,0.0 -0.26153418420662344,0.0319906175081787,6.473063775301043e-05,0.0,0.9999997807907323,3.874301522970238e-07,0.0 -0.18428790568542325,0.6562114952871086,3.904103842377701e-06,0.9999999000000099,1.1920927762985348e-07,5.960463881492674e-08,0.0 -0.17660844325287992,0.4746711551330293,2.980231940746337e-08,0.9999999000000099,0.0,2.1725890848040795e-05,2.980231940746337e-08 -0.1819183528347981,0.565531611345727,0.0,0.9999999000000099,0.0,1.53779968142511e-05,1.1920927762985348e-07 -0.17600491642223168,0.6219761966593955,8.940695822239011e-08,0.9999999000000099,0.0,1.2397764873504761e-05,2.980231940746337e-08 -0.18038687109200263,0.6300664543026635,5.960463881492674e-08,0.9999999000000099,0.0,1.1384486013651007e-05,0.0 -0.1839734315796013,0.6316524742952202,0.0,0.9999999000000099,0.0,1.1056660500168911e-05,8.940695822239011e-08 -0.18642130493345807,0.6322319506516274,0.0,0.9999999000000099,0.0,1.11460674583913e-05,2.980231940746337e-08 -0.18822994827444764,0.6318213938584848,2.980231940746337e-08,0.9999999000000099,0.0,1.1712311527133104e-05,8.940695822239011e-08 -0.1896357536237394,0.6308115123622282,2.980231940746337e-08,0.9999999000000099,0.0,1.2606381109357005e-05,8.940695822239011e-08 -0.19078999756976706,0.6290965079183997,0.0,0.9999999000000099,0.0,1.3649462288618223e-05,2.980231940746337e-08 -0.19173961877028925,0.627229452025775,1.4901159703731684e-07,0.9999999000000099,0.0,1.4901159703731685e-05,1.1920927762985348e-07 -0.19255366920627545,0.6255973576428148,2.980231940746337e-08,0.9999999000000099,0.0,1.6391275674104854e-05,8.940695822239011e-08 -0.08931532501804543,0.3974585830484725,0.9989457919625679,3.5762783288956044e-07,0.001511752454262987,0.0015243290330529365,0.0 -0.7061076163953222,0.451746314686668,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.49442872403004867,0.7638087867382581,0.9999999000000099,8.940695822239011e-08,8.940695822239011e-08,0.0,0.0 -0.5401581525578945,0.21569725867392625,0.9999997211860935,0.0,0.0,2.8610226631164835e-06,6.854533463716575e-07 -0.4530942141822119,0.13637921211768408,0.0002720951761901406,5.960463881492674e-08,1.4901159703731684e-07,0.9999854756774167,5.066394299268773e-07 -0.3447453975534739,0.15525203940594104,6.556510269641941e-06,0.0,1.847743803262729e-06,0.9999997807907323,2.2053716361522894e-06 -0.32291993497465044,0.1969319581648257,6.1690801173449175e-06,0.0,2.2351739555597527e-06,0.9999997807907323,6.943940421938965e-06 -0.3267465829713945,0.18975460526078128,5.334615173935943e-06,0.0,1.6689298868179488e-06,0.9999999000000099,6.3180917143822346e-06 -0.3285057544572225,0.1824116110489344,4.827975744009066e-06,0.0,1.3113020539283883e-06,0.9999997807907323,5.3942198127508695e-06 -0.3280251622064184,0.17855933305543817,4.6193595081568225e-06,0.0,1.1920927762985347e-06,0.9999997807907323,4.917382702231456e-06 -0.3248715102538055,0.17639279362519086,4.559754869341896e-06,0.0,1.043081179261218e-06,0.9999997807907323,4.649161827564286e-06 -0.32125663755993966,0.1753489374814182,4.708766466379212e-06,0.0,1.1622904568910714e-06,0.9999998403953712,4.380940952897116e-06 -0.1840121447963813,0.6488944290957346,3.6656852871179947e-06,0.9999999000000099,1.1920927762985348e-07,0.0,0.0 -0.17428246139758377,0.46489500991490046,0.0,0.9999999000000099,0.0,2.014636791944524e-05,2.980231940746337e-08 -0.18229952453812093,0.555603861713638,0.0,0.9999999000000099,0.0,1.5109775939583928e-05,2.980231940746337e-08 -0.17569109796750224,0.6150790451903921,2.980231940746337e-08,0.9999999000000099,0.0,1.2427567192912226e-05,0.0 -0.1797567009851409,0.6236603855018805,0.0,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 -0.18322122096256702,0.6254509090306266,0.0,0.9999999000000099,0.0,1.1086462819576373e-05,0.0 -0.18556377290911005,0.626703262221788,5.960463881492674e-08,0.9999999000000099,0.0,1.1295079055428617e-05,2.980231940746337e-08 -0.18735808133303172,0.6267210244059279,0.0,0.9999999000000099,0.0,1.1742113846540568e-05,2.980231940746337e-08 -0.18879324196987415,0.6257682441593565,2.980231940746337e-08,0.9999999000000099,0.0,1.2487171831727152e-05,1.1920927762985348e-07 -0.18996086715865332,0.6240041850928861,5.960463881492674e-08,0.9999999000000099,0.0,1.353025301098837e-05,0.0 -0.19092249869509725,0.6217621563800437,0.0,0.9999999000000099,0.0,1.4692543467879441e-05,0.0 -0.1916906237522859,0.6201808451544234,0.0,0.9999999000000099,0.0,1.6123054799437684e-05,2.980231940746337e-08 -0.08525916933660327,0.033131241792727646,0.0003570019841820037,0.0004121064727664035,2.980231940746337e-08,0.0,0.9997361494732538 -0.2089335620316775,0.05380055307420725,0.00010928510526716817,7.450579851865842e-07,8.940695822239011e-08,7.122754338383746e-06,0.9999929858619074 -0.2424850165743556,0.05397582053213928,2.112984445989153e-05,2.9802319407463367e-07,8.046626240015109e-07,2.3633239290118453e-05,0.9999885751186351 -0.26280063389643615,0.04725646971847053,1.549720609188095e-05,2.086162358522436e-07,4.261731675267262e-06,2.0205972558260164e-05,0.9999886347232739 -0.27550029753497884,0.04382398723805549,1.2159346318245055e-05,1.4901159703731684e-07,8.285044795274818e-06,1.794099628329295e-05,0.9999877406536917 -0.2784604430083365,0.04204043745274688,1.2069939360022665e-05,1.4901159703731684e-07,9.506939890980815e-06,1.4781950426101832e-05,0.9999874426304977 -0.2740165591126465,0.040080189698031884,1.4811752745509294e-05,1.1920927762985348e-07,7.271765935421062e-06,9.864567723870376e-06,0.9999885155139963 -0.2697430252917175,0.03879815339377753,1.7583368450403387e-05,1.4901159703731684e-07,5.185603576898626e-06,7.271765935421062e-06,0.9999890519557456 -0.2674997448810438,0.03828120230972909,1.9073484420776555e-05,1.4901159703731684e-07,4.112720078229945e-06,6.079673159122528e-06,0.9999889327464679 -0.26693272589531897,0.038132488721039956,1.9580123850703434e-05,1.4901159703731684e-07,3.4868713706732143e-06,5.632638368010577e-06,0.9999886943279127 -0.2697272300608527,0.038557380431248574,1.8000600922107875e-05,1.4901159703731684e-07,3.5762783288956045e-06,6.109475478529991e-06,0.9999875022351364 -0.2729973792916743,0.03891545533467542,1.630186871588246e-05,1.4901159703731684e-07,3.844499203562775e-06,6.7055218666792585e-06,0.9999863101423602 -0.13448804616371215,0.25608769054796093,0.9999988271165112,2.3841855525970696e-07,4.976987341046382e-06,5.960463881492674e-08,0.0 -0.713054120511093,0.42913496486944913,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5777073502301373,0.40971985452311854,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,5.960463881492674e-08 -0.6032406091440276,0.309800982422232,0.9999999000000099,0.0,6.556510269641942e-07,0.0,1.1920927762985348e-07 -0.5830440520998809,0.3573525845392573,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.5722100734473754,0.35546550148599154,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5726331472159736,0.35859268897591934,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5669373869661178,0.35539257520312134,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.566922664618859,0.3510656952256823,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5654791593317483,0.34904950851185523,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5626346468692501,0.348114430844779,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.560728251910833,0.3476449846626084,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.22458094357514274,0.3824357985795331,0.020521221492952314,1.1920927762985348e-07,0.0004253685049027247,0.9998978568583587,8.940695822239011e-08 -0.38005524872159796,0.21756589408963717,0.016506878871086404,0.0,1.92821006566288e-05,0.9966696100155036,0.0 -0.433850944024241,0.31128853554163666,0.9999854756774167,5.66244068741804e-07,5.66244068741804e-07,1.963972848951836e-05,0.0 -0.5597844123608537,0.40027850859463576,0.9999999000000099,1.7881391644478022e-07,8.642672628164378e-07,0.0,0.0 -0.6150968074543887,0.408151924540248,0.9999999000000099,1.1920927762985348e-07,8.85128886401662e-06,5.960463881492674e-08,0.0 -0.5342437624710117,0.4496059416954726,0.9999999000000099,8.940695822239011e-08,3.7550922453403844e-06,0.0,0.0 -0.5475630759966137,0.4152911304716427,0.9999999000000099,0.0,2.026557719707509e-06,0.0,0.0 -0.5464384555590382,0.39830359809730853,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,0.0 -0.5490593313943484,0.3941065966408128,0.9999999000000099,0.0,3.874301522970238e-07,0.0,5.960463881492674e-08 -0.5621703862911138,0.3876796364120397,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.5681824087861347,0.3830832242309725,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5683562159302925,0.3764584361862237,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.14048087596311612,0.12444096801534295,0.0001746713940471428,0.0,0.0004966854552447845,0.9999735547496538,0.0 -0.23601809143042782,0.18784075972201597,9.328125974536036e-06,0.0,2.494454134404684e-05,0.9999997807907323,5.066394299268773e-07 -0.24682798980644505,0.18399837609955075,6.347894033789698e-06,0.0,8.761881905794231e-06,0.9999997807907323,6.258487075567308e-07 -0.26780557631337365,0.20029163357166008,5.513429090380723e-06,0.0,7.4803821712733056e-06,0.9999999000000099,1.4305113315582417e-06 -0.27349168061077617,0.21280786391428919,5.841254603862821e-06,0.0,7.629393768310623e-06,0.9999999000000099,2.2947785943746796e-06 -0.27493551372343306,0.21540221568233858,6.079673159122528e-06,0.0,7.3611728936434526e-06,0.9999999000000099,2.65240642726424e-06 -0.2743875980263579,0.2127790748708676,6.3180917143822346e-06,0.0,6.943940421938965e-06,0.9999999000000099,2.74181338548663e-06 -0.27340739964306726,0.20936834808579186,6.645917227864331e-06,0.0,6.4373009920120876e-06,0.9999999000000099,2.712011066079167e-06 -0.27118867634604,0.20457029339148405,7.033347380161355e-06,0.0,6.1690801173449175e-06,0.9999998403953712,2.5033948302269232e-06 -0.2696629464514651,0.20127609368692423,7.3611728936434526e-06,0.0,5.990266200900137e-06,0.9999997807907323,2.3841855525970694e-06 -0.2692620754130448,0.20040220018769947,7.68899840712555e-06,0.0,5.871056923270284e-06,0.9999997807907323,2.413987872004533e-06 -0.26930832861738857,0.2005418836727067,8.016823920607646e-06,0.0,5.841254603862821e-06,0.9999997807907323,2.592801788449313e-06 -0.34781137107362586,0.11163282392497634,1.6391275674104854e-06,1.1920927762985348e-07,0.9649193514069295,0.01288771500456346,0.0 -0.07775354385054016,0.027019172902248978,3.805756188333072e-05,0.0,0.9999416066632489,5.66244068741804e-07,9.238719016313645e-07 -0.1734093427586276,0.022281914945601666,2.13980653345587e-05,2.980231940746337e-08,0.9999991847443441,2.9802319407463367e-07,1.4901159703731684e-07 -0.2243925928976603,0.04160577058079677,8.943676054179758e-05,0.0,0.9999999000000099,1.1026858180761447e-06,8.940695822239011e-08 -0.2126081585796058,0.032920628780449865,0.0001268386713981641,0.0,0.9999997807907323,4.4703479111195056e-07,2.980231940746337e-08 -0.1999867558396499,0.030468583101777337,0.00011530517378747578,0.0,0.9999999000000099,4.172324717044872e-07,8.940695822239011e-08 -0.18934404849222072,0.030183345074253548,0.00010469554807841882,0.0,0.9999997807907323,4.172324717044872e-07,8.940695822239011e-08 -0.19424104689747448,0.032846897834875335,0.00010293721123337848,0.0,0.9999999000000099,5.66244068741804e-07,8.940695822239011e-08 -0.20847710966200647,0.03541228174556886,0.00011315940679013842,0.0,0.9999999000000099,6.854533463716575e-07,5.960463881492674e-08 -0.2301339805030897,0.03793799876517116,0.00012278555595874907,0.0,0.9999999000000099,7.748603045940476e-07,2.980231940746337e-08 -0.24129593371345817,0.037207275622672384,0.00012722610155046113,0.0,0.9999999000000099,7.152556657791209e-07,1.1920927762985348e-07 -0.24235862492511462,0.035353690379764685,0.0001300871242135776,0.0,0.9999999000000099,6.258487075567308e-07,1.1920927762985348e-07 -0.6846160292341943,0.4091392158761385,0.9999996615814547,3.397464412450824e-06,2.086162358522436e-07,5.066394299268773e-07,2.3901460164785624e-05 -0.505989432313948,0.4317994415020648,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5658760666612912,0.3211752175734825,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5241456627628727,0.3635623454425061,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.566536009288217,0.33612331742253115,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5443899631274824,0.36182230704787605,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5587986111409544,0.34202802175387176,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5515745281944762,0.35440027707707056,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5579072832830201,0.3472298979164637,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5594521164662447,0.34921026223878693,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.560546338534986,0.348339080750899,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5592856406933939,0.34915977710467083,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.6923106908511547,0.4111244081746877,0.9999996615814547,3.635882967710531e-06,2.086162358522436e-07,5.066394299268773e-07,2.571940164864089e-05 -0.5154168009544573,0.4461269973944631,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,5.960463881492674e-08 -0.57791531083575,0.3121394514503044,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5315443277138908,0.355330228744697,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5741283297301024,0.330586314144747,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5574994086988391,0.3492696880696178,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5705633759262339,0.3330868780042584,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5718797445060438,0.33906543249046306,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5704153775932627,0.33799821132594243,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5763618349790333,0.3363491296192241,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5765977501630445,0.3386804162876023,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5773657560109436,0.3392896353617473,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.44741475580270157,0.24621862168864317,4.291533994674725e-05,1.7881391644478022e-07,2.6851889786124495e-05,0.9999999000000099,6.3180917143822346e-06 -0.4871442913807379,0.3877092897228104,0.006436257910832827,8.940695822239011e-08,1.290440430343164e-05,0.9993424608338813,0.0 -0.6672183870992946,0.4346329569072345,0.9999999000000099,5.960463881492674e-08,1.7881391644478022e-07,2.980231940746337e-08,0.0 -0.6161864995701272,0.4025340079571951,0.9999999000000099,2.980231940746337e-08,1.5795229285955586e-06,0.0,0.0 -0.5604504346615464,0.42088636748736247,0.9999999000000099,2.980231940746337e-08,1.0132788598537545e-06,0.0,0.0 -0.5629107355838383,0.3989379703315444,0.9999999000000099,0.0,9.834765404462913e-07,0.0,0.0 -0.549439787841934,0.3940532802860704,0.9999999000000099,0.0,5.364417493343406e-07,0.0,0.0 -0.5599012970692535,0.390017628602954,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.562339901900848,0.38894402974144354,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.5562010407217505,0.3878355621627454,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5587179660565766,0.37782236927238544,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5512176751862207,0.37182861560176567,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.7065082788174858,0.4148789345507691,0.9999997211860935,3.904103842377701e-06,2.9802319407463367e-07,6.854533463716575e-07,2.989172636568576e-05 -0.4481844901852991,0.44180905811373883,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.554337501502925,0.33744275564137566,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5435827374233227,0.3660902678339647,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5831694602724831,0.32998713845324495,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5676872133973613,0.3777596353837701,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5670496821168701,0.4385975896561131,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5570522546537525,0.5720011590931849,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5747330188513237,0.7040938137756136,0.9999999000000099,8.940695822239011e-08,2.980231940746337e-08,0.0,0.0 -0.5806657075641517,0.7421005963008438,0.9999999000000099,8.940695822239011e-08,0.0,0.0,0.0 -0.4188158213918832,0.2316684424480469,0.9999999000000099,0.0,0.0,1.1920927762985348e-07,1.4901159703731684e-07 -0.2022554278289969,0.08882641790776342,0.0011344550905645007,0.0,2.264976274967216e-06,0.9997995092043142,1.4901159703731684e-07 -0.4263213872733016,0.23719114061108743,3.758072477281131e-05,1.7881391644478022e-07,2.8967854464054395e-05,0.9999999000000099,4.827975744009066e-06 -0.326881110654647,0.19924220439360185,5.424022132158334e-06,0.0,4.112720078229945e-06,0.9999999000000099,3.7550922453403844e-06 -0.33437836168811946,0.19447362419613043,3.933906161785165e-06,0.0,2.2351739555597527e-06,0.9999999000000099,4.589557188749359e-06 -0.35732334850739034,0.17108649012497035,3.308057454228434e-06,0.0,1.3113020539283883e-06,0.9999997807907323,3.039836579561264e-06 -0.37196871636757795,0.15401932594522988,3.6060806483030677e-06,0.0,9.536742210388278e-07,0.9999997807907323,1.937150761485119e-06 -0.378187268956737,0.15536460277758007,6.616114908456868e-06,0.0,8.344649434089744e-07,0.9999993039536218,1.043081179261218e-06 -0.38281694053018417,0.1850787400882421,2.0056960961222846e-05,0.0,8.642672628164378e-07,0.9999965621402362,5.364417493343406e-07 -0.40594607589948095,0.21891048546857259,7.441639156043604e-05,0.0,8.642672628164378e-07,0.9999784423300365,1.7881391644478022e-07 -0.41614514587586526,0.24935141201517885,0.0003847181412309446,5.960463881492674e-08,6.556510269641942e-07,0.9997999860414246,5.960463881492674e-08 -0.39318075774472083,0.268157184078075,0.0032403465845346775,5.960463881492674e-08,5.066394299268773e-07,0.9967311220027605,0.0 -0.3638248741476088,0.26868697996307034,0.029694315801930722,2.980231940746337e-08,3.874301522970238e-07,0.9546315907474732,0.0 -0.35468643902263625,0.276710927439037,0.34024717981576663,5.960463881492674e-08,2.682208746671703e-07,0.49237341725435746,0.0 -0.18298366665082455,0.6240515111808297,2.8014180243015566e-06,0.9999999000000099,8.940695822239011e-08,5.960463881492674e-08,0.0 -0.17547932266462404,0.4710611104158588,0.0,0.9999999000000099,0.0,1.820921715796012e-05,8.940695822239011e-08 -0.1818921565934204,0.5580702423093765,0.0,0.9999999000000099,0.0,1.3649462288618223e-05,1.1920927762985348e-07 -0.17605936526523175,0.6153887509245921,0.0,0.9999999000000099,0.0,1.1593102249503251e-05,8.940695822239011e-08 -0.18007680772989387,0.6228148936158864,5.960463881492674e-08,0.9999999000000099,0.0,1.0997055861353983e-05,0.0 -0.18340614437297503,0.6243693827513624,0.0,0.9999999000000099,0.0,1.0758637306094277e-05,0.0 -0.18567368387407132,0.6249886750104726,5.960463881492674e-08,0.9999999000000099,0.0,1.096725354194652e-05,8.940695822239011e-08 -0.18735277651964694,0.6248181461217994,2.980231940746337e-08,0.9999999000000099,0.0,1.150369529128086e-05,2.980231940746337e-08 -0.18865343927555925,0.6247240303877153,0.0,0.9999999000000099,0.0,1.2308357915282372e-05,2.980231940746337e-08 -0.18978661297965968,0.6240805386428303,2.980231940746337e-08,0.9999999000000099,0.0,1.3291834455728662e-05,8.940695822239011e-08 -0.19080540537044086,0.6227912901765593,8.940695822239011e-08,0.9999999000000099,0.0,1.4543531870842124e-05,8.940695822239011e-08 -0.19172084330718578,0.6209131478200084,5.960463881492674e-08,0.9999999000000099,0.0,1.5884636244177974e-05,8.940695822239011e-08 -0.326789885745822,0.034795343869926824,2.3633239290118453e-05,6.258487075567308e-07,0.00033545490725040767,1.4781950426101832e-05,0.9995292617719272 -0.28511306642305434,0.04537844657120911,7.033347380161355e-06,1.7881391644478022e-07,4.878639687001754e-05,1.901387978196163e-05,0.9999711109594623 -0.27450385688598755,0.04243841766584401,8.493661031127061e-06,1.7881391644478022e-07,1.767277540862578e-05,1.123547441661369e-05,0.9999811841434221 -0.2822611927869267,0.043742448084016713,6.973742741346429e-06,1.7881391644478022e-07,1.5795229285955586e-05,1.4990566661954075e-05,0.9999786807485919 -0.2826638221623678,0.043390780679902125,7.301568254828525e-06,1.1920927762985348e-07,1.4692543467879441e-05,1.4543531870842124e-05,0.9999784423300365 -0.28168284891869505,0.04225835203400839,8.22544015645989e-06,1.1920927762985348e-07,1.2397764873504761e-05,1.2338160234689835e-05,0.99997927679498 -0.27588689326097604,0.04039686917566931,1.087784658372413e-05,2.086162358522436e-07,8.40425407290467e-06,8.31484711468228e-06,0.9999822570269207 -0.27097630499671405,0.03899630903529939,1.379847388565554e-05,2.086162358522436e-07,5.602836048603113e-06,6.0200685203076e-06,0.9999842835846404 -0.2665615081676732,0.03802359103505397,1.6838310465216805e-05,2.3841855525970696e-07,3.844499203562775e-06,4.678964146971749e-06,0.999985714095972 -0.2600148916136841,0.03676939009990496,2.1576879251003478e-05,2.086162358522436e-07,2.4735925108194595e-06,3.367662093043361e-06,0.9999873830258588 -0.25951302050469605,0.03682333230341745,2.2381541875004992e-05,2.3841855525970696e-07,2.1159646779298993e-06,3.308057454228434e-06,0.9999872638165812 -0.25953349470017556,0.03688618540132234,2.2888181304931868e-05,2.086162358522436e-07,1.847743803262729e-06,3.2186504960060438e-06,0.9999871446073035 -0.44291013477398794,0.25129359956253,5.6982034707069966e-05,1.1920927762985348e-07,2.8699633589387225e-05,0.9999999000000099,5.930661562085211e-06 -0.40914997456763746,0.284729361485363,0.00014373658650219584,0.0,7.808207684755402e-06,0.9999941779546837,1.7881391644478022e-07 -0.44121429322323114,0.26514834161032846,0.001323044167774929,5.960463881492674e-08,1.7881391644478022e-06,0.9992778494054059,0.0 -0.5230366587422277,0.4270979165299542,0.9999999000000099,3.278255134820971e-07,3.5762783288956044e-07,1.4901159703731684e-07,0.0 -0.500279307344702,0.41402021043363707,0.9999999000000099,1.7881391644478022e-07,1.996755400300046e-06,0.0,0.0 -0.4773966073792189,0.4557968377286532,0.9999999000000099,1.7881391644478022e-07,3.3378597736358976e-06,0.0,0.0 -0.502358734586895,0.43133994929557,0.9999999000000099,8.940695822239011e-08,2.086162358522436e-06,0.0,0.0 -0.51796615121604,0.4117863177548051,0.9999999000000099,0.0,1.1026858180761447e-06,0.0,0.0 -0.5297675728578548,0.40623414509492817,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 -0.546849310375458,0.40107285969542134,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5589012503392534,0.39472562067902167,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5625513791805024,0.38526922457773566,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.1139754652929795,0.10448104141353617,0.000282734604218605,0.0,0.002835124447551398,0.9994898631056706,0.0 -0.2209441065696781,0.20497208830184616,1.1384486013651007e-05,0.0,6.902217174768517e-05,0.9999996615814547,4.172324717044872e-07 -0.23008391260148042,0.1753694712815398,6.139277797937454e-06,0.0,1.1205672097206226e-05,0.9999996615814547,3.5762783288956044e-07 -0.25380203126810086,0.1789192855051751,4.678964146971749e-06,0.0,7.4803821712733056e-06,0.9999997211860935,5.364417493343406e-07 -0.26244622467861634,0.19194361564210505,4.887580382823993e-06,0.0,7.569789129495696e-06,0.9999997807907323,9.238719016313645e-07 -0.2664270400890655,0.20120963450801105,5.30481285452848e-06,0.0,7.718800726533013e-06,0.9999997807907323,1.370906692743315e-06 -0.2673236131557398,0.20397415753686507,5.692243006825504e-06,0.0,7.539986810088233e-06,0.9999998403953712,1.5795229285955586e-06 -0.2682607471831821,0.20540130134880025,6.139277797937454e-06,0.0,7.3611728936434526e-06,0.9999999000000099,1.8775461226701922e-06 -0.269019484508819,0.20626306530281527,6.4373009920120876e-06,0.0,7.122754338383746e-06,0.9999998403953712,2.0563600391149723e-06 -0.26891788839180353,0.20536589618980972,6.765126505494185e-06,0.0,6.884335783124038e-06,0.9999997807907323,2.2053716361522894e-06 -0.26977589725330975,0.20587599273971016,7.033347380161355e-06,0.0,6.645917227864331e-06,0.9999997807907323,2.354383233189606e-06 -0.26923400162535677,0.2042171656735727,7.301568254828525e-06,0.0,6.526707950234478e-06,0.9999997807907323,2.4437901914119963e-06 -0.08904933929074627,0.033200114959753814,0.00025272366857528937,0.002485304822346593,0.0,0.0,0.9984876111039976 -0.2703166901953345,0.15540957448205542,1.4752148106694368e-05,7.748603045940476e-07,0.0,0.004109531230053347,0.9996708823937516 -0.22443515061402816,0.08566981552564404,8.076428559422574e-06,3.278255134820971e-07,3.874301522970238e-07,0.0002065002711743137,0.9999466134529094 -0.25000333784975537,0.04247742890584283,2.7209517619014057e-05,2.086162358522436e-07,1.7285345256328755e-06,6.645917227864331e-06,0.9999875022351364 -0.254859685887274,0.037050902837130924,2.7537343132496152e-05,2.086162358522436e-07,1.8179414838552655e-06,3.5166736900806776e-06,0.9999897076067725 -0.2503873407737049,0.03551656007158555,3.2424923515320145e-05,2.3841855525970696e-07,1.3113020539283883e-06,2.4437901914119963e-06,0.9999907208856325 -0.2432202398676296,0.034371703857258275,3.9368863937259114e-05,2.682208746671703e-07,9.536742210388278e-07,1.6689298868179488e-06,0.9999915553505758 -0.24196630715321923,0.034623146051200204,4.008411960303823e-05,2.682208746671703e-07,7.152556657791209e-07,1.698732206225412e-06,0.9999911977227429 -0.24116322397187126,0.034756153815993715,4.082917758822482e-05,2.9802319407463367e-07,6.556510269641942e-07,1.6093252480030219e-06,0.9999909593041877 -0.23780363797156787,0.03419539331804286,4.4703479111195056e-05,2.682208746671703e-07,5.066394299268773e-07,1.4007090121507783e-06,0.9999913169320206 -0.23475456236820902,0.033802211278849324,4.810094352364588e-05,2.682208746671703e-07,4.768371105194139e-07,1.132488137483608e-06,0.9999914361412983 -0.23321908711421377,0.03376692532914834,4.985928036868622e-05,2.9802319407463367e-07,3.874301522970238e-07,1.043081179261218e-06,0.9999913169320206 -0.1132999062491232,0.10263252256543352,0.0002879202077955036,0.0,0.003748178107237853,0.9992556764797668,0.0 -0.24594888090068923,0.2624765932110515,9.626149168610668e-06,0.0,7.691978639066296e-05,0.9999999000000099,1.8775461226701922e-06 -0.2582545280349606,0.22943955655937523,5.30481285452848e-06,0.0,1.4245508676767491e-05,0.9999999000000099,1.6093252480030219e-06 -0.28159919379975623,0.23320811982929876,4.291533994674725e-06,0.0,1.007318395972262e-05,0.9999998403953712,2.65240642726424e-06 -0.29158279298528644,0.24375092979071977,4.291533994674725e-06,0.0,9.477137571573351e-06,0.9999999000000099,4.142522397637409e-06 -0.29757371543605765,0.2427197396339597,4.410743272304579e-06,0.0,8.04662624001511e-06,0.9999999000000099,4.887580382823993e-06 -0.3047979175918254,0.23799893255926757,4.142522397637409e-06,0.0,6.556510269641941e-06,0.9999999000000099,5.2750105351210165e-06 -0.30894058941515545,0.22712829705163806,3.933906161785165e-06,0.0,5.0067896604538464e-06,0.9999998403953712,4.887580382823993e-06 -0.31262964008944116,0.216054469310004,3.725289925932921e-06,0.0,3.784894564747848e-06,0.9999999000000099,4.380940952897116e-06 -0.3144975900519798,0.20647543665211363,3.635882967710531e-06,0.0,3.0100342601538e-06,0.9999999000000099,3.993510800600092e-06 -0.3140351772178315,0.19873604175025592,3.5166736900806776e-06,0.0,2.5331971496343865e-06,0.9999997807907323,3.635882967710531e-06 -0.3121019005646217,0.19340208169486434,3.6656852871179947e-06,0.0,2.2351739555597527e-06,0.9999997807907323,3.397464412450824e-06 -0.1837993264122196,0.643449544796435,3.5166736900806776e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 -0.16814339160222946,0.4425328075128001,5.960463881492674e-08,0.9999999000000099,0.0,1.722574061751383e-05,5.960463881492674e-08 -0.1833293735905075,0.534837543872803,0.0,0.9999999000000099,0.0,1.4781950426101832e-05,8.940695822239011e-08 -0.17522305249442288,0.6024154423635811,0.0,0.9999999000000099,0.0,1.2755392706394322e-05,2.980231940746337e-08 -0.17851996421074753,0.6136566995523606,2.980231940746337e-08,0.9999999000000099,0.0,1.1742113846540568e-05,2.980231940746337e-08 -0.18195962905130336,0.6152861713309512,1.1920927762985348e-07,0.9999999000000099,0.0,1.1324881374836081e-05,0.0 -0.18422555922699077,0.6163130997556105,5.960463881492674e-08,0.9999999000000099,0.0,1.1354683694243543e-05,0.0 -0.18592366575424896,0.6163284777539599,1.1920927762985348e-07,0.9999999000000099,0.0,1.177191616594803e-05,0.0 -0.18726974724947826,0.6158562301534855,2.980231940746337e-08,0.9999999000000099,0.0,1.2487171831727152e-05,0.0 -0.18840318917448015,0.6146481632133847,0.0,0.9999999000000099,0.0,1.335143909454359e-05,8.940695822239011e-08 -0.1893671750943926,0.6130416392230287,2.980231940746337e-08,0.9999999000000099,0.0,1.4543531870842124e-05,0.0 -0.1902296841065792,0.6107962726500794,0.0,0.9999999000000099,0.0,1.582503160536305e-05,0.0 -0.18220072983940983,0.6078694461735298,2.3841855525970694e-06,0.9999999000000099,1.4901159703731684e-07,2.980231940746337e-08,0.0 -0.1826033592148509,0.5134807228162794,0.0,0.9999999000000099,0.0,1.8447635713219826e-05,8.940695822239011e-08 -0.18084344267096322,0.5948373674327804,2.980231940746337e-08,0.9999999000000099,0.0,1.2129543998837591e-05,0.0 -0.17795199155070635,0.6447376011698107,0.0,0.9999999000000099,0.0,1.0281800195574863e-05,2.980231940746337e-08 -0.18299320339398822,0.6523137091473342,8.940695822239011e-08,0.9999999000000099,0.0,9.775160765647985e-06,2.980231940746337e-08 -0.18704056739032635,0.6534714101626083,2.980231940746337e-08,0.9999999000000099,0.0,9.834765404462912e-06,2.980231940746337e-08 -0.18973177670646857,0.6534919737650523,2.980231940746337e-08,0.9999999000000099,0.0,1.0311602514982325e-05,8.940695822239011e-08 -0.1916201710621643,0.6529076694324193,2.980231940746337e-08,0.9999999000000099,0.0,1.1116265138983837e-05,8.940695822239011e-08 -0.1930691003719493,0.6517028807477806,0.0,0.9999999000000099,0.0,1.2159346318245055e-05,8.940695822239011e-08 -0.19421485065609678,0.6503171919662796,0.0,0.9999999000000099,0.0,1.3411043733358517e-05,8.940695822239011e-08 -0.19522070883896225,0.6484213470302334,0.0,0.9999999000000099,0.0,1.4960764342546611e-05,8.940695822239011e-08 -0.19611108302258015,0.6462023257102703,0.0,0.9999999000000099,0.0,1.671910118758695e-05,5.960463881492674e-08 -0.49916869399864816,0.35160768026053213,0.9999996615814547,6.854533463716575e-07,8.940695822239011e-08,8.940695822239011e-08,2.8014180243015566e-06 -0.6293222903944734,0.43120267979867577,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.5901846289390322,0.343399941862432,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.5521123409042623,0.33323401206986125,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5780444741009729,0.340141326130797,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5686071514847866,0.34157457941882063,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.57625639436243,0.3357886969468194,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5727407335997887,0.33927494281681264,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5727052688361488,0.33870166534346113,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.5762229561567124,0.33817958825996286,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5737246274710553,0.34066048258670173,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5758980512380552,0.3403785824192848,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.31171882151266617,0.12010106442302274,2.5629994690418497e-06,5.960463881492674e-08,0.8594042395448055,0.0705041516848601,0.0 -0.1596595942907979,0.14336112139154344,2.6494261953234936e-05,0.0,0.0009274779822796676,0.9999935223036568,0.0 -0.20881843566029862,0.1580970883098728,6.675719547271795e-06,0.0,2.6315448036790155e-05,0.9999990655350666,1.4901159703731684e-07 -0.23578825592018343,0.1692698001571723,4.380940952897116e-06,0.0,1.0907648903131594e-05,0.9999994827675383,1.7881391644478022e-07 -0.2498559355632319,0.17776584622200164,4.112720078229945e-06,0.0,8.612870308756914e-06,0.9999996615814547,4.4703479111195056e-07 -0.25087019800101035,0.17925545570165075,4.470347911119505e-06,0.0,8.04662624001511e-06,0.9999996615814547,4.4703479111195056e-07 -0.24591091274196886,0.17310711738483248,5.155801257491163e-06,0.0,7.450579851865842e-06,0.9999996019768158,4.768371105194139e-07 -0.23717322944612707,0.1633190512377506,5.960463881492674e-06,0.0,6.973742741346429e-06,0.9999994827675383,2.9802319407463367e-07 -0.22141137718237544,0.15106654164588504,7.808207684755402e-06,0.0,7.033347380161355e-06,0.9999991251397053,2.086162358522436e-07 -0.20500811933622237,0.14129468796217928,1.0520218750834569e-05,0.0,7.808207684755402e-06,0.9999985290933172,1.1920927762985348e-07 -0.18642270564261024,0.13291087744344277,1.5139578258991392e-05,0.0,9.596346849203206e-06,0.9999975158144573,8.940695822239011e-08 -0.1606788337164149,0.12399050591253007,2.5510785412788644e-05,0.0,1.361965996921076e-05,0.9999948932103495,0.0 -0.45497286317848723,0.24815368648094488,4.187225876748604e-05,1.7881391644478022e-07,2.601742484271552e-05,0.9999999000000099,6.973742741346429e-06 -0.1616116762094335,0.1647360920623981,4.962086181342651e-05,0.0,2.3037192901969185e-05,0.9999991251397053,2.3841855525970696e-07 -0.21540871261658395,0.14017820355876023,1.3589857649803297e-05,0.0,5.424022132158334e-06,0.9999989463257889,2.3841855525970696e-07 -0.18912371992281762,0.12922927735023162,2.086162358522436e-05,0.0,6.586312589049405e-06,0.9999978138376514,5.960463881492674e-08 -0.13730913400081457,0.11536988614014147,5.6654209193587864e-05,0.0,1.3738869246840614e-05,0.9999907208856325,0.0 -0.03991502523256962,0.1265492141030099,0.00019407270398140146,1.1920927762985348e-07,1.591443856358544e-05,0.9999076320191245,2.980231940746337e-08 -0.01985695958055289,0.11656916139513936,0.00021985171026885729,5.960463881492674e-08,0.0019028184895277212,0.9458302505707835,2.5033948302269232e-06 -0.07798641919766797,0.034869074815501354,1.5318392175436174e-05,1.1920927762985348e-07,0.9921283325841943,3.0934807544946974e-05,1.9401309934258653e-05 -0.07474049925494654,0.013623446223787182,2.3841855525970695e-05,5.960463881492674e-08,0.999854941518412,2.682208746671703e-07,8.85128886401662e-06 -0.04636812209891008,0.027086079115997898,1.344084605276598e-05,1.5497206091880952e-06,0.9999345733158688,5.990266200900137e-06,0.00011554359234273549 -0.03084489703050684,0.039119929068542385,4.142522397637409e-06,1.5437601453066027e-05,0.9987590506291608,4.488229302763983e-05,0.0012876390123188624 -0.032843232153486224,0.04470494388768491,1.1920927762985347e-06,2.9653307810426052e-05,0.9777872776714065,0.00014072655224204203,0.007918774289757092 -0.22527477144262195,0.38145935528898983,0.01991843978061696,1.7881391644478022e-07,0.000419795471173529,0.9999022079969923,8.940695822239011e-08 -0.127606362099132,0.10384145377288337,0.00022932884784043062,0.0,0.0001876056006699819,0.9999907804902712,0.0 -0.24272328614183536,0.19304874536069633,1.662969422936456e-05,0.0,1.1742113846540568e-05,0.9999997807907323,1.847743803262729e-06 -0.2438572645086402,0.16478255388299254,1.2248753276467444e-05,0.0,4.410743272304579e-06,0.9999996615814547,9.536742210388278e-07 -0.2260814011003339,0.14429998395356225,1.4394520273804807e-05,0.0,3.9637084811926284e-06,0.9999993039536218,4.4703479111195056e-07 -0.19305282830392628,0.12859100101176366,2.3752448567748306e-05,0.0,5.21540589630609e-06,0.9999981118608455,1.1920927762985348e-07 -0.16631853579786166,0.11910241840230446,3.91304453819994e-05,0.0,7.808207684755402e-06,0.9999958468845705,1.4901159703731684e-07 -0.1487013101516185,0.1136626303001323,5.671381383240279e-05,0.0,1.1056660500168911e-05,0.9999928666526298,8.940695822239011e-08 -0.149005264037638,0.11254501340846271,5.790590660870133e-05,0.0,1.1801718485355495e-05,0.9999926282340745,0.0 -0.15163725613919835,0.11280083654379489,5.570053497254904e-05,0.0,1.1563299930095787e-05,0.9999932242804627,8.940695822239011e-08 -0.1598515808516115,0.11463296411458712,4.762410641312646e-05,0.0,1.0192393237352472e-05,0.9999946547917942,5.960463881492674e-08 -0.1735055744576135,0.11842587588189724,3.6776062148809795e-05,0.0,8.22544015645989e-06,0.9999964429309587,8.940695822239011e-08 -0.1846472918910816,0.666107177620314,4.440545591712042e-06,0.9999997807907323,1.7881391644478022e-07,2.980231940746337e-08,0.0 -0.17793712019183552,0.48052904001590685,2.980231940746337e-08,0.9999999000000099,0.0,2.3484227693081136e-05,2.980231940746337e-08 -0.18178078531466219,0.5711085795378262,0.0,0.9999999000000099,0.0,1.582503160536305e-05,2.980231940746337e-08 -0.1761732995437152,0.6264406441569526,5.960463881492674e-08,0.9999999000000099,0.0,1.2546776470542079e-05,8.940695822239011e-08 -0.18083322047438466,0.6333162783491956,5.960463881492674e-08,0.9999999000000099,0.0,1.1444090652465934e-05,2.980231940746337e-08 -0.1844788491649533,0.6338536738263985,0.0,0.9999999000000099,0.0,1.1175869777798764e-05,8.940695822239011e-08 -0.18687349557102786,0.6339099406110569,0.0,0.9999999000000099,0.0,1.1324881374836081e-05,2.980231940746337e-08 -0.1886266767900562,0.6330593823302576,5.960463881492674e-08,0.9999999000000099,0.0,1.1920927762985348e-05,8.940695822239011e-08 -0.18996828793692755,0.6318725942483381,2.980231940746337e-08,0.9999999000000099,0.0,1.2695788067579396e-05,1.1920927762985348e-07 -0.19105783104105417,0.6304694413059209,0.0,0.9999999000000099,0.0,1.3738869246840614e-05,0.0 -0.19200405477682433,0.628846645247544,0.0,0.9999999000000099,0.0,1.4990566661954075e-05,8.940695822239011e-08 -0.19285371898806233,0.6271457671045246,5.960463881492674e-08,0.9999999000000099,0.0,1.6510484951734707e-05,2.980231940746337e-08 -0.29136547445044436,0.029747456307085755,6.8247311443091115e-06,3.5762783288956044e-07,0.022587595111388192,3.5703178650141115e-05,0.9873777832660058 -0.27849447726050186,0.04858943819167673,4.202127036452335e-06,2.9802319407463367e-07,0.0002209841984063409,2.0503995752334798e-05,0.9999137116922836 -0.28814733027218714,0.04453283547592544,3.457069051265751e-06,2.086162358522436e-07,5.376338421106392e-05,1.689791510403173e-05,0.999948043964241 -0.2768422961120412,0.04249054192769117,6.079673159122528e-06,2.3841855525970696e-07,1.8775461226701924e-05,9.000300461053937e-06,0.9999681903321604 -0.2557047009362197,0.037647098296394683,1.4722345787286905e-05,2.682208746671703e-07,4.917382702231456e-06,2.8610226631164835e-06,0.9999826146547536 -0.23676404355976094,0.03436815738089475,2.8610226631164836e-05,3.5762783288956044e-07,1.4603136509657052e-06,1.2218950957059981e-06,0.9999888731418292 -0.22805222867975058,0.033628612750970725,3.951787553429643e-05,3.874301522970238e-07,6.854533463716575e-07,9.238719016313645e-07,0.9999907804902712 -0.22514006494543515,0.03372788428682714,4.678964146971749e-05,3.874301522970238e-07,3.874301522970238e-07,8.642672628164378e-07,0.9999913169320206 -0.22787642477999287,0.034442484372916936,4.729628089964437e-05,3.5762783288956044e-07,3.874301522970238e-07,1.0728834986686813e-06,0.9999910785134654 -0.2305640578174487,0.03470808266999059,4.717707162201451e-05,3.5762783288956044e-07,4.172324717044872e-07,1.1622904568910714e-06,0.99999084009491 -0.24091830848649934,0.03631511329982711,3.722309693992175e-05,2.9802319407463367e-07,5.66244068741804e-07,1.847743803262729e-06,0.9999889923511068 -0.2521468102827568,0.03769955038378804,2.8014180243015567e-05,2.682208746671703e-07,8.642672628164378e-07,2.8908249825239467e-06,0.9999869657933871 -0.09762901067329505,0.021245717998681322,8.642672628164378e-07,1.1920927762985347e-06,0.9975297645582417,3.6209818080067994e-05,0.00018379090378582661 -0.09178099035836691,0.025545477862752183,1.1742113846540568e-05,2.9802319407463367e-07,0.99999537004746,9.536742210388278e-07,2.8908249825239467e-06 -0.18885925411396015,0.039232760661082874,1.8388031074404898e-05,5.960463881492674e-08,0.9999996615814547,1.9669530808925826e-06,1.7881391644478022e-07 -0.21972739695592844,0.041861385099872264,8.109211110770783e-05,5.960463881492674e-08,0.9999997807907323,1.1920927762985347e-06,1.1920927762985348e-07 -0.20020455121165015,0.031529724592531914,0.00010392068777382477,0.0,0.9999997807907323,3.874301522970238e-07,0.0 -0.18633243440810165,0.029907703394536952,9.059905099868865e-05,0.0,0.9999999000000099,4.172324717044872e-07,8.940695822239011e-08 -0.19087603687449675,0.03293347358139676,8.890031879246323e-05,0.0,0.9999997807907323,5.66244068741804e-07,5.960463881492674e-08 -0.20121628045202575,0.034878104919183285,9.694694503247834e-05,0.0,0.9999999000000099,6.258487075567308e-07,0.0 -0.20575219391924515,0.03441435098058777,0.00010529159446656809,0.0,0.9999997807907323,6.258487075567308e-07,2.980231940746337e-08 -0.19070106743976584,0.030530303711431686,0.00010025500248670677,0.0,0.9999999000000099,3.874301522970238e-07,0.0 -0.16471639274868788,0.02732294797429474,7.438658924102857e-05,0.0,0.9999997807907323,3.278255134820971e-07,1.1920927762985348e-07 -0.13732588290599576,0.026389896865140546,4.601478116512344e-05,8.940695822239011e-08,0.9999999000000099,3.874301522970238e-07,2.682208746671703e-07 -0.10205441712910546,0.021656990047561095,1.0728834986686813e-06,1.0132788598537545e-06,0.9983864024272898,3.263353975117239e-05,9.191035305261703e-05 -0.42506739495424645,0.0789862274988344,2.682208746671703e-07,3.278255134820971e-07,0.9999743296099584,0.011887280944374322,0.0 -0.21808451413205238,0.1102786958028785,1.0311602514982325e-05,1.1920927762985348e-07,0.9599728816409564,0.7167300461248469,0.0 -0.10740718245061537,0.08816131947915112,7.286667095124793e-05,0.0,0.0062642687255323555,0.9998085095047752,0.0 -0.17386162280316456,0.13594371078070724,1.0788439625501739e-05,0.0,7.25686477571733e-05,0.9999962045124035,2.980231940746337e-08 -0.20064288376931022,0.14909794924090292,6.139277797937454e-06,0.0,1.856684499084968e-05,0.9999983502794008,0.0 -0.22731122373593363,0.15989822146538715,4.470347911119505e-06,0.0,1.1056660500168911e-05,0.9999991847443441,1.1920927762985348e-07 -0.24157190321875682,0.16939008233030844,4.202127036452335e-06,0.0,9.089707419276328e-06,0.9999994827675383,2.3841855525970696e-07 -0.24720260499884286,0.17492839691027742,4.470347911119505e-06,0.0,8.31484711468228e-06,0.9999996615814547,3.5762783288956044e-07 -0.24693101643493506,0.17443415519588454,4.947185021638919e-06,0.0,7.838010004162866e-06,0.9999996615814547,4.172324717044872e-07 -0.24192795156430785,0.1683358549783466,5.513429090380723e-06,0.0,7.2121612966061355e-06,0.9999996615814547,3.278255134820971e-07 -0.23254463075628576,0.15895932910104596,6.616114908456868e-06,0.0,6.8247311443091115e-06,0.9999994231628994,2.086162358522436e-07 -0.12409803270779778,0.028129935259770568,5.9843057370186444e-05,0.08098681951324126,0.0,0.0,0.9830418438154139 -0.15917369722660904,0.09011071918851886,0.0029338893340677312,2.4735925108194595e-06,0.0,1.5795229285955586e-06,0.999967355867217 -0.28947058318846836,0.1397552489995065,2.682208746671703e-07,3.993510800600092e-06,0.0,0.018699673928448745,0.9993565275286416 -0.19163972138564983,0.06085708736331265,0.0001423060751706376,2.682208746671703e-07,8.940695822239011e-08,7.4803821712733056e-06,0.999984760421751 -0.24177572130155783,0.040190339081557946,3.340840005576644e-05,2.682208746671703e-07,3.5762783288956044e-07,3.0100342601538e-06,0.9999858333052496 -0.24903613327902513,0.03768968581507941,3.412365572154556e-05,2.3841855525970696e-07,7.748603045940476e-07,2.65240642726424e-06,0.9999875022351364 -0.26283121107920465,0.03843548893270377,2.1874902445078112e-05,1.7881391644478022e-07,1.3411043733358516e-06,4.053115439415018e-06,0.9999848796310286 -0.26760041712606525,0.038170427077433,1.955032153129597e-05,2.086162358522436e-07,1.8775461226701922e-06,4.380940952897116e-06,0.9999844623985569 -0.2681243419536192,0.037424802773742924,1.9699333128333287e-05,2.086162358522436e-07,2.026557719707509e-06,3.993510800600092e-06,0.999984760421751 -0.2652038335690356,0.03654688596099653,2.1964309403300505e-05,1.7881391644478022e-07,1.7583368450403388e-06,3.2782551348209707e-06,0.999985714095972 -0.2656777500996251,0.03670209645596507,2.1547076931596017e-05,2.086162358522436e-07,1.6391275674104854e-06,3.3378597736358976e-06,0.9999852372588615 -0.261046081770578,0.03585818409305721,2.494454134404684e-05,1.4901159703731684e-07,1.370906692743315e-06,2.6226041078567766e-06,0.999986369746999 -0.7108951806727729,0.41612413518455854,0.9999997807907323,4.053115439415018e-06,2.9802319407463367e-07,6.556510269641942e-07,3.108381914198429e-05 -0.510948061921897,0.4597326218294655,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.5905588865035614,0.30257105822150465,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.5302603840608373,0.3496146201488739,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.57661205527779,0.32631719106808543,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.5631388425593843,0.34472027415094797,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5747368335485892,0.3305144607454826,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5756499767065103,0.33676153415635435,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5755265354871856,0.3365424572845199,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5805439948795255,0.33609104150739083,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5829570889231572,0.33821299666335375,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5816766023395005,0.3406146764171997,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.44370591638635126,0.24296087022435725,3.8355585077405355e-05,1.1920927762985348e-07,2.697109906375435e-05,0.9999999000000099,6.079673159122528e-06 -0.39650312064436355,0.21690660711388945,1.9937751683592993e-05,0.0,4.0829177588224814e-06,0.999999542372177,9.238719016313645e-07 -0.4199515580957089,0.21716263886547832,4.658102523386525e-05,0.0,1.370906692743315e-06,0.9999906612809936,2.086162358522436e-07 -0.5270671844264175,0.30231064552852555,0.9955907064483145,6.258487075567308e-07,5.960463881492674e-08,0.0029603239913821512,0.0 -0.5188476443075867,0.3922473489566524,0.9999999000000099,1.7881391644478022e-07,1.2516974151134616e-06,0.0,0.0 -0.4745388924879035,0.4627427755993968,0.9999999000000099,1.7881391644478022e-07,5.1259989380836994e-06,0.0,0.0 -0.48550602791683173,0.44695943586325365,0.9999999000000099,0.0,2.9504296213388737e-06,0.0,0.0 -0.5079563259868097,0.4174208342314251,0.9999999000000099,2.980231940746337e-08,1.3411043733358516e-06,0.0,0.0 -0.5147790908600318,0.4103262423766371,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 -0.5369280576483603,0.40505653612830245,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.544117093063712,0.4004104732781459,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5531419515380698,0.3882411419680501,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.6710399985035553,0.4057493209144082,0.9999996615814547,3.0994412183761904e-06,1.4901159703731684e-07,4.172324717044872e-07,2.0831821265816896e-05 -0.5323736667412613,0.44257861368230217,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 -0.577873051142606,0.3182159065655359,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5357161760108372,0.35331588977485756,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5712077021362292,0.3345728217982544,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.4901159703731684e-07 -0.5545241832503538,0.3499104976054883,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5667700767282403,0.3359859585186698,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,1.1920927762985348e-07 -0.5640073418383705,0.34297543758241433,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5707986354591525,0.33740097278539527,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5715775489570452,0.3390871881858023,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5747138857603515,0.338104665221493,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.4901159703731684e-07 -0.5757018327474628,0.33928102249057873,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.7104243039790668,0.41596782200366184,0.9999997807907323,4.023313120007555e-06,2.682208746671703e-07,6.556510269641942e-07,3.102421450316937e-05 -0.5267476439257899,0.45180588952911077,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,1.4901159703731684e-07 -0.5892891883606086,0.3033752142863541,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.5398602485433194,0.3455193936233148,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.581433415388827,0.3260493277945107,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.577131509756986,0.3373447656053817,0.9999999000000099,0.0,8.940695822239011e-08,0.0,8.940695822239011e-08 -0.5839681625124403,0.33068758243620305,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.5851486921068128,0.33495843404756276,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5857003926988309,0.33749827736797444,0.9999999000000099,0.0,2.086162358522436e-07,0.0,0.0 -0.5891857146972829,0.33847868436739453,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5915817022078648,0.3415004610430551,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.594342470144457,0.34353560203391753,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.37275880573636544,0.28510928149109627,0.9999997807907323,1.4901159703731684e-07,5.960463881492674e-08,0.0,3.874301522970238e-07 -0.6666539907179397,0.4869266151548107,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.6160505413754002,0.38484072678651876,0.9999999000000099,0.0,4.4703479111195056e-07,0.0,0.0 -0.588552296137281,0.3190757035662737,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 -0.5883058905357897,0.34980231517523946,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5867089628930335,0.33805340522699495,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5871607661004123,0.3455249070529556,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5898830294364813,0.33974075311565255,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,0.0 -0.591001033758487,0.3419117032896125,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5910252332442648,0.3414405285727437,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.5920039415114361,0.34292712801783215,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5946028232328251,0.3435696064837561,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.16551953553468063,0.13858839867126085,0.00013142822858691345,0.0,0.0002723931993842152,0.9999933434897403,0.0 -0.17220062016727752,0.12518668172600017,2.166628620922587e-05,0.0,2.61962387591603e-05,0.9999959660938481,2.980231940746337e-08 -0.1906232535760148,0.13466727731306083,1.397728780210032e-05,0.0,1.1861323124170421e-05,0.9999978734422902,5.960463881492674e-08 -0.21482822298114046,0.14303305742675587,9.775160765647985e-06,0.0,7.629393768310623e-06,0.9999988271165112,1.1920927762985348e-07 -0.22976055740358733,0.15056231615349394,8.31484711468228e-06,0.0,6.139277797937454e-06,0.9999993039536218,2.682208746671703e-07 -0.23678803442928206,0.15554493663031715,8.04662624001511e-06,0.0,5.692243006825504e-06,0.9999994231628994,3.5762783288956044e-07 -0.2396739721198974,0.1579125225273574,8.22544015645989e-06,0.0,5.453824451565797e-06,0.999999542372177,4.4703479111195056e-07 -0.24050095676379932,0.15843662616877768,8.523463350534524e-06,0.0,5.245208215713553e-06,0.999999542372177,4.4703479111195056e-07 -0.24051815270381632,0.15804493424570326,8.881091183424084e-06,0.0,5.066394299268773e-06,0.999999542372177,5.364417493343406e-07 -0.24112474917367036,0.15800452229655249,9.208916696906181e-06,0.0,5.0067896604538464e-06,0.999999542372177,5.066394299268773e-07 -0.243026942004631,0.15918448564664645,9.357928293943498e-06,0.0,4.917382702231456e-06,0.9999996615814547,6.258487075567308e-07 -0.2401587366958356,0.1566735505789459,9.983777001500229e-06,0.0,4.7385687857866755e-06,0.999999542372177,5.960463881492673e-07 -0.18177333473406557,0.6006180046960422,2.2351739555597527e-06,0.9999999000000099,1.4901159703731684e-07,0.0,0.0 -0.16439262031828136,0.430999934599507,1.1920927762985348e-07,0.9999999000000099,0.0,1.2934206622839103e-05,0.0 -0.18302699922757446,0.5169036983558544,0.0,0.9999999000000099,0.0,1.2189148637652518e-05,2.980231940746337e-08 -0.1757310628818225,0.5882348417228515,5.960463881492674e-08,0.9999999000000099,0.0,1.1801718485355495e-05,2.980231940746337e-08 -0.17800721525408847,0.5985824464726665,2.980231940746337e-08,0.9999999000000099,0.0,1.1295079055428617e-05,2.980231940746337e-08 -0.18092420696463052,0.6012288927002406,2.980231940746337e-08,0.9999999000000099,0.0,1.096725354194652e-05,2.980231940746337e-08 -0.18293634056287483,0.602495670215435,0.0,0.9999999000000099,0.0,1.1056660500168911e-05,0.0 -0.18442583083342778,0.6036349533954768,0.0,0.9999999000000099,0.0,1.141428833305847e-05,0.0 -0.18570330738252344,0.6039085983195938,0.0,0.9999999000000099,0.0,1.2069939360022665e-05,1.4901159703731684e-07 -0.18688780068577335,0.6015928982658216,0.0,0.9999999000000099,0.0,1.2964008942246566e-05,2.980231940746337e-08 -0.18765306472001292,0.602096676723377,5.960463881492674e-08,0.9999999000000099,0.0,1.388788084387793e-05,8.940695822239011e-08 -0.18847146629506753,0.6024830936353897,0.0,0.9999999000000099,0.0,1.5079973620176466e-05,8.940695822239011e-08 -0.14313307403925446,0.05422618984247544,1.8388031074404898e-05,0.9995961977813165,0.0,0.0,0.004050552439945976 -0.1571695208484419,0.6251085995557402,0.0,0.9999999000000099,0.0,8.928774894476025e-05,5.66244068741804e-07 -0.17743709682683548,0.43263429395896835,0.0,0.9999999000000099,0.0,0.0010021625947147707,3.874301522970238e-07 -0.18547564744181327,0.4877455829738844,0.0,0.9999999000000099,0.0,0.000512987323960667,3.278255134820971e-07 -0.18573310970490992,0.50939762583593,0.0,0.9999999000000099,0.0,0.0005517303391903693,3.5762783288956044e-07 -0.18579027055924716,0.5169299243995511,0.0,0.9999999000000099,0.0,0.0003688931096255816,2.086162358522436e-07 -0.1873362958353672,0.5216849445403384,0.0,0.9999999000000099,0.0,0.00027185675763488084,2.086162358522436e-07 -0.1888200044553772,0.5244501828249296,0.0,0.9999999000000099,0.0,0.0002077817709088346,1.4901159703731684e-07 -0.19026878475355022,0.5264272688917907,0.0,0.9999999000000099,0.0,0.0001662969422936456,1.4901159703731684e-07 -0.1916477382103718,0.5282475947429195,0.0,0.9999999000000099,0.0,0.0001383125643700375,1.4901159703731684e-07 -0.19295078515207503,0.5294295548486131,0.0,0.9999999000000099,0.0,0.00011867283588051914,2.086162358522436e-07 -0.1942033469596556,0.5304926632926449,0.0,0.9999999000000099,0.0,0.00010457633880078896,1.7881391644478022e-07 -0.6540701389041909,0.40102547400283306,0.9999996615814547,2.65240642726424e-06,1.1920927762985348e-07,3.5762783288956044e-07,1.8328426435589973e-05 -0.5029746889859784,0.4370332061496061,0.9999999000000099,0.0,2.086162358522436e-07,0.0,1.1920927762985348e-07 -0.5609886646038459,0.30942758912510043,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5219477414868712,0.3554924427854254,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5675449967149331,0.328917086068098,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5539351701507078,0.354547142921772,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5679053663972301,0.33398824924471987,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5623629092937305,0.3449479936962734,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.569951474642995,0.3385479747669341,0.9999999000000099,0.0,0.0,0.0,1.1920927762985348e-07 -0.5712895393135023,0.34058842057118066,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5760544538259393,0.3389264940635154,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5790994763134536,0.3398017882718921,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.1920927762985348e-07 -0.203305602065251,0.03296837210090678,5.608796512484606e-05,8.970498141646475e-06,5.841254603862821e-06,1.0728834986686813e-06,0.9998458816133121 -0.21172398327904426,0.033729702228492475,6.9975845968724e-05,5.066394299268773e-07,1.1026858180761447e-06,1.043081179261218e-06,0.99999537004746 -0.19616016744755066,0.031719654793076174,7.593630985021666e-05,6.258487075567308e-07,3.5762783288956044e-07,5.364417493343406e-07,0.9999968005587916 -0.1722164750027871,0.02956619858235483,0.00010043381640315155,1.1622904568910714e-06,1.1920927762985348e-07,2.3841855525970696e-07,0.9999977542330126 -0.11225295066368682,0.02557158469715933,4.819035048186827e-05,1.0251997876167399e-05,0.0,2.980231940746337e-08,0.9999990655350666 -0.0866496562921884,0.02650400995754349,2.0325181835890017e-05,5.209445432424597e-05,0.0,0.0,0.9999991847443441 -0.07943320274024113,0.029688358301801075,1.353025301098837e-05,0.00013601778577566282,0.0,0.0,0.9999990655350666 -0.083437591787698,0.03792843221968635,1.1205672097206226e-05,0.0003013908561676771,0.0,2.980231940746337e-08,0.9999976946283737 -0.2696429490931438,0.19020503756127177,0.0,0.9887776578132131,0.0,9.238719016313645e-07,0.9397266759514962 -0.20276856421584696,0.36281704896436223,0.0,0.9999997807907323,0.0,0.00021117923532128544,0.005938827397602856 -0.14364111422897646,0.285622984122005,0.0,0.9999999000000099,0.0,0.0015408693203240785,0.00012668965980112677 -0.1394233703555549,0.29839688534395403,0.0,0.9999999000000099,0.0,0.0013646780079871552,4.291533994674725e-05 -0.12498900293786343,0.03144514560161012,0.00011572240625918027,7.605551912784652e-05,3.278255134820971e-07,1.1920927762985348e-07,0.9998709155616144 -0.12976440786778043,0.027491658921302595,9.050964404046626e-05,5.722045326232967e-06,0.0,1.4901159703731684e-07,0.9999988867211501 -0.17459064721338216,0.03427794575104264,0.00010883807047605623,1.1622904568910714e-06,0.0,5.66244068741804e-07,0.9999973966051797 -0.16535505651742974,0.031886756414675366,0.0001255273693442357,1.1920927762985347e-06,5.960463881492674e-08,2.9802319407463367e-07,0.9999979926515679 -0.1417468488157706,0.028871119017425634,0.00010168551381826502,2.74181338548663e-06,5.960463881492674e-08,2.3841855525970696e-07,0.999998588697956 -0.09288418292614654,0.026198089118286184,2.8818842867017078e-05,2.998113332390815e-05,0.0,2.980231940746337e-08,0.9999993039536218 -0.07886385917337016,0.028632760043009662,1.4483927232027197e-05,0.0001202523588091147,0.0,0.0,0.9999991847443441 -0.09145471453287994,0.04821938275465208,8.40425407290467e-06,0.0006822943005144663,0.0,0.0,0.9999946547917942 -0.300640642630526,0.15419751403075538,0.0,0.9953416782673458,0.0,1.6689298868179488e-06,0.9643489350134707 -0.23305338620174504,0.3712052702268114,0.0,0.9999993039536218,0.0,0.00021427867653966162,0.03154536766264768 -0.14500814675684343,0.31349325174685605,0.0,0.9999997807907323,0.0,0.006849288255500861,0.00033587213972211216 -0.13474345206656413,0.3278577327166864,0.0,0.9999999000000099,0.0,0.005282103487139993,8.91685396671304e-05 -0.0925585031471073,0.03275573253070699,0.00020742414307594505,0.003763675313329734,0.0,0.0,0.9978766635561446 -0.08812624215714801,0.09450399874022629,4.1544433254003936e-05,0.0012462137883424882,0.0,1.1920927762985348e-07,0.9999643756352763 -0.11218124627602499,0.1606111526214235,1.043081179261218e-06,0.017611293223688183,0.0,1.7583368450403388e-06,0.9998479677756706 -0.23249909280767925,0.2926458119844957,0.0,0.9983517125274995,0.0,1.8954275143146702e-05,0.4351445597379549 -0.1172280609559155,0.5564630030632833,0.0,0.9999999000000099,0.0,0.004427194152617498,0.000101298083665968 -0.1360512673798492,0.3347762226485156,0.0,0.9999999000000099,0.0,0.0036582943119049436,3.641843431592024e-05 -0.13304117321417186,0.36352941387627336,0.0,0.9999999000000099,0.0,0.0024353561350196843,1.7285345256328753e-05 -0.13585814833078494,0.3829644321739555,0.0,0.9999999000000099,0.0,0.002005189456692358,1.290440430343164e-05 -0.13782802223588525,0.3950372933664988,0.0,0.9999999000000099,0.0,0.0014583168955654051,9.80496308505545e-06 -0.13987702130692162,0.403910577228047,0.0,0.9999999000000099,0.0,0.0010551511186212407,7.718800726533013e-06 -0.1418845951498408,0.41152331225977873,0.0,0.9999999000000099,0.0,0.0007923542660862286,6.407498672604624e-06 -0.143821299070125,0.4179564117669627,0.0,0.9999999000000099,0.0,0.0006165801862210097,5.48362677097326e-06 -0.24896803497237208,0.03397348522558208,4.395842112600847e-05,3.3378597736358976e-06,2.2709367388487087e-05,2.8908249825239467e-06,0.9997996284135918 -0.1303586065715217,0.024499326940156052,8.261202939748846e-05,3.993510800600092e-06,1.7881391644478022e-07,5.960463881492674e-08,0.9999978734422902 -0.08008337020542416,0.024051189418489015,1.776218236684817e-05,7.545947273969725e-05,0.0,0.0,0.9999994231628994 -0.10817635058908755,0.06593066452804751,4.857778063416529e-06,0.0026638505179167058,0.0,8.940695822239011e-08,0.9999811245387832 -0.33669215439355954,0.13263967630976117,0.0,0.9994875385247568,0.0,3.725289925932921e-06,0.9449488171719883 -0.21221846341208042,0.3581895231587276,0.0,0.9999994231628994,0.0,0.0003904103842377701,0.021014420076826423 -0.14044097065344063,0.2808201908584384,0.0,0.9999999000000099,0.0,0.00830194271037885,0.00033429261679351663 -0.1332931518499494,0.29402017588349133,0.0,0.9999999000000099,0.0,0.006132959706223072,9.790061925351717e-05 -0.13519090413487445,0.3086225389905795,0.0,0.9999999000000099,0.0,0.004300027655705852,5.447863987684304e-05 -0.1382968127670243,0.31847295159608574,0.0,0.9999999000000099,0.0,0.0028119978476912064,3.5703178650141115e-05 -0.14150068163285842,0.3265237211621968,0.0,0.9999999000000099,0.0,0.0018823144937753864,2.5779006287455814e-05 -0.14456436037418663,0.3336194753075577,0.0,0.9999999000000099,0.0,0.0013121067165523899,1.990794936418553e-05 -0.2594538926970813,0.034191399806843596,4.15742355734114e-05,2.682208746671703e-06,3.108381914198429e-05,3.4868713706732143e-06,0.9997848464631657 -0.24974501131930948,0.039549976580523186,2.449750655293489e-05,2.682208746671703e-07,6.794928824901648e-06,5.1259989380836994e-06,0.9999891711650233 -0.2643586993108003,0.041945010416477815,1.3649462288618223e-05,2.086162358522436e-07,6.8247311443091115e-06,9.566544529795742e-06,0.9999879790722469 -0.2704668640978399,0.04308038949228743,1.1652706888318178e-05,1.7881391644478022e-07,8.1360331982375e-06,1.2308357915282372e-05,0.9999865485609154 -0.2668078541645197,0.04102024435294598,1.433491563498988e-05,1.7881391644478022e-07,6.556510269641941e-06,8.67247494757184e-06,0.9999878598629693 -0.2655586600193688,0.03993058203967127,1.600384552180783e-05,1.7881391644478022e-07,5.1259989380836994e-06,7.003545060753892e-06,0.9999882174908022 -0.2621553540121245,0.03884381055166767,1.874565890729446e-05,1.7881391644478022e-07,3.874301522970238e-06,5.543231409788187e-06,0.9999888135371904 -0.2582468390357848,0.03782448171921587,2.202391404211543e-05,2.086162358522436e-07,2.8908249825239467e-06,4.351138633489652e-06,0.9999894095835785 -0.25705200432666686,0.03751760720564232,2.3484227693081136e-05,2.086162358522436e-07,2.324580913782143e-06,3.9637084811926284e-06,0.9999894095835785 -0.2549650668992325,0.03702461718878948,2.5600192371011033e-05,2.086162358522436e-07,1.9073484420776557e-06,3.4272667318582874e-06,0.9999895287928562 -0.2536415457620498,0.036687701934254274,2.7179715299606593e-05,2.086162358522436e-07,1.6391275674104854e-06,3.069638898968727e-06,0.9999895287928562 -0.25597196816338147,0.03709912299474596,2.5629994690418497e-05,2.3841855525970696e-07,1.6391275674104854e-06,3.367662093043361e-06,0.9999886943279127 -0.5146080851341783,0.3587117492538378,0.999999542372177,7.748603045940476e-07,8.940695822239011e-08,8.940695822239011e-08,3.6060806483030677e-06 -0.6365193128322247,0.4358723758904817,0.9999999000000099,0.0,3.278255134820971e-07,0.0,0.0 -0.5991488098850112,0.3402290939702137,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,8.940695822239011e-08 -0.5597290396458597,0.33034050458973535,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5827879905459364,0.33743697399083344,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5799367427585789,0.3355535268208984,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,0.0 -0.5827410816905001,0.33525997394542983,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5839968323465761,0.3353344797513863,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5848255753274988,0.3371473550219194,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5878655910248521,0.3373848795313087,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5928249358885384,0.33879405254284717,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5949983596555383,0.34121432894585985,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.1212501823851923,0.031458497042037514,0.00012406705569327,8.568166829645719e-05,2.682208746671703e-07,1.1920927762985348e-07,0.9998693658410053 -0.21824145316173948,0.041056960814121336,7.641314696073608e-05,5.364417493343406e-07,4.4703479111195056e-07,3.0994412183761904e-06,0.9999951316289047 -0.25119569896611527,0.04595002531218484,2.0563600391149726e-05,2.086162358522436e-07,2.175569316744826e-06,1.3202427497506273e-05,0.9999907804902712 -0.26100414990298026,0.04388368128978782,1.7493961492181e-05,1.7881391644478022e-07,4.917382702231456e-06,1.3291834455728662e-05,0.9999904824670772 -0.2640012502560971,0.04120805858860108,1.7732380047440704e-05,2.086162358522436e-07,5.602836048603113e-06,9.983777001500229e-06,0.9999906016763548 -0.2624945044408824,0.039601713412179364,1.9758937767148216e-05,1.1920927762985348e-07,4.678964146971749e-06,7.390975213050916e-06,0.9999908996995489 -0.26024514435644186,0.03863209485346173,2.1785495486855723e-05,2.086162358522436e-07,3.635882967710531e-06,5.930661562085211e-06,0.9999909593041877 -0.26148954032768856,0.038651287549076124,2.1308658376336308e-05,1.7881391644478022e-07,3.397464412450824e-06,5.722045326232967e-06,0.9999902440485219 -0.2615121006857351,0.038389623158556964,2.1725890848040795e-05,2.3841855525970696e-07,3.039836579561264e-06,5.334615173935943e-06,0.999989886420689 -0.2619962096105808,0.03818953036608024,2.166628620922587e-05,1.1920927762985348e-07,2.8312203437090202e-06,5.096196618676236e-06,0.9999894095835785 -0.2635226845632153,0.03823333977998265,2.089142590463182e-05,1.1920927762985348e-07,2.7716157048940933e-06,5.096196618676236e-06,0.9999886943279127 -0.2623646259199222,0.03771245478937971,2.2083518680930358e-05,2.086162358522436e-07,2.5033948302269232e-06,4.529952549934432e-06,0.9999887539325515 -0.12773516773648627,0.11638301608953769,0.00021114943300187797,0.0,0.0008125006340056739,0.9999284936427096,0.0 -0.031890183685889584,0.12500888107066563,6.407498672604624e-06,2.1159646779298993e-06,0.45044173266197296,0.0016900597312778402,9.793042157292463e-05 -0.08783951401346786,0.03559666871414996,3.874301522970238e-07,2.980231940746337e-06,0.017682401557794387,3.8355585077405355e-05,0.7684832042872386 -0.21893623470353504,0.04032164811397564,5.21540589630609e-06,5.66244068741804e-07,3.910064306259194e-05,4.380940952897116e-06,0.9997124864316443 -0.23946207760772967,0.0319632291739091,2.5838610926270743e-05,4.172324717044872e-07,1.6093252480030219e-06,5.66244068741804e-07,0.9999741507960419 -0.22023212908786555,0.029558032746022,4.6908850747347345e-05,5.66244068741804e-07,3.278255134820971e-07,1.7881391644478022e-07,0.9999871446073035 -0.19499728082803094,0.028256833548475645,6.84261253595359e-05,9.238719016313645e-07,2.086162358522436e-07,1.7881391644478022e-07,0.9999922706062416 -0.12962463497578794,0.024705857034267413,4.062056135237257e-05,7.450579851865842e-06,0.0,0.0,0.999997277395902 -0.0863643884623052,0.02616709470300829,9.566544529795742e-06,0.0001199245332956326,0.0,0.0,0.9999981118608455 -0.11662539839261649,0.06364041565759007,3.3378597736358976e-06,0.0023121235442698234,0.0,0.0,0.9999528123353462 -0.3083339035383343,0.1563041209906913,0.0,0.9936428268518427,0.0,4.500150230526969e-06,0.8883112972772687 -0.2241877019312534,0.510055541904848,0.0,0.9999990655350666,0.0,0.0006312727296888891,0.010359077609798414 -0.09561616181931346,0.021014899011828146,8.642672628164378e-07,1.4007090121507783e-06,0.9962439732897261,4.0024514964223304e-05,0.0003571807980984485 -0.051993638274900895,0.027718722815535564,4.470347911119505e-06,1.7285345256328755e-06,0.9999023868109087,3.3378597736358976e-06,5.1677221852541485e-05 -0.08571821450832194,0.0358242988525082,3.0100342601538e-06,1.5795229285955586e-06,0.9999904824670772,6.288289394974771e-06,9.626149168610668e-06 -0.06238231062630788,0.03732067345933815,3.2782551348209707e-06,3.039836579561264e-06,0.9999852372588615,8.22544015645989e-06,1.788139164447802e-05 -0.0366704165920332,0.041816413395396934,1.2814997345209249e-06,1.8060205560922803e-05,0.9997672034900764,2.688169210553196e-05,0.00018113849735856236 -0.03379502892354264,0.05231645702419893,2.9802319407463367e-07,6.228684756159844e-05,0.9885488952094414,0.00014260409836471221,0.003817230081304946 -0.05147129297043339,0.053464740505600204,5.960463881492674e-08,4.1544433254003936e-05,0.565455678184199,0.00027075407181680473,0.06914763951239059 -0.09499958157145996,0.04784420131817763,2.3841855525970696e-07,1.0013579320907693e-05,0.008106171274191222,6.699561402797765e-05,0.8446094741213585 -0.2136125862509967,0.040978401892320826,5.48362677097326e-06,1.0132788598537545e-06,1.2516974151134616e-05,2.175569316744826e-06,0.9997582627942542 -0.21538072823586307,0.03062361478281158,3.573298096954858e-05,7.748603045940476e-07,5.066394299268773e-07,1.7881391644478022e-07,0.9999794556088965 -0.1925238072792442,0.028726875777093888,5.3316349419951966e-05,1.2218950957059981e-06,1.1920927762985348e-07,1.1920927762985348e-07,0.9999901248392443 -0.1934567093769076,0.03044229745343589,6.818770680427619e-05,1.0132788598537545e-06,1.4901159703731684e-07,1.1920927762985348e-07,0.9999911977227429 -0.0849520266020884,0.03378739952462518,0.00032863017610609857,0.0014919339118570237,0.0,0.0,0.9990276887362997 -0.22482722996734447,0.10374477503907424,5.8144325163961035e-05,7.748603045940476e-07,0.0,0.00018987057694494914,0.9999510241961816 -0.2343170344732534,0.07165879009927124,1.4185904037952563e-05,3.5762783288956044e-07,3.278255134820971e-07,7.286667095124793e-05,0.9999758197259287 -0.2576510906112795,0.04688507317693867,1.8626449629664607e-05,2.086162358522436e-07,2.2947785943746796e-06,1.4513729551434662e-05,0.9999860717238048 -0.26500618456696856,0.04044046997331504,1.8447635713219826e-05,1.1920927762985348e-07,3.695487606525458e-06,7.77840536534794e-06,0.9999884559093575 -0.26915612815696094,0.03932464122098841,1.7493961492181e-05,1.1920927762985348e-07,3.993510800600092e-06,7.063149699568818e-06,0.9999879790722469 -0.26616740225643465,0.038143247359420075,1.9788740086555676e-05,1.4901159703731684e-07,3.397464412450824e-06,5.513429090380723e-06,0.9999886943279127 -0.260499179352464,0.03684201835955134,2.4020669442415477e-05,1.7881391644478022e-07,2.4735925108194595e-06,3.874301522970238e-06,0.9999895287928562 -0.25327351688289934,0.035631567233659976,2.980231940746337e-05,2.086162358522436e-07,1.5795229285955586e-06,2.592801788449313e-06,0.9999904228624383 -0.25038367508805137,0.03548485040057048,3.209709800183805e-05,2.3841855525970696e-07,1.2218950957059981e-06,2.3841855525970694e-06,0.9999902440485219 -0.2492312192813669,0.035580933087931955,3.3050772222876875e-05,2.3841855525970696e-07,1.1026858180761447e-06,2.2947785943746796e-06,0.9999900056299666 -0.24959620832363388,0.03576853870733037,3.2514330473542534e-05,2.086162358522436e-07,1.0132788598537545e-06,2.2351739555597527e-06,0.9999896480021337 -0.18304130434231997,0.624922573459428,2.8014180243015566e-06,0.9999999000000099,5.960463881492674e-08,0.0,0.0 -0.18208369611939818,0.5080480574691567,5.960463881492674e-08,0.9999999000000099,0.0,1.9937751683592993e-05,8.940695822239011e-08 -0.1809603273793629,0.5918240546166765,8.940695822239011e-08,0.9999999000000099,0.0,1.2934206622839103e-05,8.940695822239011e-08 -0.17766931652287077,0.6418907641265359,0.0,0.9999999000000099,0.0,1.0728834986686813e-05,0.0 -0.18263781069952967,0.6493904589494705,8.940695822239011e-08,0.9999999000000099,0.0,1.0162590917945008e-05,8.940695822239011e-08 -0.18662300705136964,0.6503382324058816,8.940695822239011e-08,0.9999999000000099,0.0,1.007318395972262e-05,2.980231940746337e-08 -0.18925642966440454,0.6503807305175993,2.980231940746337e-08,0.9999999000000099,0.0,1.0460614112019642e-05,8.940695822239011e-08 -0.1911332905213367,0.6496140359719846,2.980231940746337e-08,0.9999999000000099,0.0,1.1295079055428617e-05,8.940695822239011e-08 -0.19256353377498536,0.6482336520038677,5.960463881492674e-08,0.9999999000000099,0.0,1.2308357915282372e-05,1.1920927762985348e-07 -0.1936988234439752,0.6465144156302608,1.4901159703731684e-07,0.9999999000000099,0.0,1.3500450691580906e-05,8.940695822239011e-08 -0.19464954733042572,0.6446808575479942,5.960463881492674e-08,0.9999999000000099,0.0,1.5079973620176466e-05,5.960463881492674e-08 -0.19551631807471356,0.642511367687831,2.980231940746337e-08,0.9999999000000099,0.0,1.6689298868179488e-05,8.940695822239011e-08 -0.332714855657152,0.032539546484143665,1.1682509207725642e-05,2.682208746671703e-07,0.003732740505784787,2.971291244924098e-05,0.9978224233348231 -0.2605811953436716,0.042352110140224025,1.0251997876167399e-05,2.3841855525970696e-07,4.9471850216389196e-05,7.539986810088233e-06,0.9999642564259986 -0.25429531930824156,0.03819242119135135,1.4424322593212271e-05,2.682208746671703e-07,7.808207684755402e-06,3.6060806483030677e-06,0.9999835683289746 -0.2606863975416958,0.0403670966556091,1.290440430343164e-05,2.682208746671703e-07,5.155801257491163e-06,5.30481285452848e-06,0.9999836279336135 -0.2551169991387587,0.039135575287793246,1.722574061751383e-05,2.9802319407463367e-07,3.397464412450824e-06,4.053115439415018e-06,0.9999863101423602 -0.24638178943567496,0.03689068555200211,2.4646518149972206e-05,2.682208746671703e-07,1.8775461226701922e-06,2.5331971496343865e-06,0.9999890519557456 -0.2145569324404565,0.03137764334141355,5.626677904129084e-05,4.768371105194139e-07,4.768371105194139e-07,5.66244068741804e-07,0.9999941183500449 -0.16694092749858053,0.026859641070534963,8.174776213467202e-05,1.4603136509657052e-06,5.960463881492674e-08,1.7881391644478022e-07,0.9999972177912633 -0.09460362791623343,0.024134367700258827,2.008676328063031e-05,3.489851602613961e-05,0.0,0.0,0.9999989463257889 -0.08291542529716481,0.029450446362220842,1.1354683694243543e-05,0.00016731022115349934,0.0,0.0,0.9999984098840395 -0.16967090963614753,0.10883480308576429,5.960463881492673e-07,0.04321842953512116,0.0,1.1920927762985348e-07,0.999714870617197 -0.32238468526458963,0.18814170357343538,0.0,0.9998233510598401,0.0,1.987814704477807e-05,0.623409685736424 -0.17086634039171325,0.14153179523905518,0.0001247227067202342,2.980231940746337e-08,0.0002474784603595758,0.9999948336057106,5.960463881492674e-08 -0.15854045748054152,0.1206102669032517,2.8103587201237956e-05,0.0,2.9683110129833516e-05,0.9999936415129344,2.980231940746337e-08 -0.14690378307687907,0.11985760925147934,3.1948086404800733e-05,0.0,2.1785495486855723e-05,0.9999920917923252,5.960463881492674e-08 -0.11295077204236581,0.11529150603227525,6.315111482441487e-05,0.0,3.150105161368878e-05,0.9999786807485919,0.0 -0.026322931050164297,0.13440853355013518,0.00016546247735023663,5.960463881492674e-08,3.859400363266506e-05,0.9996566964897136,2.086162358522436e-07 -0.06647461652480481,0.13846924898637525,5.990266200900137e-06,3.5762783288956044e-07,0.23054108698464862,0.08491083130498314,9.238719016313645e-07 -0.08279773592606067,0.020550042387304474,1.6272066396475e-05,5.960463881492674e-08,0.9993359043236116,1.1920927762985347e-06,7.450579851865842e-06 -0.07252341508565054,0.017073720690664637,1.5079973620176466e-05,2.3841855525970696e-07,0.999961872240446,5.66244068741804e-07,8.58306798934945e-06 -0.029976755379389222,0.036534994834365876,3.904103842377701e-06,1.2934206622839103e-05,0.9993962242180924,2.7537343132496152e-05,0.0008853673049569218 -0.037327051161174095,0.05150032042575165,6.258487075567308e-07,3.761052709221877e-05,0.9444627413424526,0.00022378561643064245,0.026690599633491303 -0.060852020976407864,0.04825812577374945,2.9802319407463367e-07,1.8060205560922803e-05,0.1580531141061113,0.0002644955847412374,0.34482270011207505 -0.11098253726499675,0.04287031292181254,8.344649434089744e-07,3.933906161785165e-06,0.0014188884269893311,4.869698991179514e-05,0.9721020680119611 -0.3156767487395225,0.04130983351953763,2.8908249825239467e-06,2.980231940746337e-08,0.9998938037429194,3.367662093043361e-05,2.980231940746337e-08 -0.27784425019067405,0.03570580481871501,3.969668945074121e-05,0.0,0.9999996615814547,7.152556657791209e-07,0.0 -0.30375748871499164,0.04381811618054612,1.4901159703731685e-05,0.0,0.9999997807907323,1.9669530808925826e-06,0.0 -0.27865985034742435,0.038400441401581845,4.139542165696662e-05,0.0,0.9999997807907323,8.642672628164378e-07,0.0 -0.25959554313538413,0.0344084799230784,6.961821813583444e-05,0.0,0.9999999000000099,5.066394299268773e-07,0.0 -0.24072962998347064,0.03203377127098869,9.879468883574107e-05,0.0,0.9999997807907323,3.278255134820971e-07,5.960463881492674e-08 -0.23278397320737143,0.03262633084692177,0.00010287760659456356,0.0,0.9999999000000099,3.874301522970238e-07,2.980231940746337e-08 -0.2334693372152929,0.034427791827982314,0.00010284780427515609,0.0,0.9999999000000099,4.768371105194139e-07,2.980231940746337e-08 -0.2454091906445928,0.03746098279311539,9.46223641186962e-05,0.0,0.9999997807907323,5.960463881492673e-07,2.980231940746337e-08 -0.2522148191824427,0.03770437836001402,8.988379533290952e-05,0.0,0.9999999000000099,6.854533463716575e-07,0.0 -0.25137871502789055,0.03639972209307129,9.18507484138021e-05,0.0,0.9999999000000099,6.258487075567308e-07,0.0 -0.25903898476481696,0.037953555577454876,7.998942528963169e-05,0.0,0.9999999000000099,7.152556657791209e-07,0.0 -0.09593516587813813,0.02089455723404724,8.344649434089744e-07,1.6093252480030219e-06,0.9917251072026113,4.661082755327271e-05,0.001186907172721636 -0.2596667706858878,0.05038493870826075,1.7821787005663097e-05,2.980231940746337e-08,0.9999997807907323,7.390975213050916e-06,8.940695822239011e-08 -0.3341991603236097,0.05285412072230328,8.67247494757184e-06,8.940695822239011e-08,0.9999997807907323,8.493661031127061e-06,0.0 -0.303221791970095,0.04238444566000914,2.0056960961222846e-05,0.0,0.9999997211860935,2.1457669973373625e-06,0.0 -0.29235035179834973,0.039188623421634254,2.8759238228202153e-05,0.0,0.9999997807907323,1.2516974151134616e-06,0.0 -0.2821750044705851,0.037836194031912226,4.503130462467715e-05,0.0,0.9999997807907323,9.238719016313645e-07,0.0 -0.27242010830704855,0.036408394568884624,6.470083543360298e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 -0.27814158796112376,0.03861543535524986,5.584954656958636e-05,0.0,0.9999997807907323,8.940695822239011e-07,0.0 -0.28729736803772526,0.04048445820115174,4.1961665725708426e-05,0.0,0.9999997807907323,1.2814997345209249e-06,0.0 -0.29367375372624294,0.04112768172513523,3.272294670939478e-05,0.0,0.9999997211860935,1.5497206091880952e-06,0.0 -0.29018366335620926,0.039869159453240745,3.659724823236502e-05,0.0,0.9999997807907323,1.2814997345209249e-06,0.0 -0.2808133959653924,0.037792861455167935,5.1200384742022066e-05,0.0,0.9999998403953712,9.238719016313645e-07,0.0 -0.32527568935001067,0.04320836066459828,2.8312203437090202e-06,8.940695822239011e-08,0.9998821212337117,3.8892026826739695e-05,5.960463881492674e-08 -0.07663559913317923,0.014871865508393966,1.645088031291978e-05,1.4901159703731684e-07,0.9999816609805325,1.7881391644478022e-07,1.1920927762985347e-06 -0.11899143456920003,0.02750080823427405,1.0758637306094277e-05,1.7881391644478022e-07,0.9999994231628994,8.344649434089744e-07,7.152556657791209e-07 -0.09683439135150483,0.03345948457144952,1.0490416431427107e-05,4.4703479111195056e-07,0.9999991251397053,1.996755400300046e-06,1.847743803262729e-06 -0.03543308377119209,0.040338337414509894,1.5795229285955586e-06,1.4960764342546611e-05,0.9998888565578977,2.0325181835890017e-05,0.00015622375833392299 -0.03699630498732915,0.057464957227403635,2.3841855525970696e-07,7.072090395391057e-05,0.980479499997399,0.000206649282771351,0.008516042573002066 -0.06577843427385707,0.05515146254548777,1.1920927762985348e-07,3.156065625250371e-05,0.21377829559681033,0.0002486407508164669,0.24412280860125368 -0.13543173670207945,0.04776987432615545,4.4703479111195056e-07,4.7385687857866755e-06,0.0008170007842362008,2.5898215565085667e-05,0.9820772023408332 -0.2335802614592153,0.0408985018660131,5.930661562085211e-06,7.748603045940476e-07,6.943940421938965e-06,1.8179414838552655e-06,0.9998603059359054 -0.23907408117258033,0.034482300275620076,1.8417833393812362e-05,5.66244068741804e-07,1.3113020539283883e-06,5.66244068741804e-07,0.9999656869373301 -0.240134477605413,0.034460276359379344,2.2858378985524404e-05,5.066394299268773e-07,7.748603045940476e-07,6.556510269641942e-07,0.9999749852609853 -0.24339494108145904,0.03531533479085829,2.4974343663454304e-05,4.172324717044872e-07,6.258487075567308e-07,1.0132788598537545e-06,0.999978323120759 -0.18891280888728862,0.15067413446707345,0.00010588764085471735,5.960463881492674e-08,0.00018507240352034753,0.9999973966051797,8.940695822239011e-08 -0.04209941625420768,0.13283485171904477,0.0001591443856358544,0.0,4.5835967248678664e-05,0.9998275233845572,2.980231940746337e-08 -0.08457025885231784,0.08625665305567966,0.00014388559809923315,0.0,0.00035476681022644395,0.9997463418664913,0.0 -0.05863028764481956,0.11387345192866676,0.0002742707455068854,0.0,0.000623553928962356,0.9983062341880838,1.1920927762985348e-07 -0.07240563630757924,0.07485070823341401,0.0003666579356700218,0.0,0.19281972506655348,0.6231004568702522,2.980231940746337e-08 -0.2582590579879633,0.03618618845320001,4.0382142797112866e-05,0.0,0.9999382688034752,6.139277797937454e-06,8.940695822239011e-08 -0.20582035183054298,0.01940760016109019,0.00019714234288037018,0.0,0.9999988867211501,1.1920927762985348e-07,1.1920927762985348e-07 -0.19720277189391863,0.02494403719474909,0.00022995469654798735,0.0,0.9999997807907323,3.278255134820971e-07,2.9802319407463367e-07 -0.19523078202392888,0.028682827944612417,0.00024899837864935645,0.0,0.9999996615814547,4.4703479111195056e-07,1.1920927762985348e-07 -0.20498678087339367,0.031339347357151916,0.00025835630694329994,0.0,0.9999997807907323,6.854533463716575e-07,1.4901159703731684e-07 -0.212391942730692,0.03181320428303513,0.0002793371398061542,0.0,0.9999997807907323,5.960463881492673e-07,1.7881391644478022e-07 -0.2142885923296888,0.031093567604462677,0.0002910196490138798,0.0,0.9999997807907323,6.258487075567308e-07,1.7881391644478022e-07 -0.3437314629412417,0.048049360505459396,2.5629994690418497e-06,0.0,0.999834675941215,5.8263534441590885e-05,0.0 -0.19589737056874684,0.021939009424267564,9.697674735188581e-05,0.0,0.9999994231628994,2.3841855525970696e-07,2.980231940746337e-08 -0.2525705695047699,0.03987109660419562,5.85019529968506e-05,0.0,0.9999999000000099,8.046626240015109e-07,0.0 -0.2568266689671028,0.03899639844226654,8.535384278297509e-05,0.0,0.9999997807907323,7.152556657791209e-07,0.0 -0.24058395623164563,0.03347301482581121,0.00010207294397056204,0.0,0.9999997807907323,4.172324717044872e-07,0.0 -0.2192090451626607,0.0301825702138716,0.000109016884392501,0.0,0.9999997807907323,2.682208746671703e-07,0.0 -0.19749307631628515,0.028616338963376856,9.6410503283144e-05,0.0,0.9999997807907323,3.5762783288956044e-07,2.980231940746337e-08 -0.1755439639018803,0.027908682818402204,7.59959144890316e-05,0.0,0.9999998403953712,3.5762783288956044e-07,8.940695822239011e-08 -0.1507804095682652,0.027117401356822002,5.2213663601875825e-05,0.0,0.9999997807907323,3.278255134820971e-07,1.7881391644478022e-07 -0.12745767831274593,0.027680665249852993,3.141164465546639e-05,8.940695822239011e-08,0.9999997807907323,5.960463881492673e-07,3.5762783288956044e-07 -0.10365995764303128,0.030233710999080128,1.603364784121529e-05,2.682208746671703e-07,0.9999994231628994,1.132488137483608e-06,1.2516974151134616e-06 -0.06736803054530614,0.03435093163855761,5.602836048603113e-06,1.6093252480030219e-06,0.99999537004746,4.202127036452335e-06,9.268521335721107e-06 -0.18329089879230656,0.6306049822681169,3.069638898968727e-06,0.9999999000000099,8.940695822239011e-08,2.980231940746337e-08,0.0 -0.18145424126827372,0.5030992626282377,2.980231940746337e-08,0.9999999000000099,0.0,2.0384786474704945e-05,0.0 -0.18107402323926727,0.5875478385872879,0.0,0.9999999000000099,0.0,1.3381241413951053e-05,8.940695822239011e-08 -0.17735809087018894,0.638758659253415,0.0,0.9999999000000099,0.0,1.0997055861353983e-05,1.1920927762985348e-07 -0.18225985764702457,0.6462274788703612,0.0,0.9999999000000099,0.0,1.034140483438979e-05,8.940695822239011e-08 -0.18616071342651086,0.647525131591544,1.1920927762985348e-07,0.9999999000000099,0.0,1.0251997876167399e-05,2.980231940746337e-08 -0.1887924969118145,0.6476179360234434,8.940695822239011e-08,0.9999999000000099,0.0,1.069903266727935e-05,8.940695822239011e-08 -0.19067397712871656,0.6468222140158282,1.1920927762985348e-07,0.9999999000000099,0.0,1.1295079055428617e-05,2.980231940746337e-08 -0.1920884251515004,0.6456402539101346,0.0,0.9999999000000099,0.0,1.2308357915282372e-05,2.980231940746337e-08 -0.19322618841324832,0.6441489456981098,0.0,0.9999999000000099,0.0,1.353025301098837e-05,0.0 -0.1941961049953157,0.6424757837149062,1.1920927762985348e-07,0.9999999000000099,0.0,1.5020368981361538e-05,2.980231940746337e-08 -0.19507560133126256,0.6405395268297093,2.980231940746337e-08,0.9999999000000099,0.0,1.6599891909957096e-05,5.960463881492674e-08 -0.1458202898441969,0.02504509686994846,1.6689298868179488e-06,2.9802319407463367e-07,0.9996705247659187,2.2053716361522894e-05,5.30481285452848e-06 -0.07657295465152289,0.018563836809794242,1.1950730082392812e-05,1.4901159703731684e-07,0.9999897672114114,2.682208746671703e-07,2.086162358522436e-06 -0.14650645851482277,0.03278949856196646,1.2427567192912226e-05,1.1920927762985348e-07,0.9999996615814547,1.2814997345209249e-06,3.5762783288956044e-07 -0.1494490206179724,0.03406581282032335,3.1381842336058926e-05,8.940695822239011e-08,0.9999998403953712,9.536742210388278e-07,2.682208746671703e-07 -0.11015373467942925,0.02813407778258175,2.0444391113519873e-05,1.1920927762985348e-07,0.9999996615814547,7.152556657791209e-07,7.152556657791209e-07 -0.04123455285855258,0.03691300749146667,2.5033948302269232e-06,7.271765935421062e-06,0.9999646140538315,1.1265276736021154e-05,6.780027665197917e-05 -0.03386852145054765,0.055840909471486656,3.278255134820971e-07,6.967782277464936e-05,0.9936433036889533,0.00015574692122340356,0.003857463212505021 -0.05549433827170418,0.057084172954321256,8.940695822239011e-08,4.5865769568086125e-05,0.5392959770686322,0.000333160128656033,0.09156905689076276 -0.09333103894800915,0.04948008059608049,1.7881391644478022e-07,1.2427567192912226e-05,0.010081111376685005,8.80360515296468e-05,0.7836522272378046 -0.1974035799421586,0.0447326898498231,2.1159646779298993e-06,1.4603136509657052e-06,4.029273583889048e-05,5.811452284455357e-06,0.9991355135279159 -0.23571181296326216,0.03527399896971364,1.6331671035289926e-05,6.258487075567308e-07,1.7285345256328755e-06,5.66244068741804e-07,0.9999559117765645 -0.2179970443158481,0.03093218802876094,3.600120184421575e-05,7.748603045940476e-07,3.5762783288956044e-07,2.086162358522436e-07,0.999982495445476 -0.24663078783921383,0.033952146762756145,4.467367679178759e-05,3.5166736900806776e-06,2.1308658376336308e-05,2.8014180243015566e-06,0.9998033239011983 -0.3186947107183099,0.053619593372700156,3.367662093043361e-06,1.1920927762985348e-07,4.979967572987129e-05,9.56058406591425e-05,0.9999573422878961 -0.28879022597070786,0.04766196011680808,3.6060806483030677e-06,1.1920927762985348e-07,6.341933569908205e-05,4.6849246108532416e-05,0.9999630643332224 -0.2921338677285345,0.04558780788594682,3.933906161785165e-06,1.4901159703731684e-07,5.316733782291465e-05,3.519653922021424e-05,0.9999646736584703 -0.2907692789911032,0.044382631771117176,4.053115439415018e-06,1.1920927762985348e-07,4.810094352364588e-05,3.09944121837619e-05,0.9999619318450849 -0.2856372296691874,0.042686045162520975,5.543231409788187e-06,1.4901159703731684e-07,3.0487772753835027e-05,2.0056960961222846e-05,0.9999691440063815 -0.2858018576980502,0.04151132702116634,6.496905630827015e-06,1.4901159703731684e-07,2.166628620922587e-05,1.582503160536305e-05,0.9999719454244057 -0.2830957174183924,0.04037967323565455,8.1360331982375e-06,1.1920927762985348e-07,1.4781950426101832e-05,1.1682509207725642e-05,0.9999757601212899 -0.2756690680866534,0.038395404809099185,1.2218950957059982e-05,1.4901159703731684e-07,8.016823920607646e-06,6.794928824901648e-06,0.9999817801898102 -0.2610478103052764,0.0355072319446798,2.2143123319745282e-05,2.086162358522436e-07,3.2186504960060438e-06,3.039836579561264e-06,0.9999873830258588 -0.2456004619496691,0.03335201739693789,3.573298096954858e-05,1.7881391644478022e-07,1.370906692743315e-06,1.4603136509657052e-06,0.999990542071716 -0.23277541994084652,0.03226962685032453,4.9114222383499634e-05,2.9802319407463367e-07,6.556510269641942e-07,9.238719016313645e-07,0.9999920917923252 -0.14508539437646914,0.031742244953442175,8.845328400135129e-05,4.062056135237257e-05,7.748603045940476e-07,2.086162358522436e-07,0.9998730613286118 -0.47374832628195784,0.06688365339087567,1.4007090121507783e-06,0.0,5.254148911535792e-05,0.0010005234671473602,0.9994445039755324 -0.12314397096124,0.034761101001509226,5.960463881492674e-08,6.556510269641942e-07,0.13548015193355217,0.0007915198011428196,0.6264939873765412 -0.17970350383968106,0.03621441125249633,8.493661031127061e-06,1.7881391644478022e-07,0.9999565078229526,1.2427567192912226e-05,1.996755400300046e-06 -0.33608922360935906,0.053202152243087185,4.2110677322745743e-05,5.960463881492674e-08,0.9999994827675383,1.2516974151134616e-05,8.940695822239011e-08 -0.3502732515190043,0.04216921328776206,1.5348194494843634e-05,5.960463881492674e-08,0.9999982310701231,1.6599891909957096e-05,0.0 -0.3586723208278911,0.05194023250644109,9.357928293943498e-06,2.980231940746337e-08,0.999991793769131,6.6310160681606e-05,0.0 -0.36096656320984566,0.06235787271385522,5.155801257491163e-06,8.940695822239011e-08,0.9999119235531191,0.0006668865013808079,0.0 -0.2634221315274834,0.08064621685554478,1.5437601453066027e-05,8.940695822239011e-08,0.9888342822200873,0.12223397463115575,0.0 -0.10475587844414862,0.08895397184756092,0.0004758834362983751,0.0,0.007120399955150555,0.999799866832147,0.0 -0.16739735006592918,0.11646321413906925,5.057453603446534e-05,0.0,3.919005002081433e-05,0.9999959660938481,2.980231940746337e-08 -0.20129424332738874,0.13280886409392717,2.1427867653966164e-05,0.0,7.808207684755402e-06,0.999998588697956,2.086162358522436e-07 -0.36742293833164863,0.06488600372157051,1.847743803262729e-06,1.1920927762985348e-07,0.9992869093105058,0.0002553164703637387,0.0 -0.15685367583579019,0.020316630598404013,8.156894821822725e-05,0.0,0.999998290674762,2.3841855525970696e-07,1.4901159703731684e-07 -0.19665411113878387,0.02963897585361312,5.1677221852541485e-05,0.0,0.9999998403953712,3.874301522970238e-07,0.0 -0.20889744161694512,0.03614220022536331,9.828804940581419e-05,0.0,0.9999999000000099,6.258487075567308e-07,1.1920927762985348e-07 -0.17910534142706241,0.02825179695599299,8.43703662425288e-05,0.0,0.9999997807907323,3.278255134820971e-07,8.940695822239011e-08 -0.13429781793991938,0.02381509542057412,4.291533994674725e-05,2.980231940746337e-08,0.9999997807907323,2.682208746671703e-07,2.086162358522436e-07 -0.0690928101511002,0.029013901943960634,9.655951488018132e-06,7.748603045940476e-07,0.9999973966051797,1.7583368450403388e-06,5.602836048603113e-06 -0.03223374485836071,0.05166453122207973,6.258487075567308e-07,4.804133888483095e-05,0.9981715873090009,0.00010126828134656053,0.0023590919996559854 -0.05961760878316064,0.060663163651569124,1.1920927762985348e-07,4.082917758822482e-05,0.5282818146759384,0.00032523271169364776,0.17855952384631812 -0.14514321088189888,0.04797852038515597,7.748603045940476e-07,3.993510800600092e-06,0.0006347894033789697,1.8984077462554166e-05,0.9911173187006155 -0.22781333326350073,0.03566923736915157,1.654028727114217e-05,7.748603045940476e-07,1.937150761485119e-06,5.066394299268773e-07,0.9999478055456857 -0.20535033940418612,0.029809564346931078,4.139542165696662e-05,1.0132788598537545e-06,2.086162358522436e-07,1.4901159703731684e-07,0.9999851776542227 -0.5165663361335479,0.3595785498003355,0.9999996615814547,8.344649434089744e-07,8.940695822239011e-08,2.980231940746337e-08,3.6060806483030677e-06 -0.6154213547451772,0.44183203570429586,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5914618968718712,0.346210032642209,0.9999999000000099,0.0,2.9802319407463367e-07,0.0,8.940695822239011e-08 -0.551288485504211,0.33860075467987366,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.4901159703731684e-07 -0.5752892493963446,0.3444176911717975,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5626334547763547,0.3455346822146971,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.567504584765777,0.34042453760039876,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.562132298923104,0.3440304397947581,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5679296850922975,0.34009006613629894,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5632439851527637,0.34340277308305833,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5647470950846473,0.34202009433611796,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.5557207464941702,0.34729191654934183,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.6637672185622976,0.40337282412297554,0.9999996615814547,2.8014180243015566e-06,1.4901159703731684e-07,3.874301522970238e-07,2.0056960961222846e-05 -0.5287296175737791,0.45307815067162366,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.7881391644478022e-07 -0.5817939638850583,0.30851513142071263,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5417121648564142,0.3429005443462669,0.9999999000000099,0.0,0.0,0.0,2.980231940746337e-08 -0.5785042643307512,0.3282559513483626,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5774850845097791,0.3397018312826209,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5853162407632695,0.33331382268920184,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5894972681755108,0.3380581735985762,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5881884693855871,0.3422346710572726,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,8.940695822239011e-08 -0.5895189642662082,0.34419727319545584,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5924170613043572,0.3467288910748899,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5953290462247384,0.34845596545928353,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.2370996773144773,0.027150243516087618,4.053115439415018e-06,4.172324717044872e-07,0.12215797871666673,4.130601469874423e-05,0.9104861898695022 -0.25430038570304725,0.04752019046923409,7.033347380161355e-06,3.5762783288956044e-07,0.00015500186323821698,9.715556126833059e-06,0.9999152614128928 -0.2494246959582998,0.037217140191381025,1.3291834455728662e-05,3.278255134820971e-07,9.000300461053937e-06,2.354383233189606e-06,0.9999755217027346 -0.26166313885558967,0.040265560143251604,1.0728834986686813e-05,2.9802319407463367e-07,5.1259989380836994e-06,4.261731675267262e-06,0.9999776078650932 -0.26210218666898705,0.04058614372512115,1.20401370406152e-05,2.682208746671703e-07,4.261731675267262e-06,4.6193595081568225e-06,0.9999796940274517 -0.26460957526064954,0.040320634835014635,1.2606381109357005e-05,2.9802319407463367e-07,3.933906161785165e-06,4.976987341046382e-06,0.9999805880970339 -0.2620339989553668,0.03901591896342713,1.5407799133658562e-05,2.3841855525970696e-07,3.1590458571911173e-06,4.112720078229945e-06,0.9999829722825865 -0.2610209584128062,0.03829097747147058,1.740455453395861e-05,2.086162358522436e-07,2.5629994690418497e-06,3.6060806483030677e-06,0.9999841643753627 -0.2598487138640571,0.03775134682008899,1.9311902976036264e-05,2.086162358522436e-07,2.1159646779298993e-06,3.397464412450824e-06,0.9999851180495838 -0.25930124520181785,0.03739726542786141,2.089142590463182e-05,2.086162358522436e-07,1.847743803262729e-06,3.1888481765985805e-06,0.9999855352820556 -0.25724726914294294,0.036776304238697724,2.3186204499006502e-05,2.086162358522436e-07,1.6093252480030219e-06,2.8014180243015566e-06,0.999986369746999 -0.2542536854638677,0.0360754430232263,2.6315448036790155e-05,2.3841855525970696e-07,1.2814997345209249e-06,2.413987872004533e-06,0.9999872042119423 -0.7072691917126569,0.4149319230799653,0.9999996615814547,3.9637084811926284e-06,2.9802319407463367e-07,6.258487075567308e-07,3.0279156517982785e-05 -0.48238533733277816,0.4507318734350869,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,1.7881391644478022e-07 -0.5764750241994571,0.3038062154726512,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,2.980231940746337e-08 -0.5256780981799846,0.3585377930980906,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5714514851333504,0.32661065453658683,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5552029609450279,0.3515753745430694,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5650571584467561,0.3347310423277836,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5651359557871458,0.34203106159075475,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5657619833711959,0.34030455345048644,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5700697302582245,0.3392578958884098,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5737639069319607,0.3394082188025076,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5771498083829314,0.33914750808630467,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.1556738316948326,0.023716181512586296,1.698732206225412e-06,9.536742210388278e-07,0.7081348783938181,5.2303070560098214e-05,0.21106574808898182 -0.13033586739954084,0.047926992169756474,1.519918289780632e-06,1.4901159703731685e-06,0.16216064858076434,4.3720002570748764e-05,0.9174559391000481 -0.09223806857680807,0.04486608504480758,8.940695822239011e-08,6.794928824901648e-06,0.3016168769580633,0.0005814432516396104,0.3580577611493325 -0.04242250323119931,0.042645931236594,2.980231940746337e-08,2.494454134404684e-05,0.7905556961099882,0.00017762182366848169,0.008483230219334448 -0.04343089461146762,0.0466191470543188,1.7881391644478022e-07,2.890824982523947e-05,0.6603484089445597,0.0001825690086901206,0.030792471667456932 -0.055086016652687274,0.048178851596211755,1.1920927762985348e-07,2.4169681039452794e-05,0.2837781622349767,0.0002593695858031537,0.10785378927298593 -0.05804073810337059,0.0474842190661183,5.960463881492674e-08,2.253055347204231e-05,0.15211002497683318,0.0002856552315205364,0.12368436410975878 -0.05790108442066763,0.046699732534041326,1.4901159703731684e-07,2.1249053737521383e-05,0.11141296107054166,0.0002596974113166358,0.1282686164856536 -0.06154662370426912,0.046247810117431704,5.960463881492674e-08,1.820921715796012e-05,0.06721734328436918,0.00022596118574738728,0.19973174720440706 -0.06582117080415925,0.04643365739980955,5.960463881492674e-08,1.6480682632327243e-05,0.04436796459930583,0.00023686883465051886,0.260024879202285 -0.06460776924819449,0.04646673797765422,1.1920927762985348e-07,1.707672902047651e-05,0.04646759760620044,0.00026690957261324194,0.2173065027845017 -0.05774009227513597,0.04604944585965317,5.960463881492674e-08,2.0503995752334798e-05,0.08976279791611522,0.0002954303922861844,0.09845413773187199 -0.3161465227473003,0.0412193238664617,2.8908249825239467e-06,2.980231940746337e-08,0.9998951150449733,3.361701629161868e-05,2.980231940746337e-08 -0.33235752581173833,0.048285871735887644,6.556510269641941e-06,2.980231940746337e-08,0.9999993039536218,5.960463881492674e-06,0.0 -0.34713771937840227,0.04729425906325166,2.413987872004533e-06,1.4901159703731684e-07,0.9999991251397053,1.4036892440915248e-05,0.0 -0.33140569923935953,0.05124053358154259,4.0829177588224814e-06,8.940695822239011e-08,0.9999989463257889,9.387730613350962e-06,0.0 -0.33817562459499045,0.04788678883686236,2.980231940746337e-06,8.940695822239011e-08,0.9999988271165112,1.150369529128086e-05,0.0 -0.3468157052850166,0.05241754650172069,2.2947785943746796e-06,8.940695822239011e-08,0.999998290674762,2.3514030012488597e-05,0.0 -0.35331502555337846,0.05549165605548506,1.6093252480030219e-06,1.1920927762985348e-07,0.9999962045124035,5.447863987684304e-05,0.0 -0.3546787202211381,0.06025764345090919,1.2814997345209249e-06,1.1920927762985348e-07,0.999989886420689,0.000127732740980388,0.0 -0.35275629161327704,0.0643196999916565,1.0728834986686813e-06,1.1920927762985348e-07,0.9999696804481307,0.00030100342601538003,0.0 -0.34600484369752577,0.06783801316053341,9.536742210388278e-07,1.4901159703731684e-07,0.9999121619716743,0.0005816816701948701,0.0 -0.3380204439023241,0.0711827576038541,8.642672628164378e-07,1.7881391644478022e-07,0.9997301294047336,0.0014398394575327778,0.0 -0.3115035593380687,0.0757750272621101,1.1026858180761447e-06,1.1920927762985348e-07,0.9987006380831221,0.006070076812273324,0.0 -0.11641123890394738,0.10754603145665148,0.0002636909221172359,0.0,0.0018748937162429281,0.9997211291042726,0.0 -0.12747573852011215,0.10362300274981896,5.0723547631502654e-05,0.0,0.00016289947788119478,0.9999712897733788,0.0 -0.13355273007793544,0.11601251361767731,3.3915039485693316e-05,0.0,4.929303629994441e-05,0.9999861909330825,0.0 -0.12635752558184973,0.11820283530118592,3.76701317310337e-05,0.0,3.850459667444267e-05,0.9999837471428911,0.0 -0.09987059235159274,0.11648598311336955,6.350874265730444e-05,0.0,5.245208215713553e-05,0.9999629451239447,0.0 -0.06555408239093179,0.11669212577728993,0.00010645388492345915,0.0,9.077786491513343e-05,0.9998595906802396,0.0 -0.04139646887607822,0.1026239991012321,0.00021904704764485577,0.0,0.0006783007897138663,0.9980787232817272,8.940695822239011e-08 -0.12470948695620081,0.10115110872443964,2.598762252330806e-05,0.0,0.654978925056917,0.08232595693349622,1.4901159703731684e-07 -0.22218602894816672,0.026934057469524295,6.106495246589245e-05,0.0,0.9999844027939181,8.642672628164378e-07,1.7881391644478022e-07 -0.1652825176647411,0.01662287115766078,0.00011038779108524432,0.0,0.9999987079072337,2.3841855525970696e-07,1.4901159703731684e-07 -0.13750267028239227,0.021696090694527055,9.307264350950811e-05,2.980231940746337e-08,0.9999996615814547,2.9802319407463367e-07,4.4703479111195056e-07 -0.10649886726892081,0.025600135322001855,4.8965210786462317e-05,1.7881391644478022e-07,0.9999993039536218,8.046626240015109e-07,1.996755400300046e-06 -0.695540249318886,0.4119734465370454,0.9999997211860935,3.6656852871179947e-06,2.086162358522436e-07,5.66244068741804e-07,2.6583668911457325e-05 -0.4753597676557162,0.45203009240039504,0.9999999000000099,0.0,2.086162358522436e-07,0.0,8.940695822239011e-08 -0.5633726119761837,0.33753603691043316,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5432224273456704,0.36377552145450875,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5797837376354468,0.33528560394267887,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5535563826331759,0.3586367368084008,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5542066693076485,0.34852921956769994,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5537595748672067,0.35345008963254637,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5608840584522694,0.3490199148057293,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5651486515764825,0.34876000875223073,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5659907459978344,0.35032880300245034,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5719289183379815,0.3511332272882013,0.9999999000000099,0.0,8.940695822239011e-08,0.0,1.1920927762985348e-07 -0.596741080259409,0.38737535470051343,0.9999996019768158,1.7881391644478022e-06,1.4901159703731684e-07,1.4901159703731684e-07,9.715556126833059e-06 -0.608173131917566,0.4324807523940532,0.9999999000000099,0.0,4.172324717044872e-07,0.0,8.940695822239011e-08 -0.5879400968308183,0.3230297564907065,0.9999999000000099,0.0,2.682208746671703e-07,0.0,1.4901159703731684e-07 -0.5482280850183452,0.3361366390606362,0.9999999000000099,0.0,5.960463881492674e-08,0.0,1.1920927762985348e-07 -0.5711278915168783,0.3364740013500071,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5589864253766339,0.3432741164573327,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5607737302547947,0.33978480094813407,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5540266036757895,0.34611457580361754,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5454056858790578,0.3501315116282776,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.5476308464777205,0.34981352084845535,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5446916222346782,0.3534293174138457,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,5.960463881492674e-08 -0.5453392863047808,0.35270786279360794,0.9999999000000099,0.0,2.980231940746337e-08,0.0,0.0 -0.11420673131469844,0.26572155947903525,0.9999973370005409,2.086162358522436e-07,1.397728780210032e-05,3.278255134820971e-07,0.0 -0.7140477895441023,0.445229470653589,0.9999999000000099,0.0,2.682208746671703e-07,0.0,0.0 -0.6321903466916569,0.4139965771919877,0.9999999000000099,0.0,7.748603045940476e-07,0.0,8.940695822239011e-08 -0.6063637733208391,0.3359856008908012,0.9999999000000099,0.0,1.0132788598537545e-06,0.0,2.980231940746337e-08 -0.5909659862273605,0.35740560287077594,0.9999999000000099,0.0,5.66244068741804e-07,0.0,1.4901159703731684e-07 -0.5816290378329717,0.3559074103222806,0.9999999000000099,0.0,2.682208746671703e-07,0.0,2.980231940746337e-08 -0.5725369453193101,0.3655776976913065,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5739249586821371,0.3576195239408382,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,8.940695822239011e-08 -0.5726779699088428,0.354416668354381,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5755527019262409,0.3489329814313393,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5765783190488486,0.34650555247095477,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5751144885778704,0.3458995818499495,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.2765053510551399,0.03442475199109929,3.71038876622919e-05,1.937150761485119e-06,5.185603576898626e-05,4.917382702231456e-06,0.9997517062839846 -0.2761002480869407,0.04473051428028917,1.0788439625501739e-05,1.7881391644478022e-07,1.9222496017813872e-05,1.573562464714066e-05,0.9999817205851714 -0.2801504135015832,0.04431414603428198,7.77840536534794e-06,8.940695822239011e-08,1.7195938298106364e-05,1.7553566130995923e-05,0.9999823762361983 -0.2801165282610298,0.04376709460462712,8.22544015645989e-06,1.4901159703731684e-07,1.5109775939583928e-05,1.603364784121529e-05,0.9999826146547536 -0.27053666113686897,0.0409217774797939,1.2278555595874908e-05,2.3841855525970696e-07,8.791684225201694e-06,9.000300461053937e-06,0.9999861313284437 -0.26055264471882533,0.03839316963492049,1.8239019477367584e-05,1.7881391644478022e-07,4.649161827564286e-06,5.0067896604538464e-06,0.9999886943279127 -0.2516754567518925,0.036715567105682,2.5093552941084157e-05,2.086162358522436e-07,2.5033948302269232e-06,3.1590458571911173e-06,0.9999902440485219 -0.24207457899044926,0.03517851232879981,3.427266731858287e-05,2.9802319407463367e-07,1.370906692743315e-06,2.026557719707509e-06,0.9999917341644923 -0.23101717232701247,0.03360968827625778,4.67002345114951e-05,2.682208746671703e-07,7.152556657791209e-07,1.1920927762985347e-06,0.9999929262572685 -0.22565007208843466,0.03330084680940698,5.39421981275087e-05,3.5762783288956044e-07,4.768371105194139e-07,1.0728834986686813e-06,0.9999932242804627 -0.22767707704554982,0.0341794192732458,5.242227983772807e-05,3.278255134820971e-07,3.874301522970238e-07,1.1622904568910714e-06,0.9999925090247969 -0.23253974317541437,0.035112202161498546,4.7355885538459296e-05,3.5762783288956044e-07,4.768371105194139e-07,1.370906692743315e-06,0.9999916745598535 -0.6184172034007538,0.3929587005896025,0.9999996615814547,2.1159646779298993e-06,5.960463881492674e-08,1.7881391644478022e-07,1.2129543998837591e-05 -0.56438809630918,0.4565256833248419,0.9999999000000099,0.0,2.682208746671703e-07,0.0,8.940695822239011e-08 -0.5758980512380552,0.33315500611322496,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5370057225004994,0.3497918545600832,0.9999999000000099,0.0,5.960463881492674e-08,0.0,5.960463881492674e-08 -0.5699586868050126,0.341220259608014,0.9999999000000099,0.0,5.960463881492674e-08,0.0,2.980231940746337e-08 -0.5533189773330454,0.3528035878531008,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5662951469186897,0.3385704755203329,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.5592733621365708,0.3470634519459569,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5651751756434065,0.34057319158444316,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.5643202662234285,0.34292352193682385,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5665789246324535,0.3411774932753949,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5670450925592225,0.34185832733022525,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.16287049650471525,0.02627775072601485,1.937150761485119e-06,2.3841855525970696e-07,0.9997623159096937,2.068280966877958e-05,2.65240642726424e-06 -0.05771216749905985,0.033806234592370976,1.1920927762985347e-06,4.827975744009066e-06,0.37237166614914013,8.791684225201694e-06,0.1897103596758146 -0.25372856854341824,0.050958514204836124,2.324580913782143e-06,7.748603045940476e-07,0.00014817713209390788,7.539986810088233e-06,0.999708075688372 -0.24864736198349374,0.03696992992721742,9.000300461053937e-06,5.66244068741804e-07,6.0200685203076e-06,1.043081179261218e-06,0.999945778987966 -0.22808426617631603,0.03333640098000941,2.1189449098706455e-05,6.556510269641942e-07,9.834765404462913e-07,3.874301522970238e-07,0.9999774886558155 -0.17471015452615188,0.02745652198321352,4.765390873253393e-05,1.8179414838552655e-06,8.940695822239011e-08,8.940695822239011e-08,0.9999932838851014 -0.0972119569738189,0.023980736728376566,1.388788084387793e-05,4.300474690496964e-05,0.0,0.0,0.9999983502794008 -0.08632466196656403,0.029285490507833196,9.506939890980815e-06,0.00017869470716715035,0.0,0.0,0.999997635023735 -0.1804408430978445,0.10858407614755955,4.768371105194139e-07,0.053681636448929246,0.0,1.7881391644478022e-07,0.9995500041862349 -0.32704609631137843,0.19116237756316778,0.0,0.9998241855247836,0.0,1.8447635713219826e-05,0.52794826711713 -0.17735365032415337,0.5292757748651189,0.0,0.9999996615814547,0.0,0.0027741489020437276,0.00210750081921818 -0.14461740850803453,0.37075078481047685,0.0,0.9999999000000099,0.0,0.005449771336126382,0.00011083482587635627 -0.08603134750963648,0.032981008285597,0.0003426372662276064,0.000394195278802518,0.0,0.0,0.9997465802850465 -0.19511726497795884,0.04676187037620903,0.0001563727699309603,8.642672628164378e-07,8.940695822239011e-08,2.5629994690418497e-06,0.9999954296520989 -0.23748278616875523,0.052716046562704726,2.539157613515879e-05,3.278255134820971e-07,6.854533463716575e-07,1.820921715796012e-05,0.9999894095835785 -0.23960822819671287,0.04217910765879308,3.5107132261991846e-05,1.7881391644478022e-07,1.6093252480030219e-06,6.526707950234478e-06,0.9999933434897403 -0.23472902177792382,0.03647306560845485,4.357099097371145e-05,2.682208746671703e-07,1.4305113315582417e-06,2.8014180243015566e-06,0.9999946547917942 -0.22453400491738407,0.03401756286038594,5.704163934588489e-05,2.682208746671703e-07,7.748603045940476e-07,1.4603136509657052e-06,0.99999537004746 -0.2034092843448335,0.03100875019496182,8.46981917560109e-05,4.4703479111195056e-07,2.9802319407463367e-07,5.66244068741804e-07,0.9999964429309587 -0.16266313194555024,0.027288168664074255,0.00010135768830478292,1.4007090121507783e-06,8.940695822239011e-08,2.3841855525970696e-07,0.9999979330469291 -0.11270591616163864,0.025479137893128532,4.45842698335652e-05,1.1086462819576373e-05,0.0,0.0,0.9999988867211501 -0.0892359316312079,0.026598483319496307,1.981854240596314e-05,4.8965210786462317e-05,0.0,0.0,0.9999990655350666 -0.08187815546650402,0.02899029850463362,1.3470648372173444e-05,0.00010928510526716817,0.0,2.980231940746337e-08,0.9999988271165112 -0.08127155899664998,0.031982421869523485,1.2069939360022665e-05,0.000149279817911984,0.0,2.980231940746337e-08,0.9999985290933172 -0.11736184358110832,0.03145870565829419,0.00013354419326484337,9.784101461470224e-05,2.086162358522436e-07,0.0,0.9998669220508138 -0.26977294682339353,0.06395789979793183,1.1384486013651007e-05,2.682208746671703e-07,1.6093252480030219e-06,9.912251434922317e-05,0.9999801112599234 -0.24206811188649138,0.04211634396785534,2.9385086935758882e-05,2.682208746671703e-07,2.8610226631164835e-06,7.301568254828525e-06,0.9999932242804627 -0.2585526108634699,0.041045039885168305,1.999735632240792e-05,2.086162358522436e-07,4.261731675267262e-06,8.67247494757184e-06,0.9999912573273818 -0.2557879090203227,0.0393082201413556,2.3126599860191574e-05,1.7881391644478022e-07,3.844499203562775e-06,6.3180917143822346e-06,0.9999919129784087 -0.2478776276008962,0.036904066794751895,3.066658667027981e-05,1.7881391644478022e-07,2.4437901914119963e-06,3.695487606525458e-06,0.9999929262572685 -0.23974898456534413,0.035342842334417424,3.927945697903672e-05,2.086162358522436e-07,1.4305113315582417e-06,2.2947785943746796e-06,0.9999935819082956 -0.23539218305566736,0.034845054143660986,4.437565359771296e-05,2.682208746671703e-07,8.940695822239011e-07,1.8179414838552655e-06,0.9999937011175731 -0.24003475903470792,0.03597950934747674,3.9368863937259114e-05,2.682208746671703e-07,1.0132788598537545e-06,2.2947785943746796e-06,0.9999924494201581 -0.24096849559739814,0.03588670491557735,3.924965465962926e-05,2.086162358522436e-07,1.0132788598537545e-06,2.175569316744826e-06,0.999992151396964 -0.24672296642235517,0.03663516043989377,3.373622556924853e-05,1.7881391644478022e-07,1.1026858180761447e-06,2.712011066079167e-06,0.9999909593041877 -0.2548499107255312,0.037724614136911805,2.697109906375435e-05,2.086162358522436e-07,1.4901159703731685e-06,3.6656852871179947e-06,0.9999892903743008 -0.33060854672016643,0.03230908512515908,1.1175869777798764e-05,3.5762783288956044e-07,0.004425257001856014,3.054737739264995e-05,0.9975065783537427 -0.4782015979091996,0.03725335001307587,8.642672628164378e-07,0.0,0.9959801035536925,0.0001168250920772564,0.00603851615602082 -0.12793275713390853,0.023567676540153838,2.6434657314420008e-05,1.1920927762985348e-07,0.9999947740010718,9.238719016313645e-07,1.4603136509657052e-06 -0.14006802439109645,0.026181697840975758,7.11083341062076e-05,2.980231940746337e-08,0.9999996615814547,6.854533463716575e-07,5.960463881492673e-07 -0.15226921438540325,0.029594659800230207,8.58306798934945e-05,2.980231940746337e-08,0.9999997807907323,9.238719016313645e-07,4.768371105194139e-07 -0.17083546518572088,0.03155639767106433,0.0001160204294532549,2.980231940746337e-08,0.9999997807907323,8.642672628164378e-07,2.682208746671703e-07 -0.1979970633901626,0.034225106233458306,0.00016808508145809342,0.0,0.9999997807907323,8.940695822239011e-07,1.4901159703731684e-07 -0.22716099022878347,0.03649875521034864,0.00022396443034708723,0.0,0.9999997807907323,9.536742210388278e-07,1.4901159703731684e-07 -0.2500776052371424,0.03710237144788566,0.00023090837076902618,0.0,0.9999999000000099,9.536742210388278e-07,1.1920927762985348e-07 -0.2545510530366398,0.03474801778198327,0.00023159382411539785,0.0,0.9999997807907323,7.152556657791209e-07,2.980231940746337e-08 -0.2596343755614537,0.03460246323946669,0.00021135804923773022,0.0,0.9999998403953712,7.748603045940476e-07,2.980231940746337e-08 -0.27000206707790064,0.03605911135056064,0.00016966460438668895,0.0,0.9999998403953712,9.238719016313645e-07,1.1920927762985348e-07 -0.4296958148301534,0.3149271606859721,0.9999997807907323,2.682208746671703e-07,2.980231940746337e-08,0.0,1.0728834986686813e-06 -0.6366440057490896,0.4505799113932581,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,5.960463881492674e-08 -0.5711694955589297,0.3628876506660866,0.9999999000000099,0.0,2.3841855525970696e-07,0.0,2.980231940746337e-08 -0.5600476860768158,0.3268698751366706,0.9999999000000099,0.0,1.7881391644478022e-07,0.0,5.960463881492674e-08 -0.5669432878259504,0.3533654212346574,0.9999999000000099,0.0,8.940695822239011e-08,0.0,2.980231940746337e-08 -0.5510487556229342,0.35252249234838823,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,2.980231940746337e-08 -0.5538939237365249,0.3489212393163205,0.9999999000000099,0.0,5.960463881492674e-08,0.0,0.0 -0.5510817169914937,0.3528191446653845,0.9999999000000099,0.0,8.940695822239011e-08,0.0,5.960463881492674e-08 -0.5508955716858679,0.3507682680483041,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,2.980231940746337e-08 -0.5567342042692442,0.3484681248068156,0.9999999000000099,0.0,2.980231940746337e-08,0.0,2.980231940746337e-08 -0.5570634007223251,0.3493032454846206,0.9999999000000099,0.0,0.0,0.0,5.960463881492674e-08 -0.561412274814247,0.3465503453614958,0.9999999000000099,0.0,8.940695822239011e-08,0.0,0.0 -0.44721603391702863,0.2479470073752216,4.661082755327271e-05,1.1920927762985348e-07,2.7209517619014057e-05,0.9999999000000099,6.3180917143822346e-06 -0.29909420012189253,0.19720292087992822,7.241963616013599e-06,0.0,4.947185021638919e-06,0.9999999000000099,3.2186504960060438e-06 -0.31104174255036815,0.1924501061109972,4.559754869341896e-06,0.0,2.2351739555597527e-06,0.9999997807907323,4.023313120007555e-06 -0.324607968316942,0.19102022048540282,4.053115439415018e-06,0.0,1.937150761485119e-06,0.9999999000000099,4.559754869341896e-06 -0.3330577611785306,0.18726193901670127,3.874301522970238e-06,0.0,1.6391275674104854e-06,0.9999997807907323,4.500150230526969e-06 -0.33661600945986214,0.18126618859048185,3.725289925932921e-06,0.0,1.4305113315582417e-06,0.9999999000000099,4.2319293558597985e-06 -0.3338807821135551,0.17768165466127084,3.725289925932921e-06,0.0,1.2218950957059981e-06,0.9999997807907323,3.993510800600092e-06 -0.3300596475464526,0.17590242621270769,3.8146968841553113e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.904103842377701e-06 -0.3269600272043263,0.17539557811594694,3.874301522970238e-06,0.0,1.2218950957059981e-06,0.9999997807907323,3.933906161785165e-06 -0.32334920762630504,0.17546132203912296,4.0829177588224814e-06,0.0,1.1026858180761447e-06,0.9999997807907323,3.8146968841553113e-06 -0.31964641808139915,0.17576980587810515,4.291533994674725e-06,0.0,1.0728834986686813e-06,0.9999997807907323,3.874301522970238e-06 -0.31449562309870227,0.17566040155263865,4.529952549934432e-06,0.0,1.2516974151134616e-06,0.9999997807907323,3.6656852871179947e-06 -0.6563398837771437,0.40157222740926407,0.9999996019768158,2.682208746671703e-06,1.1920927762985348e-07,3.5762783288956044e-07,1.8626449629664607e-05 -0.5561181306608713,0.44717276088686825,0.9999999000000099,0.0,3.5762783288956044e-07,0.0,8.940695822239011e-08 -0.5833722352740006,0.3167948424273668,0.9999999000000099,0.0,2.086162358522436e-07,0.0,2.980231940746337e-08 -0.5520842075119294,0.3402825593365681,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5808376073596768,0.3348075448893397,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5809237956760185,0.34063535922893323,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,8.940695822239011e-08 -0.5854499935861399,0.33983215683839996,0.9999999000000099,0.0,1.4901159703731684e-07,0.0,0.0 -0.5851507782693798,0.34381628030611683,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,1.1920927762985348e-07 -0.5828491449114734,0.34728127712025125,0.9999999000000099,0.0,0.0,0.0,0.0 -0.5803284644840265,0.34865987294902523,0.9999999000000099,0.0,5.960463881492674e-08,0.0,8.940695822239011e-08 -0.5771126746892378,0.3506157993669947,0.9999999000000099,0.0,1.1920927762985348e-07,0.0,0.0 -0.5718832015754407,0.351898610531631,0.9999999000000099,0.0,2.086162358522436e-07,0.0,5.960463881492674e-08 -0.12308809160676538,0.11315876243560982,0.0002286135921746515,0.0,0.0010541676420807943,0.9998882605115096,0.0 -0.23977759479483515,0.2174348830804433,9.477137571573351e-06,0.0,4.079937526881735e-05,0.9999998403953712,8.642672628164378e-07 -0.2437450587648552,0.18929356333352257,6.079673159122528e-06,0.0,1.0013579320907693e-05,0.9999997807907323,6.258487075567308e-07 -0.2610951661955485,0.19040331241208316,4.976987341046382e-06,0.0,7.390975213050916e-06,0.9999997211860935,8.642672628164378e-07 -0.26364955304961446,0.19520428773398443,5.364417493343406e-06,0.0,7.301568254828525e-06,0.9999998403953712,1.132488137483608e-06 -0.2628416418920399,0.19454669949061254,5.871056923270284e-06,0.0,7.033347380161355e-06,0.9999997807907323,1.2516974151134616e-06 -0.2597046792399634,0.1889353990231286,6.3180917143822346e-06,0.0,6.556510269641941e-06,0.9999997807907323,1.1622904568910714e-06 -0.25791507958297877,0.18459480997739358,6.735324186086722e-06,0.0,6.288289394974771e-06,0.9999997211860935,1.043081179261218e-06 -0.2546317577256623,0.178766757219221,7.2121612966061355e-06,0.0,5.900859242677747e-06,0.9999997807907323,9.536742210388278e-07 -0.2509533166781462,0.1724854409399316,7.718800726533013e-06,0.0,5.48362677097326e-06,0.9999996615814547,8.344649434089744e-07 -0.2442070245641677,0.16376915571269487,8.493661031127061e-06,0.0,5.1259989380836994e-06,0.9999996615814547,6.258487075567308e-07 -0.23066198824881062,0.15150389072684958,1.0132788598537546e-05,0.0,5.066394299268773e-06,0.9999994231628994,4.172324717044872e-07 -0.2524413466349022,0.03405350446117934,4.3094153863192035e-05,3.0994412183761904e-06,2.521276221871401e-05,3.069638898968727e-06,0.9997951580656806 -0.3102270364632894,0.052324652662854146,4.023313120007555e-06,8.940695822239011e-08,4.294514226615472e-05,7.11083341062076e-05,0.9999647332631091 -0.2937759756920285,0.04772838949339888,3.2186504960060438e-06,1.7881391644478022e-07,6.851553231775829e-05,5.185603576898626e-05,0.9999603225198368 -0.29258018730859414,0.04596674441504148,2.2351739555597527e-06,8.940695822239011e-08,0.00012499092759490137,6.309151018559995e-05,0.999924202108715 -0.25120651720914156,0.043601900331660406,1.1026858180761447e-06,1.7881391644478022e-07,0.00044506783803105796,0.00010105966511070829,0.9996190859626214 -0.18632632493201243,0.04317116736626481,5.960463881492673e-07,5.364417493343406e-07,0.0013319848635971678,0.00014543531870842125,0.9976260856545667 -0.15465700625732892,0.04364889859405776,6.854533463716575e-07,9.536742210388278e-07,0.0015547572011679566,0.000139117226994039,0.9946516949684242 -0.13348829745693594,0.04343041776867097,4.768371105194139e-07,1.5795229285955586e-06,0.0024429557264685872,0.0001883506586551685,0.9846077768863597 -0.09647199511128546,0.042730569832160566,2.086162358522436e-07,3.4868713706732143e-06,0.010135142981770736,0.00033262368690669867,0.8708246075510231 -0.06312313675619054,0.04156142472509147,2.086162358522436e-07,8.493661031127061e-06,0.0666755669198609,0.0003714859114140309,0.29678550374964174 -0.046117454765317555,0.040090322487641966,2.682208746671703e-07,1.3858078524470467e-05,0.2876945744352697,0.00023296473080814116,0.05579527654594536 -0.04071438312361928,0.03950840234079947,4.172324717044872e-07,1.6570089590549635e-05,0.5379183946563416,0.0001698732206225412,0.02831175640229909 -0.3428440689898624,0.11391803620295111,1.6093252480030219e-06,1.1920927762985348e-07,0.9538293719136631,0.01779389203469771,0.0 -0.1539975106652389,0.14526638386146257,3.2305714237690296e-05,0.0,0.00200116614357235,0.9999911977227429,0.0 -0.21036928891264528,0.16076311466325235,6.616114908456868e-06,0.0,3.0726191309094736e-05,0.9999990655350666,5.960463881492674e-08 -0.24102634190515027,0.1759518980678628,4.053115439415018e-06,0.0,1.141428833305847e-05,0.9999996615814547,2.086162358522436e-07 -0.2659377157578022,0.20146492120154033,3.695487606525458e-06,0.0,9.745358446240521e-06,0.9999997807907323,8.344649434089744e-07 -0.27644252775954925,0.2253800928206752,4.0829177588224814e-06,0.0,1.043081179261218e-05,0.9999997807907323,1.847743803262729e-06 -0.2796103060129734,0.2317586838802214,4.380940952897116e-06,0.0,9.983777001500229e-06,0.9999999000000099,2.592801788449313e-06 -0.28299123047610547,0.23415043946071393,4.6193595081568225e-06,0.0,9.357928293943498e-06,0.9999999000000099,3.1590458571911173e-06 -0.28700348733667236,0.23586937781109707,4.649161827564286e-06,0.0,8.523463350534524e-06,0.9999999000000099,3.874301522970238e-06 -0.2909220754979786,0.23566928501862036,4.887580382823993e-06,0.0,7.718800726533013e-06,0.9999999000000099,4.380940952897116e-06 -0.29477751253814793,0.233528524597234,4.827975744009066e-06,0.0,6.794928824901648e-06,0.9999998403953712,4.768371105194139e-06 -0.29729878901204254,0.22822418805029074,4.827975744009066e-06,0.0,5.7816499650478935e-06,0.9999999000000099,4.827975744009066e-06 -0.11942747234803634,0.11027508972187021,0.0002453922980010534,0.0,0.0013801752140790362,0.9998274041752795,0.0 -0.15760689973178563,0.11847162244675451,2.598762252330806e-05,0.0,7.447599619925096e-05,0.9999929262572685,2.980231940746337e-08 -0.16175541281030342,0.12765365836818637,1.892447282373924e-05,0.0,2.3990867123008012e-05,0.9999951316289047,2.980231940746337e-08 -0.17539903520811492,0.13108694551130576,1.4632938829064515e-05,0.0,1.5109775939583928e-05,0.9999963833263199,1.7881391644478022e-07 -0.17251661419154116,0.12968185541793367,1.6391275674104854e-05,0.0,1.433491563498988e-05,0.9999962045124035,1.1920927762985348e-07 -0.16786184906264456,0.12740978596412963,1.8894670504331777e-05,0.0,1.4692543467879441e-05,0.9999956084660152,8.940695822239011e-08 -0.1530646085675755,0.1226907074241357,2.6494261953234936e-05,0.0,1.7791984686255633e-05,0.9999934030943791,2.980231940746337e-08 -0.1392213404120971,0.11848986146805265,3.704428302347697e-05,0.0,2.2232530277967675e-05,0.999989886420689,0.0 -0.12954357265889677,0.11566355822489953,4.756450177431154e-05,0.0,2.6375052675605083e-05,0.9999860717238048,0.0 -0.11002865433237329,0.11313050983399112,7.20024036884315e-05,0.0,3.489851602613961e-05,0.9999745680285136,0.0 -0.0986793339211611,0.11160576341625295,9.253620176017376e-05,0.0,4.452466519475028e-05,0.9999597264734487,0.0 -0.09467181562985366,0.10941368339572376,0.00010725854754746067,0.0,5.713104630410728e-05,0.9999439908488015,0.0 -0.4179857075041307,0.2609322070628632,0.00010994075629413238,1.7881391644478022e-07,3.662705055177248e-05,0.9999997807907323,4.053115439415018e-06 -0.29915684460354885,0.18924111124612922,8.67247494757184e-06,0.0,5.632638368010577e-06,0.9999999000000099,2.8014180243015566e-06 -0.30565714834854946,0.19473639127257775,5.2750105351210165e-06,0.0,2.5629994690418497e-06,0.9999997807907323,4.380940952897116e-06 -0.3104477524628836,0.18924835321046818,4.798173424601603e-06,0.0,1.996755400300046e-06,0.9999998403953712,4.172324717044872e-06 -0.31137567757270845,0.18769338723783405,4.768371105194139e-06,0.0,1.847743803262729e-06,0.9999997807907323,4.202127036452335e-06 -0.30837333201085154,0.18510481712032686,4.887580382823993e-06,0.0,1.7583368450403388e-06,0.9999998403953712,3.874301522970238e-06 -0.3032798170917815,0.18216547366837657,5.245208215713553e-06,0.0,1.7285345256328755e-06,0.9999997807907323,3.546476009488141e-06 -0.2976083755369931,0.18079340454820442,5.692243006825504e-06,0.0,1.8775461226701922e-06,0.9999999000000099,3.308057454228434e-06 -0.291756272303898,0.18110045787571227,6.258487075567308e-06,0.0,2.086162358522436e-06,0.9999999000000099,3.069638898968727e-06 -0.2873649597048977,0.18392804261872783,7.063149699568818e-06,0.0,2.5629994690418497e-06,0.9999997807907323,3.2484528154135075e-06 -0.28174576162125287,0.1851569711844964,7.897614642977793e-06,0.0,2.9504296213388737e-06,0.9999997807907323,3.2186504960060438e-06 -0.27712365983769177,0.18638557192471877,8.732079586386767e-06,0.0,3.3378597736358976e-06,0.9999998403953712,3.0994412183761904e-06 -0.27619728444863106,0.12006124852031959,4.947185021638919e-06,5.960463881492674e-08,0.6957378883806179,0.20449493270602428,0.0 -0.14450097083447064,0.12382936475540739,3.4630295151472434e-05,0.0,0.0009351967830062006,0.9999854756774167,0.0 -0.19625109433315174,0.1483345925553952,8.165835517644963e-06,0.0,3.0457970434427562e-05,0.9999984098840395,8.940695822239011e-08 -0.22855722903258918,0.1620228886326869,4.827975744009066e-06,0.0,1.1295079055428617e-05,0.9999993039536218,1.1920927762985348e-07 -0.257369041432214,0.18415349718755214,3.9637084811926284e-06,0.0,8.612870308756914e-06,0.9999996615814547,5.066394299268773e-07 -0.26995384692027935,0.2081592082620853,4.142522397637409e-06,0.0,9.179114377498718e-06,0.9999998403953712,1.2814997345209249e-06 -0.2724757194406217,0.2165548801051301,4.6193595081568225e-06,0.0,9.089707419276328e-06,0.9999997807907323,1.7881391644478022e-06 -0.27102074025939227,0.21398067470701132,4.976987341046382e-06,0.0,8.434056392312133e-06,0.9999999000000099,1.8179414838552655e-06 -0.26803261040531373,0.2072922885062981,5.424022132158334e-06,0.0,7.86781232357033e-06,0.9999997807907323,1.6689298868179488e-06 -0.2632443308721258,0.19753575321629702,5.811452284455357e-06,0.0,7.122754338383746e-06,0.9999997807907323,1.3411043733358516e-06 -0.25658828019033353,0.1851282417457196,6.407498672604624e-06,0.0,6.467103311419552e-06,0.9999997807907323,1.0132788598537545e-06 -0.24848580359383673,0.17208901044759836,7.063149699568818e-06,0.0,5.842346452143114e-06,0.9999996615814547,6.968938222377927e-07 diff --git a/synthetic_data_Baabda.csv b/synthetic_data_Baabda.csv new file mode 100644 index 00000000..9a77d35d --- /dev/null +++ b/synthetic_data_Baabda.csv @@ -0,0 +1,1177 @@ +0,1 +0.6028760671361972,0.3623982666751729 +0.5951542258012255,0.3573469518460254 +0.6290412544939527,0.3766575454448259 +0.5978493690239208,0.34857726085841173 +0.6266852617000149,0.35885900247419883 +0.7096256017386399,0.40571540580988524 +0.783453702893676,0.4062283931849789 +0.8142478465691383,0.4140345452877874 +0.7573499679246815,0.5042718647280753 +0.6647823452669851,0.46700650438474195 +0.5739238857981512,0.3868653773011154 +0.5740346312281392,0.25899678460333636 +0.5404322743188473,0.24785208694077004 +0.43450957534869417,0.2567473649148849 +0.27886816858072105,0.21095857017374783 +0.31890764831155005,0.23792290679871542 +0.47224169967572005,0.25110629192819794 +0.5290760993734939,0.49950617535659914 +0.47490096090226225,0.5513805149203697 +0.4909444153102329,0.5598688123800897 +0.5101750492834992,0.5802053807290773 +0.5558750033144746,0.45650127515344174 +0.5577445626024208,0.5314697621535197 +0.5359293818248352,0.4552672503907333 +0.6021217107519515,0.3699012397524294 +0.4786539971627092,0.26174604884271274 +0.27147394417574344,0.22361934177800863 +0.35590654610090233,0.2003132700272707 +0.44979473946586424,0.20084565871423243 +0.4802154600418244,0.2548471092354148 +0.4439619481376794,0.2548882960449413 +0.42423489688042215,0.2252742349373401 +0.45444160697932534,0.22827738516105517 +0.4769806265630329,0.2476744352970744 +0.4828159808909429,0.27123695603187553 +0.4846283197199072,0.29230225076765165 +0.4999222457198589,0.32060322155127535 +0.5428692102203867,0.4015895424975438 +0.5309392213598046,0.6453176734746046 +0.6206672787405207,0.653951525476819 +0.6635757684428477,0.5155987141850163 +0.6215229630208803,0.5415070055165172 +0.5455693006285983,0.48603120430496966 +0.16244947909625415,0.25485128156054776 +0.23537871240579286,0.04782634971980288 +0.48541775343760163,0.1066520213736119 +0.5033318996217693,0.1762900053885047 +0.47861629722489035,0.2601813375108973 +0.5758170485254276,0.33198255289792417 +0.573917925333674,0.3310822247388829 +0.6391695737569848,0.40010362850609593 +0.5968255996453018,0.386786281937524 +0.5518446564442218,0.33374327410402016 +0.6507343053543987,0.332041501891588 +0.6757827996923341,0.46217793211304814 +0.6735639571860188,0.40358328806231386 +0.5947089195001272,0.37208023655310146 +0.40581828354081917,0.294171392822559 +0.35527351497109194,0.18277978891187419 +0.4107792079275886,0.16091808671518912 +0.33471703527949764,0.25535508982034893 +0.4453771114161996,0.26645570984811806 +0.5110349058889928,0.5065085886271937 +0.5594119429352974,0.6251809594994842 +0.5506731271512108,0.6873286960287759 +0.631810665104035,0.5460417268895633 +0.6169000863769402,0.5193758009185673 +0.530513703800771,0.4731416700741348 +0.2756560742739104,0.32993274916476095 +0.3216559290750605,0.16864702100071607 +0.46408310530617497,0.2297633587571478 +0.39772444961781983,0.4840115605220531 +0.622860968086742,0.39187464105338743 +0.5776236653084936,0.33551061142568406 +0.6245339512562272,0.37101382005144723 +0.6453925966944977,0.3931033312003902 +0.5980420708404716,0.33404284704856446 +0.511384427525941,0.3319709597945191 +0.3672837614858607,0.28693753471637645 +0.387092947943615,0.17375040048705803 +0.29843401907619005,0.2292083799098235 +0.38918590544017,0.17108118528558916 +0.5114544629835491,0.24505028120704117 +0.5117653608106845,0.35080134857284184 +0.48146790264011463,0.35853183257913246 +0.48325842616909204,0.3569314776697528 +0.47254019973674266,0.3657981156120624 +0.47297042606271333,0.3131626843394009 +0.43074625728702387,0.2973151206009314 +0.4359221160228443,0.3282476662528605 +0.42623692749137615,0.4043116568212337 +0.46967709062507723,0.4332763253242169 +0.44168341157962404,0.5432220099600853 +0.4566811322973769,0.633411466870634 +0.49816930291941075,0.4772922395117277 +0.44096660612158534,0.4034211336262548 +0.6487656831468399,0.4112619756323114 +0.6994404196444943,0.4667027889173871 +0.8496586084008395,0.4130079148865079 +0.8818578719721778,0.4090148805250054 +0.7722609042796449,0.6036315558389989 +0.7906060218478429,0.5441054104000158 +0.8503712415337441,0.49889722450344814 +0.8664358257882868,0.5360828636344201 +0.872568488084324,0.5877707598693934 +0.8596064447994993,0.5737363098197606 +0.8208471536291024,0.572218417936401 +0.7740737199457673,0.5198695657957271 +0.7514587044399744,0.4939599035573968 +0.7145192622837832,0.41303753839495166 +0.6340307593078907,0.34220650781062023 +0.3129717111455858,0.18170174950449247 +0.22738277911183297,0.04455953835000908 +0.4473099112322499,0.18628928059279254 +0.6219018697477015,0.38249957549130814 +0.40213572977281614,0.5404424665611728 +0.4747917055883935,0.4758826492678901 +0.544309914089192,0.31453800191250375 +0.49787461755565365,0.2750456332271473 +0.47980552909739893,0.22672760479275111 +0.6185303926207681,0.3841994701574305 +0.5747786164041945,0.33923736203673854 +0.2991795241706869,0.32453417767526427 +0.2852172553419286,0.1438244580757704 +0.41932004688406216,0.19593703740463111 +0.46870914099628797,0.17048835748884472 +0.4488048255254762,0.19528478377706482 +0.44022175667818103,0.16757953161545622 +0.46344128249126054,0.16928407544386956 +0.4820545613562917,0.18083629006263352 +0.49326965210746787,0.19787624471944934 +0.48476991055356516,0.20947879546070985 +0.47998571393854733,0.2058774530222223 +0.4850316345487629,0.20712083571415746 +0.48413407800545044,0.208797961405983 +0.49514997003379563,0.22078397862928203 +0.501242697217835,0.24763783804519415 +0.49555954335035246,0.2707449196894137 +0.470088124255431,0.27798396339969006 +0.4498887657929934,0.26030144087008084 +0.4510487019825961,0.23912233106514294 +0.4504228532124809,0.22526291005483645 +0.46068561075179826,0.21856805675118351 +0.4591441750333267,0.21673148863463537 +0.6045476197942079,0.3595372437268788 +0.6550358533583681,0.4271230100204958 +0.7824554443030197,0.4902959464395929 +0.8970178365330024,0.35565137851664785 +0.8405977487210449,0.5924734471313624 +0.8509489893555277,0.587666272927136 +0.8792293667423384,0.5652006266674594 +0.897140502891945,0.6334382889607743 +0.8813117742167687,0.6112635133675076 +0.8112444877283222,0.6021827457389116 +0.7530558108966638,0.554823159992194 +0.7317808866192996,0.48258167489667597 +0.6964744925205957,0.42800909266944037 +0.7031564712228597,0.4033334849961409 +0.7774496078164139,0.40613362179981666 +0.8606818914051365,0.4086031316390301 +0.8990347385028272,0.5141770838029379 +0.9108399152372549,0.6239855883489 +0.9050065278626224,0.6578748820086016 +0.8922121524435439,0.6648200152155854 +0.8826931714640249,0.6381316182935164 +0.8758364319432868,0.6136042473717255 +0.8691911100975581,0.5946850178703937 +0.8712450265517868,0.5885479448323686 +0.5767348408456404,0.33000463236633687 +0.5925057530153871,0.34406322229709596 +0.6461834311213442,0.4040418861990675 +0.6827470659922426,0.4730385242363844 +0.7183972596819964,0.3879361747441592 +0.7100655436217085,0.45743650183198775 +0.773920297590122,0.44048506007263477 +0.8591755628224362,0.44667464480269004 +0.8935408591848211,0.5227254627445721 +0.8575342893239701,0.6021843550643201 +0.7138093709645381,0.5582113264187113 +0.5005362629679867,0.45460736736863816 +0.11379441618440642,0.12760743494678006 +0.2656742930300524,0.03997877238888885 +0.5560092925791479,0.15890857572188105 +0.5227733254212749,0.2956468163965298 +0.4403484761529682,0.3915029464886882 +0.5251263379829739,0.5166182516335699 +0.4823916256224824,0.41149288402609663 +0.47114840147897347,0.3412138520568517 +0.4689272045891896,0.27212506523874186 +0.46125954387631635,0.2973227797977826 +0.421314895135321,0.37463653075507986 +0.3975425064396506,0.3275008200540662 +0.6104825734835334,0.3697551487681321 +0.6460276245799079,0.42011159644854307 +0.7790123223930694,0.5022578833864105 +0.921908020934421,0.3549171983048643 +0.9164807200046262,0.6432466504879082 +0.9375576972566997,0.7265001533067654 +0.9304258823003347,0.6938574311874935 +0.8914124369246261,0.7250726220648561 +0.857566356622858,0.6580678818483219 +0.8541437387107094,0.6101480720455414 +0.8499174117684434,0.5642297862136717 +0.8345714211112826,0.5485569832936271 +0.824116468394895,0.5262105463234629 +0.8227007388722495,0.5057629941259393 +0.8233190774571234,0.4939474163843204 +0.8291597365984182,0.4942202864480139 +0.8383429050092868,0.49397239073047317 +0.8456130027415248,0.5076018570213106 +0.8504099845528464,0.5163143275499583 +0.8533047437308863,0.5302263496592622 +0.8594127297039875,0.5384478567290537 +0.8666872381799388,0.5488681195392541 +0.8719969987502415,0.5605211256123007 +0.8751884698499608,0.5717902181684731 +0.583954453443756,0.336995899568362 +0.5332251786961342,0.29706579437191655 +0.32221794127062403,0.3196027277867214 +0.3900170028045607,0.24323266736752544 +0.4126767813985781,0.3198288380066037 +0.515806555726286,0.3269925712482307 +0.5034754872110272,0.5053806899344735 +0.49813634155085135,0.515579223466181 +0.5698544382809274,0.41067370759089084 +0.612781405423134,0.47176480278026833 +0.7516376375835826,0.5025010703370155 +0.908571600875778,0.4108974634273053 +0.928588986357724,0.6814399359408049 +0.921339869460446,0.7135475871641009 +0.8956780433277975,0.7198847529945724 +0.8590420484181449,0.6897784469282527 +0.8243960737835246,0.6209378836532298 +0.7977074980400185,0.5794691441570496 +0.7999587058684455,0.5420291422045809 +0.8134679197922852,0.514352798295679 +0.8219763636243247,0.5165374873399253 +0.8385477065687263,0.5301044581607359 +0.8538172244666435,0.5372705457858308 +0.8337600230819893,0.5437924264104014 +0.5728550553080839,0.33641913522337935 +0.4853716790471922,0.2788915633253916 +0.4383235573584214,0.3265987037556823 +0.5046649575021148,0.283265888599399 +0.43706393240043606,0.2901629506603871 +0.3188154399260864,0.22235688559975147 +0.3952690958810457,0.20208829634810818 +0.4442787170223249,0.2066470681953134 +0.43851140139642314,0.2063613235283525 +0.43929839132368187,0.19006362551268477 +0.46637797353689814,0.19015493982845114 +0.48917645213930205,0.20902746909061645 +0.48871859906047915,0.22143223874564968 +0.4710682332317539,0.21201804273428798 +0.47770088909046843,0.19838273518826452 +0.4936460256368862,0.2051772176556273 +0.47974124548801134,0.20628130429276742 +0.46508088705967304,0.19308161729294412 +0.4736723005572364,0.18847113841641294 +0.4870199858937415,0.19866150611178893 +0.4948027431756712,0.21868976943577553 +0.4908292591365317,0.23939880720984424 +0.48543536661013204,0.2546120881211414 +0.4853675067220581,0.2714543937759459 +0.5883873700848048,0.3457266091183052 +0.56360900399698,0.31858983625605813 +0.5662785172224232,0.3563414810936343 +0.5897698998203118,0.36393064248720813 +0.47624087331675663,0.3025264142966043 +0.28399366139170845,0.2401513754545351 +0.35344475506249273,0.19327595823717147 +0.3824169933635047,0.21162262552097585 +0.4400820731931558,0.20976221554652524 +0.4679334163468913,0.23932588092698512 +0.4986401796131166,0.2900915740982916 +0.4961424171715865,0.3494159876170975 +0.4722914993564278,0.33079910267629126 +0.4110330939119987,0.30716222514715685 +0.4379365145975887,0.23382586233211353 +0.48326650259845877,0.2917392252932853 +0.5102472305083192,0.37830668675593837 +0.4827100634371815,0.4153627751915329 +0.43294697998132825,0.44740957007253307 +0.4070185422726107,0.3208472727692293 +0.38084527848548855,0.2557236849435208 +0.386417686922983,0.3023781775450958 +0.38413333891206225,0.3165673314501932 +0.3910777866675837,0.29237040867893027 +0.6056825518353284,0.37277302133910195 +0.6067571639759387,0.3769694267485123 +0.642424046966229,0.3746691046934391 +0.4940030574590758,0.3003658055288395 +0.31055676935796767,0.2764964698851562 +0.4461488723567189,0.23374447218969902 +0.41800251601368,0.30569782843246596 +0.4500364064980959,0.29456543912904176 +0.46400538084939114,0.34910905349892585 +0.5096607804083988,0.34088909614989793 +0.46157184241260385,0.3670333920723107 +0.386183321459736,0.26147127143038695 +0.3778645396073638,0.2120428680688289 +0.4334757029827861,0.2316676675524613 +0.47033667562413395,0.26124513140818223 +0.48990818856085633,0.3306733964805006 +0.49105623362382683,0.42479142532924796 +0.5009682178286559,0.3874823151766637 +0.4943984746724991,0.43018379793569 +0.4818401336467213,0.4148826001733776 +0.4695507287781587,0.28163287034469303 +0.3829666971999226,0.36127930867916613 +0.4315152466115612,0.32143083204371414 +0.37531703708977077,0.4465735255228612 +0.5990834831939434,0.3574109374321711 +0.5144143104336809,0.28234079471046153 +0.18850043415230236,0.2301206588001384 +0.3371992111064196,0.158940970846306 +0.442075639944552,0.15181818599562646 +0.48732736704683527,0.18843156093229488 +0.512972712495204,0.23646983496652818 +0.4494432508756385,0.21519580476481615 +0.47878175971877984,0.23045760385694478 +0.5120666026853666,0.2819059788269656 +0.5263918041961471,0.3421434758987906 +0.5663891434431216,0.45074334726071036 +0.5493242740400004,0.7016894815084486 +0.683116197557321,0.6060050127931877 +0.7881407737400364,0.4755601583374371 +0.8760335445035508,0.5665007231788801 +0.8599787950153955,0.6032904384570595 +0.7869165539410462,0.6239475009809009 +0.6382264494627434,0.552556276142829 +0.36612698434243096,0.37329283344602016 +0.048294991252774755,0.07630118725218023 +0.28395429252383597,0.0408784746991602 +0.5470998883017212,0.09527799484034638 +0.6243967413639601,0.1546182631946574 +0.5745614766832868,0.32403194893854914 +0.46249520776710296,0.2545956968438335 +0.3669028282011172,0.29130467763069073 +0.3902094960048547,0.2758334874215338 +0.4458725452235518,0.2917594312678576 +0.46431836483909356,0.3132506011904162 +0.4048811197110551,0.2749838232105352 +0.3662842511976642,0.21226006739432024 +0.4316506683644852,0.18231651181050718 +0.47900933025252274,0.19933682673687583 +0.47586607931042474,0.21270152919570648 +0.4788646101750142,0.2259703575834469 +0.47282534835733614,0.22891896955721014 +0.47508198020843745,0.2215959429024724 +0.48336920140140244,0.2218252419708492 +0.49419304726428936,0.2320382892335549 +0.4982327222614491,0.2529447673933783 +0.5135778188489383,0.28986564269234355 +0.536184251285884,0.36532264936084274 +0.5435754060516558,0.5384184120345442 +0.5692099928616431,0.6915483472496412 +0.6827925443362043,0.5689250824996908 +0.6949010491078811,0.4975742100061188 +0.6655850410181415,0.5682090519022355 +0.5750040411707255,0.33517631877556936 +0.5755723118539902,0.3384307025769315 +0.6334875821800754,0.38492795812563985 +0.6109386682253355,0.38864868866757396 +0.614534497235194,0.34281331289656 +0.7048219442071036,0.38151237356253476 +0.8087865113871782,0.4306180475750608 +0.8936067223172951,0.4037638901359249 +0.8337043523437715,0.596325397298727 +0.7885811328556185,0.5723595021305389 +0.7244752645187769,0.5159953234912236 +0.6406059860913665,0.4874593613956488 +0.6041699051602821,0.35594961035668515 +0.6084558963519658,0.260381936942824 +0.5789058208222032,0.2532829045430798 +0.506038784959485,0.29883968820450363 +0.3524394631237533,0.31107372035463293 +0.27904433010834734,0.2344217299657405 +0.34000879524707894,0.23395234338828602 +0.5487244724996508,0.3023835419631239 +0.5175287127277088,0.415501206978979 +0.43755981324262405,0.4026136098990988 +0.4933860301763869,0.277370035558702 +0.5504339933163819,0.21508455269537882 +0.5522851943737381,0.30468261232065724 +0.42058512566704426,0.24940332762287062 +0.26916933058559994,0.22489657990816528 +0.3508129715771908,0.1992590128731467 +0.44102877376608346,0.15363705153268206 +0.5116788148664743,0.21837186806296874 +0.5005033015994274,0.25783795109998775 +0.48269212243910486,0.27775442591273425 +0.5024083852556582,0.3043411969154941 +0.5281240343825365,0.35508662450758355 +0.5442038774261411,0.49773243053562394 +0.5946683883416817,0.704123198758486 +0.7815027832656147,0.5973526237464541 +0.8886549472434982,0.47482547148617305 +0.9107269644354102,0.7101946470826346 +0.8726596235861817,0.6850218770674243 +0.8554785847303982,0.6830168364224729 +0.842668652499034,0.640336513312335 +0.8174304961814312,0.6124642489361197 +0.7758389115007164,0.5735955236488466 +0.7130008935628387,0.5312377212714842 +0.6064957380039648,0.4633091686658746 +0.45854979751565156,0.28515195837341717 +0.36102673409850494,0.1674882471020122 +0.563894808268666,0.31549745787914313 +0.44640278814345136,0.25360083571820896 +0.29799273608861404,0.24898120752870773 +0.3647741973246656,0.23366379730302161 +0.4379425942713555,0.2016924917046051 +0.4936472773344264,0.27699726811039715 +0.4531108438778036,0.2713494299965304 +0.4083351194686765,0.23487663261451927 +0.42078506944793487,0.20038396113595147 +0.44856154916783564,0.1871330141416379 +0.4726912677089195,0.19070675962960337 +0.47691300509353807,0.19729390734018198 +0.47237071392933094,0.1949370204772352 +0.47701516745467876,0.1919502019261833 +0.4793151020802076,0.18835514777771753 +0.4845338165556198,0.1864984034889194 +0.4826028942858799,0.18602553003974667 +0.4867699444089193,0.18766248220100656 +0.47416758535297665,0.18609037989324134 +0.4869206249509051,0.18889743083570876 +0.48933535812226653,0.206157982282767 +0.4759097397127209,0.20871138565947472 +0.46246880290946857,0.20328566425429162 +0.4643589556021839,0.19641461962073958 +0.5859191417447597,0.33803495753807317 +0.5893725156536109,0.3428677021348999 +0.6289358138773494,0.3800240157806519 +0.6239041685795569,0.3958097695025093 +0.5693358778714034,0.32490465034474597 +0.4335550069626564,0.3512657581624592 +0.5023552179125208,0.2940499781611908 +0.5467338561781709,0.2892918585795987 +0.39948859809148524,0.31787073601939786 +0.36604261396775495,0.2567105292444256 +0.4055392145939925,0.29766893377220377 +0.45737701652510027,0.34589755523946575 +0.45362693069456955,0.39441502081521596 +0.45621868966090645,0.3794738053049081 +0.4159099757496384,0.36096587765471605 +0.4613245725437636,0.30791425695004493 +0.4654381871027641,0.3743997215014638 +0.4425968825630909,0.3438648282370252 +0.4359010159785947,0.3400958775374834 +0.4312869012174363,0.35381299245843467 +0.4659249484343018,0.3667292593724426 +0.4409089386277676,0.36317241180126547 +0.414901912194917,0.31140315522620005 +0.3865884542302573,0.2670550643534633 +0.6281756162379161,0.3897830246619278 +0.6521701812469775,0.4365059135933605 +0.6889392733284079,0.4101820586786199 +0.6568389534673925,0.4054362176538476 +0.6329442262383258,0.3626933692713605 +0.690113663644368,0.322142958536938 +0.717570424049707,0.34109678853455067 +0.7152421474155887,0.3807941971978682 +0.6970858573620312,0.3693349360226014 +0.6395326852529412,0.3327854274627892 +0.6724951266959515,0.3219086526784017 +0.756721019713038,0.3984249828958291 +0.8400208353642882,0.3970291017202854 +0.8403489589337629,0.46171456560471397 +0.8369743823653013,0.5706391928735876 +0.8616864084834939,0.5235730407930043 +0.8214619159352899,0.5541840193864741 +0.7648882865583975,0.5431872008475477 +0.7553238868395615,0.5068680642397179 +0.7205896377260326,0.4433985053059919 +0.603845834706652,0.38775965558871395 +0.16132274269378996,0.18206387752370834 +0.20836192368584486,0.03083941339449765 +0.5290840267912487,0.2194481789356525 +0.6055253743870623,0.37032255518388807 +0.5904935002078546,0.35976636398132134 +0.6221399306989244,0.36379855859442856 +0.6093653440219106,0.35294544685400925 +0.5892409085979524,0.3378338216643436 +0.5851730108014928,0.31721243252038883 +0.5321224927678359,0.31970968832173624 +0.40100634096365956,0.3167760967184516 +0.44916805623072215,0.24596321574844837 +0.3856785297231545,0.33609220374689197 +0.4226477742017322,0.29989248504483107 +0.46666064856473355,0.393982648722155 +0.537029564358053,0.5202871559368885 +0.48777607081268554,0.6810142991726014 +0.5213699340600974,0.31480705727893293 +0.20772022008021998,0.37663352477298917 +0.3621713220920786,0.181063592375411 +0.43244802949993444,0.26257908335782437 +0.46126905081715763,0.36739021527814325 +0.42398750780229233,0.4533194004024254 +0.47142753003044485,0.4244931934892107 +0.4382947683149961,0.5291098950583352 +0.4398058950716006,0.46797427519932483 +0.4493864178468476,0.33146071423308426 +0.5785269737000267,0.3389151691295093 +0.5734040736910869,0.34019535768958137 +0.46749621627748217,0.33289840806692444 +0.24650353192246047,0.22220230095357646 +0.3374616205550322,0.18864056461913223 +0.4247996210873229,0.15145274991862664 +0.4564775228308327,0.1651954054298559 +0.4828514158522604,0.17451319092832457 +0.4648143648905711,0.1704595982477499 +0.4763950407304617,0.17490929359505142 +0.4925322830469825,0.18824243539448368 +0.4880491792950349,0.19956663244473308 +0.4695968031685681,0.19068789475953807 +0.4697102010052485,0.17962247127449738 +0.4866293966565448,0.1847678720353924 +0.49299603698563793,0.19975197308760226 +0.48048305509453226,0.20597439997691813 +0.478861510733486,0.20878875248836817 +0.45513865349762184,0.20057678216173755 +0.4593790173337319,0.18440300220251776 +0.46034070847481995,0.17781299346899088 +0.46488654611539104,0.1677873134070761 +0.46817794440207205,0.16339495772802995 +0.47257661817469887,0.15962278837767133 +0.6111960410814649,0.3780250846117881 +0.5161425471088708,0.2846786676917311 +0.26632916926217204,0.26587784281720744 +0.3703623711907025,0.20533704751054085 +0.36317351458928987,0.21002438657648506 +0.4154344200913179,0.17971792811307433 +0.488934755304748,0.20702341192230359 +0.489021748283794,0.2347159086899344 +0.4983536600856933,0.28478962173794464 +0.4522018730450171,0.27274137726552017 +0.42161220310344816,0.23894593111898718 +0.46821382639822534,0.2254910766349629 +0.47842085359468006,0.2476707398090995 +0.44166952369739193,0.2300914227218855 +0.4437502026371238,0.20483225577410122 +0.4704774021904427,0.1998209356615851 +0.4817165434157847,0.20318785303224682 +0.4829188883101433,0.2036984264192278 +0.4909471571238925,0.2088558375160412 +0.4837878048216424,0.20813378684946546 +0.48819696901174925,0.2050351201825287 +0.4837945699488241,0.2077844738288722 +0.47633597252749177,0.2030508219539525 +0.45931270716642203,0.19127196067350336 +0.5877724885693277,0.3472002147506109 +0.5468780398138765,0.31497260917974307 +0.5130330323957142,0.3520104883963646 +0.46898576615267895,0.2952647804259654 +0.42213994262826726,0.25278514615472136 +0.37678924201333863,0.27660652986169837 +0.4178551733318014,0.2822903393786755 +0.45222991703038273,0.324509322538401 +0.4760541617670056,0.35407847154617844 +0.5108397006773616,0.4023911057602242 +0.5118342041753972,0.5866793988239087 +0.5912790298213164,0.6391060946306343 +0.6847147941301297,0.5309166310501828 +0.6181306838729211,0.4785293041113188 +0.420004934054825,0.4420461355211201 +0.1009929478126,0.1564470529050649 +0.2980545163029211,0.050573468191968014 +0.5147705077908437,0.10563009973926811 +0.5970554947601908,0.19131109112278574 +0.5569784044985102,0.3115856646484433 +0.46958610413483143,0.3441389201959362 +0.4782757460869805,0.25811868897678913 +0.5318501591458685,0.20500937097599406 +0.5398104786645767,0.20387873046961508 +0.5650320052862878,0.32365334023505826 +0.3866091966466383,0.23619049779887857 +0.4258770346462375,0.32699817408483783 +0.523645877816105,0.3604666589525611 +0.6090254783374155,0.38065308320140806 +0.5528497099643821,0.602940320773762 +0.6906703710265467,0.4692986606034836 +0.7286705374411162,0.4616918562350619 +0.7273991107634659,0.4556935428100291 +0.6619812249858835,0.4980680642902457 +0.6660703420358823,0.41118001924577174 +0.6591116785725826,0.34788486350260217 +0.659427046748076,0.3319038449645237 +0.5916206836451546,0.2747926711148023 +0.33399993179823506,0.28886032095156433 +0.3347423672535261,0.17255252594139414 +0.3799191713173299,0.22456908218755275 +0.40706169603542625,0.2895879744547471 +0.49613788721858376,0.5133644936809777 +0.4899928867610786,0.6117531655241791 +0.43935933707296215,0.6414818761659687 +0.4973680674820513,0.42614987478788485 +0.49717515704924387,0.44320103511791487 +0.5140264630101438,0.4664516447467072 +0.6356098055572139,0.3918873368427205 +0.7247626781158717,0.5070450900346436 +0.9248955249397275,0.3930052815597664 +0.9479994773465925,0.5040931700030964 +0.9361553787791281,0.8122852442023496 +0.9297138452138779,0.7292799947289016 +0.9197783469766859,0.7346252200613416 +0.8751122951139411,0.6785032746983153 +0.8438095450046317,0.6271465418696069 +0.824074983562133,0.5535136459469019 +0.8046573400158918,0.5180588958973255 +0.7897294759418129,0.4826449154247622 +0.7790398597389545,0.4576810894917445 +0.773405671087153,0.4380090831294653 +0.7523717879932502,0.41384088979697475 +0.6709965467170717,0.3631007670182686 +0.5611082911255337,0.265217065725441 +0.27764961122298426,0.21537157886220196 +0.4302358031091889,0.22367691986484303 +0.49905389545248513,0.5992758272141554 +0.5682321190594991,0.6876274941129383 +0.5947287082421918,0.7168459889956156 +0.7822701334624209,0.5913595555301598 +0.7771017551095194,0.5289205311019449 +0.5367276072276336,0.2843381463562394 +0.4138257503335426,0.2359274326992474 +0.3957249224019463,0.3186458944244513 +0.3606271445599475,0.294888734722199 +0.41403156517194334,0.2533411978856513 +0.482123374918682,0.2874136566186884 +0.47545221445944424,0.2897613345640203 +0.4390056133085575,0.2953309415816447 +0.4611736535831986,0.27534624925297485 +0.47682341931244443,0.2974769174091219 +0.4859768152032489,0.31191530813626706 +0.4826675057208137,0.3325965999482018 +0.46888056395465477,0.3366270660266111 +0.4247970580875976,0.30423289527597225 +0.4076098203487577,0.25380313388251124 +0.4159026741806537,0.23419830195487218 +0.4520066976357083,0.2330591081819707 +0.4606023728653729,0.2396054863155361 +0.4621163308426042,0.23371580235557132 +0.47099453208849223,0.22681903831780703 +0.48209628460763276,0.21954035751876785 +0.49959555266185873,0.22442939870256676 +0.49027106163823364,0.22640115015342183 +0.5052682757165059,0.23594146959308748 +0.6376160382956244,0.3976591824200024 +0.653853058787495,0.4256996809060419 +0.7698677777920137,0.4775139091855758 +0.8622518777484542,0.3620199559949058 +0.8028796910901854,0.5468658207079615 +0.8837884664163714,0.5831578968070721 +0.93612992759581,0.5603406427479791 +0.9007787704088818,0.6820412872017494 +0.8385549783353887,0.6565637586379011 +0.7761014699609409,0.5673547385289459 +0.6648076772410136,0.48781600578754714 +0.5054696798111935,0.28639161577505506 +0.1591935753755354,0.08079415557157468 +0.2881283163903138,0.045908689484064014 +0.47835284469499423,0.1296049058018474 +0.6157051920631782,0.2556017040380274 +0.5560878515009585,0.45759013280384664 +0.44072076676421956,0.5772045848888301 +0.5516320466763169,0.389822691553013 +0.5364640950930927,0.5183838604205359 +0.5601218342545424,0.4230678974214798 +0.5453358292350229,0.40952241407510387 +0.49041026828610074,0.45179560765923504 +0.44374138114969736,0.4421477912427517 +0.6136263012627896,0.3739925025684899 +0.5469769239195547,0.3055092095341352 +0.1555090248519325,0.25694423905651437 +0.3037359118333828,0.11696818467174569 +0.4739998280802634,0.1488369106765369 +0.4944518804342156,0.17553102964450257 +0.4772517978944271,0.18860492104156806 +0.46775081751762954,0.17476591462209054 +0.4648998677534978,0.1819566189654697 +0.48095276949766497,0.18608504527753567 +0.4739355444708758,0.19520902627357978 +0.4810254275596431,0.19820863002093186 +0.4944319426805391,0.2202599047902638 +0.4916658103259191,0.23658525936109842 +0.501494348028066,0.2588606773970358 +0.5093506574416454,0.29683771719875723 +0.5085290074134513,0.33104449499875227 +0.530876159645635,0.40218654261942116 +0.529898822285294,0.6619834301716414 +0.6482445001329458,0.6580671069879401 +0.7041404246987705,0.49990627153452466 +0.6504941582406087,0.554054736911998 +0.6316484808656081,0.5414307115712294 +0.6987941860858667,0.48288694008479444 +0.6452885865893689,0.4051091073634259 +0.6540347337447627,0.4259494541698924 +0.7492405175847516,0.4663814900798292 +0.8635107278460575,0.3737397490724016 +0.8381607532148608,0.4800183771489387 +0.8357826470977123,0.6010162232363895 +0.8766651749242089,0.5143451689011502 +0.8832010626421347,0.6224980352297214 +0.8787438869106633,0.5985516903850132 +0.8376080989485266,0.5962175128917184 +0.7723840474757457,0.5495696662080337 +0.6637456416804504,0.4708240626720824 +0.5058987736489134,0.2669700979323635 +0.2345337271591701,0.09266102311000625 +0.32797843216469935,0.06530830261980775 +0.48188883064150073,0.2135276495720264 +0.5881892442455797,0.540478586975895 +0.3859583139257184,0.652225017336813 +0.4093913733786968,0.39814728485591033 +0.4489554166604949,0.36047935474189413 +0.4883376657757356,0.2521545886178463 +0.4404315352254592,0.34762555349559066 +0.45746830103856995,0.3448230027038023 +0.43470498917658207,0.3304971753482791 +0.5605644583466259,0.31837517012796895 +0.27734848855759164,0.19324409955454933 +0.22084653376603863,0.11590489741394114 +0.4092777371234373,0.12433135505472669 +0.5599635839226704,0.16683039063783883 +0.5423549413452863,0.2411127089674843 +0.5108889937185888,0.2526223062652476 +0.5058317780281888,0.2865991591480959 +0.512072026708041,0.2995089291558254 +0.4570165276335139,0.31325611462005615 +0.4420559406094546,0.26058411589783675 +0.413988888246286,0.23474952570957683 +0.44600301979095963,0.21999058120293324 +0.4794160425461305,0.25347936145219596 +0.48388829825272944,0.29828754057780527 +0.49720638988310484,0.350541144496159 +0.4847259521280452,0.3826981185629908 +0.4510465264130619,0.37445774662313386 +0.4393911063486261,0.29881942262528655 +0.4510806500721944,0.3071484564742182 +0.4482279419710418,0.38569492089203933 +0.47337448594962866,0.4747387467280529 +0.4226759671987098,0.5873286126145926 +0.45545268056860777,0.43196031437264637 +0.5734766125437756,0.3286247848402325 +0.604735493634532,0.36269801843365146 +0.6687577962594021,0.4460042415607955 +0.6839376687715809,0.4280575810479495 +0.6696765422539314,0.4111947415930265 +0.6475008725847593,0.38514426338145985 +0.6602301001271009,0.3171317576337114 +0.6542120575629621,0.287069857027735 +0.5960986613976518,0.28837281456210395 +0.46309864519078364,0.3043215273827246 +0.46386507151559575,0.287186205294299 +0.4166777729812803,0.26129370919365846 +0.3001476526134104,0.26676821700057446 +0.35152894257020273,0.22106441848285963 +0.486749947050598,0.2777665852602645 +0.5181410908481054,0.4625206886227182 +0.476968914250335,0.493069469769385 +0.4570614099310279,0.4790839849354193 +0.4437982439808107,0.3982458411360146 +0.44401195643464386,0.2648615836241155 +0.429211735707346,0.353884279613563 +0.4096266925162601,0.39595931755620245 +0.4265447854816281,0.4139770268055977 +0.44932895896928654,0.49684920890962764 +0.6112521290521962,0.3763222395157503 +0.5468841194876434,0.3081949352222015 +0.2406365573304984,0.3010067938785469 +0.30915683506618696,0.15151813621392413 +0.41527062652748203,0.19012856477314657 +0.4953868984967678,0.20999014370807267 +0.4905894100459656,0.28876659264768534 +0.48988708851660673,0.2730307578158112 +0.4863179921899289,0.3268672822849534 +0.49688965080078173,0.33202296484706884 +0.4742905497351431,0.3240578769590181 +0.49954539535328235,0.3268050252335056 +0.5042313933160368,0.4776551423913254 +0.529984891392346,0.672881960651365 +0.6515929698669968,0.6144504545133281 +0.7555556296984386,0.4985848067579589 +0.8029129504819686,0.5111188290851458 +0.6761786341382708,0.5514806507235599 +0.5703848004101166,0.5424484012757955 +0.5856109857312839,0.3858100770657082 +0.5794442295784367,0.3275156616106105 +0.5708753466365974,0.35004422057282714 +0.5420970916519988,0.37805837380588436 +0.5743128061052943,0.46125555023544706 +0.6075564622623431,0.37136787164129864 +0.6520053147995356,0.4372923968809176 +0.7789847254425396,0.4760197101485068 +0.825982928241313,0.3553783892436648 +0.5971351861702522,0.5453630087997253 +0.4501591324616832,0.3220946787746855 +0.2437958717243627,0.10686784979227383 +0.4343739449795134,0.11787524815564443 +0.4247542321503283,0.23802977792676314 +0.4021866023371298,0.2287886141991285 +0.39675703643083354,0.2275419532517317 +0.4503397345353451,0.21284574263369394 +0.5116254091047577,0.27126544705206895 +0.5246262550133295,0.35545104730562255 +0.47566208241368957,0.354414641742603 +0.47130468485756793,0.2855502962143223 +0.48928588626710506,0.26237082472904644 +0.4983658790378717,0.2567191123132705 +0.4744833707609834,0.25658220044426566 +0.45438751576419395,0.24000859252802179 +0.4528324603843918,0.23029193274684515 +0.45903679726576835,0.22350352995324746 +0.45478335021013067,0.21160084002331747 +0.458036601524157,0.19697669142078986 +0.6083993315440764,0.36823064076920464 +0.642728984328887,0.4246156214295398 +0.6777049302769701,0.4092229305375267 +0.5650791525603032,0.343388765939358 +0.1408543884694924,0.30820751180224504 +0.3373301625109856,0.10507673021735223 +0.5145593285344134,0.18874171370128337 +0.5437554120788699,0.33283752192230603 +0.5227715968865765,0.47885385140201586 +0.5209192037363248,0.6369379756776302 +0.6073617338878701,0.5212638376458624 +0.6687161326127059,0.47931212171322335 +0.7107887863813827,0.4436357019897989 +0.6166840195396385,0.451538622233369 +0.6006600856528309,0.37670415627702514 +0.6875354051300722,0.314924359219813 +0.6823456287096972,0.36318767059032303 +0.6106211542826304,0.339673638234031 +0.33956879375936555,0.3313090204121799 +0.2773299217107449,0.17520278686583057 +0.3678018152559042,0.16974356765029452 +0.41558495162169184,0.2574871181609532 +0.5030417442110149,0.37830811726741254 +0.45436727998729354,0.43328112349811976 +0.5474330186613569,0.3017687796571092 +0.36651915310271416,0.2249682842958069 +0.35704505442070916,0.27156233778759925 +0.43951725957928794,0.29427564134623746 +0.5674267410993279,0.37529045331269933 +0.5218565463800231,0.6043684480621189 +0.5805522799247645,0.430831611017222 +0.5203308462877717,0.29583734264349276 +0.1771132945939893,0.3094608484698545 +0.36657693980582146,0.14150515194134236 +0.3879358172253483,0.19626349204396043 +0.4224383830846451,0.1676481663638929 +0.4711673855583336,0.17308914655813357 +0.5050694346215436,0.19887861603031312 +0.5279320478217231,0.2681613563624594 +0.4916601180823433,0.29540646066655074 +0.4818534850871504,0.25918853274551684 +0.5133226513646656,0.23787218324602794 +0.531883656956231,0.26103639594224626 +0.5221475958604491,0.29610145082440714 +0.5149974822781388,0.3328824936267746 +0.49041190741383195,0.3854274450486962 +0.46763259170472254,0.43124619112382323 +0.43662565944742104,0.38696950661550433 +0.6574584245405172,0.4168972073638123 +0.714993536442241,0.47406762823042126 +0.7543817758242813,0.3823379872993743 +0.6505991816246985,0.480010360324219 +0.6056685447438067,0.3853808640188193 +0.5777387618775501,0.26133680335181714 +0.4839842617308138,0.25186702600922034 +0.40552687643252455,0.20135894411254981 +0.35325083135072416,0.22072666876334904 +0.34596955774759114,0.25097990027899253 +0.43856066463532795,0.24731513849848447 +0.5048014521386447,0.3711341618292099 +0.5588327049973946,0.4846085904462528 +0.5006998181132435,0.6525238750256203 +0.5677635669469395,0.4806907473441102 +0.5272150039451053,0.3943400977767575 +0.44743394849802226,0.40972867594828244 +0.5267310738341943,0.3956879376086278 +0.5883600711574988,0.5741816757253784 +0.7029469012918383,0.5464304683826628 +0.8425681590679469,0.4123136697867109 +0.8695712089172748,0.5674792526318414 +0.8925006389242447,0.6596400139584095 +0.8577533959981553,0.6074438093129559 +0.6286975145075474,0.39042192684906873 +0.6384499668806418,0.41253149496097213 +0.6984465717975513,0.43655669675069275 +0.7629449367202225,0.41430771337470473 +0.792061209645328,0.40794327841925737 +0.8442590832355088,0.5173848865744232 +0.9352590441310334,0.5281992552957511 +0.9309686421956366,0.6552748081950498 +0.8849698304757699,0.716034948594419 +0.8118067979471096,0.6169314382466572 +0.738233149020609,0.5607315896129346 +0.6870791911789804,0.4736577270884334 +0.5714731216190246,0.3021638392425528 +0.07969209551475956,0.10915887352276508 +0.2283118665122303,0.03195711969296454 +0.5304666757360452,0.12380287047199648 +0.7002859115305977,0.25555917612399387 +0.5438662767181475,0.36484551417956995 +0.46327611802059493,0.4585092364259861 +0.5277325510756683,0.2772622703609829 +0.594726026033177,0.19371250265536533 +0.5779797434563669,0.21531644456580254 +0.5430215000877814,0.2881389855407257 +0.505750596502008,0.33509269345897646 +0.5993006825194958,0.3577132521903742 +0.6206243037916395,0.3869334160031045 +0.5935178994882755,0.32618039835878376 +0.5012714862612603,0.3727401493775189 +0.40601876376351276,0.3188163935107762 +0.480348229388056,0.2422448991946269 +0.43754243848867275,0.3432630895458897 +0.47278088329233553,0.3088753222420927 +0.45157492158897355,0.3654042481195139 +0.4187230169596946,0.2782687245900125 +0.3705648779713184,0.256874442017505 +0.40521013735020145,0.2395794092834553 +0.47538259623434953,0.28629219522760185 +0.5003605484751963,0.4017840622557054 +0.4735962152281838,0.4200212358070928 +0.4297078549681131,0.38660934554956544 +0.4176668524566415,0.3110461830087556 +0.45556062458029145,0.27536332598369745 +0.43205419180959764,0.358368068817665 +0.4158509969536356,0.309078723092323 +0.40993699429694774,0.30070453872498853 +0.42037913201470917,0.2717726825789436 +0.44694355128315333,0.2648570834734364 +0.44095098970465485,0.24777811757662768 +0.6010720133528563,0.35968422878084744 +0.5972038507210305,0.3527881799988202 +0.6860846280763001,0.4644201694418065 +0.7758910059602478,0.44665330633986733 +0.7877793907787785,0.3777394591541167 +0.6655897497850786,0.5282131431779792 +0.6914624571509335,0.44764491901235265 +0.7622021436370627,0.4282295404480709 +0.8640444874399987,0.44362583742109174 +0.9309237002934778,0.5391321180508541 +0.9271843432990062,0.6756808755598231 +0.8800787925349968,0.6946982143064234 +0.8209733962667314,0.629112064635085 +0.7867467403080882,0.5624629257291658 +0.7876597046520745,0.5067633388788814 +0.7889134883548721,0.4709551630882235 +0.7667732834493399,0.45656630382087066 +0.7424404620811924,0.4520714877574888 +0.7289682626417567,0.4297009109061983 +0.713086605042022,0.4245375393449093 +0.7036682963075245,0.43050903067980184 +0.7754006385477014,0.514212727380502 +0.8630464076632768,0.41803061948617243 +0.721939802139428,0.5342287419499914 +0.5890721678486004,0.3480388521023296 +0.5505947470433344,0.306768089433707 +0.6242185830807339,0.3859192131702566 +0.6236869096493598,0.4923106132346724 +0.5761140584703309,0.29136264314771604 +0.4850665926729222,0.3642550407662934 +0.6282449960444316,0.32757282246493163 +0.630013763878067,0.5433231590422364 +0.68332511183725,0.43005153522897616 +0.6845217942903551,0.41867279992877493 +0.6918317079253016,0.4284588991210925 +0.6137871145943868,0.3238613902475795 +0.42996746299842137,0.28842294206834385 +0.41465049980326496,0.22107547514446188 +0.42939281461816603,0.18119958037242212 +0.30869746206892235,0.3046705721824165 +0.3994598984550271,0.2752426563803887 +0.47778284547703115,0.4335458575278041 +0.44573241470369074,0.45113900289260156 +0.4645538031859464,0.3913873730825061 +0.46513232586811204,0.39711695896665594 +0.465382963399382,0.31949233998463306 +0.4581730663583645,0.2857084869415051 +0.42735537884821695,0.3192334770124572 +0.554806232429052,0.3102219699810679 +0.37306129930834103,0.22470441453347154 +0.3472277223917795,0.2601130901926515 +0.40832805631827096,0.26724076262420104 +0.44744360445047543,0.2387058734122319 +0.46480414269399256,0.2724310456825974 +0.445122182350506,0.25136941663247386 +0.42013534901758803,0.24033156029563288 +0.42706084249607174,0.21029421680329605 +0.46765056250512155,0.21486946933477633 +0.4752297401228294,0.23042029134932746 +0.47494056818871383,0.23926931611911156 +0.5042871832635443,0.27675643554326 +0.5205269455690744,0.3331955670233561 +0.5136696696065334,0.35075336683381314 +0.4914311170371259,0.38495904194788017 +0.4897892772945344,0.45884722456407573 +0.527242898918859,0.5926527975074336 +0.6329466104241167,0.6032732723193698 +0.776668310132731,0.4902712403143415 +0.8549012541411279,0.528858661480688 +0.8660597800844146,0.6455827949344798 +0.8516659736275006,0.6120936868596709 +0.8101207613604191,0.6411394474818448 +0.5882974862804873,0.3407506941647742 +0.5604387521507999,0.3154540955000831 +0.4956031739503262,0.34792810667237273 +0.5535641312366298,0.3403667806479 +0.5795301794761991,0.38015085446469293 +0.5949926972138909,0.31789875020243324 +0.5231752395409784,0.28856888404102926 +0.40138411520223005,0.3009055255871062 +0.4708451628486914,0.2554378508695928 +0.4371535181815297,0.42971760020673 +0.5152570605061247,0.4600399135056458 +0.5188481211444014,0.7225852010298934 +0.7160342335399754,0.6125265953945347 +0.8384828567152135,0.4698046742351407 +0.9033875465013013,0.5882024763113621 +0.8995330929377733,0.6877661941212859 +0.8537980317710266,0.6415196655107441 +0.7674405574475723,0.6256647704009697 +0.7055505513848074,0.5613372324083016 +0.6166827678420983,0.46954196676337806 +0.3035572767129984,0.22539770595895242 +0.07615870237030066,0.03434541820369778 +0.3711516260944626,0.09533551332253604 +0.6821166872691246,0.2223842739340169 +0.5997139215217062,0.3629901407976012 +0.6141024231652354,0.3896785973243151 +0.5951879620301669,0.3239897488500618 +0.5458340644606795,0.36525157082197107 +0.5389631390344853,0.3242848514462494 +0.48558062312944356,0.31098145236455044 +0.3412534892415487,0.2564851640826027 +0.3740378022036552,0.2451229392689989 +0.39788243172879034,0.2897065876978118 +0.4253299236118672,0.26899123183139895 +0.4376904666239662,0.2848377822909076 +0.4577346145914152,0.2885121702215438 +0.5105591416144156,0.36176681506862646 +0.5433839559326453,0.47464740260996413 +0.5237848162430707,0.6801391837782919 +0.669827282400562,0.6531933543955211 +0.7907779216433679,0.4947162566970297 +0.7852510213521575,0.5366282461339387 +0.663214564295524,0.5946544406876338 +0.5632238387824576,0.5064274071010358 +0.44049045441681717,0.3358151911603879 +0.3125737607347596,0.22134259335993647 +0.43751257656164155,0.18585965031339038 +0.37522873280853974,0.3259858786006221 +0.6137340068558942,0.37187612044713414 +0.6631981730182115,0.44360238299338023 +0.8518316745399693,0.4983129797755486 +0.9369181394182867,0.3661517499694005 +0.9025353192903386,0.7871456143696237 +0.9012808203318038,0.6336258647778217 +0.9170963167758406,0.6955661771433621 +0.8937882184606285,0.6605519054185335 +0.8790779709446153,0.6650964615579644 +0.8543336391089558,0.5994820592850115 +0.8312336206086459,0.5773839948695461 +0.8176287412299458,0.527612447568127 +0.8187105655325736,0.5121721623672761 +0.8246921300541116,0.48436808570466183 +0.8221361636769607,0.49070155604715837 +0.8288065194734942,0.4899527130927648 +0.837276816332879,0.49094989879953477 +0.843028426134883,0.5047369001664626 +0.8458369969965813,0.5104780791540174 +0.8488584756494083,0.5247631667348498 +0.850762844049902,0.5229624508121224 +0.8486870526910415,0.533870041197849 +0.8509305715202928,0.5339304207029869 +0.8528085946677968,0.5365016458684767 +0.5353505611194457,0.28281959882178753 +0.12227094172917005,0.12080091234117653 +0.3121767938005722,0.12402355666920604 +0.5145829915783883,0.13830572362244536 +0.6062721609814218,0.28284221878447247 +0.5708556174991776,0.4536100028479339 +0.5962359308945637,0.29470783462536415 +0.5059169530655692,0.48246744259500085 +0.5913858413447495,0.3154350518160835 +0.5845369696371213,0.4088958500494274 +0.5568972229723295,0.41719883666860064 +0.573246598219597,0.397871911397137 +0.6629290580470619,0.44082164750157266 +0.7385007738756392,0.469635218230099 +0.8073906898158868,0.4109309314353359 +0.7293171882322572,0.508168041541849 +0.6732345819190039,0.5192258356323609 +0.6379219293325988,0.4329901634247427 +0.5348829626812024,0.32813101996307276 +0.47731879351515183,0.2819418906254312 +0.5403427481423985,0.29015037408034355 +0.5624683499099613,0.4172067044817085 +0.5772319435830463,0.5982691047642243 +0.6311985254022175,0.46707868560954163 +0.6207501291967551,0.38412260996801745 +0.5949555039155526,0.35769402969244035 +0.5582054853204496,0.33676353086078026 +0.40648561714369635,0.3581050633226786 +0.452829003314995,0.25845932952157036 +0.5021145343569279,0.3112928866334012 +0.487737625816807,0.32606211294126525 +0.42826464770422723,0.2908351420416243 +0.4656834304136821,0.28073048582540766 +0.46707794068278846,0.37156850087554777 +0.46242210267028905,0.3384917973378065 +0.37146505711900085,0.29972350587694746 +0.38405868409448424,0.243603914897389 +0.4699800312321354,0.2963759302135091 +0.49369299409696726,0.40536087738287585 +0.47511127589134333,0.42609149203834623 +0.4690456390183533,0.4895488618222196 +0.4547642767238033,0.560793578443481 +0.49477756021325464,0.3620970844052202 +0.37288534639697146,0.3764033018326186 +0.2726443409805038,0.26450115433727517 +0.3269841372829205,0.20951700203799853 +0.37762597201666037,0.20804601901006206 +0.45956397054646214,0.21582591526685552 +0.5956385731446499,0.34983086574692257 +0.6279453038905136,0.39118543254607235 +0.7256162166290194,0.5090131757998462 +0.772733807531273,0.36873680341247367 +0.685766339273213,0.5222143529157883 +0.7642492651617874,0.46199923738806925 +0.8192473053587535,0.4039451776629507 +0.8034652471204342,0.4964788554494355 +0.8103522061960722,0.5082204340245896 +0.7927027940416633,0.4945271907638632 +0.7195480465586265,0.4989865420636152 +0.6200224756933677,0.4327783881219242 +0.47408914564045557,0.24797150484653893 +0.24249058960848133,0.1016063093810715 +0.32060217856012074,0.05817699430492809 +0.3864796757535468,0.12564375992528945 +0.5314410924687922,0.17630833381676722 +0.61359471080106,0.3807288705072155 +0.44868552682896323,0.5290201304633324 +0.428392648678877,0.3783778547017772 +0.5488893389470927,0.2364580928515112 +0.562100231623844,0.20226588838715906 +0.5138916373036676,0.2497811912683021 +0.45878967640854,0.3016594051339817 +0.608756601784845,0.36813497531437106 +0.6344443559379697,0.41109019504612426 +0.6937422752088516,0.4369893072623327 +0.7759764194162073,0.42177316532808723 +0.860622703992877,0.39944389449561274 +0.9269543885794724,0.5881205795294672 +0.945699572523386,0.6413406131578967 +0.9309361576642353,0.7592347261836064 +0.9078820943450453,0.7334883210672632 +0.8872715234383196,0.6863027808832335 +0.8524205684303253,0.6245463488467656 +0.8221637010228459,0.5748229024936647 +0.8106938600199104,0.5259412525384547 +0.8115994929925896,0.4964542089288288 +0.816837429965941,0.48237195595410154 +0.8246889114032938,0.48224133237511846 +0.8308389186509598,0.48536089047004227 +0.8297818898805576,0.4937627909971883 +0.8142557143822483,0.4889589248507458 +0.7609548568405454,0.471406340446705 +0.7014364599886487,0.4599841235581541 +0.5425010919342694,0.2919164299021452 +0.04886761307510785,0.13957288856763825 +0.3343733548977372,0.11094716187706077 diff --git a/synthetic_data_Beirut.csv b/synthetic_data_Beirut.csv new file mode 100644 index 00000000..30f4f511 --- /dev/null +++ b/synthetic_data_Beirut.csv @@ -0,0 +1,1177 @@ +0,1 +0.04052710532672483,0.801129817824095 +0.5593115090675751,0.486606955444103 +0.158577650767071,0.41522890322179784 +0.2774971723234969,0.2213911711786762 +0.5141697525382295,0.13791450855730986 +0.039418250317774337,0.41781952969954494 +0.1715820729533693,0.7832462786273587 +0.42997375125671067,0.8419953583214831 +0.6164295672656075,0.8487648962460326 +0.434899777123602,0.7853920458389018 +0.5006257891074869,0.55292904367421 +0.23022568223192857,0.35299986594770894 +0.2110239863151167,0.48440995804038445 +0.428098887155518,0.3326740860363682 +0.07603088020397375,0.13280183074561777 +0.053023993962819475,0.16014999148460143 +0.05615147947614421,0.23434275384664807 +0.1645173430252176,0.46105366937293024 +0.3310344218824178,0.5419908164994355 +0.5273160337790768,0.41202494494941794 +0.2603227495845507,0.5552201270096903 +0.25182032582226077,0.5991619824326938 +0.31505954261943736,0.6255606411805696 +0.32966810461038987,0.7417207955031317 +0.07311084865676572,0.7396960853251067 +0.42924755806717385,0.5311450957333363 +0.6215417384381108,0.22445395584992997 +0.11618027089680069,0.16020837423414883 +0.08564454316100491,0.23542192574244228 +0.5959134101177161,0.4233790039283961 +0.7411553262805433,0.35349023336019125 +0.1610455512813877,0.5696342586485854 +0.41686931247649084,0.5798999666164755 +0.7005488871716317,0.3921589254654727 +0.15332955120217315,0.5700990556684635 +0.15877571700163667,0.7400161622674951 +0.5009300112143852,0.761150777208298 +0.5623372196499576,0.5247815250442819 +0.09396278857096022,0.36674383276318784 +0.10318380593057899,0.1974400281564665 +0.06334418057661385,0.2815676331033123 +0.3264660834887821,0.3693485855417443 +0.3127216696376831,0.28648459906391827 +0.35003477330920174,0.2928863167256224 +0.15193581579355167,0.619765460383995 +0.2551095783414872,0.8574118016667478 +0.6424774526805274,0.8390991686323477 +0.5085058211691043,0.624971389662422 +0.47491493815641034,0.3820175527865626 +0.05628514289203754,0.6473129986597179 +0.31089857217047184,0.7539968489296586 +0.3353184461205078,0.6912581919428282 +0.34765386577392465,0.7766031025497113 +0.41847917432704285,0.6804746388212191 +0.3989437222018498,0.567131876847413 +0.28034627434343046,0.5262141822858554 +0.2638211846045921,0.6287486552104748 +0.45580643410169397,0.6315986512999173 +0.3341556787103642,0.4564808904335203 +0.18611219523180647,0.2918311953039909 +0.08438974617933878,0.36635512107235235 +0.3068822621943595,0.3911745547571774 +0.16765385864222473,0.465451687493889 +0.27047008272851647,0.5323703884157721 +0.35328876968104755,0.6187001465681087 +0.3944303094883683,0.35635071986711236 +0.11276191471700575,0.10804349182167695 +0.01983082294234322,0.15585499999211913 +0.13781246541333703,0.2891502081847799 +0.11780205367630636,0.4359928368768066 +0.28692948814881997,0.49793523541422025 +0.33794707055944273,0.6764494775555883 +0.20110774037891835,0.5830841063444709 +0.33349674936244866,0.48768556109577194 +0.6171752809763059,0.2268783151711049 +0.1267108619066278,0.17391282317014847 +0.5102934836750007,0.24004861708304226 +0.380120217756094,0.3768534063641158 +0.4583708643382132,0.419994205163799 +0.14545360205872238,0.6168911455994884 +0.3430816232760566,0.6035042404084748 +0.220774710152793,0.6434512137253882 +0.49494087690340316,0.6941150425664186 +0.28688734766496865,0.41269102685466774 +0.07914039491690078,0.20757275816188572 +0.05916658043175797,0.28292220826024356 +0.21175092456271313,0.4489528237996904 +0.3115239143010604,0.7565268276813573 +0.5145598649382392,0.7839773295954026 +0.35965889688138974,0.7038069366191553 +0.39590448136510487,0.6510270832843197 +0.38772478695191387,0.4400436579420088 +0.19985583422252348,0.5018911956872787 +0.38928285236616206,0.5641138552643777 +0.3270612954714402,0.31125539535861496 +0.05359724163388037,0.17912667986632927 +0.39047667379623,0.44369053832963795 +0.41478234524688956,0.3736054896662217 +0.042159974570157445,0.6860374211078547 +0.44404307002644267,0.808852970460241 +0.6645056008522607,0.46358433357804374 +0.17857024071531588,0.271576762152434 +0.009053081272983569,0.1505030989386624 +0.32078006859877023,0.48537302008817623 +0.43956351275118966,0.44050922982226887 +0.24757325646392722,0.4310601054876603 +0.13226729629891304,0.528643727211125 +0.40072268242961,0.6670644282141023 +0.3553577661102512,0.7301990984607518 +0.2683989405321012,0.7750670908541151 +0.3625923990783155,0.6138344406020008 +0.48674806946836313,0.5282087921182741 +0.35998481507898383,0.244772672610866 +0.01177439093453347,0.13228261468506913 +0.1198101341585566,0.40784978859523585 +0.24929746982546755,0.5751010178525044 +0.49099537724527575,0.6815950273288683 +0.23930239674656287,0.46866971246243344 +0.2661107778240839,0.31967625016405865 +0.08182319997793025,0.36586183303227654 +0.3550260662621146,0.46886625877854626 +0.2672840952563515,0.4774483739504019 +0.11148715017934219,0.7511625288617894 +0.43645885581681126,0.8146255610964497 +0.5410537719099617,0.6584714053922547 +0.38783848281180977,0.5870855449614852 +0.29096943136658304,0.29175579542836305 +0.0696841478267032,0.1696293949787506 +0.08146116136560648,0.20776617523414842 +0.06428804992884518,0.2732982635025391 +0.404832035256206,0.42815104119525577 +0.15367645023472573,0.7066316603392173 +0.4741494059013263,0.8283628223893925 +0.34910327192075985,0.7524405716548422 +0.39055129881148015,0.8637644051011655 +0.41649270052852116,0.676646709325116 +0.38842141623764553,0.6461236475780754 +0.45628798002677856,0.5994180439866046 +0.3440853952962803,0.3632110952702838 +0.0529711842475546,0.21604248877603677 +0.08741119502962039,0.23341542478339294 +0.060267508022954254,0.21362340446592354 +0.09751701353850492,0.3024738430453754 +0.18377616999404003,0.4611464142001847 +0.13088968394670147,0.6549450157940181 +0.20966973898365437,0.6945950983753566 +0.46801224345506176,0.5744215845068272 +0.5868657826697289,0.3301545977021482 +0.017519235608931875,0.27437412734054883 +0.1429661214185992,0.5028333067024356 +0.3747320770783126,0.5234351157236834 +0.5421201586095147,0.4412127732467535 +0.3324528932186182,0.16107946631506811 +0.01073867082471391,0.14776208994217294 +0.2285078465673785,0.3619211017459555 +0.10857960580521316,0.5434126853003065 +0.29407459494044197,0.717526435727958 +0.5341738461829146,0.7397046683939528 +0.5731089114478733,0.7528697847017956 +0.21826055643413597,0.5543509124750811 +0.28669682141796615,0.5784683226538629 +0.34804195161601226,0.6203205584406922 +0.49885225290240065,0.554294347667199 +0.11464840172392826,0.4169173239940583 +0.15367379782803353,0.4730368255750815 +0.30733340975061213,0.5252110957191038 +0.33498147126130917,0.6848347185857848 +0.31516408916636124,0.7092897890771609 +0.5611134766882159,0.3222818374076418 +0.03878796100167,0.633126139531312 +0.3401792645060224,0.7303220628429021 +0.6446579694000928,0.27784079308473075 +0.061870425932390706,0.2661381959454888 +0.055486828082330845,0.38476032012007255 +0.6326984762412309,0.3947034477504941 +0.4589897393648444,0.41883078210262936 +0.5450106858575623,0.41640108816574795 +0.07561504839974642,0.6734688876894656 +0.27109476920801256,0.8866220711128374 +0.7756547330911209,0.7459669707915514 +0.7369691132645183,0.2606481909301114 +0.011560678480716072,0.14326581356431894 +0.07556575535852288,0.23525968189939173 +0.12534052132107798,0.39274099462392614 +0.42567369336917793,0.4910378455266497 +0.36803168054130825,0.4779790341027454 +0.22814542052486372,0.8316522239200431 +0.45404335851176464,0.8590434788171919 +0.49629047507257357,0.600201189414173 +0.35465708370867527,0.32535099977588544 +0.043531358236990725,0.30086216325324994 +0.3057687878254394,0.3668763040861782 +0.4550107418963571,0.39769160740650195 +0.08918678759495113,0.5995948909676225 +0.24897542592978342,0.7197936772055323 +0.3816445469414032,0.6802070139662239 +0.5800031422896648,0.5278904437105838 +0.40339288110827093,0.1466000079855105 +0.018874198196131436,0.12824296949076047 +0.1911099254863543,0.33729919785388196 +0.49284085625659757,0.3346498906033636 +0.16413781044965425,0.6446589230376183 +0.24223294851357252,0.7514474390637664 +0.5794440507217364,0.6923701761955656 +0.24686133858681245,0.6774300931712635 +0.3274181782819915,0.5668312310192178 +0.31240743395046366,0.25056666131454536 +0.04675230383331244,0.26624459023639446 +0.19825816152182665,0.35602924221557186 +0.1396540105181041,0.4676671921398071 +0.28919205066190923,0.6511166094607568 +0.39817911381875976,0.7358395455995163 +0.4662068783696691,0.5312452315365417 +0.26053664085230244,0.2690088152420199 +0.05706602334314945,0.1184433400426109 +0.030693262811918885,0.16476812955867762 +0.5216651558271559,0.34581607574204215 +0.713919639504677,0.17099931833170887 +0.016711801288575606,0.42002019278891656 +0.1978473365077599,0.7184407113740097 +0.7497456668938667,0.27820563311533786 +0.11289954184177618,0.5882254837926174 +0.1905518173950646,0.7011603115776514 +0.39470303054050654,0.8259512780668421 +0.7478168605891586,0.6475564240289384 +0.1283774673789994,0.5842133163395454 +0.25787523385874483,0.5496619938853463 +0.2460196315957143,0.5307666658437229 +0.37686777110501213,0.6225628255721098 +0.40098506207588086,0.4469900130452539 +0.1408175229863073,0.3611335455746745 +0.2505478262610984,0.26965254540548284 +0.06005853413839595,0.13098156449913692 +0.046508461231564574,0.17179545757183606 +0.12930220364026004,0.4292683600636996 +0.27873146530736265,0.7069154380529439 +0.39111661906478684,0.8047759531536646 +0.5646859406770598,0.7612704633349863 +0.4829980134404316,0.6782264112253249 +0.3276093601800864,0.4164629279846917 +0.5957884191776367,0.2948054074731237 +0.42781549687196624,0.27476969356553227 +0.026897549626094676,0.6511799095934974 +0.30017292496063985,0.859202802032649 +0.764959812075667,0.5093552469326309 +0.12654608486616534,0.639560639747637 +0.3707576989697948,0.34246304625310486 +0.09143975376023268,0.12336668370020669 +0.07170525192383533,0.21897843476323042 +0.14096763728415673,0.38775551312416273 +0.5240873693812576,0.41375434391495447 +0.18080753085902332,0.6179852484587963 +0.272877007691235,0.9290794728579665 +0.7296939491380116,0.8020201920075958 +0.608744680810962,0.39271125190618833 +0.026548624035619972,0.15402194854933618 +0.050604373210765254,0.30142170185598216 +0.2841394245295296,0.4815800785185502 +0.401246994687316,0.662701427821943 +0.4014720618259618,0.35312587016674235 +0.10575410722460794,0.4715532659668786 +0.27460902926124003,0.5992011426843045 +0.44316443795791044,0.5393115877172451 +0.358322530943358,0.2231224178882004 +0.5746593474675911,0.30670112366140456 +0.5731919407180358,0.21314039822706968 +0.04193070530405547,0.4420164524744435 +0.34396818276234303,0.5075890420989521 +0.13295543192276518,0.6859135626560328 +0.4498251676038214,0.7629723547569637 +0.39551657433695153,0.6898754237889231 +0.2950211166993655,0.7463469504019288 +0.5330299734451627,0.45543685547581514 +0.09350574015487548,0.21404692526930183 +0.029427587982582513,0.16644030806523963 +0.0812360644246383,0.2486368417309863 +0.18763861057968256,0.31063920254103355 +0.11965054272218897,0.5200070141846646 +0.38584947581588547,0.6597684620669876 +0.4636476039349224,0.7481176255839651 +0.6666662096204735,0.7271491287881225 +0.15208610890533542,0.4233076571686123 +0.13866508005442782,0.45517495266671737 +0.32166165109721845,0.5556300877563846 +0.5924485921173243,0.5936172007487772 +0.1301907896844686,0.5506231187821833 +0.16366526482592972,0.44124615184782195 +0.28042358156769515,0.5065284370500022 +0.17142531273762818,0.6128693817986093 +0.18238854406150734,0.6963386534440248 +0.3643072545106271,0.6957817672479846 +0.43364208931666465,0.6486088036369108 +0.3914556204819076,0.6190140246274416 +0.48679324978909766,0.29732906813247734 +0.012821018694345664,0.22053048010826842 +0.2663570046116225,0.4522278606109526 +0.1722561418810561,0.14787301418608076 +0.03659707307391483,0.28080165381343625 +0.29257148500867036,0.48914027205590854 +0.2995498776088749,0.789510965210748 +0.574698746137783,0.7273570893937079 +0.3895061611677872,0.5238516329813019 +0.2742585539500013,0.4858058392161379 +0.3987818359866586,0.26826298232207446 +0.05470106005034792,0.10676911471427711 +0.03212139010057176,0.1849855780281578 +0.10438582299930262,0.41399651758663497 +0.29102417823280285,0.7043503521654786 +0.438077777573368,0.8014713524385989 +0.4627804457605081,0.7586352823852772 +0.4037860929498086,0.722671747082659 +0.41624081129972956,0.6461185215786256 +0.4117270409583794,0.42452946297932936 +0.41938757891563694,0.3510227798808512 +0.138245642169192,0.3949689566406001 +0.42006888980766305,0.3153574466159927 +0.6236714123956887,0.2273450493419379 +0.5030824541462647,0.34377497428670667 +0.37680453057691277,0.5472285746581671 +0.5245714187014224,0.5213785766653538 +0.5854177474297234,0.44589260212816156 +0.7480861543742225,0.3503248392929744 +0.7911061047590997,0.22418388720449936 +0.27012503143995176,0.4955295025445344 +0.16491052506443288,0.7488793729440628 +0.33643928166305676,0.6046414970305926 +0.46527200931879786,0.573863208194668 +0.2019308805231711,0.7813900707800846 +0.3624735474166471,0.8371375201684841 +0.42875769729414404,0.6618107556152184 +0.32069718834021965,0.6172623633270854 +0.3289040326691026,0.6169787644272932 +0.37781268353852693,0.5636384486177315 +0.33215603228534873,0.38712978356341887 +0.1262254118773109,0.19159403440022962 +0.0363645255523506,0.18018400665981707 +0.1558605134306549,0.6306071876388949 +0.2174014746890878,0.6645149587435654 +0.5589108466454413,0.42483040683074824 +0.09513211249202834,0.5397034286519307 +0.2399127781113145,0.6264420150627109 +0.3431469797690453,0.6980683802351074 +0.38943052287357593,0.7339560388249396 +0.33261159058531425,0.6475700138879449 +0.4915664493468026,0.4749079345835469 +0.10171997545970979,0.38710719340305294 +0.17245948312668377,0.49026295534238123 +0.46612834925018665,0.3233392238057744 +0.047583103174417954,0.2191832065203209 +0.10970959066073407,0.2523490786116004 +0.09602776168664195,0.29168805474958753 +0.12644678352798105,0.305386960453624 +0.1739567220009457,0.28895086045036306 +0.2053041457891987,0.42063370339748357 +0.19599676129931037,0.6872094272378705 +0.377314746336131,0.8116562365081876 +0.5344340204573291,0.6567818521317436 +0.3026116490013424,0.5363226532008553 +0.371069818692125,0.42155811183314523 +0.13287261126885938,0.2603876590278432 +0.04880812763602222,0.7829963563518588 +0.447846233792863,0.5680700539560153 +0.5874669551168639,0.257870495274769 +0.026601642367141538,0.20842063423366902 +0.05801194905562528,0.3153760432651594 +0.24446815249471307,0.556602239512503 +0.6174128054857083,0.7243426440893587 +0.8524387477840668,0.11649754641425479 +0.04077950119499697,0.2650460898417806 +0.1624945699980319,0.2746218144418701 +0.26527962085510975,0.4655781983524029 +0.271120548216875,0.66258168209061 +0.3631119727667623,0.7917879818500636 +0.47938188904929485,0.8773471115502325 +0.41946566100028365,0.8068590162789148 +0.5104506015186104,0.6243008970134597 +0.31156188245977795,0.3883301317020205 +0.24504879114172523,0.3705038725689035 +0.1518678664985156,0.3629612027971062 +0.20751634237745858,0.4148018657443784 +0.30532068010607,0.38289120786720676 +0.16741198299375423,0.4799423514966625 +0.2694990634605931,0.6146225928197294 +0.37299245591609964,0.6852695940739909 +0.10760593413059759,0.688972949862535 +0.164421200733206,0.7921978233874684 +0.6007436513204646,0.5952909587784255 +0.49104642862352,0.48098275057103695 +0.2898007034919626,0.23089778419316062 +0.023024767634584817,0.118818700293019 +0.07102075218331406,0.2901848256086122 +0.38274878259038414,0.40844985835640835 +0.6618997453876274,0.3783668875039908 +0.7320265769110261,0.31011238688827736 +0.13767033813788657,0.681133329750518 +0.25185328719081773,0.8053992985286178 +0.4591024517481016,0.7917596100391555 +0.3862329422980035,0.7828259466724754 +0.48808228963918326,0.6906633375880726 +0.41978886718654074,0.27868014569231264 +0.026536226269508127,0.1363304853203554 +0.05259120463715551,0.30856138462452276 +0.23597848412640357,0.4626747666989286 +0.24897024032568857,0.6420644520602837 +0.3977146744267237,0.6968109606491433 +0.3658688067965943,0.6388183831063774 +0.3344063758462605,0.6301833390099704 +0.31343835588637936,0.5780993699027671 +0.363335013347486,0.4628654121552097 +0.20063644645273396,0.5247735976265281 +0.1752705871855774,0.6906447409389059 +0.3793397247351731,0.7466759084363873 +0.38827988500864274,0.7252506016430651 +0.4444335698566434,0.7084418534007328 +0.35640197988195027,0.5105814336847382 +0.44830107683709125,0.29476612801222357 +0.012557208536600355,0.1819957494420965 +0.12639191745247166,0.39235997193226535 +0.13297432659515682,0.33449590200361295 +0.10882672666242328,0.40141746394844485 +0.2537605166141197,0.5652304886794068 +0.47833129758060555,0.7139794825272776 +0.2647566795042335,0.597445726291328 +0.4069643616204761,0.49524855605143414 +0.1525209545912439,0.2911690473052956 +0.09291085599776364,0.25053530927139894 +0.08089074491517208,0.2604359685924253 +0.11774501203126293,0.28209367389568657 +0.08095967768684684,0.4021661578913391 +0.25758510825033426,0.6660121678154195 +0.4969858824630875,0.7618930338495575 +0.39569932217781173,0.651159942037501 +0.6082696317921572,0.28497678036529595 +0.19931706783846118,0.3949922918590257 +0.318404972516358,0.40715932839027713 +0.7133136390813158,0.18039941784599808 +0.6454892157760341,0.14343234894179258 +0.41405183072060703,0.32187116140521044 +0.12118059395339596,0.6762868164800244 +0.3085891306042722,0.5873796342787562 +0.36285227532950604,0.5017729400720649 +0.4231648444639053,0.5424441694275187 +0.13650918005315174,0.6193256377102735 +0.3079075216890222,0.671145915869036 +0.4888077675729829,0.46974050990563815 +0.16755244133915118,0.29323053354914075 +0.048688083881458497,0.1476160585624985 +0.04810038208404124,0.20720815654985772 +0.14268824456468857,0.4215919374690494 +0.287130296197045,0.7102645634376491 +0.4436557292424147,0.8056973217524432 +0.48076695198210245,0.7426412700322389 +0.4580931662982369,0.7042674421046103 +0.407606869888758,0.43718129388877763 +0.2295644581051894,0.38302105658582747 +0.34028515215745364,0.28784406180172023 +0.16248589752221812,0.624237894903943 +0.14445647595639038,0.7735908030125735 +0.4970055221935387,0.6868526934389515 +0.48823946708743776,0.5461082457551626 +0.23070487377354482,0.5974332093159274 +0.4516096114589003,0.4024852513570889 +0.2361433803761556,0.10131955145037279 +0.009582936762653007,0.14432874319441466 +0.2900330423972701,0.42704638831382447 +0.202806770778044,0.4822306036115164 +0.3363974690047517,0.531826436427646 +0.5006179212943774,0.4721518158096095 +0.5996593236228364,0.5100907086443873 +0.0519769489704939,0.6560188530741058 +0.30784040685901287,0.8353636263356304 +0.6390328406547119,0.7559399603490002 +0.41003572936075133,0.5277410148661578 +0.05466374754272285,0.14958295223510143 +0.027013897892682756,0.1700839101974067 +0.13765865562751195,0.27227324242651396 +0.230315685245529,0.3292205333140346 +0.12043261526619625,0.5660377739881051 +0.3448238670426394,0.7975215314439512 +0.6039386986986344,0.8266185520649871 +0.506034851015582,0.35879409306996735 +0.7183144091727469,0.17832785841718762 +0.1267095804067653,0.2495642602012086 +0.23202106353932248,0.4535422920396346 +0.6058736442817537,0.3492069541804053 +0.0789355635551539,0.6695297955308755 +0.5718926786713724,0.547481298351971 +0.4441291391334884,0.47935906044299137 +0.4468698799092328,0.5080843566969498 +0.13272398708712918,0.5394771098157577 +0.24407875535044055,0.6959546207178033 +0.3701992630529589,0.8243461845879632 +0.3754316269916379,0.8508270977456148 +0.4211663603294628,0.7164896725369142 +0.40760263795897944,0.5458388923654692 +0.3447359203892835,0.45540589086285965 +0.3116141557332399,0.23342943187491272 +0.02511757611937344,0.12079653141793635 +0.05685263871487827,0.2511014043850553 +0.20160776374388115,0.5527849196431681 +0.3811961411988099,0.7559680937413293 +0.44839948410560404,0.7310301660227113 +0.30772766467343327,0.6618610619354001 +0.3774578570882201,0.6797381638305017 +0.07899954914131285,0.7295542954136831 +0.20764157173611716,0.7701367138484371 +0.623962759899317,0.5070242880898028 +0.32060015197853653,0.5382929443382098 +0.20105728504712184,0.5672981142016628 +0.3766564130346631,0.5135881899899127 +0.2542539238635132,0.49656021586413457 +0.2567719220817578,0.605570256605322 +0.30821323391203975,0.677703976513959 +0.3760684728186668,0.6983503102048463 +0.3867884575872458,0.6159850357897697 +0.27344414588620714,0.5480787157064515 +0.35224810238571225,0.5578558444012023 +0.4047997593410639,0.35961177938917716 +0.06622853874392795,0.16410410401367223 +0.03320625424000294,0.1742309331592597 +0.05914849042207074,0.28321135039199896 +0.2504815458961159,0.5647850035644326 +0.33117371793724176,0.621403515231429 +0.27688717838893623,0.6008816360388112 +0.40581154818600884,0.4897100328552179 +0.31232762333111863,0.28338235611783 +0.03198030590640476,0.18338617679285396 +0.10924029349014941,0.33772039407611437 +0.5438719987239051,0.3340132533926277 +0.3590106367648877,0.33513575786516614 +0.046675533050850634,0.6458048819378718 +0.6231752037279911,0.45358657829069504 +0.02287092804643736,0.6527796982589922 +0.21110936996874757,0.7866069077085036 +0.6018733381527617,0.745383500923946 +0.6362103223063451,0.5221144556096236 +0.08356535433754587,0.2039843499307711 +0.020688980815397467,0.12974643705031488 +0.11626222728335735,0.2710785865314874 +0.13251331447019496,0.44610673181448013 +0.3056929111126492,0.6817746161235455 +0.5458404421173844,0.7717134951210526 +0.49280780548107345,0.7644308804143652 +0.487883478346558,0.5192089079912601 +0.21714368460046413,0.11953949926216315 +0.015621483324148115,0.1219780444887922 +0.09302487968320575,0.3078772425119092 +0.3001586794505402,0.40756610028847645 +0.2738663553874247,0.474123656667728 +0.38216537232739023,0.5298685430564026 +0.2882971465253552,0.7671059964760669 +0.435947239348441,0.8940768240336062 +0.5024501084699159,0.35888743394366945 +0.5999031066199394,0.22803506251206088 +0.028506100174461754,0.437177896424026 +0.177923619726545,0.6979318855985954 +0.7845343350455057,0.2552261650120885 +0.04961901902577506,0.6146775483022028 +0.193148136116535,0.6948759554614896 +0.5337575673438516,0.6495701669523267 +0.37369441981753804,0.6209636925577074 +0.21840357777925795,0.52588063469375 +0.2075433432815387,0.5571521519651057 +0.4108346104145833,0.6673338412084404 +0.40842232103383563,0.6270838378775414 +0.24284681675004313,0.5335821508438463 +0.33818954225436093,0.4302638172359212 +0.2188681363805835,0.2983114718874954 +0.1071444451684776,0.3908254503527883 +0.2903811335227181,0.41468161337356485 +0.3190268277752276,0.3058216571278958 +0.08179002999311659,0.1137275695604095 +0.04759451746389112,0.1975026726381146 +0.3027015030033309,0.3397940992721364 +0.12146714328312044,0.39186125986951587 +0.1531342863859116,0.6732087730197107 +0.384775996163605,0.44822353116866726 +0.06704634427247394,0.7151128052428408 +0.3047320842389812,0.8246203659538826 +0.4989746808427551,0.6785033940095483 +0.4955137669465955,0.6388325690118315 +0.23703619835014272,0.46931135646332955 +0.40129467840313077,0.2810928225031137 +0.056006014340586725,0.12055170533956377 +0.08777913450177624,0.21627160903051376 +0.06186372040985425,0.32486310595616086 +0.47401237482300357,0.4466556905927665 +0.5818079709332544,0.38171303265645773 +0.6414790748806553,0.4270004331327106 +0.6612633465954343,0.4082014261970275 +0.07109907268653985,0.677856445195268 +0.3389570414627223,0.778872251375918 +0.6362670659281647,0.5451886056910822 +0.12264665959844398,0.6310358046394006 +0.19982361791202613,0.6519532798593243 +0.4745023250030005,0.648419737703716 +0.3480652570321167,0.6310617922645182 +0.3787700533427983,0.36107194417430977 +0.021837621924730922,0.14898765084551016 +0.06064373254073292,0.25120183821148445 +0.32034575935466464,0.49212530246806624 +0.31407964225944346,0.4557202457593507 +0.17973819372955432,0.49265971771302997 +0.5625655650440657,0.25277036424079996 +0.02478161453913588,0.3285387157825668 +0.40134087200282637,0.40388730161357556 +0.11303436754824249,0.7432347534801648 +0.4729872643399528,0.7682608364683904 +0.7438730596634071,0.38045030825710946 +0.03607881068765287,0.5962995885771403 +0.24067834016872092,0.7701321838954349 +0.4047391414173343,0.7815021871168877 +0.37275674934836267,0.7943991421279324 +0.365388214545826,0.6422916649661283 +0.39784735436597835,0.5466750263222337 +0.43792268628768044,0.34066247934171884 +0.025132149455019334,0.16912242767270116 +0.06701281665979165,0.34470546239613437 +0.21681109068265597,0.425278037712934 +0.23766067621338213,0.5520704983710139 +0.3216084241494402,0.6324704884388961 +0.4963710009476558,0.4435739218421551 +0.26694864031559445,0.13770261404516998 +0.011606276033963962,0.11297094819976154 +0.2521228789991056,0.5414608716028292 +0.3604734241544735,0.4472456275643289 +0.3388427793587011,0.3324608504197212 +0.2930451631206455,0.2306882142621666 +0.28659740087049235,0.2836075424657525 +0.17700532076691936,0.5763320325808376 +0.4025126695166524,0.6768894790432441 +0.4677422642165829,0.6460521816090021 +0.41563433403921024,0.7140856980042489 +0.24923208353015652,0.524610221295227 +0.21985399720505422,0.4940761624912274 +0.3402030169569627,0.5999418496048001 +0.37462770934532297,0.5940727590487168 +0.21235081550998555,0.6002908347998996 +0.35021603103394267,0.6370342372746242 +0.31980389352907435,0.6189557312848614 +0.2746595143953589,0.6534659265341726 +0.41835564370076017,0.6140174268614296 +0.3644790648991723,0.4284738897536258 +0.163054257612408,0.18899968263218464 +0.024597793814669876,0.12989780304569581 +0.056008338921732695,0.22486573453828954 +0.1709210276405644,0.43578851215455194 +0.2423171698766304,0.5539238451953393 +0.54634487622606,0.32852035755197917 +0.5146086811423046,0.25065833325819403 +0.05900648235590982,0.43641126148305753 +0.15795499084549702,0.6719912289410944 +0.38223034139018786,0.7508333324087518 +0.46218663448700203,0.8117939828422397 +0.6893525122797405,0.5422800778404805 +0.09300422667379346,0.29913723463607084 +0.08416101335503973,0.21309712525497024 +0.06947976349979205,0.2433096468027847 +0.208342790579496,0.3145234286241173 +0.29776421185857826,0.3421720265750393 +0.2423734962659366,0.5487198828701895 +0.3416904508671602,0.7410268782287767 +0.5013223885908962,0.7975221274903989 +0.32904887195589005,0.7909953592839776 +0.3873574137238833,0.7165688275051623 +0.4592089056436581,0.5758122204738414 +0.4533797203969123,0.37305283539995987 +0.05444136261309164,0.1165577769077899 +0.01834872364785248,0.15546163913899197 +0.10783362387361319,0.37702813738024465 +0.3037244081145252,0.5807735918947973 +0.3757800757449545,0.5725588201486289 +0.038646906609825386,0.8054687975444139 +0.28433090445084835,0.7645859717000439 +0.5860396622932378,0.4909084140405423 +0.4462400376279642,0.5365500449206341 +0.22550690171489726,0.3673870562871702 +0.06182530521630097,0.29855090374551674 +0.30378049608525237,0.39292076223253763 +0.18533110616443788,0.49439722291025445 +0.23208487031154715,0.6163156031496368 +0.3599986731588925,0.7106940745078263 +0.36300620432462066,0.7298861740757351 +0.3881299495247276,0.6187641023519417 +0.34775418039107,0.44607895605001957 +0.2611898779566426,0.3504128455509701 +0.14984926579646374,0.37086009972834205 +0.23289823529405787,0.40899828069289185 +0.29476469751757145,0.2692365943919897 +0.08591079710918573,0.1486625671129614 +0.03770664333860255,0.19963979717616664 +0.2729194760006326,0.4155284463640647 +0.1582848727519682,0.5936884879039163 +0.35917532439838307,0.543277323152045 +0.3441066443521402,0.4708567260881538 +0.3178802132238163,0.5148286818567637 +0.40039443965086996,0.43092903487382195 +0.11988174913924593,0.5784299372626343 +0.24008274075587185,0.6830838321458105 +0.3450616001682985,0.7065539954870884 +0.6121085881477609,0.5535416602131056 +0.5354655980443372,0.12001195547889357 +0.006064534186614168,0.13123980162258164 +0.188468784072018,0.5778033732368637 +0.4359810053797023,0.7019937633254015 +0.41493171448667937,0.5397711395283838 +0.18000477550328137,0.6959509252298279 +0.4899587034611399,0.7453124521873861 +0.4341578781101687,0.40956118695805327 +0.10097014902852226,0.15826252100114796 +0.021756142375332403,0.127819746710606 +0.09006640314012204,0.22053965922356225 +0.056923478835185615,0.4305796920508538 +0.30195379253703264,0.6239556669109803 +0.507041513861077,0.6601063011935161 +0.5398241876930326,0.7242076395689657 +0.29684340950387234,0.5190280674990428 +0.19936001298501685,0.4627049862538245 +0.33011758323658896,0.5981733797946202 +0.5757123231220711,0.47498100987802894 +0.31136214729515876,0.4997178911298543 +0.20434898135678373,0.5526133178708894 +0.24103745815345104,0.6286895274028679 +0.32804730530752285,0.6671924589910576 +0.41242656106938236,0.669414222124676 +0.4376159607857018,0.5102677344393396 +0.1818520724562686,0.3977795838621752 +0.3244423567872802,0.2795629798882507 +0.028011113401981876,0.19452911612007417 +0.11867848037298216,0.2799557446949302 +0.1240981221055237,0.29927685851643304 +0.21446195242304048,0.3175745605873195 +0.1470347940751407,0.6440434454757741 +0.4344125985595868,0.891330301607476 +0.7169594763878697,0.7001758216600664 +0.360153913456192,0.6257883309235723 +0.22704148289910664,0.4254008530834725 +0.3209760188684466,0.5333212613137095 +0.40851473803554916,0.46188274017929015 +0.17848899958449643,0.4230352639420359 +0.2014386355643506,0.49243637910909516 +0.2987559735428811,0.5493057369235854 +0.34329587217167695,0.6706297992500152 +0.35235220189780037,0.6124713419808681 +0.06461590527739423,0.7556800840978245 +0.21135234830314628,0.785131633145923 +0.5821233987133693,0.5608517526610296 +0.32379931207719537,0.6527796386543474 +0.37869924302481334,0.7213613985721435 +0.34400495882816523,0.4484962224184675 +0.2393802702149529,0.4312103389947907 +0.43238627905603744,0.33449918025907505 +0.05733138322165873,0.13179782030687234 +0.029771506782896667,0.20315125581088955 +0.1375647783120016,0.4320062398163389 +0.295172631706367,0.7009637950638609 +0.40469515318949517,0.7827301620083379 +0.4681734144145157,0.742103338113234 +0.4070663153653526,0.7077897189823581 +0.41406336421936973,0.5986118315615121 +0.5416862367956001,0.3586856126164949 +0.022123962638198717,0.18948292728961755 +0.05943295358922833,0.2539237141170043 +0.05454292892777714,0.24192562695133946 +0.12357401846407443,0.4388804434970958 +0.2800487279567462,0.7017694710471505 +0.5465177296958886,0.7745642660708769 +0.4236145615086835,0.49818053832975095 +0.37852171059037043,0.4509626030142018 +0.453624248452075,0.3530419766292355 +0.17752426860659615,0.35448047512599595 +0.21350035068899054,0.3781125246824558 +0.20676439998138177,0.5706501006093166 +0.6395416259024557,0.45263510934631 +0.6745640038662319,0.3340192436594266 +0.4578049480384589,0.2874703406790432 +0.14730516074381056,0.46086177221910907 +0.25360345837515474,0.6863169668918029 +0.35871648784295523,0.7352828978220551 +0.4435119628392331,0.8002858756588662 +0.35083881016480617,0.7391417025241466 +0.4542793929050478,0.5772858857110132 +0.2994673847805153,0.23593664165231115 +0.020061433312952483,0.15295422074533688 +0.09753116964163744,0.3420896231536516 +0.2323181330888486,0.4554386138128357 +0.44987541431936123,0.27934506530698955 +0.03078806399942316,0.4502476154979223 +0.2086054980513131,0.6471366881205027 +0.5535747408225429,0.6160700916178494 +0.21413278577230654,0.49127626410571 +0.1707718372147089,0.2894982397055632 +0.11141139267584144,0.6814425586475592 +0.2675785422015078,0.6452717779950928 +0.5779876708314633,0.3700243830040908 +0.09925362466615709,0.3809113501843674 +0.13511738179548527,0.2787013053412043 +0.22570127246148727,0.29260015482610524 +0.22588986155753477,0.32024827593986915 +0.18865665791232827,0.5829733609144975 +0.382277429059555,0.8387618063429774 +0.6861401795545878,0.728698015086988 +0.33092877264956566,0.6803073285833635 +0.31911414857981346,0.5418050884263476 +0.3087942599892429,0.4844181536790396 +0.30734080072656345,0.5871721505103289 +0.3230616449935406,0.6159170864947375 +0.3701170980501456,0.5042095779500614 +0.31125625964372755,0.2958747744048541 +0.057066112750116596,0.15703684088852118 +0.0507016777933498,0.1859863698160859 +0.060688972466112205,0.2586577534228262 +0.20169767735051441,0.3873571156785529 +0.20816421506376961,0.49353849879312395 +0.31652748581079554,0.6553540824710409 +0.46440452331883736,0.7657416461573942 +0.4652479290423114,0.3912993072786707 +0.12621903418032068,0.543801009560951 +0.1660365164087543,0.7560156582478519 +0.5349708198881141,0.6749114989067149 +0.34673994775568945,0.6231636999959866 +0.33089873190860236,0.6361906527372639 +0.4274055361252486,0.3376201986682643 +0.06169289349794778,0.3321862518212884 +0.3263131081679838,0.33265572780578057 +0.076796352854413,0.10950213668836804 +0.045684367412995516,0.20038422938696013 +0.2780787050401806,0.37883585684900245 +0.1404964029626171,0.7360523341813276 +0.4931807219410675,0.8520287273840789 +0.6003216504355037,0.6871575711969249 +0.3898698091055197,0.7918430565418266 +0.47242590779552324,0.4981024562451087 +0.23159819838701245,0.3170427679467254 +0.19146978852914404,0.27262076730781676 +0.05486324428876297,0.18781179186433894 +0.08194163440708523,0.1948206722399426 +0.05290070175511587,0.2663652598397214 +0.1947967409861865,0.4457411169234911 +0.2561338245571888,0.600695431128565 +0.03673297166398698,0.8111827968148185 +0.35952594872123367,0.712862729902959 +0.7370104192833429,0.2652352451819426 +0.03182744979489598,0.33335256570772914 +0.06384357809280661,0.2208100854968614 +0.11722204087806425,0.40070325129254725 +0.3955485224265475,0.5612638591749354 +0.40789362783473915,0.6575798391158585 +0.5407754182188929,0.4467533826055365 +0.06160393356563082,0.42252826683366407 +0.1795207857877613,0.6063382624531202 +0.5233807563175271,0.5781610011054542 +0.20475652811538825,0.6355828641745944 +0.33213219042744135,0.5240186451959336 +0.29044473167868606,0.3276415466695628 +0.11861941217001659,0.3743813633271288 +0.2170953154312345,0.4905489384279641 +0.31601738926086687,0.6107469200031694 +0.36074376102082095,0.7649337051976035 +0.4968741237541466,0.572267532249662 +0.20256119964159783,0.38216140859670306 +0.171587169150497,0.29269063467685863 +0.08966526388083014,0.3411276935941103 +0.2586826681791011,0.41215640299344736 +0.23268806931660418,0.5591811536775538 +0.4050409495361195,0.43142864100624284 +0.12699413298089005,0.5076140164451086 +0.3396880626284854,0.42497357718747397 +0.2971427142275773,0.3584012388563207 +0.44832828635742805,0.23401275273090621 +0.06598678230474699,0.34240156406202965 +0.15004444120575816,0.5784770249319987 +0.41526767606691695,0.8511284588295471 +0.6279452442395234,0.7917947171749221 +0.34124100204328345,0.7838485239580651 +0.5183415412302205,0.602634429827418 +0.33476328845913417,0.15913733837236507 +0.016338795421614434,0.1263052820940924 +0.0832288563155054,0.35691744082953875 +0.2928417920726954,0.5140457152431296 +0.28531646725209525,0.5391349791548061 +0.2315742969244603,0.6024475692660795 +0.32752320166607357,0.6823736428034346 +0.3545628785676187,0.6744301317955921 +0.34502840038116245,0.6457422970608684 +0.33173692222565915,0.6402480005110679 +0.3694805502463405,0.6600483058741596 +0.3530604242869395,0.6063053606892098 +0.3550470470970731,0.46077200762409287 +0.22953361270152173,0.48633578411274425 +0.17542093990200588,0.5894364713603096 +0.24633896348006146,0.7538516520150108 +0.6439948677270434,0.6715890764028644 +0.3986753224864574,0.499924629840222 +0.11373001335733547,0.4217353462443542 +0.3473696410253461,0.4308679401129377 +0.1337043940866036,0.26331794257378416 +0.10089161990903979,0.37909221642613705 +0.3114768266316933,0.3860755264091365 +0.1962070464860536,0.34277126187118506 +0.11115908621453645,0.4922122656447785 +0.30161219831786445,0.6701228617462881 +0.640260100290495,0.4629351197872625 +0.052199631923348956,0.503438591870025 +0.24135690924708772,0.42849171154241056 +0.14549922941429264,0.35216736787427505 +0.18560194967026586,0.4127396344424737 +0.32156634327023365,0.36238098138264047 +0.16816952822643927,0.2245742082207435 +0.05431008338298905,0.16837206479975356 +0.135629266484757,0.3165612220216683 +0.20295193789037763,0.684228777767103 +0.49521580332739784,0.3668617605528555 +0.16715809700936288,0.47804981461840396 +0.2975890636099261,0.4368872641761515 +0.37801420684248915,0.2951886653389632 +0.0898287594214301,0.5437866448415627 +0.4548534452388131,0.6452946661786827 +0.5613720416372217,0.5420710443512893 +0.11532038448904816,0.7602498530026738 +0.5130509137512803,0.7040560840342733 +0.2188049554571289,0.4181758164636282 +0.04966804384609714,0.27214372153343946 +0.18811503050531705,0.36513525241259015 +0.21283236143507014,0.3958790599615182 +0.20228254792730516,0.5212746857695283 +0.37306806440798845,0.6610838173676634 +0.493467897119562,0.4864928721540226 +0.10241732000117867,0.5361977218654276 +0.2610251903231473,0.6269301174986922 +0.3726461827323171,0.6286678313121734 +0.3162100910774034,0.6840974091300408 +0.31173759695255543,0.5768827198938222 +0.5145497321486285,0.3686214088756103 +0.03214710950478936,0.12352305648574789 +0.02170404791580475,0.19592753049323017 +0.04390725492922316,0.7937561272202067 +0.4987458884138113,0.5359600781467493 +0.40169849987143724,0.3257995843323875 +0.17412897942432662,0.19911080595387654 +0.02047836780310803,0.2967268526040933 +0.33931475873830036,0.6186262368086 +0.348845004994978,0.8427985905143374 +0.6492977141581612,0.7612372635478521 +0.3250582515816729,0.6524636744324477 +0.49333712452893996,0.6409657000386842 +0.20217210052054915,0.29433679575598065 +0.08001005648639535,0.16968438026354637 +0.03769546746770846,0.24832671876427356 +0.22639900443314714,0.4118087887051774 +0.20709592101558408,0.5100746153903007 +0.38434952493028657,0.39714348309324227 +0.2549407481851805,0.17862540480385491 +0.07374170421699536,0.25215890999247736 +0.12696561215836832,0.4936423598866271 +0.32927697893141905,0.7609550951595342 +0.5091559290295942,0.8230278490550491 +0.4536591767739094,0.7428139446881233 +0.47956943506405886,0.5556481479637484 +0.366013824897316,0.17088758942509671 +0.41396459932298835,0.42555847756655374 +0.6021354793804534,0.2652910351294427 +0.05311653017382255,0.3835740684799579 +0.2048835158110675,0.5049452780803968 +0.46505174035405594,0.443401664418784 +0.21318578717622486,0.6613312958527281 +0.4652392267641752,0.6993080376369316 +0.6520133017738133,0.3472150563593234 +0.04172295331471492,0.36081385606247696 +0.1287705004066028,0.5687116383522667 +0.38309058542580904,0.7180697320649918 +0.6634545325464133,0.6810498236432021 +0.36084473128905875,0.41501021378015474 +0.03265002369502345,0.1312059163820327 +0.041221946473113426,0.258653372481436 +0.2530892193024147,0.46296259752849916 +0.32163786884395584,0.7375815509474206 +0.6272834538686588,0.5130200385160121 +0.14689871667113427,0.4169577657455314 +0.0951845645794246,0.4270736574388045 +0.331330180129759,0.49185487619476703 +0.4573496877617172,0.5080249308661191 +0.11578249929993821,0.4988108574481417 +0.21202716228889268,0.45768719903659844 +0.501999258936887,0.36407238238713924 +0.6631634830660088,0.2094587087268977 +0.0682598352353155,0.34260573977267245 +0.15038675068066357,0.5885059236462371 +0.2518094777769129,0.7097415922844802 +0.6156862377406996,0.6333010195590528 +0.3508004247735753,0.569267213246122 +0.2006921469932701,0.4429202675053388 +0.18706527350165453,0.5095961093021266 +0.35172536965109263,0.6566796301659715 +0.4342344402763738,0.6625744103239486 +0.3346185683816363,0.4961313306427274 +0.20531666276460006,0.3183791934893257 +0.13042083381095257,0.3989077209736439 +0.29443284865782293,0.42519485943116436 +0.32515859600114067,0.3363080620184058 +0.09529742597429373,0.3476742505425936 +0.2512289881415127,0.4002375005983529 +0.20936971900421222,0.5904563664368849 +0.3825885057006017,0.5771188138917368 +0.19400325415270606,0.3159287869383884 +0.13579526542043724,0.36813873046230267 +0.2159870266664093,0.39661207788283914 +0.21881443259564712,0.48220604649787313 +0.3584218024792199,0.46100983015670555 +0.6364452838160225,0.2570098042043612 +0.4046646654136961,0.15981316563703396 +0.013219594953912518,0.5226221083690877 +0.43593674893096174,0.7211332319919828 +0.7193525432706795,0.35830038779737816 +0.11593744157401388,0.6046215294745962 +0.44854852551984764,0.4720650612491539 +0.1674133240982615,0.5335876344711646 +0.341603100260252,0.674718618276255 +0.592621385982508,0.47349563232816066 +0.09342011808266555,0.5636666416147054 +0.34203290935367753,0.4478835164726048 +0.11509528754807997,0.444529592913996 +0.30263137813876073,0.46783512822643275 +0.1882144510527909,0.5840031503621038 +0.26226311919034395,0.7098678349220927 +0.3775798975983836,0.745078801979907 +0.4491499959902064,0.6763617991231389 +0.3782800435581566,0.4165153204674402 +0.09470245241021472,0.3202556967181424 +0.18689072129945003,0.4398145376875318 +0.29228281971405656,0.3974420129565482 +0.21277672049917876,0.4353413581095243 +0.189537733771296,0.5919293760229644 +0.2533407211010153,0.5698252319304127 +0.5941252707746617,0.29095903033946585 +0.010763496159259983,0.35566842549848643 +0.22122117874443134,0.6901601551769658 +0.6316449641449479,0.6144081949125094 +0.13220086692231858,0.6816472409976825 +0.37814739342122433,0.5067437290268936 +0.11629340051257127,0.40324842922866105 +0.2511524855799523,0.3743576406785123 +0.15758585928044583,0.20379874106697263 +0.06367614864565194,0.24024251099246308 +0.15368258951313687,0.28891873354683467 +0.12926912306241353,0.45884084693602656 +0.25993514057962125,0.6619112490462923 +0.5842912196435991,0.5645935534454471 +0.30348509546577973,0.4088099002131118 +0.1429912745786915,0.194372743334533 +0.032978326078408254,0.2695638536940724 +0.35524398084338815,0.4066594242346324 +0.1070041060323702,0.6504469512768212 +0.25863364335877903,0.8240329025750779 +0.6289752721057674,0.726524829738853 +0.38989883656752194,0.6568914054688219 +0.11443486808404517,0.6806168555036285 +0.23135438558758697,0.698605120061217 +0.5393628477425246,0.4889380334962206 +0.4760593473359652,0.29036986822828537 +0.01136577129232313,0.21847197409666153 +0.28804588314533364,0.39411562674382083 +0.12944313882281513,0.3551462888103443 +0.3637682497079857,0.28343090410099114 +0.08863049744532688,0.6891809700727651 +0.39438241715629685,0.8718677161616232 +0.7907688616789996,0.4384899734692398 +0.10637849568088019,0.4800353645448184 +0.06759294866732332,0.4138581752061352 +0.4184193312636953,0.5136640667026987 +0.3052300810460219,0.6495982407400112 +0.23965057727897796,0.6417841910205984 +0.30910572406048065,0.4949541985132618 +0.3523358106204891,0.4755772649419364 +0.3643659352834017,0.2853384315474081 +0.02975431084288096,0.1786358356166888 +0.09239760040166221,0.27291309828806715 +0.10050308703211643,0.41077283017683786 +0.31233468648152374,0.6159800289996094 +0.42611414189169466,0.520739138036314 +0.32109355922793004,0.4891300200570089 +0.08618849514916209,0.7257143853839823 +0.3390839695537568,0.8004907368229238 +0.5660344957649467,0.6075646280191618 +0.34457278247655215,0.5845611094417497 +0.30182975527126943,0.3856073915291515 +0.1431940793825163,0.3168876170564019 +0.19189476964634333,0.4574679135485077 +0.5075215696700424,0.2788161038870218 +0.04499384760335263,0.15634244677700798 +0.07197114824414753,0.2555965780769811 +0.29733663793933157,0.4046903847948179 +0.2583997249303851,0.359003633198639 +0.10122811793108026,0.5234839915323908 +0.2809925973089775,0.6575062273795736 +0.44075632090229655,0.7641557453741297 +0.6386088728164737,0.5178973673878492 +0.17722126839491556,0.12903448937091838 +0.0115681886659569,0.1170442700183625 +0.12596115468472982,0.37757724517014296 +0.28645062443274993,0.5715848802531674 +0.5177249311800904,0.49814823261228824 +0.16668534276938166,0.5497208236697295 +0.4113778173446809,0.4173601567023405 +0.3098030686019495,0.5001736878483729 +0.13156470654870453,0.6484210490059007 +0.3769094049493829,0.6440319417793344 +0.321058034859648,0.5653817056631758 +0.35236221547812147,0.5757155417400325 +0.34315532441931285,0.4047982692018427 +0.33876258130916514,0.1862896978532954 +0.030508697029393277,0.1484447419386674 +0.12499248980027482,0.28378230328420373 +0.20560407636167372,0.4052008389725861 +0.2002685367829005,0.6931040285819133 +0.42414680118414366,0.8405669926143327 +0.5428855418529868,0.8599542377892023 +0.5029701589955209,0.8295637367721194 +0.4029616713056933,0.5955309270782497 +0.4593758284513323,0.49657303086275906 +0.2607555389102147,0.40949010841917094 +0.1747455894744566,0.470111876644847 +0.36766114826710494,0.46442863337114115 +0.19660225508319104,0.3962382077485502 +0.2095462381596941,0.41563066832983686 +0.3249131738763064,0.3393488823780636 +0.09812065957839773,0.19843274351502896 +0.06577444075775926,0.22589030857947892 +0.10163930057301565,0.6974650024161505 +0.19685333964927826,0.7596957682249376 +0.5268909930572327,0.5998615025436568 +0.4271951019268935,0.5591194032655772 +0.23349022862589847,0.6013848780545628 +0.378948032812077,0.5175247191487778 +0.31407374139961136,0.3711624740912353 +0.15169551966816755,0.41476702682951316 +0.2300302684040551,0.5526645778653874 +0.43173286313776293,0.5896432398729997 +0.528209090171643,0.34370613092200303 +0.035951107736236394,0.1626489460186999 +0.03893795609022989,0.25584727521286305 +0.16825866697269054,0.3762112557237392 +0.19949656722618145,0.6078668831727655 +0.3527016341277556,0.7259999512370517 +0.5104798077945469,0.6832873224030385 +0.5207017659537628,0.45296043149743787 +0.0626040697025236,0.2877063750723129 +0.12487632034762104,0.34772273892111 +0.1494881510561339,0.2468547224571551 +0.09048882125759629,0.21262842413086 +0.06448882817474783,0.21759143467954697 +0.1621976792624401,0.3609565793843669 +0.4925234615232054,0.366281628545357 +0.46502864355420814,0.29544949526445524 +0.020930796859223208,0.6301692723138058 +0.36731600757157307,0.8352788685307746 +0.6710200905022322,0.5566781758299337 +0.3314402699086464,0.39236044876942344 +0.014784306286052373,0.16129940745425128 +0.20034873483243648,0.38326868408250403 +0.2250997721888061,0.43185198299568683 +0.28708955642234574,0.5602813958152725 +0.5207509397856969,0.4158803521867578 +0.08818235992363503,0.7222867010774766 +0.38485148544620434,0.7351123689333823 +0.5421378611890109,0.376244425708551 +0.04899254440693591,0.20066222545014448 +0.02692639827416262,0.21851083632504836 +0.18264916537075754,0.4167044460052798 +0.2708452343626893,0.6711592673094634 +0.44355648750887516,0.7208591698353529 +0.3205820917711717,0.6525049804512699 +0.37933737035170473,0.6482475398849896 +0.4404404758896684,0.4121398925068474 +0.17335692046064044,0.17768549916055434 +0.021762102839809252,0.12574031946868658 diff --git a/synthetic_data_Bekaa.csv b/synthetic_data_Bekaa.csv new file mode 100644 index 00000000..3a24ea9a --- /dev/null +++ b/synthetic_data_Bekaa.csv @@ -0,0 +1,1177 @@ +0,1 +0.6039217113792824,0.3955847314961789 +0.6955162286003248,0.5017240633381389 +0.5077203511640502,0.3294857137709969 +0.5369547604931514,0.34982886839877225 +0.6747240423423589,0.43288344057507555 +0.7839259504420744,0.5631699550713483 +0.8457929491078423,0.6823177323883974 +0.8595189451238081,0.7513195261106084 +0.5365854501141631,0.4444574704742158 +0.35685944553315246,0.6037087428313774 +0.3423724174127772,0.32810884647946253 +0.6690828203428494,0.30955931481865046 +0.6110346316627813,0.4601151039856485 +0.3680531382161107,0.24632117102530487 +0.458883017251735,0.14717277854798239 +0.717804372232701,0.4087329498629844 +0.7274954914256795,0.44902104048759395 +0.7914247511958072,0.5959217536350478 +0.7327100037732883,0.6445639120452362 +0.8325073718120741,0.7401175484034056 +0.4310083388814248,0.4013600937377189 +0.392320781903585,0.4297052017127727 +0.27825045582611146,0.09889739731867957 +0.6757860182982068,0.40460917272019437 +0.8254492281971179,0.6247484671389154 +0.5675631760934657,0.41339629805151534 +0.4649447798224117,0.2934210592550408 +0.8208932875695608,0.5846716153749638 +0.8515142201452766,0.7174923405480402 +0.4383241533757171,0.29081237257474046 +0.4475710987558777,0.3596639625924204 +0.5706971287107707,0.3790896825296634 +0.7385122775229636,0.5379018772719728 +0.8412076233904142,0.753456710249364 +0.6113059520057694,0.3674562566021243 +0.4324845075137719,0.2731131905769013 +0.7027263044547971,0.5052537907899732 +0.7339896558918323,0.500261722986169 +0.6662784218064718,0.5633050788007815 +0.929073035616134,0.6981096253619159 +0.6262993811881015,0.4751142849875756 +0.42326897378140454,0.5328980673531716 +0.3710176348283376,0.525071500672791 +0.42339539523295944,0.18008574807082955 +0.4538966118796568,0.26982316320354777 +0.5303416251560398,0.3307149999623651 +0.5054588913368726,0.1792961057384379 +0.7694435118793463,0.44234752565806756 +0.8317900299122802,0.628727375192871 +0.6392804383537453,0.5021008839016489 +0.71149545900249,0.541454075674842 +0.5001163482123001,0.4146417967062297 +0.6179330348297569,0.45830684807842237 +0.7740918397062952,0.575912712842887 +0.588725626404736,0.47884958885882556 +0.4941228329598839,0.40970528043124416 +0.23423972723324907,0.18522402606797286 +0.441159963559888,0.34121787479240734 +0.38160735364585235,0.18195259534375172 +0.7129256128490754,0.41380935823897563 +0.6837042569371786,0.3837890617258884 +0.8292967080169515,0.6494499431861989 +0.801117360504905,0.7334412917602251 +0.7359938620721872,0.7719929202720957 +0.3740990757536012,0.37520238681454277 +0.5129324793258683,0.5054597248372568 +0.5763312577575528,0.3165294521623033 +0.41579273338571665,0.21218502478716672 +0.6039096116363942,0.3961105934736491 +0.43907126779557315,0.20945531087589403 +0.6323841809539813,0.2649233335873475 +0.7710136174318492,0.46284639742000455 +0.5682530998566659,0.34191822936710553 +0.6209208964627333,0.40536922134651476 +0.6435530185000709,0.40898328937053613 +0.30028218027669173,0.2189505691880407 +0.7691628932117742,0.4485349050057864 +0.5836072563491395,0.31798097427126826 +0.9003480671858728,0.7770677789273258 +0.7918131946657664,0.5249994982620475 +0.7104134558859998,0.5693972099263415 +0.6292380093844987,0.4390810719216751 +0.4957497119365291,0.4253100148205454 +0.5916676520658851,0.41629332220033505 +0.6259297131812446,0.38068023247228655 +0.45628818864636495,0.36165511535177086 +0.6626851557965775,0.4692959179949168 +0.6901082991804408,0.46954518461886474 +0.699330568237667,0.5155001272294196 +0.73671406499493,0.46417730953050973 +0.8124902247500386,0.6369499551323407 +0.735722541729199,0.5090273608430917 +0.5991502999608856,0.39286345164212494 +0.6238760947503763,0.4875949611365656 +0.4872036873765287,0.3948707274578546 +0.733741342941725,0.44518038540691596 +0.5181931256685283,0.2764567131188329 +0.5006881951742131,0.24212631534376355 +0.918848872084987,0.7453051790463234 +0.5421480535872225,0.2583560342345966 +0.5510838031170445,0.34611555864140003 +0.7459225653792146,0.43665653379103686 +0.4814996420814327,0.3180724972031363 +0.9421699046065638,0.762233553779482 +0.8698447941789308,0.6426488148124657 +0.656661391186941,0.46083605196507504 +0.44213119144407514,0.4897049953596808 +0.5256946682359206,0.598250030264568 +0.4762388169248384,0.3069466346271582 +0.60281705849778,0.340877591876071 +0.5563973187796146,0.4378532758464233 +0.6831111311170831,0.5219197858773597 +0.3474355637649954,0.17311915720353369 +0.7607021330961158,0.3982055775239889 +0.5575848221173457,0.39590993443741745 +0.6978747843938309,0.5782390821237782 +0.6859347223490764,0.48751532933130626 +0.7651945351723491,0.5225795496890477 +0.6549718975309661,0.39395412723234746 +0.9184144734339111,0.8065413220349913 +0.4708281158889726,0.272663831160846 +0.6949602960785651,0.4879718413047202 +0.6460730432762559,0.42408764276795724 +0.5153330563939366,0.34447437455314234 +0.9554758070861982,0.7964016183048329 +0.5816302894914439,0.3157613569089545 +0.78955399981509,0.5650934565590151 +0.34447735544279157,0.20216268260233441 +0.6494118570576317,0.5287219871346966 +0.5189887284669038,0.35791242050458366 +0.8165751694746317,0.6077046382090598 +0.7702950238345151,0.6923508034092677 +0.7466589211606899,0.6144383537296879 +0.5504021047948224,0.41961035047771744 +0.49210467929265306,0.430412112798383 +0.3314638733503935,0.20674610096238275 +0.5442714690571152,0.40824854291587187 +0.45673784608650164,0.30740129885658785 +0.5698821544028453,0.23777252387724923 +0.8088671564177599,0.5517567385034876 +0.8664901255620465,0.7196573004512052 +0.702202439231923,0.7563025936130696 +0.6317754983216011,0.5505129683834683 +0.2716671228113844,0.34543272783223045 +0.8357349633263111,0.6167301523166792 +0.6892474889006881,0.5186145295172967 +0.46445721382820193,0.3230060332458891 +0.4251748919025355,0.27532517854469923 +0.4525983333096226,0.3470858328494192 +0.4213775395889524,0.28844845236771655 +0.6581013201952686,0.3272172206000659 +0.7618540524609199,0.5542703259732407 +0.758403062738089,0.6610611067789594 +0.7062004207797983,0.5285314310857341 +0.8475741147074719,0.6868193135713342 +0.41398239131247266,0.336349248207684 +0.538431286753367,0.5550334442387608 +0.578358054098275,0.37954145593382727 +0.7447320222046002,0.44903385548619484 +0.5745152830453781,0.44308212310112016 +0.7606961726316388,0.6002076852136222 +0.23673292991928818,0.1557656821446945 +0.7384665607604257,0.4590559592524485 +0.6179989575668713,0.3792873315313399 +0.5509055256245406,0.3080222004399607 +0.8103915452077249,0.5108748068041786 +0.7618920802242825,0.6893100724621843 +0.5897468327835619,0.30288353501262716 +0.8614796995181264,0.6489464627527967 +0.6855228542537231,0.5070351948047821 +0.41715839500666213,0.2820972198518406 +0.704136729163964,0.4944746484319542 +0.28659620877968833,0.21636319116820457 +0.8633606432930993,0.6441925751090346 +0.5820202230775222,0.2635232204843976 +0.840813040642044,0.7701073869430741 +0.6967102288443358,0.49507659573832674 +0.6730430125459411,0.5138418664104683 +0.5892004370049653,0.40161460557039647 +0.6941674946984937,0.5223139513924643 +0.43160295481763955,0.3049691313314338 +0.3707239031389164,0.27690926138337724 +0.7635197638636321,0.5911149966714766 +0.40411034222029807,0.17933210694380963 +0.7206376194171468,0.3630142800638426 +0.8597133158703996,0.7063229069768192 +0.7697625755427944,0.710771440026013 +0.7341679333843361,0.5013509978672421 +0.7842337488276611,0.4968108822815358 +0.38397115464809817,0.4133373490579514 +0.7085726856416013,0.6360108839557984 +0.4740515946827205,0.3241576843875939 +0.8646239041343317,0.6491043554564883 +0.7321071623960955,0.551149963220898 +0.40973681207022733,0.28403103294303284 +0.7769649027934467,0.58259028078825 +0.4273570775521704,0.2745524341290673 +0.7851039170366425,0.5615757692454012 +0.3306387066482126,0.24050226759084423 +0.5120041965882371,0.30992478069735363 +0.6952732800682467,0.4417276671559761 +0.6538138984923955,0.466938464891838 +0.804028987797222,0.6833468661830135 +0.644621610571488,0.42420929584769845 +0.8986179231621654,0.7507684215661267 +0.6052007674513786,0.336741446769515 +0.43271541590760665,0.5751199114643286 +0.45574754471598844,0.5887071478413418 +0.5339078902618538,0.4025096885191831 +0.38268899913447396,0.14615622133338854 +0.5288820862195833,0.29611515939113203 +0.5715981125210976,0.3808915309375891 +0.45767536754407195,0.1658227142327161 +0.7718879579659644,0.42754506978582485 +0.7319825886885285,0.43693321855152617 +0.7573835848939614,0.5674428928373878 +0.8287018536621578,0.587185858495808 +0.5398714541802737,0.3471571200044268 +0.30826383825769765,0.15915465322817562 +0.8573990463279567,0.6097184407333793 +0.8905810116754587,0.7103720889068234 +0.7643210887079054,0.5980088102676485 +0.4113479554206536,0.20772066670481706 +0.6725014447435708,0.5686959016773288 +0.6494801043758921,0.4297200730716142 +0.7454868554259538,0.5682793844204784 +0.708979010504991,0.5684042561510311 +0.6260561346327995,0.5007632960709423 +0.2425391077731957,0.19373688062691308 +0.5558242201201614,0.41068112767353854 +0.6036137341797614,0.4222747973030927 +0.4696420132603935,0.2339248950531466 +0.7054565548130822,0.3657514743580195 +0.8267291187342408,0.6528577791397134 +0.7924973963830687,0.724763868777392 +0.7773736714472719,0.6246984588420498 +0.6793783902384296,0.4702133824877715 +0.3174593448294226,0.4459139397686871 +0.7203539013080467,0.6083143937238822 +0.5149196981824641,0.3207160227982376 +0.21307975051473663,0.08851054292945859 +0.2748630046546043,0.11222752906097268 +0.4410831033704585,0.2557887429800092 +0.7720069288369232,0.5126811851650982 +0.7209033369235266,0.4667450776222543 +0.7127588986576567,0.6805962906461116 +0.6998241543009984,0.45260226635241035 +0.7981431483355808,0.5451565373868871 +0.47441941494558953,0.35063055086938427 +0.6289955972942235,0.6567614065274695 +0.47656577820371826,0.43145343574283107 +0.6277208923611954,0.39097928921993047 +0.48682692641694436,0.2950395041713626 +0.6691519617307814,0.4509792914830948 +0.6815505027030985,0.48168381951450107 +0.21470329163127483,0.11619964218543763 +0.5662801265101699,0.16283410754738373 +0.691041469498943,0.4285893431601834 +0.6621392964597838,0.37426820321886234 +0.7223030924012799,0.4384748926855321 +0.846624910739527,0.6890526400019187 +0.7146260141550431,0.7192448363101914 +0.7711979745981195,0.6432455765147532 +0.4041175841846375,0.3689042918393769 +0.8782439230918982,0.65942323074848 +0.7094521521751667,0.530482410314587 +0.5715178250645939,0.44192379623921396 +0.4133666455296873,0.32719522648618815 +0.4845764338444043,0.29623824298234497 +0.5942625998805448,0.43570947559211093 +0.6518999337442207,0.4645691504644728 +0.5818356870973176,0.3386257284009988 +0.7589224576126054,0.5657145965609667 +0.8016133307540272,0.647967396859691 +0.8052984475215104,0.7410613879515202 +0.598981261188321,0.3510324351859717 +0.43666261429813874,0.37081956788608134 +0.6178805231377155,0.4221879831381524 +0.7763708829036796,0.5284977544615038 +0.328325152361507,0.2650319928545538 +0.8422984479943302,0.6493483768717064 +0.45996934170497095,0.22057262018536408 +0.7517214416641379,0.5892711865937137 +0.5768220424025801,0.3801190249405358 +0.4124954640417448,0.3152073019345624 +0.7879459857085142,0.41960790668728654 +0.5501237511037516,0.3589107983025577 +0.6593848466157225,0.41295546209964573 +0.3342110216254706,0.15167406170769593 +0.2986558675441718,0.1553437706675029 +0.6676627396812299,0.4613188197844596 +0.8596529363652486,0.704240261087923 +0.7480846046589176,0.6363062845747095 +0.5919301509214474,0.2663950318685282 +0.6605790852783125,0.2987786227398705 +0.7063530086704067,0.4407650521447952 +0.9729326366321848,0.8024600728061627 +0.4337942301756017,0.2292163367416447 +0.5266479849243547,0.4789555361147001 +0.42235824461165783,0.2409272785095579 +0.895106434724894,0.7598184331826993 +0.3062379359866469,0.1548356410718176 +0.8579728602431471,0.7541097983408507 +0.6686609982718198,0.3700957588837113 +0.6314709185868319,0.6195405709168149 +0.3480985462287601,0.21694111780278108 +0.8360636233375669,0.6946775303180267 +0.6715074776874043,0.48971649905609926 +0.5219029783635906,0.46932554150331046 +0.42349922652414684,0.3543327443605283 +0.41702157254459504,0.3115893596086385 +0.7508459090371273,0.505997775964559 +0.6463376282943852,0.4482805123823982 +0.7865310906509895,0.6035513865694878 +0.7239183186698728,0.5302616347107842 +0.4561800956230765,0.33409935168588545 +0.4858109950491805,0.32876306705919767 +0.8110805749012536,0.5981108534192981 +0.5618424414978344,0.4332212498986587 +0.9239724873493232,0.8130975349238363 +0.5419859885580959,0.30494469342712516 +0.7705665825960822,0.6175256955088916 +0.4661349355668351,0.32518881493780594 +0.6918581723415668,0.5902127611653314 +0.23156741258967936,0.16725587811112727 +0.5857114791234166,0.39713090578085625 +0.4218795001048739,0.28173768463528065 +0.5847282409033084,0.26471012777341596 +0.7173255681212722,0.41609334861751696 +0.7300107478302831,0.48257294199882217 +0.768608629620068,0.6267534481758259 +0.7982695101824908,0.5060645927712174 +0.7476680874012724,0.4437197735896411 +0.7934191226097753,0.6548765884541838 +0.4943273662984084,0.33607789806289134 +0.6158797740267572,0.6630936251617005 +0.5926727651906234,0.4153346708980237 +0.7896255253888127,0.6327632056824724 +0.8605993389148895,0.6671261773958458 +0.30893501636011805,0.22185510352208698 +0.7955466508001571,0.6341052042568834 +0.5114609002511684,0.3246793442376159 +0.6200116276067834,0.47483852409907845 +0.3929786681702219,0.30926570233907913 +0.847968220618684,0.6316465126648578 +0.6701657175290111,0.4435211709136501 +0.45666873450089207,0.39209866444655445 +0.6928935646258476,0.4643112411670499 +0.5769533514350059,0.413539915442812 +0.8243783711491994,0.6630043374040071 +0.5551394223564113,0.4468151321935509 +0.43508914108320645,0.34473627736175716 +0.6476726531279194,0.4213967910849997 +0.7467824219846511,0.5011485804939932 +0.7507210969109812,0.6347230660033789 +0.664708554672548,0.49737805027775206 +0.8458620308911295,0.6810607896419093 +0.6805492638802701,0.5103846182065346 +0.4883615970081321,0.4502754798390066 +0.4336257576471623,0.4034170798270911 +0.6121887563994419,0.38686758201768306 +0.664073765205759,0.4634572258184307 +0.8197841643397007,0.5778000343112483 +0.5742079018923048,0.40136402764426615 +0.5440387129192926,0.3708114914567306 +0.6838495134564805,0.47764542602517956 +0.5412042736419514,0.4116491369050608 +0.8824768065448078,0.7069951877638848 +0.31504985686696146,0.19700306614240456 +0.7626682519084633,0.5525931108772889 +0.5702276229239259,0.35909414218951696 +0.7644263505105673,0.6424504505550533 +0.6586778163194735,0.4922239174451305 +0.7858933805566068,0.6219749438138212 +0.6788316368319642,0.49782082338057293 +0.6358326672817318,0.5162419070321531 +0.4836724101971941,0.44502845316768996 +0.6079707145030798,0.45188325552393505 +0.7065761088557768,0.47400063180683844 +0.3480607270816542,0.2758313411871109 +0.7959386109441575,0.5805951941223523 +0.5727509855602181,0.35718828367666805 +0.7948392032713948,0.7519154533478707 +0.4689219295469402,0.27474594060794033 +0.7736113070601682,0.5726088273896511 +0.7464069723272516,0.5708898890424408 +0.5315421819109754,0.3802858583409256 +0.49709308142033104,0.34646409680102114 +0.7479893564365768,0.5233283628398505 +0.4859838485190104,0.3739788524713838 +0.7023612260055875,0.48119699857928 +0.6192868351263934,0.4228890529685865 +0.6831574439260686,0.5010159005549908 +0.5966278909989098,0.4006456724668821 +0.8642032145515527,0.6809669123265774 +0.7144076227366098,0.5313714135896187 +0.574881076750325,0.4102781704733473 +0.48398029798974795,0.3543227605825486 +0.592316925461353,0.43201404722813525 +0.495120257085447,0.3808494798607849 +0.8212968110146464,0.6459621177995571 +0.6409440039892458,0.46854188943770664 +0.7477737664364477,0.6735195503954929 +0.6031709908784179,0.4244089118026486 +0.747491002001664,0.5004472722449805 +0.24263688919293913,0.12456059430747415 +0.8692288993845336,0.7390606388443802 +0.46440732474053037,0.26005035586356434 +0.8360827564285378,0.6323803650498523 +0.7784127592195285,0.6283969270429028 +0.6031532286942767,0.5066496123585079 +0.5231106280712536,0.6091848599544262 +0.27834624049025514,0.3837215892681387 +0.39716446395376404,0.1385763284749133 +0.6676537393798698,0.4517948022312668 +0.5717518328999567,0.3692092888060774 +0.5137937664427792,0.2158598299440917 +0.8316314219525501,0.5581700790590942 +0.8547199963595281,0.7613909229179918 +0.70960605136796,0.5658869731933094 +0.8405755161326398,0.6120111929946849 +0.4154854714419329,0.33874732187609535 +0.4833907186460162,0.5213882912609695 +0.3035254776148253,0.1419168409822898 +0.6134734749127911,0.3748507492133996 +0.48235577339657104,0.2668835217337996 +0.6338591574934329,0.29586204826760387 +0.817984700114127,0.5673801887512107 +0.792183160695847,0.6817713366108435 +0.7056059836575178,0.4813268472976613 +0.8671030401242054,0.6412362443387829 +0.43276703352997653,0.3161898248970582 +0.6077442168529579,0.3665343515632428 +0.49436485761996807,0.25498396106787513 +0.31283536549986185,0.19089451393724213 +0.7536755799428869,0.4955047060985625 +0.6840637325497799,0.44199463635938663 +0.8739218710904144,0.7969456895012453 +0.6761888860922,0.2832505697259181 +0.7757073043934672,0.5550457824002044 +0.4513617753492466,0.22713130666696232 +0.7479956745289223,0.5370097149507742 +0.7601733206877259,0.5213726152394252 +0.6087316273981999,0.4462440004884651 +0.41885536904555565,0.3471072607191727 +0.5090803503437427,0.3646058432854249 +0.7866654991249434,0.5723994362729775 +0.5165898203288891,0.3013337844492705 +0.807242631824583,0.5322926033727644 +0.8098638056829409,0.7058374867507475 +0.9006448387121772,0.8939360362141828 +0.49078416819012005,0.2965773338057882 +0.5271699427985961,0.5544720280907538 +0.2626895308209346,0.17420077288776867 +0.6695637702214898,0.4048353425443384 +0.7392559050711006,0.6113104211874741 +0.7413884996562877,0.5129004706527845 +0.5303282737156116,0.32223963672491296 +0.32458412643723056,0.16671693291415524 +0.6099549531274371,0.39565721074407956 +0.6383006572030337,0.43924125940418585 +0.7370222210083853,0.5775415885720234 +0.7994882463540809,0.6627797471029464 +0.7588043212066734,0.7176383719274454 +0.6471508740676123,0.4807101478417366 +0.3612260520066011,0.5587181437666985 +0.33535498377019807,0.5803467023587848 +0.29687857624645214,0.09870156625866502 +0.6793075799204441,0.34541511465973485 +0.5026298760822054,0.2787099475007322 +0.5956562756845316,0.257937311605894 +0.7568188904894206,0.44456535488104165 +0.7518092393058826,0.559582649532777 +0.825603961854938,0.6513844119284823 +0.7273984550639957,0.44808754234532705 +0.8734773992543726,0.7097101793279277 +0.4542893170817168,0.359460412730923 +0.5243567823794375,0.6224433767161661 +0.5443716644649718,0.5227211703247484 +0.3774108588285742,0.17593076789656253 +0.6193726658148606,0.3902363173243038 +0.6486985086690373,0.3986794046466751 +0.8253908752498891,0.5588517773800155 +0.746776997961977,0.5381438125246281 +0.6892801522460215,0.4620740702368852 +0.5567097067228485,0.42273873005476614 +0.4425182342048821,0.32608577543289924 +0.5003654956274343,0.33631485632771796 +0.7400947808415783,0.5524008858982761 +0.4895261823599496,0.3045769923742474 +0.5164561867153172,0.2572979921873227 +0.892485260866536,0.7798238976961808 +0.8608504532833009,0.781560657832143 +0.7412415742069324,0.6692843423695201 +0.4667543470352737,0.3436275713665264 +0.19474682209761401,0.25132095763059187 +0.7551934718265723,0.4916487326242081 +0.6982448100285564,0.47049197459688974 +0.3692688941554623,0.30410382090265237 +0.6397396325370449,0.3331230276064338 +0.49555620545728685,0.2763462061076422 +0.8626909255044757,0.7459392532561651 +0.7815471290693469,0.6136868583698756 +0.68186736099469,0.5760313260857508 +0.35927549000653825,0.17112216318900697 +0.6492947339306608,0.4459306588715129 +0.9130638836822949,0.813978431967195 +0.5993427633588445,0.33709663084701513 +0.814643919379474,0.6021464454903209 +0.49279889459027665,0.3208264702047836 +0.43257826561999335,0.3404522531318117 +0.6505836843737887,0.42131805334941025 +0.6632828115696755,0.4924443950257099 +0.3241870700961024,0.22460338428016974 +0.6341270207670244,0.24824199030396227 +0.8529889582661492,0.7529597863268739 +0.8222565650047156,0.6733680949934242 +0.6901306509222291,0.6468988047903131 +0.6612150072333521,0.4654205134064049 +0.3468671440701566,0.43715327889959305 +0.7486890553615192,0.627455888913087 +0.31537026163491677,0.17310127581013712 +0.7053832411000164,0.4045675984805474 +0.832249998955962,0.7179570183577719 +0.564858615337076,0.39331662575543813 +0.4712160527194511,0.3732579044919572 +0.4137500524071634,0.30814617810084344 +0.6369339823031271,0.3895081273805516 +0.5500752925275544,0.3327577107393423 +0.7458572386885479,0.5341545332625025 +0.9312913416804989,0.7531689390249688 +0.6159006356524263,0.4395977249815461 +0.6092243193918597,0.5529960382751579 +0.2476563751428641,0.523574947254789 +0.4431667029376456,0.3014186018586148 +0.4098384379895583,0.1812213357607998 +0.6865178941934954,0.46817150617581943 +0.45934969181795327,0.20305460650495433 +0.6240331529893424,0.25243365713701454 +0.7835382818324973,0.4841481735477689 +0.7514367102760768,0.5549862373601939 +0.7713271974679784,0.600425361375903 +0.6966265439230802,0.32951211862857915 +0.7204715608768205,0.26856049841117274 +0.9266378878540998,0.8674135786680394 +0.5540514587754443,0.35215830731886316 +0.4488268494118693,0.5154827226731803 +0.5893105267838534,0.521684645554195 +0.5036971568514377,0.3073617213725368 +0.48304003471851825,0.2256066496590055 +0.6653255819551959,0.476224510901245 +0.6787712573268133,0.4870772351930908 +0.8228108285964216,0.6120480286650818 +0.535553455294634,0.38088351411288296 +0.46836069221179605,0.2884824866198147 +0.38032999630613207,0.26912668293075215 +0.8605052827854441,0.6652998314789669 +0.7392265795858742,0.445610611732037 +0.8626994489686776,0.8492812497174911 +0.5100414156359967,0.2965562933662249 +0.48765033478210457,0.37767490668412834 +0.22905081508056846,0.15171086757577049 +0.6833797096464118,0.497386782358194 +0.5583633183826726,0.31276416715479183 +0.659727513718499,0.42082506333346736 +0.8451591729200144,0.682973085456381 +0.6917703150951773,0.584226487888679 +0.826667189508326,0.6772754178691489 +0.6178935169502751,0.3544451289180256 +0.392176210837698,0.558978377645263 +0.478446870990303,0.5004324902931061 +0.44678899640954234,0.18684443793756822 +0.6491702198277386,0.37347680254945337 +0.6765688657026018,0.525564967525891 +0.5263398885155441,0.2958566540472626 +0.8276078104074243,0.5652010429426177 +0.45374554390749,0.21934044316873016 +0.4285035728943005,0.19618451555735517 +0.9033002852412773,0.7506651267169393 +0.3387017845739729,0.10715451814972679 +0.9222795962285965,0.671727238730712 +0.7057186364361311,0.3182811134594294 +0.6719539164767235,0.5588054645711183 +0.6842789649220405,0.42383143220290703 +0.6878988146035018,0.4694324126311772 +0.6857494115084898,0.46760439778424784 +0.6840969323369163,0.49008452793452256 +0.6000353693310593,0.4727962007522915 +0.3428206443414395,0.2665145689833841 +0.8169944285459363,0.6133567678477753 +0.6267469524656712,0.4492228022097517 +0.4943166672646724,0.4738762369134431 +0.6583680509806095,0.4735787203296469 +0.6509469746836553,0.5096415271016186 +0.3742865919660442,0.2488905186401328 +0.7737175225371464,0.4718987932223633 +0.5625202655181465,0.3905586592425989 +0.9012144803022337,0.725929556812913 +0.8650630711569891,0.8143963201308724 +0.694630682392993,0.5432829845914412 +0.8877443074216163,0.6730125532880561 +0.7328270672956145,0.5631679881180747 +0.4061681627786226,0.2996647053873142 +0.7552681564464677,0.5925457465617792 +0.6479813455831777,0.46860006357089007 +0.35278475280745963,0.26519590562735557 +0.6294651030810683,0.4360159328726055 +0.7147684096513961,0.523854791061445 +0.6407158970137151,0.49629905719788187 +0.7375208734665221,0.5198202122693815 +0.7939670085044912,0.6761888848017299 +0.6785581707217645,0.48247307441670245 +0.4869304000802632,0.3137678199638178 +0.3822288214745355,0.22691002442368002 +0.7430241107133916,0.5489442933454336 +0.645139813353109,0.5048543204614943 +0.5778921841947612,0.4612502744431061 +0.48636138433897674,0.3390261524037922 +0.8769654034616049,0.6411123262825449 +0.9135205148658695,0.8936524373149135 +0.6176199316307858,0.38777869861588193 +0.3481072783092187,0.2619417900524067 +0.4636713265869237,0.34303069045494955 +0.6848607062549852,0.45958927181050063 +0.40910804267256,0.2058423455377988 +0.46518251294807256,0.2891513103374903 +0.7306137680214102,0.5109618891900198 +0.721358776014206,0.5003660311143155 +0.6564841865780431,0.4123526207236034 +0.7903670667743828,0.4912751307115095 +0.6602580546615872,0.43273228319623 +0.9155982731778692,0.7070426330610303 +0.3675827383595944,0.15334674685065386 +0.5949386357615138,0.446793853335409 +0.5210618376166116,0.37458830996298287 +0.7942548393340804,0.5938327300491736 +0.5989723204916056,0.4652679851207323 +0.6923187374316961,0.5780656326078316 +0.48316615814684927,0.33308109573891886 +0.4555615782243094,0.2884126895809235 +0.7441080211785144,0.4736509313566466 +0.5270992516899001,0.38099378270549505 +0.8815139531132107,0.6094446766004781 +0.694883465691458,0.4008614412805338 +0.8806173204419518,0.8378514034537717 +0.7677568196416754,0.5419033158816081 +0.44292718167264167,0.44530668764894027 +0.4285432099830719,0.6493192898051148 +0.47845706338455846,0.28752711357295935 +0.5479080080391118,0.3727318040959084 +0.9273114203399886,0.8171969635692847 +0.5197837948234765,0.26297038740522094 +0.7452361582900557,0.544450639580236 +0.7339797019161559,0.45198047069936764 +0.6555787920240032,0.5442420233239429 +0.5766484140723681,0.45340555814842803 +0.4969549178537567,0.4206536403754391 +0.7489113806865073,0.5078966011293387 +0.6456133722557981,0.5158883918847034 +0.39037594194941994,0.3389103405792272 +0.5411376952537446,0.3769011489895373 +0.8076735734062622,0.6269572960605466 +0.24473294613088292,0.12601295088146428 +0.7413834928661271,0.28642290772840007 +0.6902840136732196,0.45812323597056215 +0.7294476031465064,0.6426877962500702 +0.747398137965114,0.5706362712794331 +0.7573056220186036,0.6056485163870352 +0.7252458333181662,0.6767606721579069 +0.3268179893138801,0.3493288748370824 +0.6135966777135285,0.6343246685585038 +0.32257252928092434,0.14942792027851062 +0.7838661669833712,0.5612859714630878 +0.6530583500153047,0.4732578983297904 +0.6209582685750034,0.43295952590397785 +0.3018884658485693,0.1970342095692369 +0.6773860453823837,0.44890391736084656 +0.6398442386886144,0.44755950479832696 +0.5945370196650609,0.3743807367879713 +0.6974346636968572,0.43515467555966064 +0.8178212641781707,0.6282073246682547 +0.8581510781310061,0.8546228391575532 +0.6997398137286504,0.48477020761939027 +0.3598876893129598,0.41502907788487664 +0.3712105750634546,0.4157842687326576 +0.6396821736594878,0.3077099913112569 +0.8812553285595583,0.7478726491148447 +0.3911927938036556,0.2543366844292424 +0.5876065491991996,0.46504202391284455 +0.742580354133087,0.5707755673339922 +0.5194942950638338,0.33327865533362844 +0.3926245271733274,0.27598792258862004 +0.4171817898297339,0.20834681349691958 +0.7270534633800732,0.4795760800702051 +0.7551507949009177,0.5843348491326621 +0.6763790845136576,0.604390023919786 +0.46058976645237065,0.23416951251481138 +0.818789482027797,0.5621108997451153 +0.5270861982726958,0.3092342310867012 +0.9473774432107347,0.7975462659007908 +0.226737737631021,0.07503592952852137 +0.6510959862955775,0.39492583195183834 +0.37849310036364353,0.28752204717816365 +0.7024648188781958,0.441460817161855 +0.9159904717404488,0.7524842008671703 +0.7829970716579956,0.6777992234863786 +0.7330603002705953,0.6433872567550986 +0.46196493501415675,0.3912053696371075 +0.4787908493952644,0.6026417600874053 +0.26345384118080645,0.14645424455666436 +0.8223719595969882,0.5309439290781519 +0.64225453131378,0.4427120080601339 +0.3661409020026342,0.29782065689097265 +0.4624446629975794,0.2648002201938122 +0.44416263694708946,0.3306664221769711 +0.8138956426690449,0.6391752349358966 +0.7201261519603847,0.6069327580607754 +0.6267675160681165,0.5296850789830347 +0.7969236373036087,0.549184142435526 +0.6128417848875302,0.43519115360218963 +0.5958421229669211,0.34678429295210866 +0.3848346769391879,0.16046634284077957 +0.6260359286582228,0.3630090646574353 +0.5562868713728578,0.3748084299156944 +0.802265703591023,0.599305092079609 +0.8842581509583717,0.7533302887980504 +0.7077207564539191,0.3871978811560397 +0.6655434369318263,0.5067598809511199 +0.42058649654590174,0.2878509158050485 +0.6565557717564106,0.439221530266805 +0.8563049434685784,0.6492768512981203 +0.6897901295866643,0.5258891571881705 +0.19738093016388686,0.1480213400716157 +0.6984297036366296,0.48509520194437256 +0.3391488790143845,0.2406119103346874 +0.6242828368462794,0.3434817188010552 +0.6139881610203708,0.32944375210115967 +0.6999493240550132,0.4615280320871992 +0.7635844945078512,0.6037111866218083 +0.8263763188418536,0.6024327862032443 +0.7318926452795722,0.5073112835188249 +0.8252519368229327,0.679033814491121 +0.39915853734450824,0.3355760567572172 +0.6281546949658235,0.6931084380474795 +0.6365014910006839,0.4477427294759969 +0.6056216358480919,0.4577450146979028 +0.6777261494854351,0.4784896066074307 +0.42215955252832066,0.28953716100466553 +0.41485035414959764,0.3018264764419901 +0.7613605260022333,0.50235044854882 +0.8008852600181748,0.6221551882592584 +0.8312002419522918,0.7881565078096837 +0.6978704928594076,0.459903358485511 +0.5778257846204886,0.4739083340145899 +0.2324895560488993,0.23242184472887725 +0.5935661792110647,0.35531669783449576 +0.4910018741551385,0.3793466381527718 +0.41582745309129454,0.22867584182391168 +0.6286837457927925,0.24430388162927308 +0.7368150948678134,0.4395643463805392 +0.7473376988553183,0.48922845622566274 +0.8258117436466025,0.6608654247305564 +0.7767397164455097,0.5378099073052699 +0.7887415289022449,0.5745090234612579 +0.6052165030775976,0.44688588290675657 +0.4766567050893133,0.40277424373448506 +0.797135829838986,0.6529418216886772 +0.4452803432457962,0.33160275153985913 +0.7096392511550963,0.4864418794833891 +0.7471371888303157,0.5271887172555871 +0.6009724735561163,0.41250485098605266 +0.8253461717663124,0.5835688102395539 +0.4866187273927665,0.3344964974332228 +0.5532193779344702,0.40738099731291594 +0.3791223764007914,0.29173099935816593 +0.7398487328679723,0.504966377193446 +0.5339850186721847,0.3166773908903375 +0.7997945546235484,0.5874554503035834 +0.7532418369429036,0.5306535948540366 +0.8536133765247483,0.8107581122257657 +0.6355340480114395,0.39242678801538117 +0.4797868728116754,0.4102815381357703 +0.3389433025945765,0.21265643792174443 +0.8390271662754776,0.6016422498011829 +0.8820405005450993,0.7657695993236497 +0.29129058119472123,0.21434786872544642 +0.7120798825444492,0.5715516198074024 +0.7041794060896186,0.5152108062842634 +0.5966173409767856,0.544836937282246 +0.7103799580756397,0.535827814451907 +0.25355541703332163,0.19990017969819127 +0.7209364175013734,0.5317801822426639 +0.7594726084838225,0.5406359423223053 +0.5649438499790955,0.3797833911864826 +0.8218748568596154,0.5671616185192602 +0.5352649092093078,0.36725723669362065 +0.35481381412468316,0.24214568685327648 +0.7814753650770451,0.529296814327751 +0.4139733314064678,0.26379448122222326 +0.7586029767166439,0.4472755780735121 +0.6840198039265852,0.4570519616921748 +0.6610716580626829,0.5385602701768337 +0.7658497094276491,0.41086342847921636 +0.8941950201017325,0.7817130073038816 +0.6848469971866883,0.4882637848542412 +0.46206223959674203,0.3517562143860194 +0.5283610224150134,0.4325511744834453 +0.5252079963113824,0.2806485289634968 +0.8394573329967749,0.664202211947642 +0.4965774118361127,0.36947852298598477 +0.8098726271703668,0.7271590218182151 +0.634042024543584,0.47282406592366777 +0.8591032027265448,0.6724582896974077 +0.4410203992841616,0.29545783936987485 +0.45421183104351726,0.36860638782539035 +0.6398149728080329,0.4310449651130092 +0.4570954143504704,0.24341356705205885 +0.810461938293197,0.5823333251651416 +0.6898229121412872,0.4593875994953099 +0.3404237031567022,0.21402862624867333 +0.8682525156985739,0.5856843578922997 +0.6275866627011758,0.3707115642699662 +0.7703667878268169,0.5889558780234878 +0.5821173190438508,0.391270100281203 +0.7264952658818122,0.5432934154042559 +0.364204883535895,0.22932288004396584 +0.5627617239341054,0.4190661302696934 +0.7676703333021158,0.54236364255228 +0.5389792322527277,0.3542440228469591 +0.7401618956715881,0.4483886948124473 +0.8914425372109486,0.8139084561143699 +0.9111555813753731,0.9067735653707233 +0.43781387801185045,0.3558045022463537 +0.40230500693721466,0.7163120493745786 +0.14323332904214156,0.10918596364886418 +0.6706671118008073,0.33030670814647717 +0.48082491750264855,0.29516738593647024 +0.4791944026426724,0.1795483823969409 +0.7774146198382281,0.4141239515534656 +0.7878993748763048,0.5367390502593952 +0.7610629796155468,0.5580669630238408 +0.6749103664619066,0.5034621943809282 +0.6940226554117053,0.4924680878719604 +0.6202108859342459,0.4585520317842114 +0.5986748933142088,0.43662488372472497 +0.6133800148297935,0.45172202496014285 +0.4080969094787001,0.3213475638106814 +0.6513489484079769,0.4450978627763909 +0.38457813854810247,0.26409578270095513 +0.49085450167094735,0.17902085148942035 +0.7667363881232315,0.46001863386827413 +0.7658859490516686,0.5439857233519256 +0.7482217549465309,0.6672497974288606 +0.7250367402243169,0.4794432213172687 +0.8399711846393277,0.6833757744356713 +0.40936705465640333,0.3335507207341569 +0.693401098176055,0.6830817447235874 +0.43096834416478486,0.4856640090683168 +0.5037491917063209,0.3263020806883528 +0.5178843140039805,0.25128489682057553 +0.6004804372135488,0.42084264670364063 +0.4667881130665353,0.2779200667497619 +0.5031925439288241,0.17150592769361928 +0.7258673905538164,0.37436640187093173 +0.8028273581586806,0.5999720680533004 +0.7412533759265966,0.591415344475894 +0.44805803890131735,0.3324478857964247 +0.5428511499769166,0.3864742509676036 +0.5016148685864356,0.3427644067049526 +0.8941574095708833,0.7604185327450874 +0.719440460126963,0.49616154928266243 +0.6923905014239979,0.5548049200311529 +0.52706575387954,0.39609229484773995 +0.24111667272810786,0.17701151931345002 +0.599675893718458,0.4227900496538143 +0.43213361497001723,0.31375950511588846 +0.5503385662434988,0.242243259656577 +0.7816604374990526,0.5218315113986254 +0.8399034737628702,0.6835038052123906 +0.6817189454292155,0.6555188285003433 +0.8004317282761282,0.6306523071920097 +0.42315769190962094,0.3454941504185476 +0.6167884468362593,0.6707350598157822 +0.3589138388244028,0.3780860595229597 +0.2867978512929416,0.0813327132015048 +0.7033320068549388,0.42561998877507456 +0.4639201461765116,0.19070553741136292 +0.693687915726683,0.37191483303394235 +0.8970698117235822,0.6836024508992948 +0.5787869095173874,0.41309547340994074 +0.3533700704190904,0.2099674041804489 +0.7325603365102736,0.4805460264526786 +0.5364176034344939,0.38456746858276253 +0.7488609551570328,0.5278425206028096 +0.6286054252895661,0.3802171639879605 +0.6361828445697493,0.4213549188221295 +0.7739762066954435,0.4980086674182037 +0.9148422478636203,0.8074114306376674 +0.5702168344832227,0.3725596062774996 +0.6224398612300244,0.45326989797719286 +0.4780090152698305,0.3440556519244398 +0.4522629379735079,0.28454381170100124 +0.625929355553376,0.4638174762907265 +0.5706365703916855,0.43418714316529566 +0.6850507258625085,0.4481299510499992 +0.8657993673338196,0.7091020331385111 +0.7483631371639228,0.6946784243876966 +0.7669020890356891,0.5913192021840652 +0.3396739959347987,0.4062066964062422 +0.332409083807139,0.4542655935661574 +0.6128749846746665,0.28321677389239863 +0.867204248811023,0.675310967990604 +0.9268294571823871,0.7328830942630294 +0.5139912962355434,0.346587269799201 +0.43355286116660996,0.2738457316597133 +0.8697040080079866,0.682207881028298 +0.7536057232992178,0.5756645787071876 +0.8211348651948093,0.5552378285652834 +0.4047414660014338,0.3344489627291103 +0.5133172869124965,0.5204259742730118 +0.29468664523739757,0.1724672314026178 +0.6179240941330416,0.419667630541231 +0.4156805574442615,0.21860885576023265 +0.6767354010800861,0.3274011009288271 +0.7261109351323423,0.45080870299009174 +0.7271583079502217,0.539498983725508 +0.8017452954375456,0.6149146544451274 +0.7594448327193601,0.4967567314618666 +0.7915747164820459,0.6211788641798068 +0.5675768851617625,0.3970397106745338 +0.5316227077860582,0.423171310763351 +0.5996201037709543,0.347980021728536 +0.6522195338494716,0.3755943171554728 +0.77537000170872,0.6005468356417102 +0.5457898377779586,0.41770198856979296 +0.5286574959180941,0.3891955308216576 +0.5496083497404347,0.3721734277847788 +0.8896555303561317,0.7565367206572751 +0.5509696602223121,0.3863387994126248 +0.6744468807441835,0.5164147605016531 +0.6743738650543416,0.4811259200405287 +0.43388462061939376,0.3349797122874422 +0.33472383018674,0.24784004638273016 +0.497366249507307,0.37545424624053314 +0.41665291781669933,0.20342457253432894 +0.7282933592005563,0.4015826574808613 +0.7428232430605204,0.4810235788656558 +0.8428300618210242,0.7281628832434974 +0.7416617869525532,0.695729611900835 +0.6684974431265739,0.6001303183848599 +0.30981296297524186,0.35276919532193396 +0.6903495191778206,0.5739064205037941 +0.16522723434561593,0.082617044282212 +0.6742590069038719,0.4053966394830561 +0.5218001603513642,0.19702723582581222 +0.7985112666216736,0.5995974528616427 +0.831968068986205,0.6421942101876807 +0.6982101201253008,0.700940726773747 +0.7293721436662289,0.6106864201625792 +0.3950206934976827,0.34170973232010177 +0.5404590963730505,0.3307714455608535 +0.4300355016718289,0.24663966844401974 +0.866966128255171,0.6459433423364908 +0.5041401981760051,0.25227147289890783 +0.9511457680623152,0.8159700615637028 +0.62153565876888,0.31225946482617417 +0.8172965048856251,0.6137872325914749 +0.36348563428746844,0.234517097000118 +0.3962244987057582,0.279166817102014 +0.5891867875413132,0.4168369463619125 +0.3137906789438957,0.2195290322644191 +0.6416170596379763,0.2528755063678433 +0.7240666746307026,0.42852052959792897 +0.7467104195737702,0.4897468080179064 +0.893475770853306,0.7441295966397895 +0.7326200007596873,0.7605019792476047 +0.6255446075713926,0.579768656514919 +0.27451109883188857,0.3728852860558955 +0.7221059202363843,0.5428125847358226 +0.30581030246275226,0.14460280508438558 +0.6687455176581021,0.383499263943575 +0.6709771155582505,0.4287258377964437 +0.6793739794947167,0.4417460253865299 +0.8071960209923736,0.6237773286635487 +0.6121897100737582,0.43289706023637925 +0.901013493440073,0.7461231335849262 +0.5478582381607298,0.3881525687494815 +0.7000266908839232,0.5439796436781709 +0.3997242748303324,0.2847362750985928 +0.35457533594096274,0.23939886640898778 +0.4021252393285916,0.3387746506056697 +0.39129644628090876,0.1943566795243598 +0.7439633011010155,0.42170935784157143 +0.7015273570252702,0.4210986188501123 +0.8048126696666437,0.659977911571641 +0.7774608134379241,0.6151268469800998 +0.8112378119541541,0.7793384178654644 +0.4378718733312106,0.3877981893346842 +0.4541125297053322,0.5636512625769388 +0.6185243129058646,0.5601180184510698 +0.4559453725319765,0.30689424214450634 +0.35685145851075345,0.12281534050964854 +0.629216790130961,0.4046989671173674 +0.4527156948551726,0.20733082252644994 +0.6861518024653247,0.34969323802985947 +0.7246469854521729,0.4110593787485202 +0.752607941545786,0.5181520570794172 +0.8027025460325344,0.6411093460503121 +0.6810636519646259,0.46804174686440514 +0.7376434802208117,0.5204005826943888 +0.43614411349329396,0.2697146827502754 +0.6800500153756858,0.4367105952037391 +0.607647955351656,0.422668754201941 +0.7111963032903947,0.501240073623539 +0.5744403004022588,0.38972315113614514 +0.6533780097252003,0.42034909044357355 +0.9189423321679847,0.7578787788363308 +0.7975502013294196,0.6269605147113579 +0.5954493283578939,0.439344166823183 +0.2325835227713775,0.3285509937335146 +0.5093702673358986,0.29728969871638444 +0.7422759532122521,0.5015448321716608 +0.48236080998905406,0.37791278882094714 +0.4945130347668636,0.2341816122576764 +0.7946616410346282,0.5336400259698391 +0.8972514866808379,0.8474966270518708 +0.7822165488347466,0.6917068348284132 +0.7004536389544029,0.5171857465802677 +0.32098272439332537,0.4984575797994241 +0.29433149096154193,0.5367158640526243 +0.27611786124092436,0.10684967019463794 +0.6978201269345778,0.387548624687513 +0.8307757972768923,0.6130188691172251 +0.7357663511431042,0.5628508318038645 +0.5365709661854843,0.4036546937430089 +0.4733173250638122,0.35432112145482053 +0.5334299206154518,0.34776282240341255 +0.5379088520419675,0.3996826998278332 +0.5665475129466033,0.37326937838605334 +0.7662329672935132,0.5244585861118018 +0.89332383861379,0.8066897972048273 +0.7371237873230716,0.5904719817649366 +0.622040152482204,0.47461128139133063 +0.3019829988151728,0.3404280536460817 +0.5275239347838787,0.3194751733058063 +0.47524511808957337,0.355984210249989 +0.5870872735339727,0.4143443695294004 +0.4700044691052333,0.185669004542646 +0.8285499810272866,0.5625303972341983 +0.852787017729672,0.6939474330256457 +0.722099542539394,0.757497785947695 +0.7309349178474251,0.5629126418203719 +0.319219022954613,0.4001694313560873 +0.5242114066508461,0.5131792415758367 +0.2595419287399775,0.1218742129728658 +0.7132573126972145,0.41817870651774497 +0.45935985440988636,0.2578248376414297 +0.6220429539005081,0.4254454961778466 +0.43330335612360726,0.2811785930684152 +0.18921571967931503,0.1577236947216167 +0.6127321123411553,0.29871827303715714 +0.7233598231483881,0.43045827659566843 +0.7715664505120808,0.5745012748574527 +0.6774612068394372,0.6681919084422802 +0.7969508170216233,0.6275201427200253 +0.5491596459746143,0.43360671313564364 +0.466231048056525,0.47300341629943515 +0.6459209918274504,0.6506546126593244 +0.3972864150569613,0.3340782516416775 +0.42491912837183204,0.15320587127301138 +0.6711605786548491,0.4326125374651178 +0.6530107259041343,0.44144391924509524 +0.4416442214963131,0.17113625968746793 +0.7404589652211164,0.34293508460492267 +0.7693799733280227,0.5632031548584212 +0.7701569198725855,0.6222762452925531 +0.7599163054594823,0.48730936548170034 +0.7083401679223577,0.2733785504549061 +0.7653917073372447,0.3815312377863507 +0.8053835629542404,0.5967503178003993 +0.4712513386691543,0.26708561128150293 +0.6593015193223355,0.4728646268843556 +0.5353729724302738,0.3597993843450769 +0.806091189296937,0.5463967312282272 +0.747570156969917,0.5073014487524568 +0.9129360913239103,0.7277762279136194 +0.5974892377204654,0.42049482379975545 +0.328826069796145,0.3449780934051232 +0.6081558465297321,0.4147245577553334 +0.4451393484585953,0.2872483426499071 +0.7516858576912109,0.5505089152676317 +0.3205524980673833,0.15977740255553283 +0.6263517140662086,0.2227846379554843 +0.7638417481546738,0.5153837193584081 +0.718408942144592,0.5146400918116902 +0.765731334603138,0.6153911339745008 +0.7128940819919927,0.476103781693496 +0.8435915707625918,0.7263221726072566 +0.48418956989753165,0.36010521577680255 +0.550999581753986,0.5561371434438405 +0.5714291929578226,0.5166035880159207 +0.40755996103629927,0.20029273588789018 +0.4767981767136723,0.24085304092463988 +0.6062431334790974,0.4175888291519151 +0.33770912881999127,0.145507603590251 +0.6260294913565878,0.39091163794824685 +0.5097931622905341,0.33809554508679107 +0.5776883363096514,0.35055458474977125 +0.9111008047068305,0.7682564839125973 +0.7734814881438615,0.4248873582852956 +0.6777644156673768,0.44156926781280503 +0.7620732187397352,0.5254175652396588 +0.5188976525696969,0.32090270454529757 +0.5837631820998549,0.3698525719335183 +0.8523942231206448,0.6208085405225643 +0.651832818914211,0.5002091516895831 +0.38894453640529436,0.32288348609647805 +0.2924664020220777,0.21990778997888036 +0.4532321094974505,0.3466301553410304 +0.4429515003677074,0.20084986050148204 +0.7114524244489668,0.4189316025867067 +0.7034575342368222,0.40802746928884587 +0.83903557053039,0.6854595528128159 +0.7341271042026694,0.6328432547202443 +0.7916256784533233,0.6523278938487289 +0.516364693585597,0.3714066140312901 +0.5535367726678646,0.4534010281954342 +0.6511121391543099,0.4351845374866329 +0.7637305854921798,0.5482652176288773 +0.44059666986449936,0.2669545704702286 +0.5166168212329695,0.29041516722275845 +0.6476792692434888,0.4216982117730209 +0.9101648329700242,0.777393756728945 +0.8566248415970532,0.7111719832380957 +0.7179406880552874,0.4988792826603594 +0.3848795294343765,0.3756437294058919 +0.5610730647431572,0.4968073060028565 +0.3750653266499501,0.21732532934222829 +0.6731809972985812,0.4550876608252415 +0.4918191730442099,0.31676942046168505 +0.758233070291208,0.502124546945577 +0.8259365557727486,0.6756228194914398 +0.6667118667832314,0.47054690027693946 +0.6286451219829823,0.3421692841303931 +0.4436522125716108,0.2273482079688625 +0.674488544390877,0.4058270148197887 +0.6759155987959344,0.46550497318788125 +0.5694832801200517,0.44809725790240584 +0.8077063559608851,0.5707514274529069 +0.9327090381563276,0.8698649388887724 +0.7108055948439345,0.4765677442474918 +0.38330230112682373,0.3561024360626625 +0.7637058495646006,0.5099763859952914 +0.3976176976725869,0.18795001468895456 +0.6718226670489423,0.37678956909474287 +0.6845054029675176,0.4528858652516796 +0.6935887335977875,0.4633582821083031 +0.870629668141248,0.6107811915475809 +0.7626465558177674,0.5745613563392651 +0.8521051405935156,0.633428393516824 +0.4144619702842834,0.40913686073749017 +0.45684275026129495,0.6760152564718495 +0.5111516117494626,0.368499457092879 +0.5642337202413187,0.2894597643735808 +0.39394980664744195,0.26265293306778753 +0.5587050914157776,0.37963384313304277 +0.43787872786535903,0.17913773619758913 +0.7490576504847702,0.4346183827693758 +0.7457796930457035,0.4646555175945781 +0.7943201064201023,0.6638321863136226 +0.7055816649624521,0.45274680761569913 +0.8482282756838109,0.6119473564202592 +0.621842563084795,0.4315226963399204 +0.4869087337918897,0.4075730434779949 +0.6059600114164451,0.47267976307895765 +0.5072341560766701,0.2505666906548031 diff --git a/synthetic_data_Kesrouan.csv b/synthetic_data_Kesrouan.csv new file mode 100644 index 00000000..853a596f --- /dev/null +++ b/synthetic_data_Kesrouan.csv @@ -0,0 +1,1177 @@ +0,1 +0.5915231704211047,0.41167277057562723 +0.426116406881491,0.17990845424276633 +0.45371109243365887,0.1671676932135477 +0.7757400273619883,0.8486099234889867 +0.6217468380401582,0.8569174400557462 +0.6922532915482872,0.677765785986955 +0.7302784919120413,0.5480933780094466 +0.5049168467094134,0.5851167434709369 +0.6025798916306483,0.511254548528001 +0.5968328117818917,0.08362883321237423 +0.5761262177933191,0.1956371365070172 +0.5953521131965068,0.5066645736522579 +0.5021446346811447,0.551596939025928 +0.6150479912237088,0.5189145202345521 +0.6653717159661517,0.44848149971149054 +0.6225950121352402,0.4644832010508689 +0.4333041309943468,0.45671513632112304 +0.5962756275625786,0.3993505831639357 +0.5531928538807712,0.17728945595621168 +0.6464411019731563,0.13686546669966676 +0.4638404249752206,0.26137265537526566 +0.5638436078547839,0.6326848858386496 +0.5640804171084565,0.7994241110636471 +0.5317786931541298,0.42875510412372975 +0.6512244939252659,0.5117729301231072 +0.6290205716554175,0.49092838120277266 +0.6117749809700797,0.44964051202801797 +0.4201212823035227,0.10971933592588785 +0.6264547109073437,0.300659060185059 +0.6591966747679442,0.6190611118002668 +0.5651593207834446,0.8139320604017658 +0.6928048133263471,0.6303293102794228 +0.5963089465590051,0.7826197139738612 +0.7062982916233919,0.9194492092704412 +0.4423507451636552,0.06174960726439254 +0.42742955681042644,0.031332462995496684 +0.36539310213809756,0.27050167295784106 +0.47871434684514647,0.5574007624913384 +0.5918929576372599,0.5392673010336467 +0.6083142756900687,0.4908060724718128 +0.6965103744870746,0.8946230402806703 +0.6085146069011419,0.49356299590624325 +0.6830465793031256,0.5821785921142435 +0.4374685883151611,0.0985570250980721 +0.5239599942717352,0.0705468355921492 +0.5035176276734296,0.3094850179515694 +0.48680880661657105,0.5647439355112172 +0.6357410549579185,0.9411694994332842 +0.6813422440905624,0.5648437136864739 +0.7227064966543512,0.6564396017349826 +0.7651187180824921,0.6493244164811475 +0.648983895723704,0.32947260109248133 +0.6579567789474314,0.5588957661901371 +0.541465163185048,0.31101018160059507 +0.6244912146993191,0.2461865243895538 +0.5330588221098626,0.2532428500567307 +0.44388756152209136,0.4144324060213923 +0.5507714747916208,0.5106593365458544 +0.5976558327168806,0.4145715232621624 +0.6313003897132383,0.49649065684546634 +0.6237742304273766,0.8208914987189548 +0.5783751606451489,0.483645379071736 +0.7426592110958685,0.7348606579291191 +0.47962450977078963,0.10145214190127955 +0.3818664252434684,0.0548818110884564 +0.49734160299858327,0.424189507547676 +0.5645918845652308,0.5723559850834156 +0.5562773942476366,0.5207514161754491 +0.5924015640710854,0.5726209277291838 +0.6142172812895444,0.6094871157425547 +0.5790712832914218,0.3161129054325185 +0.5853641032676956,0.45582321241757373 +0.6650044321450769,0.5359031552811591 +0.6956818699247669,0.6118884676689242 +0.6593005656637788,0.49888524364466047 +0.691623687685578,0.3836039599016249 +0.48149803276753345,0.2727334794723123 +0.35317569968094115,0.1746286748137102 +0.5739078521242564,0.22931033350520597 +0.6018078922715828,0.42617744165828647 +0.5923498868440694,0.4124056096824261 +0.6193613409471594,0.5351595277336664 +0.6552149056833508,0.6719740026597775 +0.6294218301240114,0.5224624867113479 +0.6310335397186015,0.36903008782644886 +0.6492946147368918,0.6427356594494552 +0.4602173864451776,0.39664167127082495 +0.41829308863912673,0.08427315942176795 +0.5794531106458206,0.22170761205990583 +0.4900183975281645,0.3842777904101537 +0.5680471658225676,0.6524659984902608 +0.6576455234924408,0.8904731861015196 +0.509186088995734,0.4090281720941665 +0.552282690955128,0.3674130138152692 +0.4594278633205497,0.5045421714631652 +0.4326566457382065,0.7163689725566766 +0.6136754154639372,0.44781625227180105 +0.6187375783396378,0.4722423548862295 +0.5774975418555504,0.4157079752206643 +0.5705366730206906,0.3167983290444448 +0.642363846247641,0.4139371212261141 +0.691992521227417,0.6785969131528927 +0.5848243832093001,0.40309017857349744 +0.5258316397221688,0.4081602092577935 +0.5893078445889254,0.6793959134153278 +0.5492908954155254,0.09190270295719087 +0.5451177358165746,0.21394675949217076 +0.7304286956168626,0.6680111878557495 +0.7724164723695939,0.6482148164150906 +0.5927510857080186,0.20384579877051315 +0.4542504846665081,0.17801085097122485 +0.42882135506813635,0.6888802044827405 +0.37337163087544384,0.6519134634337317 +0.5910958647227461,0.29628208250721305 +0.4897157847466655,0.33927619424164446 +0.428632765972083,0.45709389403597894 +0.5256690978558801,0.6718066924220562 +0.5784094333158919,0.7402552955085455 +0.5462214350237871,0.7289853684946926 +0.6081940531215669,0.48271372867248263 +0.616989791341037,0.4533335860123779 +0.6490949987815559,0.5295198554598073 +0.659390330258803,0.5799335235663227 +0.7739028930008768,0.6694352620273346 +0.6946454047568554,0.43910083131891886 +0.6209414004753765,0.31653413145673553 +0.5938484668228854,0.20016688088927354 +0.7002124189737607,0.3815300460910097 +0.7981601952830635,0.7588615410081345 +0.7642515301057284,0.8235534421520283 +0.5639804005145319,0.398488044350232 +0.476474642713256,0.18503847700197035 +0.3417532145687644,0.2610088584262338 +0.4024559557097121,0.4141446347966973 +0.4934540986596943,0.4526040847656832 +0.5388370155831892,0.5169241423335081 +0.7178353666651396,0.9305219641195692 +0.6007947921244212,0.6355804794790147 +0.6420899629049212,0.6594863527543509 +0.3540720939336423,0.32398113576771176 +0.3512451052368297,0.08478349438983726 +0.6445755958011341,0.23115912057272403 +0.4586380719750202,0.38857144079468486 +0.5035583376458077,0.6588653915656862 +0.6494941710875828,0.5087625975416612 +0.684262156428572,0.5935589069301127 +0.7980953454295534,0.7650273434809131 +0.6186550855112757,0.2557252344975934 +0.3191969096390337,0.06578934186242817 +0.30750238892812515,0.041759312112145994 +0.630991101211525,0.32108083336041393 +0.6240015625425307,0.5367053145897641 +0.5797784327969772,0.4037961359855288 +0.6503416299269276,0.5092325205606122 +0.631321489757487,0.6833838217747817 +0.5932668446992164,0.33983159032112004 +0.652123510782337,0.441593974398153 +0.6625440120136019,0.5199321503338101 +0.6260091661876854,0.5215275878589575 +0.5059650539923447,0.14967745527932252 +0.4554373323531752,0.23234698153729458 +0.5440740584866459,0.36982148849668245 +0.5449420809284364,0.38501566610943116 +0.5600733756544806,0.5944811099931784 +0.5574945806984917,0.6800104373023629 +0.5496442317497241,0.6155371063906474 +0.5949217080566201,0.4955518538888469 +0.6456233262469072,0.5504674906131803 +0.5684599279876023,0.37554472648243514 +0.41789421435632357,0.1682446001319771 +0.35195106264948967,0.0870226620779311 +0.46742811795091477,0.22951561190161227 +0.6529352664394643,0.8708140841576445 +0.5763967632759317,0.9528717985399161 +0.635312676375954,0.9062082162604328 +0.7814293503099624,0.7174770825066155 +0.5460222363009646,0.770411729061448 +0.6387479900772928,0.8551655999428608 +0.5067897438573872,0.10045465817193595 +0.5992005466907488,0.05693969124964265 +0.6294874548379036,0.4944081003613671 +0.5016553997568697,0.6259083741760979 +0.5180913209476472,0.5221648211156298 +0.581779241512628,0.4576715524502564 +0.5933175086472712,0.4572291071725201 +0.6062558888875696,0.6516719454133373 +0.5571515559678384,0.38049307428454093 +0.5246187448057371,0.3387657400642857 +0.3957707583569151,0.5288321966737041 +0.750965356763195,0.3206006285402492 +0.5502375959884128,0.25436872219079526 +0.5490353106987502,0.4798326189607837 +0.5589510797980998,0.36113375390127145 +0.5798000692830287,0.3951676484069668 +0.6512817143842454,0.58970671834668 +0.5680365561957985,0.41353225667687205 +0.6679832934767643,0.5216084117571941 +0.47265294190219354,0.2163145540035645 +0.6146317123846327,0.2815500793096021 +0.5840368270379496,0.46685355856198546 +0.6415380238943478,0.7717185012922295 +0.4988537430340845,0.8533855668330241 +0.6926819681534755,0.42744508343981114 +0.6431248783520687,0.5853288764014857 +0.6031812428917362,0.8474833957038301 +0.29968860742892406,0.05542522663434379 +0.44102823730549084,0.032256603209515664 +0.5159127711812912,0.41719466407152495 +0.545634388877444,0.5114729995508899 +0.5469036101831837,0.5665767187316286 +0.6286994814340396,0.7023988955324866 +0.6503455638334824,0.5920094245860424 +0.6004103421656525,0.3852528925954059 +0.5814604758723962,0.5181804294302141 +0.5076858996915092,0.8013074390227788 +0.5422888993757741,0.8883668175618558 +0.6097120046099332,0.44125550942312597 +0.6184202432108805,0.4715434606245971 +0.6031439303841101,0.4712518747026402 +0.648385643904144,0.5019897217624374 +0.7011101245286468,0.6440215104499409 +0.6804291605373255,0.529963492830438 +0.6700478791623196,0.4526630039569862 +0.5959607362242568,0.08543810240044473 +0.6341540812909081,0.14982992396050931 +0.6148253678754915,0.38117894493130255 +0.4332982897391593,0.3967716093963086 +0.555672824335731,0.4868204588911805 +0.6114107965905329,0.42463672119698964 +0.621203124470563,0.5768679374792238 +0.570785462807962,0.6369106167305254 +0.5526949762830046,0.660002827000826 +0.5220860838448004,0.7291585795922411 +0.4891943335118921,0.06518879526457927 +0.4578670262902711,0.1598072646490233 +0.5336408018614002,0.3657877441654409 +0.5036103128960475,0.487791180135046 +0.5821011661990326,0.6408040517281025 +0.6991955041293338,0.8914513579259747 +0.5759116410721459,0.5753250712507172 +0.539390146686658,0.3324302431679972 +0.4846029877252326,0.24219977832067183 +0.5127476453346964,0.2656033930572978 +0.6948307752020911,0.7080955498466954 +0.562067568254562,0.5630297655337931 +0.6205782293747908,0.4568696315602302 +0.6755013465309373,0.578210830124704 +0.6130428909736344,0.6051008695424551 +0.6491072177337338,0.4681550557817095 +0.7170628308642711,0.6633107059687006 +0.573389410924044,0.4342419500885337 +0.5445641278759477,0.27935817810476904 +0.5941714643928959,0.23809242225320446 +0.4901270269932585,0.2598943111746655 +0.4309500753514644,0.40335476359139744 +0.47518694396763755,0.4638396795041788 +0.5777422785269775,0.4266249831331461 +0.6066909431897484,0.5358530277749519 +0.5953797101470355,0.7784757010498927 +0.554657757235292,0.4647308285473468 +0.7147585152974497,0.6257399314501269 +0.4809828698227834,0.05859836930283496 +0.48185095186921867,0.04306387897107298 +0.44657611843142486,0.2818980214231392 +0.6538407205981706,0.5163287515374273 +0.7950234412473794,0.7853455535860716 +0.7131811975828921,0.5330162043142779 +0.6313298940123997,0.297351807065954 +0.39936053749517625,0.17792949063118577 +0.4009005427021076,0.06221014255180056 +0.5463713407053845,0.25164270376465075 +0.5781908034788743,0.5831396574056649 +0.6969194411641335,0.5306960339140133 +0.7530841826754912,0.5220092529929177 +0.4747924208239026,0.46579405619981357 +0.5250334739240492,0.7528277032187601 +0.38275673982240305,0.06340634816663154 +0.4717524051266808,0.046063721135048676 +0.530494987919711,0.30085098714104863 +0.5214343666588815,0.46187889530923704 +0.617642283387338,0.8295025817412595 +0.6692798733144536,0.8695887914761915 +0.662071883622376,0.4050456281527371 +0.6383784412797167,0.5419726366480744 +0.34278655049282547,0.09151086202281951 +0.6570713519493679,0.08244013778277762 +0.5011751651339551,0.3228631612490722 +0.4868194460456626,0.6414866441194047 +0.5579993128304069,0.3597071465322858 +0.4372588097678919,0.18739670496788696 +0.6156919002011628,0.4337474103513145 +0.659667491856985,0.7013397209958606 +0.5982137917965759,0.667935191933735 +0.5623794793606453,0.29433232517154395 +0.6112665533501886,0.17738386971344383 +0.7089549302454509,0.3796795602911172 +0.5796910523877439,0.5899522298782705 +0.5262638926060433,0.8172018520016661 +0.6297489404145111,0.4927074308359715 +0.7498024701437256,0.4161210652108774 +0.5116088985963589,0.8073918811555182 +0.5902798771358402,0.9302532663811838 +0.4002986549992167,0.03960379954291284 +0.3687067925617824,0.016461700184983906 +0.4226692020535206,0.3123155531222257 +0.5839774012071135,0.5031716818671809 +0.5869532823065625,0.5707904094852717 +0.6910395621668287,0.924168287806642 +0.6211251019905587,0.49877697180753156 +0.6761707066917083,0.5791067475394494 +0.3873531818061905,0.06939348571686996 +0.6416912078314077,0.06498211615902212 +0.6469330787110907,0.5043190116733437 +0.680059432925815,0.5861082667358087 +0.5618050097943487,0.3535529967675496 +0.673946261348879,0.4159721430060513 +0.7438396810855451,0.7422643892680306 +0.6495345830367372,0.47629404021553096 +0.5987531542271026,0.13089087592714135 +0.4905108809055795,0.039790451487844984 +0.3913631438877601,0.11367741216066081 +0.5061861276197979,0.4168792064893588 +0.6198242306184459,0.46101859166971026 +0.6219135522315807,0.54146969265595 +0.6183975934458678,0.8178154222143857 +0.6122567057091136,0.46954411222452325 +0.6727387308504766,0.7497118108115199 +0.3984388708730924,0.07880824796621995 +0.39713260528062794,0.03523805734059608 +0.4715834855634016,0.2817887065047277 +0.5280438065081754,0.4766018087985286 +0.6072909235440067,0.6707508557455343 +0.657314538900031,0.8782333127041826 +0.574793517540899,0.2865264710970473 +0.5012723207049308,0.25580400203558723 +0.37631922957094927,0.6899008744188792 +0.5878224372366037,0.4057683940745787 +0.6130755543189685,0.4599334593103099 +0.6128196715789694,0.5054402942497651 +0.6157412528470326,0.45287367657373945 +0.503079950766881,0.18470698577037523 +0.6019644140687497,0.2315387723572507 +0.6085423826656048,0.44544503049333606 +0.5923882126306568,0.681129037669772 +0.5671299695488417,0.8832035056085772 +0.6020461916413746,0.5615979427583947 +0.7325745820378845,0.4514441187748403 +0.521252274469108,0.6978933208336632 +0.3431934117980278,0.21441546061590505 +0.5004658102565432,0.04895269865985025 +0.5720511078350154,0.31329661577194967 +0.5087086557911236,0.4699471588321014 +0.6604459285176858,0.9208193412385571 +0.6400601863319119,0.7296513907947635 +0.6376628279146039,0.49454274725378344 +0.47388774152557833,0.3863874074029545 +0.4586603045075196,0.14933705315334217 +0.7329642176007483,0.11160254467573014 +0.4895801543774906,0.29488658876276985 +0.5479754209054439,0.6765452616770794 +0.6076912283382843,0.4379252787134824 +0.5099606513545246,0.2884276506472719 +0.48593315478024995,0.22416856863099266 +0.6115300058800736,0.45766130045136505 +0.4814997314999094,0.2880980369619853 +0.5324578880812879,0.24962922906377885 +0.5428981780546166,0.3515931960492456 +0.6086729764422967,0.6703277223726865 +0.6531960963649793,0.9176927199952678 +0.5285443067103119,0.7838629476533742 +0.7705761789623096,0.5342641467607235 +0.47275805469324605,0.8014892331891665 +0.5634632110118596,0.9390808334731015 +0.3739773034732777,0.10827985395364333 +0.4600346088019894,0.14843890056441994 +0.713966309963807,0.6266710156052554 +0.5445540546909815,0.5424747461751728 +0.28943830726080094,0.06284940236639333 +0.2993293404325708,0.33276581731775545 +0.501858293967668,0.4701391751950581 +0.4855246841496388,0.4460918302954856 +0.6234273313948132,0.669017552677156 +0.5495565533172668,0.5503677124379236 +0.5002735852771588,0.4142589267029427 +0.6118412613350642,0.44477680282141074 +0.48875248428020956,0.2589286563256009 +0.3560583293136469,0.09169122567773398 +0.7480900883041184,0.7391476027911197 +0.6215326189468535,0.7763423912108168 +0.5531711577900749,0.6273914569459531 +0.6933721899399161,0.6548600190453301 +0.6380552648957719,0.49564626764607905 +0.5927327274774293,0.27117997381472364 +0.4994231462055756,0.43740552621154777 +0.6136807202773218,0.24888160800509007 +0.7793582677181272,0.19946646670920085 +0.5515058040151914,0.4086288209745607 +0.6063638925038936,0.7045115821644904 +0.6227125524947272,0.45536717728084186 +0.6281969546739808,0.479744970330727 +0.62146735186083,0.6269646876897774 +0.45234280820831085,0.1433681248220649 +0.6300943493309552,0.08905714741606584 +0.5712717771046433,0.3452265855284147 +0.541400790168696,0.5615457886942671 +0.6228887438246684,0.7608685486050546 +0.632838010734379,0.5926840895595973 +0.5802323221669033,0.5303535456254679 +0.5239422320875937,0.3106930252860544 +0.4500663578129195,0.19668394307986434 +0.5537481903560966,0.32164174286952585 +0.7745408415138537,0.8827676764464045 +0.5872122644880896,0.7045823924824145 +0.5806170701488959,0.12466132628683778 +0.6914206146608455,0.1777783034498604 +0.6043338179076604,0.21867561319010517 +0.6789878606221338,0.5390890235412974 +0.527259051755129,0.78271484298683 +0.6589171289839713,0.5077074761208761 +0.6426361798695966,0.6118805402511768 +0.6125524043518192,0.868322490799173 +0.29366040227310825,0.131651699414635 +0.45642757411906726,0.02641326186465767 +0.4355591535199432,0.3217223283491836 +0.5405615567703296,0.5760017627821924 +0.5631632208347305,0.541987895437122 +0.5916858911013277,0.558991312435619 +0.7002057432535465,0.7702223055005365 +0.6054260730230769,0.6143332713812927 +0.5685269832129689,0.26064264748909083 +0.3749650418440894,0.39205047449986513 +0.4545201956840939,0.43198594408830726 +0.5599679946425267,0.3626604672710597 +0.3711304664297565,0.12426289903922515 +0.4639484881961892,0.17337456328653636 +0.8084046839983215,0.8990404001053123 +0.6321805118979172,0.8787869206443166 +0.7466220259034247,0.6630100601407466 +0.6741696595574783,0.567979454440405 +0.5239411592039879,0.5398074383240747 +0.5457053780093655,0.13997545824708 +0.514363884882289,0.028180986615360233 +0.49356329436891355,0.2373279330800607 +0.3842760920199215,0.48809179616067755 +0.4785736202788437,0.585616349602957 +0.558002412271935,0.5287043447107855 +0.6077565550289526,0.4966328437254394 +0.7315770983076528,0.8307061187273906 +0.6105616092164897,0.6763519042096166 +0.6107234358270412,0.5541195864042971 +0.5331696867491353,0.45565772012151623 +0.40913113948218766,0.11710548389460777 +0.7566938399627832,0.09826105823472847 +0.4550164937587742,0.26903051111692927 +0.6267715691989428,0.8226268283452536 +0.4978017508562103,0.895398735127021 +0.5480492710603144,0.34497687186937165 +0.5592375397208661,0.35740637744387665 +0.7912945746705468,0.8524218789372352 +0.7085320352908053,0.6137614244198751 +0.5624093412876752,0.16811314208805314 +0.6308067440452504,0.5524396294929408 +0.5905600785709055,0.17297151667895816 +0.6273177861636183,0.09030571571128093 +0.6437209844044168,0.5944407576487047 +0.5684372782225896,0.5410652155368987 +0.6119243502098741,0.46280929401095133 +0.5847458838921376,0.4170008595692267 +0.655279219095058,0.571401714721492 +0.642215371077518,0.4698220486828399 +0.6098989247759331,0.5269156689274649 +0.6364568471369656,0.4961139256885308 +0.6798026561161444,0.6919952624249547 +0.46454602476001194,0.589679717442623 +0.39731460806343416,0.06777015321799498 +0.4475786089518173,0.07778441898391132 +0.47733724113237247,0.3129575249481531 +0.4424147009474938,0.5187011356064642 +0.5318703054931418,0.7481132142402026 +0.6426787971906074,0.8939716807232 +0.6868460773840112,0.5746508831143201 +0.8570278882254666,0.8620642415224381 +0.8471758364913765,0.7100752585163349 +0.6126136183219983,0.2891009447139982 +0.28168672320841776,0.06287842982837064 +0.462948799094101,0.10915026058044967 +0.6739152669335985,0.5239579672473043 +0.6274140476649224,0.6564396613396273 +0.6767214536093863,0.5104710454731924 +0.6500471829817621,0.32905751434667024 +0.6705251931576405,0.44489565448297697 +0.5138994454902385,0.5115769500512768 +0.452539116105862,0.5181025261595686 +0.5105911492869053,0.46841865732297167 +0.6981508135204441,0.7735170118419286 +0.6181553005648763,0.5431399936148622 +0.6382949351723934,0.6222019189489989 +0.623083770222357,0.5048071141089335 +0.6062787174665167,0.5403127665019878 +0.5213042497193479,0.5695350164582365 +0.49639701839058525,0.2013282475892673 +0.8419216870548708,0.09797382345183592 +0.49523514505007693,0.2629376647292848 +0.5740892886629374,0.6656038754649083 +0.5211545228516847,0.3068599101889312 +0.524707794145024,0.29643136233990747 +0.6883713602436843,0.6470820301422389 +0.6956614255316107,0.8036242715629393 +0.727416396079459,0.5435457820360975 +0.643330097144013,0.4327650662017291 +0.6473885178017809,0.2907097038772398 +0.43439111109870115,0.04788044090370884 +0.4320221840969486,0.051158934781737796 +0.340891003579839,0.30418449610615167 +0.4957336782989361,0.5904114240611723 +0.5633093118190626,0.5205303425481927 +0.6072828769169627,0.48108282638372857 +0.7316603659963969,0.791078328314979 +0.6208643912743332,0.7179269187602968 +0.6568423509041603,0.489952831982685 +0.6945735215552623,0.6868419640519886 +0.4075798391950723,0.1510211525875064 +0.3719985484761918,0.05393919343457506 +0.5547088384158602,0.2729151246270882 +0.47433230276859795,0.4463112051903675 +0.5273625850230951,0.6678842299625017 +0.5244698524031007,0.6753798716635673 +0.46398282047157696,0.31138098209538123 +0.5594953894141426,0.36195069516176637 +0.41069257255891395,0.15982031806621638 +0.5916250943636621,0.37272289358990757 +0.673636913242521,0.7128978364669215 +0.5844425558549013,0.6654250019261118 +0.623845756001101,0.5493739838011973 +0.5617173909665363,0.2287326154862838 +0.7537741660433527,0.6087298387314217 +0.5763600468147532,0.5030604596001385 +0.7148290871968578,0.46534740879462466 +0.608220517583845,0.23066216684739374 +0.36285245415476164,0.15172168597686853 +0.6556753515642018,0.1735043822027306 +0.49117758865965816,0.31043612926732295 +0.6107545494516113,0.7164551608729378 +0.6242687105603913,0.8028948299208893 +0.6422290205411704,0.48934334468812857 +0.6817653178591423,0.7528845064451757 +0.35405972596985247,0.11865770805233503 +0.40168806907113574,0.02996879813133252 +0.4898114800038443,0.23630633927192896 +0.4803121089528603,0.4391153450499075 +0.5744009017457967,0.7300208799873659 +0.6760410665893328,0.9623560896073289 +0.6111530661065459,0.44363671497958107 +0.5319778918769523,0.3221823569971115 +0.5289345383196233,0.29724013776407615 +0.5595483779433434,0.3533382114303109 +0.6913818716417448,0.6726441376803338 +0.6420141457967733,0.7737103693093914 +0.7023633121849433,0.669695138278302 +0.5006675719790908,0.6875478022547306 +0.6012037395921905,0.8260024777941717 +0.5262203216107162,0.07586166255229913 +0.4744466244772675,0.06653594964215674 +0.46100527044207446,0.31396436660671734 +0.47172453995525065,0.5662740463457543 +0.5651321410654292,0.5434839720195256 +0.5479893683923203,0.44834992245827715 +0.6794226765057335,0.666222690886363 +0.653915882055226,0.8293585769196224 +0.5909006595111232,0.2853509780962556 +0.662919521275655,0.3677187856426688 +0.5233661531958883,0.33841741052055796 +0.5346511601949022,0.21785011866309328 +0.623342752403884,0.2984323498677111 +0.4642607271278187,0.39690789541645466 +0.6041583418334565,0.7449610226043296 +0.5790681838498938,0.3919615741722693 +0.651296377126859,0.5326875443033069 +0.752167522843568,0.778567134574889 +0.6731511353876427,0.37202525102581424 +0.6574108004013351,0.29979693860386836 +0.5808587669834396,0.39572453460256024 +0.5053532719184218,0.061654150425877824 +0.5145035981696306,0.16679826362559005 +0.48183888192865265,0.4650476868386638 +0.5712325572483844,0.5224484796198393 +0.5760409831512975,0.5100984568390647 +0.7404118179648027,0.8372398606720088 +0.6450768708636526,0.8047257057926698 +0.6319105624617524,0.5977088207139082 +0.6743067502404501,0.8378831139977977 +0.36088487502857025,0.06069558852953462 +0.34872198101905627,0.020383477191124044 +0.439033776484508,0.23880717135033164 +0.47430559988774085,0.46421909287012664 +0.5361306666873917,0.665249764270643 +0.7039102315306681,0.9582551708414909 +0.6098967790087213,0.6532582038231981 +0.5790385603414429,0.8066522471192216 +0.5100473165080207,0.911837338512177 +0.5280757545977722,0.31642690270088913 +0.47012025113893446,0.2215164897666199 +0.6580249070564039,0.5468192691239702 +0.7030041813255141,0.8215635410881421 +0.6856139301673186,0.666393875425991 +0.6455934643198772,0.4024694856057341 +0.48874616618786393,0.22842806555410086 +0.5529888271817224,0.14757555708801257 +0.6940734385856392,0.13505923734847686 +0.827561378408931,0.8423527470958566 +0.7597167491269559,0.861008464450561 +0.6028420328583483,0.32469987837603503 +0.6313053368987543,0.4849195773641795 +0.511710643724982,0.7583583585974314 +0.4807555079053069,0.7824592582702824 +0.5875371098020881,0.5066680307216515 +0.6365983485636504,0.3908298607830224 +0.5203061103380237,0.4946134681647405 +0.49991464610635183,0.48551395488130017 +0.5922235249971562,0.49308136057460533 +0.5014246105723189,0.525946914636875 +0.5155609249632118,0.4706825311363008 +0.555716931772861,0.44537314729180705 +0.5251141786130682,0.558299362115096 +0.5762643813598968,0.3875884409940076 +0.3970311581752288,0.14884883150846298 +0.36006698009303156,0.08997607222367206 +0.5279222130328438,0.3298264142635231 +0.5650343894480059,0.7317878596800095 +0.5641564726351834,0.8853925457904638 +0.617261290497966,0.9311537733535723 +0.6951541900046151,0.7657247774287499 +0.7021057605148907,0.5224337572725941 +0.5793235897527347,0.6869427555062055 +0.5586972236160229,0.7570453874835992 +0.42575907703609284,0.06296670430719692 +0.45000317688946295,0.04649731512304449 +0.5378032326242923,0.44598883346941415 +0.6184265016985814,0.6833587878240005 +0.7062475084660476,0.7413173906727626 +0.7275037168840475,0.6605263942000226 +0.4061615168704396,0.2202473876712997 +0.4103381335387871,0.29544407100481057 +0.44217839833330175,0.34922489489837183 +0.6900939344775472,0.2676576373351563 +0.4843543171472507,0.42045775014889447 +0.6029506325211198,0.7374773018322075 +0.5001177787357292,0.5531030291886441 +0.7208286523208615,0.635501145696896 +0.8348404168375748,0.8202821604360101 +0.6389226912911147,0.36809566581121617 +0.34513628479896197,0.088265478524931 +0.42294555898899827,0.1440837381865405 +0.5991826652973178,0.29586100549460786 +0.8009384869850987,0.8213473550417525 +0.8169050215983098,0.6953551762476674 +0.7639466523477281,0.22178751208614933 +0.5978285073727804,0.2585451898438123 +0.49253055449130023,0.6788840287264959 +0.31389081475461056,0.3670588728186815 +0.5692126750464069,0.3044040796172901 +0.5845557450753202,0.40085440835015246 +0.5806044339642046,0.4432791169135998 +0.6303217410507541,0.8604339352801312 +0.5535782575138563,0.5551403159450805 +0.7333305477475067,0.7355540983657599 +0.4553288817020155,0.07196843617097856 +0.36659824845070915,0.042906522709019373 +0.4451603591065173,0.25524869536307876 +0.4629665016735978,0.4687556619842031 +0.527545332863961,0.6131154888850741 +0.5956651567908406,0.7481974356031882 +0.5276427864581605,0.31582361428938327 +0.48020476098762893,0.23436877108610454 +0.7177352904665703,0.6886771910628334 +0.6865949630155936,0.8029374472418621 +0.6980105637912994,0.4868930573484461 +0.6339354514538905,0.3679075833548108 +0.511808752970274,0.17813980562007067 +0.5587451457504182,0.09114179006273014 +0.7076506614085862,0.2665061352038633 +0.7321119307851771,0.6812235110316489 +0.5060250758696284,0.4524569507001986 +0.5691225528235142,0.447008609335882 +0.5915377139544287,0.4250344927935104 +0.6310042142333745,0.6162846678446915 +0.5672779082771616,0.6393409961188723 +0.5248728394063931,0.3619668778228071 +0.5694462656492619,0.42126733023576685 +0.5302947163132826,0.22013366200917914 +0.6383427380974992,0.25656795476692856 +0.5378620624086807,0.4490389819535312 +0.605144202657958,0.7267406575746401 +0.5289170741587057,0.17746758443694924 +0.32612934705833807,0.4196871514996672 +0.5595658421042612,0.4165125783197028 +0.6918600201020925,0.5836067194016694 +0.7647541760750767,0.7248963706577982 +0.6155445575192905,0.3600914176767781 +0.6509300469801004,0.35190510715505113 +0.49566441770171293,0.4060457344864482 +0.5147386192839601,0.25838088964064915 +0.7861679791738495,0.6188967817947814 +0.8221995233793251,0.6955642693413356 +0.7617920636485697,0.43399915056827787 +0.5704790353291976,0.22132787086841207 +0.49837106462073427,0.6280299419001646 +0.49727708097061935,0.7752504341195964 +0.6028046011414324,0.3429716226094708 +0.752015173371535,0.5573589796353916 +0.66921073192652,0.6978034370294295 +0.5397277473946372,0.6765857928354871 +0.4621535837258975,0.6879410140959304 +0.4647366702163099,0.5894842738125952 +0.5291041731386398,0.3584918674311453 +0.49568724628065997,0.3427993055815931 +0.4757961034371904,0.385568260770605 +0.5493357777130375,0.5628222817655323 +0.6447126864841058,0.842970370424417 +0.40494349595455764,0.20625022033608564 +0.7000327109697781,0.5982326859363284 +0.6876555084599925,0.5884722465499406 +0.5783930420385801,0.32020711867582574 +0.5840874313813597,0.25935357783779034 +0.5121880173249476,0.35387253726787893 +0.5590116381171865,0.5148069853531506 +0.622335255093331,0.6149770015442392 +0.5659299492356803,0.5821514123962525 +0.6202604174088753,0.561702012468071 +0.6777935623548704,0.37460511886311204 +0.5371315478823754,0.6052898758708536 +0.6821293234247547,0.8397451630987652 +0.430796921216727,0.037540703975313824 +0.3915367126133314,0.051144570062360936 +0.5268141626865631,0.3959260579063494 +0.5849426388245245,0.5379727477550323 +0.6252965926594559,0.7083529227025845 +0.6076261996708399,0.7168891422911243 +0.6214104890297191,0.28685247870132846 +0.5578904747490563,0.3402542468568102 +0.4513966738795488,0.33132803407788536 +0.37241607901280804,0.36903411113996726 +0.8345230221041727,0.19610095004988468 +0.5172063707867419,0.2967381474462673 +0.5715143680088586,0.3802354034054281 +0.721489071784917,0.6700161688947492 +0.7209323644027619,0.7024877064531153 +0.6518418788357971,0.2571413514491087 +0.6449528335978856,0.38714694939058675 +0.774061679774545,0.750578045113196 +0.7401983141272354,0.354917347085128 +0.7701917886081856,0.4077610965567666 +0.667416810932867,0.4687982495028536 +0.5417623519438729,0.3089618083802412 +0.5001755952411564,0.2779371139677422 +0.5550438165194694,0.3984847660947725 +0.5606337189199666,0.3965366478868331 +0.611755430646595,0.634864687300605 +0.5893445014454591,0.7262665026259142 +0.61601185793429,0.22305726983256144 +0.5010691284709087,0.3135649260801445 +0.45660430189081136,0.6023975008813032 +0.776914000445385,0.28663533898062343 +0.604345321604101,0.21990975716129868 +0.5940890311691785,0.43190276580660425 +0.5145048498671708,0.496663391105857 +0.641435205882119,0.380504965411162 +0.36210802194390246,0.30162566870843904 +0.523662626698976,0.31030681699060886 +0.4878112971369635,0.24376293993070472 +0.4950318336067653,0.24109029746390448 +0.6936908363708584,0.6940176480202118 +0.6461178659845667,0.8272342673818989 +0.7117519974105888,0.7053245299137894 +0.6730024814035854,0.5713946813734154 +0.5314692258384822,0.6670206778698379 +0.44856646653191856,0.08976295581648544 +0.5428969263570764,0.019968807677825967 +0.36251884695798203,0.20952653864458243 +0.4554901122661193,0.5463872546590594 +0.6185284256411386,0.5810815090235774 +0.6517776250287347,0.5825791353267437 +0.6801836490055164,0.8791886559497111 +0.5272775887996526,0.6444226497088882 +0.6841087340729332,0.8018739215661718 +0.3962058126590939,0.02644780275627133 +0.4279130100841587,0.03669229146240814 +0.530365467026625,0.32748699156301475 +0.5129822492165125,0.5110649461531553 +0.6667155026824991,0.9347008457606973 +0.633885502761573,0.7313938729784283 +0.5963373779745607,0.5767332905868074 +0.5503144859801665,0.34830129112615527 +0.40556141730689177,0.15361395463270783 +0.39199718829650465,0.11405858386362779 +0.7589753865553024,0.8121865979858652 +0.5889610647656516,0.8050833932656182 +0.6099490522821849,0.8338783971285334 +0.7052784561513713,0.5324829811626371 +0.7226222752912906,0.525528847658828 +0.6222646235892781,0.4800179596035321 +0.6303597688141176,0.6318598979511177 +0.5133224725288615,0.12420263874341599 +0.4913758933128091,0.06224647158275574 +0.5064177512693754,0.34044343199914284 +0.49740830059608127,0.5472100967793814 +0.5751775502671543,0.5732842082155977 +0.6276477574770669,0.5877565735808202 +0.6994881033305115,0.8637224427384727 +0.6222035884330333,0.43410855489365646 +0.6361779570040851,0.6004999870167288 +0.47286421056558203,0.5702543849153292 +0.405004262889901,0.09044483295205105 +0.6635209321413879,0.15653678759570883 +0.4693678915103208,0.33523929086423293 +0.5551547407633871,0.7048164599222193 +0.586445748756343,0.40358272155511865 +0.5709915756695778,0.3835752006605488 +0.6619964241420967,0.6005430215702147 +0.6774007677458339,0.6798274510430808 +0.6810684203524874,0.4725286061924842 +0.6895049809825714,0.470985441940754 +0.7418237923947674,0.6497987502438075 +0.6339960097729771,0.11747327435483572 +0.6387571095879426,0.23472231603624505 +0.6855791806594175,0.578391730221421 +0.6008434891191986,0.6013644927837081 +0.5762646197784759,0.38303947411382994 +0.6248310803837995,0.44586619691290835 +0.5355216264271284,0.3810225721458868 +0.531601369335938,0.395177721591924 +0.5593286156180751,0.5786714548190791 +0.6459628343035191,0.8737939587656399 +0.6397700905258147,0.4081931408239998 +0.6405823826247449,0.4146277304421308 +0.7011076211335665,0.6035364860372056 +0.495711386161792,0.1201991139670461 +0.3947158455514472,0.07191398732802934 +0.510991454081183,0.30120944947437833 +0.5016077756456983,0.47244724585244513 +0.5250797867330357,0.3122645315463477 +0.4842682778425247,0.2392772731832168 +0.6397638320381137,0.513189255690879 +0.6527152060909722,0.7031942003069492 +0.555855274153373,0.43158996063112803 +0.4955953955230689,0.08312100163938305 +0.6336387395322237,0.1772455571353774 +0.48852401967680487,0.2777488228950803 +0.601500272699923,0.6153480404576043 +0.6647486090097225,0.9236522903973244 +0.4708163737852073,0.8255605689582378 +0.7685449718778258,0.542421996064598 +0.45399725433320126,0.8063993446116862 +0.6209975480507501,0.9441553941103961 +0.38806998726419867,0.3285331722870924 +0.5365656613849257,0.11804470408374022 +0.48151716585850474,0.11556464422402152 +0.39175045486947785,0.3113107380215819 +0.38868683573292695,0.506674050790768 +0.4868895113055901,0.5363473290935922 +0.4949470161972571,0.540488123366746 +0.6591550707258944,0.7433807246589405 +0.6000942587344354,0.7875523559520841 +0.5652365684030669,0.34007173743468594 +0.655654013101374,0.5194991821945839 +0.5787845849500765,0.40172648390701093 +0.6323499082983546,0.4869073922655006 +0.712831377922735,0.674694358644674 +0.7079584597941803,0.5722315901898907 +0.6817588209528623,0.4287107284657377 +0.46098968382746697,0.09531438341384058 +0.498854786115368,0.044404417233086836 +0.4902504086079331,0.12624597537129123 +0.4216553866506218,0.39875084122879045 +0.5847183465462537,0.5215126866977781 +0.6024767159905507,0.49168312501650513 +0.70065510267047,0.8760243049663157 +0.6374514102396035,0.5373794431215165 +0.6632840036784257,0.671009182275739 +0.4313728808991429,0.4870519633312624 +0.3419197797485751,0.05703595275086105 +0.6164353489353833,0.1651651261626591 +0.48610478635486615,0.357581495890056 +0.6657136678131992,0.8849602929069741 +0.5984449386089952,0.9002887001796261 +0.5794959663854105,0.6864578121167858 +0.3885611295371063,0.5253002042416925 +0.3630752563169132,0.046072900250335135 +0.5770709514129291,0.3888442810558782 +0.634901583140973,0.500594377029606 +0.7037357687354253,0.701866268427293 +0.7455427646005681,0.6253213876349222 +0.6332718133390175,0.305930018126697 +0.628045082039106,0.42871385770958537 +0.636645913070177,0.2672118541973158 +0.7158961295475365,0.3127215501597174 +0.7827397584252384,0.7083801620252204 +0.6730481981661243,0.679504870705871 +0.6849455832855087,0.600957214246355 +0.6407150029593589,0.48058161092630103 +0.48637166615182537,0.3621136542604234 +0.486415892798245,0.6534223550147494 +0.5188786983050635,0.5522956842759486 +0.6397356390411374,0.34073552456057987 +0.5640772580622837,0.3344766494350754 +0.5315111875084005,0.550928413330779 +0.5766376256454486,0.7604322426057242 +0.5862825512389618,0.5617558950668955 +0.6717946528819592,0.5763483041865787 +0.5558470487123947,0.4771759803410901 +0.4910770356239306,0.5622107381107331 +0.4072217344892921,0.6807202690163009 +0.5391315817376442,0.3320596214871452 +0.5125741958184147,0.2814815339681772 +0.7458127736413778,0.7635042063898078 +0.6748867034340655,0.7398772232471038 +0.651031911318013,0.28687036009474365 +0.5813282727702956,0.22461891152415403 +0.473267406185131,0.2291510102898767 +0.723926365314221,0.13631093488753962 +0.6075090169392213,0.39830064734724085 +0.5517142414579533,0.4653360839121284 +0.572684764813569,0.5327914948036938 +0.7048848270773079,0.7895957223822816 +0.6767504214667447,0.8693640819656074 +0.7042695283293438,0.47917586518296645 +0.5776211618888041,0.8072339288470174 +0.4057131111278323,0.6223554605137906 +0.3685555457756777,0.019228667002049213 +0.4764184355332376,0.06997448199125159 +0.47311380501555783,0.3438396450504884 +0.5090425014064823,0.6379920237996309 +0.6722669600871194,0.9790391912451151 +0.5911838411784271,0.6052033895313689 +0.655643105451381,0.7207089655524755 +0.3538019060788984,0.48729988885096387 +0.5925768017267101,0.4133621450208489 +0.6175060867740377,0.4686839873989306 +0.6579483150878741,0.5999274247995746 +0.5741712450494966,0.333881795080797 +0.6104293465097443,0.28254151316750686 +0.6853966712371307,0.5568635458285016 +0.5596714019301494,0.483806758647308 +0.6720927357104557,0.35318505729570987 +0.5282624959498378,0.3595125671696063 +0.484098464209574,0.2607387301763751 +0.4828906058856254,0.15127930030377693 +0.6110818981606901,0.4092113967720274 +0.6162668466046175,0.5274721378905454 +0.5639643072604439,0.48794007253754973 +0.5696452259535053,0.5922989243454343 +0.6464039682794643,0.7590365402450245 +0.6353873013912065,0.4810540671426525 +0.61970120663164,0.34769386019184156 +0.5520962476262864,0.4122301634107008 +0.5215434431588112,0.46971610142685494 +0.42535710331176163,0.24052479839714935 +0.740148305830273,0.262295245868522 +0.4714856147366887,0.37244474851533443 +0.6167526840641406,0.695635258473194 +0.6611226200497635,0.5290783638563865 +0.6014051436868696,0.44073277668895544 +0.46990174051120637,0.20279109458224098 +0.5596568583968254,0.2577775714268209 +0.6482753753113188,0.5683620566548452 +0.637041747516097,0.7796994440105831 +0.6146937012151938,0.7410356991218288 +0.6806271075626078,0.7200986735952154 +0.5982615947216816,0.8496049634278968 +0.35500869151924114,0.07707756750220916 +0.4995786845261038,0.023661524034317625 +0.4328214525809965,0.32886487213494403 +0.5161188840429071,0.5201639527971156 +0.5799710750088749,0.556701361590226 +0.6497429012702095,0.6725909107326014 +0.7015294432046062,0.8675334445124058 +0.5936151146386095,0.3023844954403347 +0.6127781867462093,0.41422384936952655 +0.4052076637401798,0.2666667995236987 +0.5269442796260968,0.37601172887379497 +0.8033797740256026,0.3195601400597421 +0.5729888677111873,0.4730602200187176 +0.54881864781501,0.693931161680727 +0.5992854237049018,0.24619433259801177 +0.7109251021736898,0.6177564257320505 +0.8249746560351876,0.8103749744143284 +0.748479723866982,0.5455540413305565 +0.4092060029160192,0.12149837601259325 +0.483662307221467,0.20125719885276427 +0.4303103386991443,0.10214599957043334 +0.4732327758865194,0.3301584121345983 +0.5229672193084404,0.5963572257902993 +0.650575101320493,0.5101542467865202 +0.6745731233979287,0.4559416766489493 +0.5501638650428319,0.5761446947202244 +0.4941219090997012,0.5809411996899129 +0.6785403489491981,0.7109377973300386 +0.549116611434217,0.07768467061097696 +0.4138621985561889,0.1314464210182287 +0.6067585944615628,0.5157339567877937 +0.5650640725611015,0.5046753878441083 +0.5409303903121684,0.5176098937709804 +0.5588091611389017,0.5924955600683566 +0.6661086677940923,0.8221458188623851 +0.5541124343402881,0.492084562298676 +0.5493269562256116,0.31495135991859063 +0.5370660423777728,0.5364569420352273 +0.45954546328468154,0.6939375989823565 +0.6681906580359204,0.5415245885337346 +0.7331017255162334,0.6784176819862279 +0.6932638883003683,0.5308349723408493 +0.6450139283587751,0.2947379943834897 +0.6652982234391499,0.6444942348871937 +0.7680338620489201,0.7571313969859262 +0.7362667917581834,0.4773019249553777 +0.6772443055533117,0.27457118007591297 +0.6926624178299908,0.5643470281820449 +0.5746527909745962,0.5079995984846354 +0.5878934263685252,0.4126223023682958 +0.6376510857995842,0.5274651641471134 +0.593352079341238,0.5740863675242027 +0.523208439305826,0.43621242003824207 +0.536523282482494,0.3388220962558659 +0.5569582581048481,0.4197922940929485 +0.5669434070107104,0.6522232883769721 +0.5819794535144116,0.7692998640188919 +0.6564713715951097,0.3259971734683065 +0.5485035180581093,0.25518384550962636 +0.4341861009230135,0.4923315937487067 +0.49650111790267665,0.38749408684142017 +0.8261117934481161,0.21994140722764355 +0.5087929963634736,0.2631985840615347 +0.6233318447538911,0.4639680977112222 +0.5211178063905062,0.306780695616102 +0.4364590346443634,0.16252732261069613 +0.6197323202562101,0.4376748199963804 +0.5600877403738703,0.49676856350146065 +0.605703771063062,0.5764260882479346 +0.6404941081458401,0.7255787842351663 +0.5611975192548493,0.3398227390313795 +0.6773146390341407,0.5164888496131379 +0.594364523837307,0.5193504090013695 +0.6424539088658889,0.7767168275889307 +0.4561353027434359,0.09431111803395942 +0.3635539114167414,0.12937349068425133 +0.6598500012792718,0.6721717112663047 +0.6688640117078909,0.6810321801221064 +0.4294077753657094,0.21442529538228342 +0.3777039646782539,0.3831006582816322 +0.2942923605192858,0.4332267935820315 +0.5303245782403125,0.4660965795740761 +0.5048426389266744,0.40132248362511724 +0.6348824500500017,0.6250937574967469 +0.6184870004130233,0.8642159691967317 +0.5412629246253422,0.269642173981018 +0.5505486726294693,0.24799463128705232 +0.72067332261659,0.6352232688432241 +0.7985528110781658,0.7669484011801507 +0.823500096728214,0.6866348975162407 +0.5099123715922607,0.19692528228632458 +0.37651303407342,0.11109712709085001 +0.4404020309075336,0.10071831931784282 +0.6410548686438394,0.4638204272039352 +0.6496970056937363,0.6804293387454359 +0.7675216197317638,0.5623270863772212 +0.8210402130385419,0.3761784430650692 +0.6220601796577159,0.1500543056455475 +0.46289798613443434,0.17322692258157169 +0.44818541403790174,0.47353428556047644 +0.40347659584443707,0.6866317384700708 +0.523255169347326,0.37846136056238555 +0.6191285252046865,0.39815080127042163 +0.6087650656184668,0.5216204518954269 +0.5357979535602837,0.6521822207767619 +0.4856292008942436,0.31954383818941196 +0.45285874601344295,0.2662502226617697 +0.5696748494619562,0.3149673935680196 +0.6290556191865424,0.3003942367485802 +0.560754299116337,0.522774278607864 +0.6104956864793738,0.7784100763360591 +0.7132886051527683,0.6219933026924884 +0.6928902863869478,0.59333181323374 +0.7501152753194803,0.6078810685906477 +0.6686115264326438,0.40041241010725154 +0.7016004323365277,0.6483582251902804 +0.6150007843450507,0.4772852654571792 +0.5608235001089154,0.19355633835993716 +0.6396058797294724,0.35772228206087825 +0.660415768567432,0.6369656318175995 +0.6965252756482673,0.6677778952763261 +0.7520574330646772,0.5696454042602528 +0.6943759917624934,0.5519059295041423 +0.5586500763420096,0.682102202704071 +0.40786433216456114,0.582155525116738 +0.4492351114369523,0.34324663844019626 +0.5710884928219745,0.41543480713392505 +0.5694522261137389,0.3950093384705977 +0.5720329284183605,0.49478369903005304 +0.6154212951139054,0.7599405042868067 +0.6165133714153876,0.359654724247257 +0.6427238583020538,0.3718197640131514 +0.5796195864186642,0.34865269030908597 +0.4620656966771836,0.3254264589951386 +0.7333760856961113,0.18496361356820545 +0.6399244069511251,0.4922184045283886 +0.6842977404014999,0.5948812359731654 +0.519940078214489,0.2913170156022641 +0.5730126499644507,0.22273173906543803 +0.6696604489713123,0.4827481205524845 +0.4854266941136363,0.3428138789172265 +0.6951150893576457,0.6777364605017542 +0.533125936939874,0.6627105468010424 +0.7321928738927752,0.5036028022624209 +0.5034187435677556,0.8069690458058939 +0.5591810941222686,0.8688510647885258 +0.523004710630001,0.07404273741178442 +0.4635091125572646,0.12789806711124227 +0.5547128319270598,0.3482748862685455 +0.3450443148320813,0.31713479726387384 +0.42848595973201364,0.47972020460084697 +0.5521470903882756,0.4884813423162273 +0.5662745832917424,0.46783763124626765 +0.6961755751973997,0.8532752982402971 +0.6052712201559636,0.589444457909924 +0.6386678814347214,0.66105502779402 +0.3798198401606339,0.3300832506776098 +0.31007710096594726,0.09611016502546091 +0.6423113345555983,0.21620303371329846 +0.6274050473635621,0.4708477552114571 +0.5509303807745786,0.35403555597118064 +0.5656788348672628,0.3641595240856991 +0.6140761970953731,0.47359120799618143 +0.6779160498998735,0.6712380641114534 +0.6524413823528973,0.6835157864581858 +0.594993889281437,0.5564362997351682 +0.6478675603318002,0.7795307628660332 +0.5494994520675769,0.11767584073990738 +0.5587451457504182,0.043353229718852984 +0.3959764539860176,0.2824504968750236 +0.4548738300415163,0.5364987844958188 +0.5742142796030208,0.5673581356238722 +0.6226966976592183,0.5503492349980613 +0.7209321855888275,0.8966593733627913 +0.6303594707908937,0.5246671433101504 +0.6605962514317966,0.6550664895346308 +0.42735406752782484,0.4903527791487379 +0.37261342999164265,0.07366618506878304 +0.6386728286202374,0.17323800904548908 +0.500526845412788,0.36164689028764246 +0.631636321491164,0.7877360574671026 +0.5962827205153062,0.8961508265340635 +0.5773181914794364,0.22853520490298018 +0.4961642026481123,0.2737453577233551 +0.5157671570341172,0.27817195626792823 +0.6368686556276839,0.5229114288953584 +0.6858069896117297,0.777542769150778 +0.6618697642719598,0.6475785964373785 +0.6898434161555774,0.4335089321678007 +0.4528165459249455,0.18903505783723068 +0.35495972630356226,0.04040729995602406 +0.6789040564915867,0.11272358883357263 +0.6956489085562089,0.6081539386541633 +0.643841385786853,0.6192034476918516 +0.7142652272573303,0.6807798736610182 +0.6530467271251849,0.5169805283274107 +0.43615534897925856,0.5006649489289512 +0.5970476865262888,0.7375151507816029 +0.49941805000844774,0.05523589248039936 +0.4788785874438112,0.1123140751220426 +0.5541160702236191,0.3899058099759705 +0.5342519282842305,0.49689003776739443 +0.5908128022647318,0.6619686477882464 +0.6542547344607454,0.6971670382377831 +0.5897728204227788,0.3519098159219838 +0.5919331311678352,0.43502747970126265 +0.4664385914407599,0.7095217697854903 diff --git a/synthetic_data_Tripoli.csv b/synthetic_data_Tripoli.csv new file mode 100644 index 00000000..817a803c --- /dev/null +++ b/synthetic_data_Tripoli.csv @@ -0,0 +1,1177 @@ +0,1 +0.3124048709334445,0.3790764795956256 +0.19588506218417046,0.2405153802921009 +0.12325337527071932,0.09196934073157324 +0.10101500151811857,0.06442016341564073 +0.1137178838058299,0.05349984747131099 +0.10000318287090718,0.05163526517737092 +0.07411140202206921,0.053901672182718234 +0.07249408959101071,0.06018638590678251 +0.07441958783782761,0.06228804567452252 +0.07509818671847923,0.06276297548250188 +0.07581496237410296,0.06401404716982403 +0.07523515819214963,0.06390523889115104 +0.07583570479048124,0.06422108390275781 +0.07623884080535057,0.06455641963314084 +0.0768076777326671,0.06473162748587116 +0.07689130304927265,0.06505763508937809 +0.07710310815444574,0.06578257657903032 +0.07751989363296628,0.06680929638416945 +0.07804712651823673,0.06808772660335186 +0.07843703030196818,0.06888338900379319 +0.0786646902426488,0.06976893520825471 +0.07918125389650627,0.07115286564833614 +0.07966324685639993,0.07221522903093155 +0.08003041146815347,0.07316070770551396 +0.3397771119489601,0.4114640639349925 +0.4673952459488667,0.551071820797267 +0.5603098272317848,0.6946009970285005 +0.5323599576038498,0.6123046854488655 +0.5028006433579653,0.5655229668746511 +0.45903789989240595,0.5693035106661556 +0.4765054284710342,0.58931922715184 +0.43355518572059143,0.5631217341632735 +0.35798120492527413,0.5204321724624055 +0.30800688261480064,0.5000885112222653 +0.26373809571518486,0.46996119460985447 +0.1827400624439134,0.36824715014124076 +0.1038829088033178,0.2525487533692377 +0.08152449129615996,0.20775186945939494 +0.09492409227653152,0.21073868800140674 +0.12377983329560781,0.20260441235383547 +0.13482013342456148,0.19163626368223372 +0.13789951798938757,0.21397790241087442 +0.15308970210315004,0.2575814715339889 +0.19430217143546383,0.31799870622921317 +0.2458410262640563,0.4060944603190993 +0.27072188253535434,0.4971771223579641 +0.27442413563797663,0.5408609491349998 +0.28210163111624575,0.5512043815268034 +0.3252187370697086,0.3931619213762155 +0.28076094384154243,0.3436210740022686 +0.2610809802561977,0.27140867619195436 +0.26359885926501336,0.36658477660402383 +0.3787519335098218,0.5516268592475561 +0.40456333749519385,0.5876500586851415 +0.3356808125397952,0.524648903042915 +0.35396152728695485,0.5485343318683893 +0.4154684542898201,0.5803035478226053 +0.4087631701723159,0.5605727415379927 +0.3719122707206945,0.5414404850942095 +0.3749888538672166,0.5576797705088654 +0.38120925419955604,0.5640913229165868 +0.3514662384385052,0.5417544823618344 +0.33327060932174785,0.541191754912395 +0.34067872160800067,0.5587343554853437 +0.3363538383861613,0.5534872394140535 +0.3211471437857989,0.5427854042944161 +0.32626640791074624,0.5533241015018499 +0.338347792567491,0.5623441915747832 +0.3337467312241321,0.5528583508091351 +0.33120930189183345,0.5509094577454428 +0.34298533195344616,0.5616105776093452 +0.3489105104802636,0.5612494926725055 +0.3240193128030988,0.3920775638797716 +0.31933563942209536,0.38846528399990443 +0.3772768675634954,0.4528676852314616 +0.4302132724978971,0.6383144238070185 +0.44250831000380264,0.5726382117162335 +0.39708739512319824,0.5411537867538003 +0.3896715342331259,0.5490598660196134 +0.44407442204500785,0.574721692067378 +0.3982680141243846,0.5466344934271826 +0.3324651717570359,0.5094405395608409 +0.28846251959629665,0.49369010163867283 +0.24252206082959654,0.45652472819940515 +0.13837581870570614,0.3079415549453068 +0.04517441987217799,0.11411339006344542 +0.04964813589199605,0.05953150967682904 +0.08947703240769801,0.05994242409653408 +0.12403419611714324,0.04668796046829673 +0.0691789686561383,0.049553513360919205 +0.07447862623846752,0.06346723416048634 +0.07543542979856065,0.06271678188295571 +0.07386389373468179,0.06253084519420173 +0.07749125360115662,0.06512904145357981 +0.07485884426742463,0.06431141474161232 +0.07707169650665448,0.0653296408848994 +0.35153365129173464,0.42494675374731034 +0.5034119485946771,0.5842992047763835 +0.5642357467638884,0.6811660505364879 +0.5093925594411262,0.5987527350395506 +0.4974112211806197,0.5767041425459665 +0.4686055778654686,0.5776453594884617 +0.4717740713742186,0.5845867375818168 +0.43731060616634426,0.568072793964956 +0.39950472109629503,0.5501086693455679 +0.36806511872664804,0.5375153404349644 +0.32959783071596194,0.5205079895703058 +0.27800548071869274,0.48881277278233054 +0.23401859398649388,0.4591112419484464 +0.20592987533857837,0.4379059061639972 +0.17529204484799024,0.4007923291608658 +0.14120009539093728,0.3513180601749101 +0.1213616430551619,0.32140862834074574 +0.11354571578942566,0.3012556423586033 +0.10652929542624721,0.26504605919742963 +0.10202920435112056,0.22626772447129825 +0.10234597323572514,0.192310690235608 +0.1045146286308616,0.15220156261003448 +0.10601598022552945,0.11479422411611163 +0.10264968870312613,0.08807757467329053 +0.322124123518145,0.3897230314074191 +0.24560445542898326,0.30230349201024453 +0.17352321740993862,0.15828305429841785 +0.1155930161278202,0.10985770784770564 +0.12151819465463766,0.09074801176189438 +0.11801120636826612,0.0796777901364567 +0.09871563313701205,0.07172673916631121 +0.08779177068160718,0.08277645679401484 +0.08844432233249643,0.10751500689730141 +0.09072810409899684,0.1484005744254406 +0.10606667397590223,0.1885724061371078 +0.14567190406212285,0.2588210395249079 +0.22659263010913386,0.3971807347344113 +0.3036640285925645,0.5236790162663789 +0.2918470501399981,0.5390264373842482 +0.29414516682356456,0.5544708352588422 +0.3497768341896032,0.5734177808626394 +0.37213879817312456,0.5651219468259456 +0.3626928924893172,0.5524530988306647 +0.36539942019881466,0.5589990597119044 +0.3711548446973409,0.5651398282193184 +0.3597760497907658,0.5553458314412137 +0.3478733002543823,0.5513120275149072 +0.3502263426180998,0.5595570783944224 +0.3167871832305152,0.383699028398729 +0.240681886631761,0.2968487729618972 +0.18995401259984362,0.1767877632417855 +0.13594987986144078,0.15052080103996596 +0.13899010417465615,0.1351054306272803 +0.13218200204493202,0.12874075727251771 +0.12092176077679484,0.1265114243560965 +0.12049224970661691,0.18390732942009966 +0.16693136093142258,0.301712899389466 +0.2853837012755958,0.45405274477491614 +0.33276313537621705,0.5322880131056735 +0.304089844174767,0.5602609496422171 +0.3488552569745663,0.576036630131363 +0.3859989344412743,0.5696207265845875 +0.39835268252227357,0.5655740480550525 +0.4123816489467207,0.5726228933225775 +0.41753801696303444,0.5736079792834805 +0.40634313218788226,0.5638535599893743 +0.3929317592901696,0.5594517569874571 +0.38296723359226037,0.5589768867841223 +0.3650016784042966,0.5513100605616361 +0.3420236408124823,0.5428113323148066 +0.32823333138567495,0.5430977922366376 +0.31996536249403956,0.5448364597189114 +0.3304899930388072,0.39894568786494305 +0.3771908878634216,0.45334556546934746 +0.4252525567280251,0.525489566950011 +0.41979116194212557,0.6012287119752262 +0.4318312703823704,0.577963946313719 +0.43335765592783965,0.5664616208174296 +0.4276803433162782,0.5601420979809331 +0.44625940911281,0.5714420657088879 +0.4376316069807272,0.5706997494653419 +0.4145006536727678,0.5569703560291251 +0.3906401693152049,0.5503380280178952 +0.37816321843347606,0.5541299562965136 +0.36031752818613505,0.549906907623679 +0.3391871451750743,0.5436526518729929 +0.33140021556901633,0.5484524946913868 +0.3332563042070042,0.5552898030753126 +0.33067706221640275,0.5524298530192803 +0.3256921171584337,0.547714350772961 +0.3246240019242416,0.5476704817545534 +0.3240853547494986,0.5482724290601235 +0.3201901316094491,0.546539066391217 +0.31731677049925383,0.5467861276429833 +0.3147868215498732,0.5461564045730408 +0.3080944120356383,0.5416226368880329 +0.3350727557562232,0.40484106405063874 +0.3786115645713998,0.4525739237406702 +0.39353203766759975,0.47132143220371703 +0.3698687254749201,0.5505878310833121 +0.41074764721512796,0.5856106857709832 +0.42079186432308824,0.5727085451968329 +0.40073925249867154,0.5495769959159524 +0.4261017142996723,0.568946896077659 +0.4526413976371078,0.5854264478145996 +0.4320684968685358,0.5624561290972965 +0.39773827784403404,0.5478365998989858 +0.3885043262770117,0.5562659483395292 +0.3704651593527629,0.5488253813478525 +0.3257052897849268,0.5239772779078358 +0.29661241168665226,0.5184866768634538 +0.28119406099272864,0.5197827202551084 +0.2530757188363648,0.49966835808265103 +0.21971195932440812,0.46986666164355734 +0.1844213604611273,0.42764839386734954 +0.11701098082446157,0.3137494315127653 +0.04563814400845112,0.14110100222050775 +0.048820465794786695,0.06763252593272705 +0.0881837904302278,0.06249853947684169 +0.12252390382576062,0.04951825721365267 +0.3329559564020324,0.4027190790990984 +0.415929198193855,0.49598675800114234 +0.5210267900528425,0.676581857322169 +0.5560684799195839,0.668775794649954 +0.5455102919598134,0.58200979037823 +0.5093539356313183,0.5776224117003002 +0.5156134962152684,0.607929466118429 +0.5341227649727802,0.619708059142327 +0.5042687057585318,0.5903151611580558 +0.48321372262309903,0.5785820464779693 +0.48367369166675195,0.5881397108403311 +0.46515008799217417,0.5786273460078468 +0.41022959344515136,0.5527435522636823 +0.36991178983076295,0.5463770013626156 +0.35279041522660853,0.5496638994877439 +0.32856377953625315,0.538266299351974 +0.2988534867251784,0.5232378226872294 +0.28362616891772724,0.5237594229319115 +0.2746528982645854,0.5253459793612282 +0.25788423414582895,0.5149827582274253 +0.24164736266766745,0.5047232491751844 +0.23622837658651832,0.507597921578427 +0.23325547571956523,0.5100411755642305 +0.22800087924867848,0.5067921859930523 +0.33547013992287267,0.4080955074467955 +0.44252347938589537,0.5233430248849055 +0.5139284729077567,0.6349851467795968 +0.4601330160306767,0.5696578602781582 +0.4155168830636918,0.5395477396057075 +0.41344943635536663,0.5613549928934045 +0.4434103368953566,0.5790985803278624 +0.4045293926500001,0.5503846388499535 +0.3679061233367369,0.5381458383652864 +0.36184519523146674,0.5500353556327398 +0.3473084270359426,0.5433652978814933 +0.31000322098192096,0.5205416065898465 +0.2934766113255559,0.5241657477939842 +0.2975370585408946,0.5416669231389527 +0.290922105262532,0.537926731691826 +0.28243368859223256,0.5333461147561818 +0.2936022281143985,0.5486923437811595 +0.30816435808627024,0.5587639193890532 +0.3089089393086769,0.5511270146981441 +0.3138971924244304,0.5513346772798459 +0.3290483652981941,0.560309289008968 +0.33681428426697235,0.5592898111681448 +0.3355124294183336,0.5530976634571066 +0.3408704995525327,0.5567203145451299 +0.3153701424058677,0.38121449819655684 +0.19567677375303852,0.24090963521364703 +0.11754375694169517,0.08331882925733164 +0.09761798380133879,0.06020706871845029 +0.11049413679138251,0.05031892640423836 +0.09680506585370884,0.049365818335150254 +0.07215678690628453,0.05354541522208913 +0.07138115166395519,0.05744972805805503 +0.07159227131571347,0.058073282047283965 +0.07292044161501607,0.059677392044428124 +0.0750730633607107,0.06230756619562107 +0.07559278606074073,0.06390669920494316 +0.07668384908316743,0.06546920516017346 +0.07679924367543282,0.06647732831620495 +0.07736906407938798,0.06706505991404388 +0.07760861514669926,0.06747207022952921 +0.07802021502112524,0.06803959585285696 +0.07812240718457515,0.06794857956058983 +0.07788538931466639,0.06764182425728087 +0.07799342273330329,0.06803807593442028 +0.07821252940746011,0.068414896497428 +0.07824128864855931,0.06840822077723552 +0.07816594837757612,0.06846216298057654 +0.078224360929446,0.06874302006581735 +0.3231232761783438,0.39073312151672157 +0.2554616927663152,0.3140839625804465 +0.1735191344917722,0.15941145962720316 +0.09576100109367948,0.07793647024749924 +0.09311524031952009,0.0523304043447353 +0.08852037785921679,0.04146134839474069 +0.0740308165423467,0.04242798671814748 +0.06753534077441596,0.04734784348839456 +0.07017937301387715,0.04988199455717602 +0.07055136560185667,0.051013916559991296 +0.07059356569035043,0.053116589606689094 +0.0720993280287309,0.056477188874835244 +0.07397028802558764,0.060004412926892826 +0.07595637439380835,0.06348219492627485 +0.0764697193968485,0.06520429231735665 +0.07647162674548098,0.06590053417064567 +0.07669806479094392,0.06673479057844979 +0.07733952997790684,0.06744086719809382 +0.07797187565422067,0.06806832529154246 +0.0784380137786068,0.06884214258974679 +0.07873120902620674,0.0695973632388435 +0.07900634406644283,0.07058733678060168 +0.0793353021009019,0.07141029810825869 +0.0794201791150475,0.07148241972819531 +0.3331594168569384,0.4025002406465386 +0.4314241706586242,0.5140098316140158 +0.539867341425959,0.6964916563544425 +0.5515552758226089,0.6478238084072739 +0.5314759611173374,0.5742387156323808 +0.48736250392197966,0.5747749190149841 +0.5132552980497787,0.6099400499892573 +0.5207248329224621,0.6112250665216654 +0.4809949993263598,0.5766528229469868 +0.45675837985800627,0.5695298891062541 +0.45767155281813127,0.5815872530528327 +0.4298467933395584,0.5655773263105042 +0.37583053105594577,0.5418643933264321 +0.3503082394000072,0.5454145651666513 +0.3448996543293696,0.5533504467547523 +0.32482048863571006,0.5405516606342964 +0.30624955887318867,0.5335717183359009 +0.3039884566740214,0.5408153515818993 +0.2937444447968082,0.533175943495918 +0.26635026927201905,0.511815844251828 +0.24668648834772805,0.5026060921998547 +0.22944331165199597,0.49215504362226964 +0.19470176097396963,0.44819432346885746 +0.15090358254709738,0.3775268482436237 +0.3246364592949975,0.3912973390822754 +0.26630765195101197,0.3276799012174582 +0.2075675725581466,0.20121863416977218 +0.12963855264351207,0.14942139337076674 +0.11833825705409269,0.10452461207661506 +0.10821440814072612,0.06934374547617378 +0.09079307316179089,0.053349554360013304 +0.07923823593690178,0.05562397819005605 +0.07776868342021616,0.059869408406928816 +0.07642745970370998,0.061590879949242575 +0.07614862917549846,0.06284165361334185 +0.07609045504220763,0.06496542670421944 +0.07652500270486821,0.06637135125814932 +0.07729706166851165,0.0668617186690738 +0.07783278821566111,0.06730356789931363 +0.07843863962737684,0.06829801178941501 +0.07894474266607802,0.06956872320712486 +0.07932391761375174,0.07058551883894212 +0.07951524852344798,0.0712592897412261 +0.07969951628273955,0.07196682667466223 +0.07997906206668826,0.07270777201138304 +0.08027076719816907,0.0734552440566849 +0.08048549293093565,0.07400146101957683 +0.08055558799317951,0.07425579403798144 +0.33461040252677965,0.4047819958478642 +0.3979444205079544,0.4742322846262171 +0.42959669225012365,0.5269346219531049 +0.395594656399699,0.5677254777010132 +0.4042282699846464,0.564427612321283 +0.40694940083211134,0.5594182591772056 +0.3993312119753836,0.5531580429620618 +0.41621309511687155,0.5663511734110308 +0.4203083812470754,0.5717474203030494 +0.40383559458493334,0.5582870226278028 +0.3865859209829218,0.5538105350062323 +0.38652947538432925,0.5644301753209998 +0.3838132619200574,0.5649701934008559 +0.36807197326079605,0.5546570401684967 +0.3616958259916852,0.5565234404040964 +0.3672531842556567,0.5637179594229645 +0.3633345364902144,0.5580404382131932 +0.3527085780493459,0.5513023119578413 +0.3505634068842469,0.5537434797810846 +0.34714147442595533,0.5526366215313134 +0.3354213833234547,0.5463402252969123 +0.32747048133964773,0.5458458047701567 +0.3245748876969551,0.5487691741680176 +0.31940346950783816,0.5474827271241398 +0.32658046478401404,0.397838322975693 +0.33523729437809746,0.40346807106283694 +0.3699964284263295,0.4325710222535694 +0.3736264705018188,0.5334748011838207 +0.3779541849442845,0.5309932810161996 +0.3571660220011431,0.5421604495960397 +0.3613091408587711,0.5500598531416604 +0.38071885698475044,0.5564391594366663 +0.3709045051893271,0.5521528702359368 +0.36820775264157113,0.5537571292446924 +0.363036632475678,0.5539392810385159 +0.3555579780923456,0.5515158753993561 +0.34880948060738665,0.5510289054531724 +0.34522998327065824,0.5521582942585933 +0.3414751290690307,0.5521032791716499 +0.3375915586370327,0.5510275345463472 +0.3335844873810813,0.5494658928584633 +0.33038312191074326,0.5493914466573881 +0.3269992470181342,0.5483844261872813 +0.31961786741505854,0.5438569765945985 +0.3126152753294656,0.5421089511831263 +0.30945262307590254,0.5438185912034917 +0.3027783035713539,0.5405949336062583 +0.29090625042702445,0.5329136234551403 +0.33351075643550676,0.40536174042332995 +0.4181160926102896,0.49657693338940884 +0.5058399437991868,0.6410751321298322 +0.5080110429847586,0.6255037167576474 +0.4762613176483984,0.5606825928979458 +0.4517063199700316,0.5641912799055403 +0.47975781551729124,0.5925618390260485 +0.4831956922180576,0.5893055776882322 +0.43742561332841867,0.5597544889772572 +0.4128684102781956,0.5570334177430862 +0.40320965640793177,0.5607634764006351 +0.36440891021210686,0.5389634352749316 +0.31861799949912256,0.5206384641372821 +0.30115532869904266,0.5271524769290291 +0.2926861643290024,0.5320228916466007 +0.2746466397768851,0.5213937145887011 +0.2639186083818562,0.51983237092404 +0.26329946513435787,0.5269136411182143 +0.2584745883499057,0.5250415188367353 +0.25294566150148723,0.5230727178217546 +0.2586658596549572,0.5334697943936764 +0.26936492319263017,0.5452375393722614 +0.27785325045596243,0.5491434317313086 +0.2901059984664071,0.5546471457974972 +0.33954101795104524,0.4123657928004563 +0.4040545224451559,0.47721659977315667 +0.4318218230461751,0.5273630005336706 +0.3989687859328889,0.5536782126952742 +0.37931126349629823,0.5307543259960955 +0.3614530562735566,0.5348571521008209 +0.36640757316037303,0.547981141162082 +0.36939907067649286,0.5496060233778608 +0.341890573443044,0.5343828183392872 +0.3282707929049099,0.5347189885346944 +0.3287230729493881,0.5469458680904462 +0.325846373979086,0.5484325867400985 +0.31778541201872007,0.544009206856845 +0.31878322357441163,0.548093674731041 +0.32426780456712484,0.5522831659889794 +0.3211503624366162,0.5467565041346292 +0.31709867710405804,0.5444360953212962 +0.3220702111169549,0.551431594431926 +0.324542164746979,0.5524921398728618 +0.3174315094404268,0.5449737292153692 +0.3160459994728601,0.5467992406647899 +0.3212915658400649,0.5530274491857965 +0.31926494831340385,0.549818692749707 +0.3133316039502536,0.5447133761278625 +0.32655683154236465,0.3964300738406247 +0.36559242003856435,0.4397416100076404 +0.42797827713313696,0.5307242852552294 +0.4423615335660684,0.6181481459891357 +0.4376640915121242,0.5677684526497524 +0.4242743252981389,0.5572906713890751 +0.4319197832798467,0.5690466146480342 +0.47028803817325543,0.5877079347950246 +0.45062631360920885,0.572043476572657 +0.4261195062861347,0.5602552275963378 +0.41866049163325236,0.5663536172014584 +0.412399977374986,0.566720901021334 +0.3809667527023289,0.5493997913076287 +0.35653570288275127,0.5460422020740336 +0.35204267495802927,0.5548490267286751 +0.34156793350093007,0.5496516805356058 +0.3232876359862838,0.5400111657172837 +0.32165569061493543,0.5479031186823323 +0.3295210599335044,0.5581023674389073 +0.32567358011391173,0.5515948515534189 +0.3221039175435696,0.5488020163271788 +0.3326254486468095,0.5590699892389496 +0.3421462475667643,0.5625517945518405 +0.3391830920592303,0.554348347714239 +0.3366547822375807,0.40831342202736437 +0.4046087860368273,0.4799752815380549 +0.4249626695382096,0.5137358886675458 +0.3512058257455261,0.494422493708897 +0.31913465255994716,0.48627894953909423 +0.2963789700954294,0.48852032259371975 +0.2197327017407864,0.4048903868940251 +0.09744429586649304,0.21616953538960149 +0.04410246013839853,0.06575936056996808 +0.08187061546831138,0.07496383761089646 +0.12466776368867476,0.057096212911076416 +0.0988922118971289,0.056502073813945605 +0.07595217226635241,0.07083168602103986 +0.08290123938094619,0.07273462390376441 +0.07897362111646675,0.07194447493294633 +0.07893663643438996,0.07332372640842857 +0.08081540463971094,0.07263830279813004 +0.07879620789132318,0.0697677431153632 +0.07936972378325378,0.06923899031333196 +0.07854881881322529,0.0692253408497241 +0.07883933185181079,0.06910103536346145 +0.07813748715970074,0.06780728675062307 +0.0773531198369133,0.06659096457108857 +0.07703766225449356,0.06607198693076775 +0.31766241783424715,0.3844653355117168 +0.2405820488517793,0.2967613925529492 +0.16609925028817824,0.1481447214885993 +0.09498563407225158,0.07252216314817424 +0.09430086611086676,0.050589769909190445 +0.09031161664370012,0.04300743327039038 +0.07618227599746841,0.045247971859991826 +0.07017388938655876,0.05271533113940532 +0.07508668302203955,0.059504836598381405 +0.07616692780144137,0.062881529120563 +0.07506442068721975,0.06476965524911048 +0.07512980698252716,0.06653970457675346 +0.07571843265190574,0.06722918130288313 +0.07740816472635395,0.06787177897605401 +0.07825490830988815,0.06848385907120211 +0.07888060806831068,0.06942391372312813 +0.07911500333384977,0.07042357301962988 +0.07934585212302532,0.07127943611109269 +0.07969197629517676,0.07209250306775014 +0.07993513344349631,0.07255190586581753 +0.08011940120278789,0.07296994304054936 +0.08032131193692996,0.07365182017449563 +0.08049160240702408,0.07401809071541346 +0.08061492441704325,0.07444611166811173 +0.33186298603097325,0.4024278508057014 +0.42308726899531784,0.5040431005759308 +0.517059445292627,0.6588914372306726 +0.5082585214698238,0.6214222291156801 +0.47385561458103076,0.5598415117583377 +0.44433420888921693,0.5614655595090925 +0.4702790974765407,0.5872449855206049 +0.473461866297712,0.5899857262874858 +0.4425697921948779,0.5674537997310372 +0.4254368244873167,0.5635989885523913 +0.42268294088755326,0.5712340454993187 +0.4033221005702813,0.5616313200256575 +0.3715013562996833,0.5491511207304589 +0.35893753164820913,0.5536562781860703 +0.3556878566132889,0.5565349441004995 +0.34055531019101437,0.5464593153767746 +0.32612520450729754,0.5410486441607687 +0.31844800705225224,0.5410652738566054 +0.29867315287244134,0.5277931076489291 +0.2638828157926747,0.5036597235020198 +0.2228589951610427,0.4700214251031982 +0.15794885155834215,0.37776175014789665 +0.05450934170743257,0.16675183121134807 +0.03185731172016144,0.04171377406451888 +0.339240789355363,0.41074514251444244 +0.4853789805534839,0.5721285324004666 +0.6035033463398367,0.7403541778559162 +0.5713164805387686,0.6157404759761439 +0.5491756199850036,0.5771933178639995 +0.4875459372162445,0.586274085465111 +0.5165284871170588,0.6146046498691089 +0.47716084114487217,0.5867415646925184 +0.4214012026065227,0.5522245150187168 +0.3832185267745904,0.5400512200384385 +0.34208893770082255,0.5234243256201068 +0.2664205133458748,0.46835225663649965 +0.1886008679543844,0.38622939457257993 +0.10214939711728956,0.2563054851052341 +0.0530551075844516,0.12968149737785634 +0.06713393329424483,0.0942491289796278 +0.10230809448397686,0.07344415759279382 +0.10809198020037844,0.05812564472754374 +0.08081957696484451,0.061479180845307665 +0.08090898393199228,0.06836301065432483 +0.07924211023881152,0.07094344472961935 +0.07952225206920789,0.07418659304562902 +0.08189362286119074,0.07740971420106127 +0.08114668725531585,0.07973021242136105 +0.3342438339614738,0.4045078740874604 +0.37506878369584673,0.4483022078755395 +0.38987982266425786,0.4647110088993687 +0.34925353521088726,0.5094480497460574 +0.36430382722338583,0.538818119151456 +0.36964941018450664,0.5528576355534002 +0.3447729348545988,0.5301693660142294 +0.3333601951028299,0.5258340817956587 +0.3290100097092877,0.5336512309317648 +0.31137788290414037,0.5253267270610301 +0.2764376401427893,0.5009832365419915 +0.25841069217071744,0.4980016036040578 +0.25504297013683974,0.508851049625987 +0.2432060539305994,0.5012953860656345 +0.2322504221995347,0.49613985253073506 +0.24147051568664915,0.5184278470792576 +0.25476139779496904,0.5368042570251761 +0.2533838152451561,0.5297256094353632 +0.2567565142668716,0.5317191463778428 +0.2714817523491433,0.545267937740995 +0.2800279259202202,0.547994909834979 +0.2818032800668736,0.5435688477427195 +0.2916823923088343,0.5489150267332944 +0.3029386698680946,0.5537588577793852 +0.32314592594335456,0.3902495192329565 +0.2825197576992735,0.34646403673459686 +0.25577688212783345,0.26238426478228927 +0.20409739013991757,0.27337080148674264 +0.25189501042821133,0.3178774107775016 +0.23111712928629186,0.33116036542584615 +0.166331440181861,0.2501717797482024 +0.142107248281941,0.2319802634097579 +0.14575958249457244,0.22420465871092105 +0.14586260912304905,0.20985814858708957 +0.14791387317032048,0.2071153216576485 +0.15684184429344078,0.2347431174997764 +0.17990589138765123,0.279136120337974 +0.21340775486152888,0.3259116400291525 +0.24537643786043406,0.39683568344696246 +0.2779189943791385,0.4940645082135752 +0.2982129454102094,0.5495703798004045 +0.30046990508656546,0.5501271467853863 +0.3148971199450112,0.5541961770566373 +0.3411879836928744,0.5625373702278531 +0.34987708920209826,0.5576690416728418 +0.34149175876492016,0.5487766247485896 +0.33866813773078147,0.5501933079408654 +0.33860903972549683,0.5536569934418053 +0.3132960199773288,0.37882709376272083 +0.1777217983895206,0.21698135064872284 +0.09271278975806557,0.05525398235885225 +0.08497893808817099,0.044513642638818914 +0.09644791482227584,0.03896364556611728 +0.0838142335271369,0.04170182333328144 +0.06549346445869504,0.04700675590980998 +0.06991049646134141,0.051742166107417484 +0.06992578505272368,0.052597939791913434 +0.07002499698393533,0.05404394846932049 +0.07159432767595787,0.0567188857085898 +0.07251107691476878,0.059187084238148224 +0.07484704254776112,0.06229463198774814 +0.07547414301533563,0.06444275357593493 +0.07633647321347593,0.06610125281125442 +0.07669839261649013,0.06737464643797018 +0.07742530106172393,0.06855615950507246 +0.07814776896092274,0.06951156235297673 +0.07867288588130401,0.07024869299244471 +0.07901889084416591,0.07063117599668713 +0.07914417980746233,0.07096412754128711 +0.07939013837408586,0.07148915505303238 +0.07952776549884867,0.07167565798590982 +0.07946205137799506,0.07143625593097142 +0.3246027230660604,0.39311358200946456 +0.3162711262161382,0.38442230095833313 +0.33802720898562144,0.38275760283997773 +0.349761396586609,0.5209560972882261 +0.4101130961669578,0.5896506885803257 +0.40041911595163776,0.5699828248003851 +0.3780245482274298,0.5449281912669134 +0.41900873177029296,0.571385858529053 +0.4613498448535579,0.5924971083820394 +0.4468492268750839,0.5694711189267024 +0.4218005835287718,0.5598284583411757 +0.43308347456191976,0.5791967491774787 +0.4379740058625808,0.5780338625618063 +0.40473100536091833,0.5552858691687707 +0.38510420911870413,0.5564259272055705 +0.38872623436947246,0.5682910065687478 +0.3752717375112722,0.5576746445094319 +0.3501479625102336,0.5444039088132253 +0.3424494265923624,0.5491625052175728 +0.33732032770102877,0.5497483592691076 +0.31391584867824196,0.5333769303574274 +0.2949321865530441,0.527688024660542 +0.29075992102412596,0.5351164323047253 +0.28366643185526613,0.5348915439807411 +0.3333709239388876,0.40627828104297087 +0.3822810053170788,0.45417591777293187 +0.4210968314880293,0.5110622031258126 +0.4066498278875215,0.5638343076891763 +0.39847901456685336,0.5463955980117232 +0.38160547607563255,0.5433570128358973 +0.3713013827164961,0.5422974806739193 +0.36909466975567706,0.542025683494654 +0.32699468726280967,0.5173782688929237 +0.27839082474709964,0.48814520076308243 +0.24662911887714156,0.47023913106751103 +0.21594467755434704,0.4408798203004584 +0.1730548441113738,0.3817258166400497 +0.13786226508640934,0.33520585186248963 +0.1203409433158805,0.313225536489267 +0.11036223171251716,0.2830254426058291 +0.09874206779696541,0.2318010322435187 +0.08708789943157512,0.1659157568618844 +0.08942323921579742,0.11234006248035079 +0.100351363403303,0.08048051568728026 +0.09989327190596017,0.06353938558274526 +0.08785921333715899,0.061868518383676296 +0.08185034988909122,0.0669650731227681 +0.08043241499477226,0.0700031814614373 +0.33760774129808646,0.4093197570440586 +0.4157916902783817,0.4922671599587166 +0.4785887598171893,0.6042113283897954 +0.4712026118425324,0.6156747320531769 +0.45103448621656084,0.5619065742743082 +0.43560662858179716,0.5611138325014511 +0.4527078866183434,0.5779417137812922 +0.4542336761173649,0.5747513155757321 +0.40289306633726146,0.5446146708364451 +0.3591431974749714,0.5285571795877452 +0.327882647458199,0.5219656807580497 +0.2805854379650313,0.49147969319690443 +0.22233813997276217,0.43877729626537204 +0.17098936435632586,0.37770101301507397 +0.11481267211855442,0.2944530834824652 +0.08180847762614368,0.2280702881325573 +0.08832293747343212,0.21233326125541876 +0.11438176033922451,0.2150825552887963 +0.13972193000308308,0.2190507345014251 +0.15883672234676435,0.2502266160212121 +0.19451820847041523,0.32286327969161627 +0.25863307710033634,0.4444405421627675 +0.29902216786986385,0.5462899189768904 +0.2923429011797997,0.5637407283971925 +0.35076987737371357,0.4241504058934564 +0.5915108918130816,0.6861721254251137 +0.753746211399712,0.8209993811761592 +0.6981466411348795,0.6267959454520491 +0.7068516014796108,0.6248142102291954 +0.5588818787571453,0.6388311364708454 +0.5607789753907316,0.6709353901322216 +0.5293693541574015,0.6330522277606507 +0.515621483237667,0.60711312090632 +0.521945774465832,0.609394727096034 +0.5225865840017025,0.6084049919728541 +0.47621825329255557,0.5834313015467164 +0.4350466131419059,0.5748165230568979 +0.42348697774311317,0.5805817226988402 +0.40880715840015264,0.5714073758057449 +0.38012585037398167,0.5563352089365262 +0.3671609460678826,0.5583971124063343 +0.3641838728757959,0.5608398299503365 +0.35030555719099277,0.5512285214078565 +0.33821111911704443,0.5475265961425475 +0.338367581309553,0.5535432677799548 +0.3354816436193124,0.5524873118966512 +0.3267073034680743,0.5470915418417893 +0.32598462695261887,0.5507669430402622 +0.31753078097628323,0.3867136227051131 +0.2268300354092336,0.2780580511315329 +0.164972782106761,0.14748063634105887 +0.12509790060762271,0.11860123236980766 +0.12601512668359174,0.09153464405868249 +0.11233752964003536,0.06866121269113717 +0.0899825990045963,0.061594992669718296 +0.08400520680896455,0.06987750506834939 +0.0839684903477892,0.0757992563092698 +0.08274179695619932,0.07795745108238988 +0.08365118502138173,0.08087387653915774 +0.08363500236032799,0.08805462688512888 +0.08546012638536032,0.10064351524971141 +0.08790343998357476,0.11824357470003104 +0.0921417772612151,0.1538040036771305 +0.11036854980486227,0.23167276304839174 +0.18647038933422005,0.35104283572858164 +0.2935430407021467,0.48867061570501746 +0.2949674427004227,0.549367724008847 +0.287080049465613,0.5630459170553732 +0.3307409881979134,0.5686612706208521 +0.3612697123862589,0.5644357781575899 +0.37385052436149113,0.5636630039406657 +0.37760177248211035,0.5646577458539899 +0.3223999738141183,0.3899092661193959 +0.22066786881482978,0.27172744183114533 +0.11913782356129525,0.08968996971603072 +0.07881948350510398,0.04671829923238577 +0.09587112067488315,0.042968869065349885 +0.08974105118168539,0.04009288535992665 +0.06881698964847933,0.04596057518821688 +0.07143205403058465,0.05494254809094409 +0.07426065205256124,0.05914756635879452 +0.07485947011619466,0.06334936597583786 +0.07531392573020682,0.06679928280388073 +0.07536271213194712,0.06838414050082693 +0.07698547838800164,0.069929539923064 +0.07829228042215593,0.0711362657548218 +0.07954683898517352,0.0722656843625649 +0.08016729353485672,0.07320779537472878 +0.08058446644356825,0.07431182240388262 +0.08112415669959461,0.07583564494478329 +0.08171078561337354,0.07755467269666944 +0.08231830595514268,0.07933720919735102 +0.08272409437670407,0.0807672140276895 +0.08307972548969554,0.08233350487785035 +0.08341410754682822,0.08357146354336584 +0.08356401322841266,0.08356389375350472 +0.33234268421204344,0.405285029245761 +0.3812250792327412,0.45313200202783266 +0.40361115329507,0.4811289592361403 +0.345689237058574,0.4865081293974879 +0.33113917702726725,0.4943371994625092 +0.3418971597562906,0.5377463680373399 +0.35194829100304365,0.5511291008607042 +0.3522145747535321,0.5510886293070373 +0.36184126132491223,0.5626272540318733 +0.3813493251147542,0.5715659837649608 +0.38054150336425163,0.5612618308339327 +0.3757240175557504,0.5571497064046534 +0.38283050053716905,0.5645803194206861 +0.38798284523996107,0.5660641770473986 +0.3805494307820054,0.5589721184125562 +0.3774985670396995,0.5601755361865401 +0.38113743060261396,0.5654413681162269 +0.3774517773935588,0.562257824444793 +0.3682405053938696,0.5574955921571264 +0.364144623217218,0.5582914333715014 +0.36018043750317513,0.5571919064930131 +0.3507642745371056,0.5521050077063425 +0.34322863811337767,0.5508319121028497 +0.34136909240599345,0.5540807824647387 +0.3213068842337696,0.39026146996419386 +0.2675477265853516,0.32743108162867685 +0.24712255592883015,0.25160384093877874 +0.268162667705394,0.3730757223983201 +0.40209743373661344,0.5849798898174382 +0.41117799275033257,0.5776296834669383 +0.3353488444707755,0.5273221713521362 +0.3775609731027686,0.5652994494574921 +0.4430146514610829,0.5856196860723141 +0.4167944192172664,0.5571246724539317 +0.3935546874326105,0.5526550393664873 +0.4109653531801328,0.574966965179807 +0.41195258491137854,0.5696551780691523 +0.3779733776398989,0.5473143440032133 +0.3646053671212529,0.553264794880497 +0.3676781057681877,0.5629273038126675 +0.34942811721540445,0.5484688263640005 +0.3310712575345573,0.5420298558197743 +0.3347846269034283,0.5540527086771435 +0.33381378644949294,0.5530948620388116 +0.3168167173319963,0.5392867308671103 +0.3114146887722829,0.5418225508659399 +0.31868949527051843,0.553377328449456 +0.3130910396039813,0.5464394670301309 +0.3346119820498659,0.40407115085665407 +0.4514739810647369,0.536397276512013 +0.5645600556360558,0.7182487225314068 +0.5629442929257612,0.6413654663535606 +0.5498316287052892,0.5804485063182134 +0.4989012478927822,0.582778094246811 +0.5227728485165938,0.6162909248688007 +0.5196065305773776,0.6116763928903928 +0.48768034569019003,0.5830327848930831 +0.474815308966395,0.5799808482768724 +0.4814598559508835,0.5911339501605926 +0.4568284749202501,0.5760942678226677 +0.4129433631189878,0.5598747115453664 +0.3955945967950542,0.5664183478454676 +0.39149934046717266,0.5689954738629882 +0.3705010115465892,0.5545420628091101 +0.35579580062495864,0.552365539607783 +0.361043512759375,0.5636722426605749 +0.3619282841062694,0.5625466089477623 +0.351615548073642,0.5533329229892471 +0.3505521714087087,0.5559675078841386 +0.3561361431465679,0.5611311178483781 +0.351617574631564,0.5555634479985597 +0.34511968487552025,0.5525467973319378 +0.3217262625143374,0.388745187410832 +0.25074824686525155,0.3088981498861026 +0.18365821239187627,0.1708527797697693 +0.124862521865445,0.13145354346109261 +0.13418090341177724,0.12378713447111848 +0.12807977197361298,0.11120381914080378 +0.10987707970645094,0.08774414629153393 +0.09670281408561415,0.0983751710934154 +0.0938679873782596,0.12093105871698354 +0.09629002211829288,0.1368398661797893 +0.1027031540694805,0.13384091809260634 +0.10339882968085735,0.14858853767211014 +0.10335180161613762,0.16820576730648368 +0.10798728464184838,0.1572381848790054 +0.10515034196960467,0.1440577502193311 +0.10201317070167873,0.15492901154117503 +0.10827821491294726,0.17269891442621316 +0.11926206944330828,0.18257507620686536 +0.1324412524473382,0.21251374411919408 +0.16148737070179447,0.2753750076606013 +0.2136211692921106,0.35472440600776806 +0.25750589366318194,0.438917158563869 +0.27484971280160003,0.523313878213708 +0.29400837416382847,0.562064228559211 +0.3124305605353383,0.3799955832149833 +0.18974155184357813,0.23191109221972778 +0.11764594910514507,0.08538728923804297 +0.10154452918221246,0.06265100815766639 +0.11178341505997583,0.05014467222582123 +0.09501498935979844,0.04884845002023298 +0.07248020170878042,0.05394205432941829 +0.07309716938674485,0.06017687896597269 +0.0736503898971329,0.06041213849811307 +0.07296088336648925,0.059541314640861744 +0.07334858177836438,0.060302048719581704 +0.07398027180358581,0.061677843125678554 +0.07623225449210401,0.0639188585524366 +0.07713201640715685,0.06556087710353092 +0.0775780677662571,0.0665629205858157 +0.07757768033606613,0.06755813933629655 +0.07814145086857763,0.06902286387210038 +0.07885307072242917,0.07013642764438634 +0.07917448876932542,0.07060834741781462 +0.07934620975089392,0.07104071950956692 +0.07948842643330364,0.07158946966985331 +0.07982355354849589,0.0724353489833497 +0.08029720185812243,0.073658793917911 +0.08074930308866636,0.07493609164884646 +0.30535715813176434,0.3701877581593372 +0.1393839716672645,0.16131859963737027 +0.06317910550943008,0.03108397115785122 +0.09170630572656066,0.04338464126358785 +0.10500571129908196,0.036486983177029114 +0.07720875738729202,0.04353681192118967 +0.06591138242546613,0.051738262003197776 +0.0702951848386559,0.05365741234924692 +0.0693690180659721,0.05333125573412856 +0.06853315233010752,0.05305868369448378 +0.06945416330101915,0.05342841130478699 +0.06940305231813301,0.05305868369448378 +0.07088708876349657,0.05419397335971758 +0.07174593208991811,0.05561259370294209 +0.07305037974060417,0.05771478991248328 +0.07392981647179209,0.059745549955500465 +0.07465323804530713,0.0615787802063937 +0.0754147767891495,0.06350004651732528 +0.07588291166913526,0.06443375327460399 +0.07621431349402968,0.06524440624315611 +0.07682168482418691,0.06638598419839266 +0.07730576394664736,0.06703272439436155 +0.0775106251107053,0.06738445140200289 +0.07771196960072209,0.06782403565574885 +0.3323177098658868,0.40420558913249466 +0.45313170544494624,0.5374676567193039 +0.555076718235336,0.69286888605713 +0.5250738262231089,0.6077805141116344 +0.48845776907186234,0.5602343659707363 +0.4524915813624905,0.5689775328649709 +0.4817768632540671,0.5934298614650049 +0.45300343624941153,0.5754869560990856 +0.40900638692528024,0.5517589431399359 +0.3951781987467246,0.5561746340240392 +0.3827803134262767,0.5545803885955723 +0.3373861610311719,0.5269961935509516 +0.30424550170457126,0.5206937772474484 +0.30289426440774453,0.5390270334306939 +0.2992130517447244,0.5413600188240323 +0.28617912525998723,0.5323099476148774 +0.2901179491976825,0.5418756586042569 +0.3050674199535608,0.5564292054610221 +0.30954334134523515,0.5536740403701539 +0.3111353814069132,0.5498780589757044 +0.32279306644634465,0.5566293578575074 +0.33376121515281004,0.559851584943271 +0.33359751099596247,0.5534772258337649 +0.3338839411163816,0.5520619135483144 +0.32642841333521805,0.39823067054861266 +0.3067467808198199,0.3701235639571291 +0.29738622898731626,0.32079908144299213 +0.25991186495145097,0.35158222795966965 +0.2838454842081407,0.37152442211627007 +0.2137033640972418,0.33818679934701074 +0.10653200743758404,0.19908738069600032 +0.07056030629857145,0.09513244000991773 +0.0887157022801123,0.06934922910347475 +0.10539248583896324,0.053867220698153466 +0.09236982463208669,0.052128046576400716 +0.07679814098950467,0.0603253839379331 +0.07860320805157352,0.06446912863115968 +0.07679310439702201,0.06527891733236546 +0.07732290028201735,0.06844294048270087 +0.07916963099077706,0.07135474657951411 +0.07949680088589316,0.07262349104395296 +0.08070191739607803,0.07395529722235293 +0.08068752287436724,0.07496616219203492 +0.08140683172739349,0.076499759894646 +0.08178788422137731,0.07770451877313281 +0.08220526574634551,0.07919836017781187 +0.0827118754245272,0.08154079290731552 +0.08313956855303978,0.08376887412620064 +0.3330259322549868,0.40563893182292937 +0.37325435870454976,0.4443063721078276 +0.37522193783057084,0.4349545821878303 +0.2628683149364489,0.3722568737911388 +0.19498273726939272,0.3001265217740831 +0.1105475723554145,0.19282644922512177 +0.06650930641942808,0.07009303546313521 +0.08728873728211141,0.0628066358846536 +0.10561600325683268,0.05179268104369541 +0.08901587127114978,0.05102124793127411 +0.07136788963049492,0.0560802815466055 +0.07382935284304036,0.058298527999135624 +0.07302373646439414,0.05930739621322432 +0.07443693278945428,0.06092816570852739 +0.07567039130822499,0.06135278919648485 +0.07477322219521944,0.061183780226790385 +0.07590875028264096,0.06272080519646456 +0.07602930067667855,0.06318834402851654 +0.07638502119663718,0.06348320820523264 +0.07643708585383957,0.06405922749041243 +0.07684117554302514,0.065034538289605 +0.07727259396183554,0.0659358499225568 +0.07738304136858543,0.0663235185308773 +0.07748994229897178,0.06680864073307911 +0.3464814125898257,0.41889524319514854 +0.5300082563446394,0.6186533549565595 +0.6593784092727739,0.7750862214827023 +0.6174560188189844,0.6170809844326519 +0.6020484565657633,0.5885934213948415 +0.4958472251043037,0.5933005789909201 +0.5131130813673689,0.6229675391309504 +0.46940410129138777,0.590519545484306 +0.41636231534504115,0.5528315883237206 +0.3965021073139265,0.5537598710583429 +0.38262552016382156,0.55525785498582 +0.32777696842303033,0.5204973203389267 +0.2935854792092195,0.51551806754036 +0.3018284439523759,0.5464625340275817 +0.30663484329695084,0.5517033320065468 +0.2922860383486937,0.5361756664434805 +0.2988776564086307,0.5457518678503054 +0.31623986357995887,0.557691214600624 +0.31074243778629873,0.5445755105849589 +0.29831537599223834,0.5332165938635187 +0.29706096644083263,0.5364963394312978 +0.28489232058415165,0.5285906773979968 +0.2515457570122097,0.5011182410619555 +0.2102158665297085,0.4599862083284957 +0.33216273778949734,0.4012171612650793 +0.3853875994022402,0.4618047162321787 +0.47127759448564704,0.6109817603625073 +0.5109919308741103,0.6686012126459917 +0.5019272564982211,0.579440591778438 +0.4837982355719888,0.5688370447177059 +0.48877626649116507,0.5907016972781294 +0.5212706326545768,0.6088792065250986 +0.4934881924737872,0.5865022520445468 +0.4751323758742234,0.5771139840820692 +0.4760327338357239,0.5849766711666312 +0.4626109301251773,0.5777246336657474 +0.4150218664889169,0.5553687792293754 +0.38015681498693715,0.5518561583152389 +0.36640796059056396,0.5558716636156609 +0.34460580343067726,0.545259235462887 +0.3235045372885843,0.5388885718413445 +0.3233209847850299,0.5505577903424459 +0.3243804275434087,0.5531771164483261 +0.3129834532201802,0.5422404390290604 +0.3076140284011533,0.5409896355626388 +0.3113904296818635,0.5474184733172871 +0.3058019875956469,0.5421409588772634 +0.29192093009718456,0.5317957383461226 +0.31975603098162425,0.38900005687103784 +0.3130182921350454,0.3807099150779011 +0.35394322866101197,0.4048882709291427 +0.35390299552579546,0.5038099868109952 +0.3517946898334837,0.49982753228599053 +0.32258611911971996,0.5187018496303722 +0.30881768459754144,0.514581022922985 +0.28904324765024386,0.4962173385686835 +0.24284526701583575,0.45893990839761345 +0.19298338886771174,0.39489865170754057 +0.1092157959751036,0.26460850150159926 +0.05625388025274237,0.13775294973004482 +0.06588530539338136,0.09085285633170308 +0.09958145020687112,0.07031246996214073 +0.1112571954536664,0.05697309951770526 +0.08278387783540354,0.060827791487061876 +0.08154609797988734,0.06945472932437378 +0.08013635872422359,0.07222536182050943 +0.08000704644740551,0.075133889661871 +0.08199721573379264,0.07674336407702698 +0.08069095014144125,0.07646596406117155 +0.08184230326204793,0.07802820179550127 +0.0817238688328995,0.0785793361415707 +0.08223411439441186,0.07870742652276393 +0.3232893347186596,0.3917811499822965 +0.23714837427846897,0.2912524928826825 +0.1505902111272444,0.13103476122830357 +0.09744974969148906,0.07262858724106419 +0.10293054578925968,0.052957236589415896 +0.09142029283865492,0.04243206963630092 +0.07095286248899495,0.04408928737176205 +0.06767487524781125,0.04987597448807387 +0.07066980003100509,0.051584541624836985 +0.07111310957644615,0.0525378583101811 +0.07121440767022458,0.05408093315127972 +0.07139161227911148,0.05531489830560864 +0.07195940612514462,0.05612382273946807 +0.07304149864853415,0.05758538822910938 +0.07453644274388975,0.06012266854173107 +0.07564452289239691,0.061988383323918074 +0.07553169129985642,0.062376469164750606 +0.07544076441426713,0.06302702405797234 +0.07600316403994903,0.06426894643235212 +0.076733201729033,0.06529068924966917 +0.0771533250676604,0.06595802285033897 +0.07733216880427833,0.06651771046290501 +0.07759714125258196,0.06737667299588576 +0.07793173192597133,0.0680927631958185 +0.33671855920747945,0.40733110768243413 +0.40796017639803933,0.48459714488774563 +0.4792394637240908,0.6132223585567533 +0.48723018161060094,0.6393960692921341 +0.47672790280762023,0.573715804085518 +0.45468300573192727,0.5613716225892411 +0.46159583322250386,0.57879829212849 +0.49154040208982813,0.5995577553691904 +0.4739834963463745,0.5818599443017666 +0.4482610820956368,0.5647584180986783 +0.4372248648848496,0.5699761490801926 +0.4280528425437382,0.5714503507544839 +0.3948507308283847,0.5554141979685422 +0.36804297560111776,0.5508185010578202 +0.36439049237687443,0.5601859073946963 +0.3599556087831209,0.5591617803915961 +0.3468216657044677,0.5511474590912335 +0.3458486496809985,0.5563614349801396 +0.35495114320399124,0.5647777300035208 +0.35442727798115004,0.5596489291517136 +0.3496136664745585,0.5545345526238936 +0.3523183166377459,0.5574055891438171 +0.35151016706169713,0.5550640206816598 +0.3386292457000722,0.5452976804586384 +0.3078013061950055,0.37360814088599276 +0.17942753431108827,0.21888962314713692 +0.11542248723914701,0.08110928508290957 +0.10684692857820088,0.06602013088998687 +0.11748209593668558,0.05436599236396312 +0.1014189719980146,0.05851325373121967 +0.08027100561674813,0.06915652728756144 +0.08239486812134357,0.07969456884390477 +0.08359256385325518,0.09065523713261227 +0.08573129771671953,0.10118472542245899 +0.08951616285698635,0.11109691821075722 +0.0905636548840897,0.13275197103853018 +0.09938070176330198,0.18654009637333166 +0.13369327781295326,0.25956889900039953 +0.21254053708251783,0.3433817017496525 +0.2655809521220348,0.454048274426573 +0.273424684954554,0.5403278451939145 +0.29015231127538965,0.5581492166895438 +0.3088124393888021,0.5539646726171051 +0.335292637290762,0.5585158448583291 +0.35216426843335025,0.5594183783864947 +0.34343874448617495,0.5497489553155533 +0.3312095999150573,0.5444511752963739 +0.3241694569032623,0.5445410591003941 +0.3168329595976948,0.3836442815326862 +0.22904014583480425,0.2826861133642596 +0.17782184478575896,0.1615039402796785 +0.14199194309664273,0.15853229111971123 +0.15841603276401167,0.17328867258196765 +0.17068386074958192,0.20908310939367145 +0.17639842626412158,0.21417254137773645 +0.1829740404769391,0.2665828755508478 +0.2200387119870109,0.3502906549163583 +0.2571562826193117,0.4101695404617747 +0.25279113645993345,0.42910313462518695 +0.2542645334762064,0.4734491690034589 +0.27262687678437203,0.5106549245894267 +0.25726723666554213,0.49652007055848363 +0.22894626851929908,0.4711269124461442 +0.2131454348199173,0.455500183963793 +0.17095157501154473,0.39283636080754286 +0.08480468390919997,0.23814228097296306 +0.042433053247815246,0.09143310754664774 +0.06221753357775574,0.06395009138619429 +0.10162037609267616,0.04818364961695764 +0.09456449745466317,0.04307839259975778 +0.06877565382733468,0.05027985555971897 +0.07507354019786883,0.05893582085893926 diff --git a/timegan.py b/timegan.py index 0b0fa7eb..ea27d23f 100644 --- a/timegan.py +++ b/timegan.py @@ -43,6 +43,7 @@ def timegan (ori_data, parameters): # Maximum sequence length and each sequence length ori_time, max_seq_len = extract_time(ori_data) + ori_seq_len = len(ori_data[0]) def MinMaxScaler(data): """Min-Max Normalizer. @@ -81,7 +82,7 @@ def MinMaxScaler(data): X = tf.placeholder(tf.float32, [None, max_seq_len, dim], name = "myinput_x") Z = tf.placeholder(tf.float32, [None, max_seq_len, z_dim], name = "myinput_z") T = tf.placeholder(tf.int32, [None], name = "myinput_t") - + def embedder (X, T): """Embedding network between original feature space to latent space. @@ -231,7 +232,8 @@ def discriminator (H, T): for itt in range(iterations): # Set mini-batch - X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + actual_batch_size = len(X_mb) # Train embedder _, step_e_loss = sess.run([E0_solver, E_loss_T0], feed_dict={X: X_mb, T: T_mb}) # Checkpoint @@ -247,7 +249,10 @@ def discriminator (H, T): # Set mini-batch X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) # Random vector generation - Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + # Use the new simplified random_generator + actual_batch_size = len(X_mb) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # Train generator _, step_g_loss_s = sess.run([GS_solver, G_loss_S], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) # Checkpoint @@ -261,21 +266,25 @@ def discriminator (H, T): for itt in range(iterations): # Generator training (twice more than discriminator training) - for kk in range(4): + for kk in range(2): # Set mini-batch - X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) # Random vector generation - Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE # Train generator _, step_g_loss_u, step_g_loss_s, step_g_loss_v = sess.run([G_solver, G_loss_U, G_loss_S, G_loss_V], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) - # Train embedder - _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) - + # Train embedder + _, step_e_loss_t0 = sess.run([E_solver, E_loss_T0], feed_dict={Z: Z_mb, X: X_mb, T: T_mb}) + # Discriminator training # Set mini-batch - X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + X_mb, T_mb = batch_generator(ori_data, ori_time, batch_size) + # ADD THIS LINE: Get the actual size of the mini-batch + actual_batch_size = len(X_mb) # Random vector generation - Z_mb = random_generator(batch_size, z_dim, T_mb, max_seq_len) + Z_mb = random_generator(actual_batch_size, z_dim, ori_seq_len) # USE THE ACTUAL BATCH SIZE # Check discriminator loss before updating check_d_loss = sess.run(D_loss, feed_dict={X: X_mb, T: T_mb, Z: Z_mb}) # Train discriminator (only when the discriminator does not work well) @@ -293,9 +302,9 @@ def discriminator (H, T): print('Finish Joint Training') ## Synthetic data generation - Z_mb = random_generator(no, z_dim, ori_time, max_seq_len) - generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) - + Z_mb = random_generator(no, z_dim, ori_seq_len) + generated_data_curr = sess.run(X_hat, feed_dict={Z: Z_mb, X: ori_data, T: ori_time}) + generated_data = list() for i in range(no): diff --git a/timegan_arch.py b/timegan_arch.py new file mode 100644 index 00000000..13d04b58 --- /dev/null +++ b/timegan_arch.py @@ -0,0 +1,119 @@ +from graphviz import Digraph +import matplotlib.pyplot as plt +import matplotlib.image as mpimg +import os + +def visualize_timegan_architecture(): + # Create a directed graph + dot = Digraph(comment='TimeGAN Architecture', format='png') + dot.attr(rankdir='TB', size='12,12') + + # Global attributes + dot.attr('node', shape='box', style='filled', color='lightgrey') + + # Define components + with dot.subgraph(name='cluster_real_data') as c: + c.attr(label='Real Time-series Data', color='blue') + c.node('X', 'Input Data\n(batch_size, seq_len, feature_dim)') + c.node('X_emb', 'Embedded Data\n(batch_size, seq_len, hidden_dim)') + c.attr(color='blue') + + with dot.subgraph(name='cluster_random_noise') as c: + c.attr(label='Random Noise', color='green') + c.node('Z', 'Random Noise\n(batch_size, seq_len, latent_dim)') + c.attr(color='green') + + with dot.subgraph(name='cluster_embedder') as c: + c.attr(label='Embedder (Autoencoder)', color='orange') + c.node('E', 'Embedder\n(LSTM/GRU based)') + c.node('H', 'Hidden States\n(batch_size, seq_len, hidden_dim)') + c.attr(color='orange') + + with dot.subgraph(name='cluster_recovery') as c: + c.attr(label='Recovery', color='orange') + c.node('R', 'Recovery\n(LSTM/GRU based)') + c.node('X_tilde', 'Recovered Data\n(batch_size, seq_len, feature_dim)') + c.attr(color='orange') + + with dot.subgraph(name='cluster_generator') as c: + c.attr(label='Generator', color='red') + c.node('G', 'Generator\n(LSTM/GRU based)') + c.node('X_hat', 'Generated Data\n(batch_size, seq_len, feature_dim)') + c.node('H_hat', 'Generated Hidden States\n(batch_size, seq_len, hidden_dim)') + c.attr(color='red') + + with dot.subgraph(name='cluster_supervisor') as c: + c.attr(label='Supervisor', color='purple') + c.node('S', 'Supervisor\n(LSTM/GRU based)') + c.node('H_super', 'Supervised Hidden States\n(batch_size, seq_len, hidden_dim)') + c.attr(color='purple') + + with dot.subgraph(name='cluster_discriminator') as c: + c.attr(label='Discriminator', color='darkgreen') + c.node('D', 'Discriminator\n(LSTM/GRU based)') + c.node('Y_real', 'Real/Fake Prediction\nfor real data') + c.node('Y_fake', 'Real/Fake Prediction\nfor generated data') + c.attr(color='darkgreen') + + # Define connections + # Embedder and Recovery + dot.edge('X', 'E', label='Input') + dot.edge('E', 'H', label='Encodes to') + dot.edge('H', 'R', label='Input') + dot.edge('R', 'X_tilde', label='Decodes to') + + # Generator + dot.edge('Z', 'G', label='Input') + dot.edge('G', 'H_hat', label='Generates') + dot.edge('H_hat', 'S', label='Input') + dot.edge('S', 'H_super', label='Predicts next step') + + # Discriminator + dot.edge('H', 'D', label='Input (real)', style='dashed') + dot.edge('H_super', 'D', label='Input (fake)', style='dashed') + dot.edge('D', 'Y_real', label='Output') + dot.edge('D', 'Y_fake', label='Output') + + # Additional connections + dot.edge('H', 'X_emb', label='Also used as') + + # Loss functions (simplified) + with dot.subgraph(name='cluster_losses') as c: + c.attr(label='Loss Functions', color='brown') + c.node('L_auto', 'Autoencoder Loss\n(MSE X vs X_tilde)') + c.node('L_adv', 'Adversarial Loss\n(Cross-entropy Y_real vs Y_fake)') + c.node('L_super', 'Supervisor Loss\n(MSE H vs H_super)') + c.node('L_emb', 'Embedding Loss\n(Combination of above)') + c.attr(color='brown') + + dot.edge('X_tilde', 'L_auto') + dot.edge('X', 'L_auto') + dot.edge('Y_real', 'L_adv') + dot.edge('Y_fake', 'L_adv') + dot.edge('H', 'L_super') + dot.edge('H_super', 'L_super') + dot.edge('L_auto', 'L_emb') + dot.edge('L_adv', 'L_emb') + dot.edge('L_super', 'L_emb') + + # Render the graph + dot.render('timegan_architecture', view=False, cleanup=True) + + # Display in matplotlib (for VSCode) + img = mpimg.imread('timegan_architecture.png') + plt.figure(figsize=(15, 15)) + plt.imshow(img) + plt.axis('off') + plt.title('TimeGAN Architecture') + plt.show() + +if __name__ == '__main__': + # Check if graphviz is installed + try: + visualize_timegan_architecture() + except Exception as e: + print(f"Error: {e}") + print("\nPlease install the required packages:") + print("pip install graphviz matplotlib") + print("Also make sure Graphviz is installed on your system:") + print("https://graphviz.org/download/") \ No newline at end of file diff --git a/utils.py b/utils.py index 3e6d30a2..8d10c903 100644 --- a/utils.py +++ b/utils.py @@ -104,27 +104,44 @@ def rnn_cell(module_name, hidden_dim): return rnn_cell -def random_generator (batch_size, z_dim, T_mb, max_seq_len): +# def random_generator (batch_size, z_dim, T_mb, max_seq_len): +# """Random vector generation. + +# Args: +# - batch_size: size of the random vector +# - z_dim: dimension of random vector +# - T_mb: time information for the random vector +# - max_seq_len: maximum sequence length + +# Returns: +# - Z_mb: generated random vector +# """ +# Z_mb = list() +# for i in range(batch_size): +# temp = np.zeros([max_seq_len, z_dim]) +# temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) +# temp[:T_mb[i],:] = temp_Z +# Z_mb.append(temp_Z) +# return Z_mb + +# In utils.py + +def random_generator (batch_size, z_dim, seq_len): """Random vector generation. Args: - batch_size: size of the random vector - z_dim: dimension of random vector - - T_mb: time information for the random vector - - max_seq_len: maximum sequence length + - seq_len: sequence length of the vector Returns: - Z_mb: generated random vector """ - Z_mb = list() - for i in range(batch_size): - temp = np.zeros([max_seq_len, z_dim]) - temp_Z = np.random.uniform(0., 1, [T_mb[i], z_dim]) - temp[:T_mb[i],:] = temp_Z - Z_mb.append(temp_Z) + # All our sequences have the same length (seq_len), so we can generate + # the noise for the whole batch in one go. + Z_mb = np.random.uniform(0., 1, [batch_size, seq_len, z_dim]) return Z_mb - def batch_generator(data, time, batch_size): """Mini-batch generator.