diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 417fcffa5adb61384aeab4895e7ca0f580a08b95..ef5834e1f053f446fadfb9ed920643123289e6ff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,8 +41,10 @@ stages: - level2 - test-gstlal - test-gstlal-only-ugly - - test-inspiral + - test-gstlal-ugly - test-burst + - test-calibration + - test-inspiral - test-offline - docker - docker-latest @@ -219,13 +221,44 @@ test:gstlal-inspiral: - export GSTLAL_FIR_WHITEN=0 - gst-inspect-1.0 + # Get the necessary ROM data: + - git clone https://git.ligo.org/alexander.pace/gstlal-testing-data.git ${GSTLAL_DIR}/gstlal-testing-data + - export LAL_DATA_PATH=${GSTLAL_DIR}/gstlal-testing-data/ + + # Run doctests - cd gstlal-inspiral - - python3 -m pytest -v --doctest-modules --ignore gst/python --ignore tests --ignore python/snglinspiraltable.py --ignore python/spawaveform.py --ignore python/imr_utils.py --ignore python/stats/inspiral_extrinsics.py --ignore python/templates.py --ignore python/inspiral_pipe.py --ignore python/p_astro_gstlal.py --ignore python/rio.py + - python3 -m pytest -c pytest.ini + only: + - schedules + - pushes + allow_failure: true + +test:gstlal-ugly: + interruptible: true + image: containers.ligo.org/alexander.pace/gstlal-dev/gstlal-dev:el7 + stage: test-gstlal-ugly + needs: + - level0:rpm:gstlal + - level1:rpm:gstlal-ugly + script: + # Install RPMs and set up the test environment: + - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi + - export GSTLAL_FIR_WHITEN=0 + - gst-inspect-1.0 + + # Get the necessary ROM data: + - git clone https://git.ligo.org/alexander.pace/gstlal-testing-data.git ${GSTLAL_DIR}/gstlal-testing-data + - export LAL_DATA_PATH=${GSTLAL_DIR}/gstlal-testing-data/ + + # Run doctests + - cd gstlal-ugly + - python3 -m pytest -c pytest.ini only: - schedules - pushes allow_failure: true + test:gstlal-burst: interruptible: true image: containers.ligo.org/alexander.pace/gstlal-dev/gstlal-dev:el7 @@ -240,7 +273,28 @@ test:gstlal-burst: - export GSTLAL_FIR_WHITEN=0 - gst-inspect-1.0 - cd gstlal-burst - - python3 -m pytest -v --doctest-modules --ignore python/excesspower --ignore python/string --ignore tests/trigger_test_01.py + - python3 -m pytest -c pytest.ini + only: + - schedules + - pushes + allow_failure: true + + +test:gstlal-calibration: + interruptible: true + image: containers.ligo.org/alexander.pace/gstlal-dev/gstlal-dev:el7 + stage: test-calibration + needs: + - level0:rpm:gstlal + - level1:rpm:gstlal-ugly + - level2:rpm:gstlal-calibration + script: + # Install RPMs and set up the test environment: + - if [ -d rpmbuild ]; then yum -y install rpmbuild/RPMS/x86_64/*.rpm; fi + - export GSTLAL_FIR_WHITEN=0 + - gst-inspect-1.0 + - cd gstlal-calibration + - python3 -m pytest -c pytest.ini only: - schedules - pushes diff --git a/gstlal-burst/pytest.ini b/gstlal-burst/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..e58acb27b358b95df74abe47f59ffd9f7dba91ae --- /dev/null +++ b/gstlal-burst/pytest.ini @@ -0,0 +1,10 @@ +# Configuration file for pytest within gstlal-burst +[pytest] +norecursedirs = gst/python share +testpaths = tests/tests_pytest python +addopts = + -v + --doctest-modules + --ignore python/excesspower + --ignore python/string + --ignore tests/test_trigger_01.py diff --git a/gstlal-burst/tests/tests_pytest/peak_test_01a_control.dump b/gstlal-burst/tests/tests_pytest/peak_test_01a_control.dump new file mode 100644 index 0000000000000000000000000000000000000000..6a153cc89829401dac50e1375268359876ada89f --- /dev/null +++ b/gstlal-burst/tests/tests_pytest/peak_test_01a_control.dump @@ -0,0 +1,4096 @@ +0.000000000 0.00030679617 +0.000488281 0.00061359227 +0.000976563 0.00092038832 +0.001464844 0.0012271843 +0.001953125 0.0015339801 +0.002441406 0.0018407759 +0.002929688 0.0021475714 +0.003417969 0.0024543668 +0.003906250 0.0027611619 +0.004394531 0.0030679568 +0.004882813 0.0033747514 +0.005371094 0.0036815456 +0.005859375 0.0039883396 +0.006347656 0.0042951331 +0.006835938 0.0046019261 +0.007324219 0.0049087186 +0.007812500 0.0052155112 +0.008300781 0.0055223028 +0.008789063 0.005829094 +0.009277344 0.0061358847 +0.009765625 0.0064426749 +0.010253906 0.0067494642 +0.010742188 0.007056253 +0.011230469 0.0073630414 +0.011718750 0.0076698288 +0.012207031 0.0079766158 +0.012695313 0.0082834018 +0.013183594 0.0085901869 +0.013671875 0.0088969711 +0.014160156 0.0092037544 +0.014648438 0.0095105376 +0.015136719 0.009817319 +0.015625000 0.0101241 +0.016113281 0.01043088 +0.016601563 0.010737659 +0.017089844 0.011044437 +0.017578125 0.011351214 +0.018066406 0.01165799 +0.018554688 0.011964764 +0.019042969 0.012271538 +0.019531250 0.01257831 +0.020019531 0.012885083 +0.020507813 0.013191852 +0.020996094 0.013498621 +0.021484375 0.013805388 +0.021972656 0.014112155 +0.022460938 0.01441892 +0.022949219 0.014725683 +0.023437500 0.015032445 +0.023925781 0.015339206 +0.024414063 0.015645966 +0.024902344 0.015952723 +0.025390625 0.01625948 +0.025878906 0.016566236 +0.026367188 0.016872987 +0.026855469 0.017179739 +0.027343750 0.01748649 +0.027832031 0.017793238 +0.028320313 0.018099984 +0.028808594 0.01840673 +0.029296875 0.018713472 +0.029785156 0.019020215 +0.030273438 0.019326955 +0.030761719 0.019633692 +0.031250000 0.019940428 +0.031738281 0.020247163 +0.032226563 0.020553894 +0.032714844 0.020860625 +0.033203125 0.021167355 +0.033691406 0.02147408 +0.034179688 0.021780804 +0.034667969 0.022087527 +0.035156250 0.022394247 +0.035644531 0.022700965 +0.036132813 0.023007682 +0.036621094 0.023314396 +0.037109375 0.023621107 +0.037597656 0.023927817 +0.038085938 0.024234524 +0.038574219 0.024541229 +0.039062500 0.02484793 +0.039550781 0.025154632 +0.040039063 0.025461329 +0.040527344 0.025768025 +0.041015625 0.026074719 +0.041503906 0.026381409 +0.041992188 0.026688097 +0.042480469 0.026994782 +0.042968750 0.027301466 +0.043457031 0.027608145 +0.043945313 0.027914824 +0.044433594 0.028221499 +0.044921875 0.028528173 +0.045410156 0.028834842 +0.045898438 0.029141508 +0.046386719 0.029448174 +0.046875000 0.029754834 +0.047363281 0.030061495 +0.047851563 0.030368149 +0.048339844 0.030674804 +0.048828125 0.030981453 +0.049316406 0.031288102 +0.049804688 0.031594746 +0.050292969 0.031901386 +0.050781250 0.032208025 +0.051269531 0.032514662 +0.051757813 0.032821294 +0.052246094 0.033127923 +0.052734375 0.033434547 +0.053222656 0.033741172 +0.053710938 0.03404779 +0.054199219 0.034354407 +0.054687500 0.034661021 +0.055175781 0.034967631 +0.055664063 0.035274237 +0.056152344 0.035580844 +0.056640625 0.035887443 +0.057128906 0.036194041 +0.057617188 0.036500633 +0.058105469 0.036807224 +0.058593750 0.037113808 +0.059082031 0.037420392 +0.059570313 0.037726972 +0.060058594 0.038033549 +0.060546875 0.038340122 +0.061035156 0.038646691 +0.061523438 0.038953256 +0.062011719 0.039259817 +0.062500000 0.039566375 +0.062988281 0.039872926 +0.063476563 0.040179476 +0.063964844 0.040486023 +0.064453125 0.040792566 +0.064941406 0.041099105 +0.065429688 0.041405641 +0.065917969 0.041712172 +0.066406250 0.0420187 +0.066894531 0.042325221 +0.067382813 0.042631742 +0.067871094 0.042938258 +0.068359375 0.043244768 +0.068847656 0.043551274 +0.069335938 0.043857779 +0.069824219 0.044164278 +0.070312500 0.044470772 +0.070800781 0.044777263 +0.071289063 0.04508375 +0.071777344 0.04539023 +0.072265625 0.045696709 +0.072753906 0.046003181 +0.073242188 0.04630965 +0.073730469 0.046616115 +0.074218750 0.046922576 +0.074707031 0.047229033 +0.075195313 0.047535483 +0.075683594 0.047841933 +0.076171875 0.048148375 +0.076660156 0.048454814 +0.077148438 0.048761245 +0.077636719 0.049067676 +0.078125000 0.0493741 +0.078613281 0.04968052 +0.079101563 0.049986932 +0.079589844 0.050293345 +0.080078125 0.05059975 +0.080566406 0.050906152 +0.081054688 0.051212545 +0.081542969 0.051518936 +0.082031250 0.051825322 +0.082519531 0.052131705 +0.083007813 0.05243808 +0.083496094 0.052744452 +0.083984375 0.05305082 +0.084472656 0.05335718 +0.084960938 0.053663537 +0.085449219 0.05396989 +0.085937500 0.054276235 +0.086425781 0.054582577 +0.086914063 0.054888912 +0.087402344 0.055195246 +0.087890625 0.055501569 +0.088378906 0.055807892 +0.088867188 0.056114208 +0.089355469 0.056420516 +0.089843750 0.056726821 +0.090332031 0.057033122 +0.090820313 0.057339415 +0.091308594 0.057645705 +0.091796875 0.057951987 +0.092285156 0.058258265 +0.092773438 0.058564536 +0.093261719 0.058870804 +0.093750000 0.059177063 +0.094238281 0.05948332 +0.094726563 0.059789572 +0.095214844 0.060095817 +0.095703125 0.060402054 +0.096191406 0.060708288 +0.096679688 0.061014514 +0.097167969 0.061320737 +0.097656250 0.061626952 +0.098144531 0.061933164 +0.098632813 0.062239368 +0.099121094 0.062545568 +0.099609375 0.062851757 +0.100097656 0.063157946 +0.100585938 0.063464127 +0.101074219 0.063770302 +0.101562500 0.064076468 +0.102050781 0.064382628 +0.102539063 0.064688787 +0.103027344 0.064994939 +0.103515625 0.065301083 +0.104003906 0.06560722 +0.104492188 0.065913349 +0.104980469 0.066219479 +0.105468750 0.066525601 +0.105957031 0.066831715 +0.106445313 0.067137823 +0.106933594 0.067443922 +0.107421875 0.067750014 +0.107910156 0.068056099 +0.108398438 0.068362184 +0.108886719 0.068668261 +0.109375000 0.068974331 +0.109863281 0.069280393 +0.110351563 0.069586448 +0.110839844 0.069892496 +0.111328125 0.070198536 +0.111816406 0.070504576 +0.112304688 0.070810601 +0.112792969 0.071116626 +0.113281250 0.071422644 +0.113769531 0.071728654 +0.114257813 0.07203465 +0.114746094 0.072340652 +0.115234375 0.07264664 +0.115722656 0.072952621 +0.116210938 0.073258594 +0.116699219 0.073564567 +0.117187500 0.073870525 +0.117675781 0.074176483 +0.118164063 0.074482426 +0.118652344 0.074788369 +0.119140625 0.075094298 +0.119628906 0.075400226 +0.120117188 0.075706147 +0.120605469 0.07601206 +0.121093750 0.076317966 +0.121582031 0.076623864 +0.122070313 0.076929756 +0.122558594 0.077235632 +0.123046875 0.077541508 +0.123535156 0.077847376 +0.124023438 0.078153245 +0.124511719 0.078459099 +0.125000000 0.078764945 +0.125488281 0.079070784 +0.125976563 0.079376616 +0.126464844 0.07968244 +0.126953125 0.079988256 +0.127441406 0.080294065 +0.127929688 0.080599867 +0.128417969 0.080905661 +0.128906250 0.081211448 +0.129394531 0.081517227 +0.129882813 0.081822999 +0.130371094 0.082128763 +0.130859375 0.08243452 +0.131347656 0.082740262 +0.131835938 0.083046004 +0.132324219 0.083351739 +0.132812500 0.083657458 +0.133300781 0.083963178 +0.133789063 0.08426889 +0.134277344 0.084574588 +0.134765625 0.084880285 +0.135253906 0.085185967 +0.135742188 0.085491642 +0.136230469 0.08579731 +0.136718750 0.08610297 +0.137207031 0.086408623 +0.137695313 0.086714268 +0.138183594 0.087019905 +0.138671875 0.087325536 +0.139160156 0.087631159 +0.139648438 0.087936766 +0.140136719 0.088242367 +0.140625000 0.088547967 +0.141113281 0.088853553 +0.141601563 0.089159131 +0.142089844 0.089464702 +0.142578125 0.089770265 +0.143066406 0.090075813 +0.143554688 0.090381362 +0.144042969 0.090686895 +0.144531250 0.090992428 +0.145019531 0.091297947 +0.145507813 0.091603458 +0.145996094 0.091908954 +0.146484375 0.09221445 +0.146972656 0.092519931 +0.147460938 0.092825413 +0.147949219 0.093130879 +0.148437500 0.093436338 +0.148925781 0.093741782 +0.149414063 0.094047226 +0.149902344 0.094352655 +0.150390625 0.094658084 +0.150878906 0.094963498 +0.151367188 0.095268898 +0.151855469 0.095574297 +0.152343750 0.095879681 +0.152832031 0.096185066 +0.153320313 0.096490428 +0.153808594 0.09679579 +0.154296875 0.097101144 +0.154785156 0.097406484 +0.155273438 0.097711816 +0.155761719 0.098017141 +0.156250000 0.098322451 +0.156738281 0.098627761 +0.157226563 0.098933056 +0.157714844 0.099238344 +0.158203125 0.099543616 +0.158691406 0.099848889 +0.159179688 0.10015415 +0.159667969 0.1004594 +0.160156250 0.10076463 +0.160644531 0.10106986 +0.161132813 0.10137508 +0.161621094 0.10168029 +0.162109375 0.10198549 +0.162597656 0.10229069 +0.163085938 0.10259587 +0.163574219 0.10290104 +0.164062500 0.1032062 +0.164550781 0.10351136 +0.165039063 0.1038165 +0.165527344 0.10412163 +0.166015625 0.10442676 +0.166503906 0.10473187 +0.166992188 0.10503697 +0.167480469 0.10534207 +0.167968750 0.10564715 +0.168457031 0.10595223 +0.168945313 0.10625729 +0.169433594 0.10656235 +0.169921875 0.10686739 +0.170410156 0.10717242 +0.170898438 0.10747745 +0.171386719 0.10778246 +0.171875000 0.10808747 +0.172363281 0.10839246 +0.172851563 0.10869744 +0.173339844 0.10900242 +0.173828125 0.10930738 +0.174316406 0.10961233 +0.174804688 0.10991728 +0.175292969 0.11022221 +0.175781250 0.11052713 +0.176269531 0.11083204 +0.176757813 0.11113694 +0.177246094 0.11144183 +0.177734375 0.11174671 +0.178222656 0.11205158 +0.178710938 0.11235644 +0.179199219 0.11266129 +0.179687500 0.11296613 +0.180175781 0.11327095 +0.180664063 0.11357577 +0.181152344 0.11388057 +0.181640625 0.11418537 +0.182128906 0.11449015 +0.182617188 0.11479492 +0.183105469 0.11509969 +0.183593750 0.11540444 +0.184082031 0.11570918 +0.184570313 0.11601391 +0.185058594 0.11631863 +0.185546875 0.11662334 +0.186035156 0.11692803 +0.186523438 0.11723273 +0.187011719 0.11753739 +0.187500000 0.11784206 +0.187988281 0.11814672 +0.188476563 0.11845136 +0.188964844 0.11875599 +0.189453125 0.11906061 +0.189941406 0.11936522 +0.190429688 0.11966981 +0.190917969 0.1199744 +0.191406250 0.12027897 +0.191894531 0.12058353 +0.192382813 0.12088808 +0.192871094 0.12119263 +0.193359375 0.12149715 +0.193847656 0.12180167 +0.194335938 0.12210618 +0.194824219 0.12241068 +0.195312500 0.12271516 +0.195800781 0.12301963 +0.196289063 0.12332409 +0.196777344 0.12362854 +0.197265625 0.12393297 +0.197753906 0.1242374 +0.198242188 0.12454181 +0.198730469 0.12484621 +0.199218750 0.12515061 +0.199707031 0.12545498 +0.200195313 0.12575935 +0.200683594 0.1260637 +0.201171875 0.12636805 +0.201660156 0.12667237 +0.202148438 0.1269767 +0.202636719 0.12728101 +0.203125000 0.12758529 +0.203613281 0.12788959 +0.204101563 0.12819386 +0.204589844 0.12849811 +0.205078125 0.12880236 +0.205566406 0.1291066 +0.206054688 0.12941082 +0.206542969 0.12971503 +0.207031250 0.13001922 +0.207519531 0.13032341 +0.208007813 0.13062759 +0.208496094 0.13093175 +0.208984375 0.1312359 +0.209472656 0.13154003 +0.209960938 0.13184415 +0.210449219 0.13214827 +0.210937500 0.13245237 +0.211425781 0.13275646 +0.211914063 0.13306053 +0.212402344 0.13336459 +0.212890625 0.13366863 +0.213378906 0.13397267 +0.213867188 0.1342767 +0.214355469 0.1345807 +0.214843750 0.1348847 +0.215332031 0.1351887 +0.215820313 0.13549267 +0.216308594 0.13579662 +0.216796875 0.13610058 +0.217285156 0.13640451 +0.217773438 0.13670844 +0.218261719 0.13701235 +0.218750000 0.13731624 +0.219238281 0.13762012 +0.219726563 0.13792399 +0.220214844 0.13822785 +0.220703125 0.1385317 +0.221191406 0.13883552 +0.221679688 0.13913934 +0.222167969 0.13944314 +0.222656250 0.13974695 +0.223144531 0.14005072 +0.223632813 0.14035448 +0.224121094 0.14065824 +0.224609375 0.14096197 +0.225097656 0.14126571 +0.225585938 0.14156942 +0.226074219 0.14187312 +0.226562500 0.14217681 +0.227050781 0.14248048 +0.227539063 0.14278413 +0.228027344 0.14308777 +0.228515625 0.14339142 +0.229003906 0.14369503 +0.229492188 0.14399864 +0.229980469 0.14430223 +0.230468750 0.14460582 +0.230957031 0.14490937 +0.231445313 0.14521292 +0.231933594 0.14551646 +0.232421875 0.14581999 +0.232910156 0.1461235 +0.233398438 0.14642699 +0.233886719 0.14673047 +0.234375000 0.14703394 +0.234863281 0.14733739 +0.235351563 0.14764084 +0.235839844 0.14794427 +0.236328125 0.14824767 +0.236816406 0.14855108 +0.237304688 0.14885446 +0.237792969 0.14915784 +0.238281250 0.14946119 +0.238769531 0.14976454 +0.239257813 0.15006787 +0.239746094 0.15037118 +0.240234375 0.15067448 +0.240722656 0.15097776 +0.241210938 0.15128104 +0.241699219 0.1515843 +0.242187500 0.15188754 +0.242675781 0.15219077 +0.243164063 0.15249398 +0.243652344 0.15279719 +0.244140625 0.15310037 +0.244628906 0.15340355 +0.245117188 0.1537067 +0.245605469 0.15400985 +0.246093750 0.15431297 +0.246582031 0.15461609 +0.247070313 0.15491919 +0.247558594 0.15522227 +0.248046875 0.15552534 +0.248535156 0.1558284 +0.249023438 0.15613143 +0.249511719 0.15643446 +0.250000000 0.15673748 +0.250488281 0.15704048 +0.250976563 0.15734346 +0.251464844 0.15764642 +0.251953125 0.15794937 +0.252441406 0.15825231 +0.252929688 0.15855524 +0.253417969 0.15885815 +0.253906250 0.15916103 +0.254394531 0.15946391 +0.254882813 0.15976678 +0.255371094 0.16006963 +0.255859375 0.16037245 +0.256347656 0.16067527 +0.256835938 0.16097808 +0.257324219 0.16128087 +0.257812500 0.16158363 +0.258300781 0.16188639 +0.258789063 0.16218914 +0.259277344 0.16249186 +0.259765625 0.16279458 +0.260253906 0.16309726 +0.260742188 0.16339995 +0.261230469 0.16370261 +0.261718750 0.16400526 +0.262207031 0.16430789 +0.262695313 0.16461052 +0.263183594 0.16491312 +0.263671875 0.1652157 +0.264160156 0.16551828 +0.264648438 0.16582084 +0.265136719 0.16612338 +0.265625000 0.1664259 +0.266113281 0.16672841 +0.266601563 0.1670309 +0.267089844 0.16733338 +0.267578125 0.16763584 +0.268066406 0.16793829 +0.268554688 0.16824073 +0.269042969 0.16854315 +0.269531250 0.16884553 +0.270019531 0.16914792 +0.270507813 0.1694503 +0.270996094 0.16975264 +0.271484375 0.17005497 +0.271972656 0.1703573 +0.272460938 0.1706596 +0.272949219 0.17096189 +0.273437500 0.17126416 +0.273925781 0.17156641 +0.274414063 0.17186865 +0.274902344 0.17217088 +0.275390625 0.17247309 +0.275878906 0.17277527 +0.276367188 0.17307745 +0.276855469 0.1733796 +0.277343750 0.17368175 +0.277832031 0.17398387 +0.278320313 0.17428598 +0.278808594 0.17458807 +0.279296875 0.17489015 +0.279785156 0.17519221 +0.280273438 0.17549425 +0.280761719 0.17579629 +0.281250000 0.17609829 +0.281738281 0.17640029 +0.282226563 0.17670226 +0.282714844 0.17700422 +0.283203125 0.17730616 +0.283691406 0.17760809 +0.284179688 0.17791 +0.284667969 0.1782119 +0.285156250 0.17851377 +0.285644531 0.17881563 +0.286132813 0.17911747 +0.286621094 0.17941929 +0.287109375 0.1797211 +0.287597656 0.1800229 +0.288085938 0.18032467 +0.288574219 0.18062644 +0.289062500 0.18092817 +0.289550781 0.1812299 +0.290039063 0.18153161 +0.290527344 0.1818333 +0.291015625 0.18213497 +0.291503906 0.18243663 +0.291992188 0.18273826 +0.292480469 0.18303989 +0.292968750 0.18334149 +0.293457031 0.18364307 +0.293945313 0.18394464 +0.294433594 0.1842462 +0.294921875 0.18454774 +0.295410156 0.18484925 +0.295898438 0.18515076 +0.296386719 0.18545224 +0.296875000 0.1857537 +0.297363281 0.18605515 +0.297851563 0.18635659 +0.298339844 0.18665799 +0.298828125 0.18695939 +0.299316406 0.18726076 +0.299804688 0.18756212 +0.300292969 0.18786347 +0.300781250 0.1881648 +0.301269531 0.1884661 +0.301757813 0.18876739 +0.302246094 0.18906866 +0.302734375 0.18936992 +0.303222656 0.18967116 +0.303710938 0.18997237 +0.304199219 0.19027357 +0.304687500 0.19057475 +0.305175781 0.19087592 +0.305664063 0.19117707 +0.306152344 0.19147819 +0.306640625 0.1917793 +0.307128906 0.19208039 +0.307617188 0.19238147 +0.308105469 0.19268253 +0.308593750 0.19298357 +0.309082031 0.19328459 +0.309570313 0.19358559 +0.310058594 0.19388658 +0.310546875 0.19418754 +0.311035156 0.19448848 +0.311523438 0.19478941 +0.312011719 0.19509032 +0.312500000 0.19539121 +0.312988281 0.19569209 +0.313476563 0.19599295 +0.313964844 0.19629379 +0.314453125 0.1965946 +0.314941406 0.19689539 +0.315429688 0.19719619 +0.315917969 0.19749694 +0.316406250 0.19779769 +0.316894531 0.19809841 +0.317382813 0.19839911 +0.317871094 0.1986998 +0.318359375 0.19900048 +0.318847656 0.19930112 +0.319335938 0.19960175 +0.319824219 0.19990237 +0.320312500 0.20020297 +0.320800781 0.20050354 +0.321289063 0.2008041 +0.321777344 0.20110464 +0.322265625 0.20140515 +0.322753906 0.20170565 +0.323242188 0.20200613 +0.323730469 0.2023066 +0.324218750 0.20260704 +0.324707031 0.20290746 +0.325195313 0.20320787 +0.325683594 0.20350826 +0.326171875 0.20380862 +0.326660156 0.20410897 +0.327148438 0.2044093 +0.327636719 0.2047096 +0.328125000 0.20500989 +0.328613281 0.20531017 +0.329101563 0.20561041 +0.329589844 0.20591064 +0.330078125 0.20621085 +0.330566406 0.20651105 +0.331054688 0.20681122 +0.331542969 0.20711137 +0.332031250 0.20741151 +0.332519531 0.20771162 +0.333007813 0.20801172 +0.333496094 0.2083118 +0.333984375 0.20861185 +0.334472656 0.2089119 +0.334960938 0.2092119 +0.335449219 0.20951191 +0.335937500 0.20981188 +0.336425781 0.21011184 +0.336914063 0.21041177 +0.337402344 0.21071169 +0.337890625 0.21101159 +0.338378906 0.21131147 +0.338867188 0.21161133 +0.339355469 0.21191117 +0.339843750 0.21221098 +0.340332031 0.21251078 +0.340820313 0.21281056 +0.341308594 0.21311031 +0.341796875 0.21341006 +0.342285156 0.21370977 +0.342773438 0.21400948 +0.343261719 0.21430916 +0.343750000 0.21460882 +0.344238281 0.21490845 +0.344726563 0.21520807 +0.345214844 0.21550766 +0.345703125 0.21580724 +0.346191406 0.2161068 +0.346679688 0.21640633 +0.347167969 0.21670584 +0.347656250 0.21700534 +0.348144531 0.21730483 +0.348632813 0.21760428 +0.349121094 0.2179037 +0.349609375 0.21820313 +0.350097656 0.21850252 +0.350585938 0.21880189 +0.351074219 0.21910124 +0.351562500 0.21940057 +0.352050781 0.21969989 +0.352539063 0.21999918 +0.353027344 0.22029844 +0.353515625 0.22059768 +0.354003906 0.22089691 +0.354492188 0.22119613 +0.354980469 0.22149532 +0.355468750 0.22179447 +0.355957031 0.22209363 +0.356445313 0.22239274 +0.356933594 0.22269185 +0.357421875 0.22299093 +0.357910156 0.22329 +0.358398438 0.22358903 +0.358886719 0.22388805 +0.359375000 0.22418705 +0.359863281 0.22448602 +0.360351563 0.22478497 +0.360839844 0.22508392 +0.361328125 0.22538282 +0.361816406 0.22568172 +0.362304688 0.22598058 +0.362792969 0.22627944 +0.363281250 0.22657827 +0.363769531 0.22687706 +0.364257813 0.22717586 +0.364746094 0.22747461 +0.365234375 0.22777337 +0.365722656 0.22807208 +0.366210938 0.22837079 +0.366699219 0.22866946 +0.367187500 0.22896811 +0.367675781 0.22926675 +0.368164063 0.22956537 +0.368652344 0.22986396 +0.369140625 0.23016253 +0.369628906 0.23046108 +0.370117188 0.23075961 +0.370605469 0.23105811 +0.371093750 0.23135659 +0.371582031 0.23165505 +0.372070313 0.23195349 +0.372558594 0.23225191 +0.373046875 0.23255031 +0.373535156 0.23284867 +0.374023438 0.23314704 +0.374511719 0.23344536 +0.375000000 0.23374367 +0.375488281 0.23404196 +0.375976563 0.23434022 +0.376464844 0.23463847 +0.376953125 0.23493668 +0.377441406 0.23523489 +0.377929688 0.23553306 +0.378417969 0.23583122 +0.378906250 0.23612934 +0.379394531 0.23642746 +0.379882813 0.23672554 +0.380371094 0.23702361 +0.380859375 0.23732165 +0.381347656 0.23761967 +0.381835938 0.23791766 +0.382324219 0.23821564 +0.382812500 0.23851359 +0.383300781 0.23881152 +0.383789063 0.23910943 +0.384277344 0.23940732 +0.384765625 0.23970518 +0.385253906 0.24000302 +0.385742188 0.24030083 +0.386230469 0.24059863 +0.386718750 0.2408964 +0.387207031 0.24119416 +0.387695313 0.24149188 +0.388183594 0.24178959 +0.388671875 0.24208727 +0.389160156 0.24238493 +0.389648438 0.24268256 +0.390136719 0.24298018 +0.390625000 0.24327777 +0.391113281 0.24357533 +0.391601563 0.24387288 +0.392089844 0.2441704 +0.392578125 0.2444679 +0.393066406 0.24476537 +0.393554688 0.24506283 +0.394042969 0.24536026 +0.394531250 0.24565767 +0.395019531 0.24595505 +0.395507813 0.24625242 +0.395996094 0.24654974 +0.396484375 0.24684706 +0.396972656 0.24714436 +0.397460938 0.24744162 +0.397949219 0.24773887 +0.398437500 0.24803609 +0.398925781 0.24833328 +0.399414063 0.24863045 +0.399902344 0.24892761 +0.400390625 0.24922474 +0.400878906 0.24952184 +0.401367188 0.24981892 +0.401855469 0.25011596 +0.402343750 0.250413 +0.402832031 0.25071001 +0.403320313 0.25100699 +0.403808594 0.25130397 +0.404296875 0.25160089 +0.404785156 0.25189781 +0.405273438 0.2521947 +0.405761719 0.25249156 +0.406250000 0.25278842 +0.406738281 0.25308526 +0.407226563 0.25338203 +0.407714844 0.2536788 +0.408203125 0.25397557 +0.408691406 0.25427228 +0.409179688 0.25456899 +0.409667969 0.25486565 +0.410156250 0.2551623 +0.410644531 0.25545895 +0.411132813 0.25575554 +0.411621094 0.25605214 +0.412109375 0.25634867 +0.412597656 0.2566452 +0.413085938 0.25694174 +0.413574219 0.25723821 +0.414062500 0.25753465 +0.414550781 0.2578311 +0.415039063 0.25812751 +0.415527344 0.25842389 +0.416015625 0.25872025 +0.416503906 0.2590166 +0.416992188 0.25931293 +0.417480469 0.25960919 +0.417968750 0.25990546 +0.418457031 0.26020172 +0.418945313 0.26049793 +0.419433594 0.2607941 +0.419921875 0.26109028 +0.420410156 0.26138642 +0.420898438 0.26168254 +0.421386719 0.26197863 +0.421875000 0.26227471 +0.422363281 0.26257074 +0.422851563 0.26286677 +0.423339844 0.26316276 +0.423828125 0.26345873 +0.424316406 0.26375467 +0.424804688 0.2640506 +0.425292969 0.26434648 +0.425781250 0.26464236 +0.426269531 0.26493821 +0.426757813 0.26523402 +0.427246094 0.26552981 +0.427734375 0.2658256 +0.428222656 0.26612133 +0.428710938 0.26641706 +0.429199219 0.26671275 +0.429687500 0.26700842 +0.430175781 0.26730406 +0.430664063 0.2675997 +0.431152344 0.26789528 +0.431640625 0.26819086 +0.432128906 0.26848641 +0.432617188 0.26878193 +0.433105469 0.26907742 +0.433593750 0.26937288 +0.434082031 0.26966831 +0.434570313 0.26996374 +0.435058594 0.27025914 +0.435546875 0.27055451 +0.436035156 0.27084985 +0.436523438 0.27114516 +0.437011719 0.27144045 +0.437500000 0.27173573 +0.437988281 0.27203095 +0.438476563 0.27232617 +0.438964844 0.27262136 +0.439453125 0.27291653 +0.439941406 0.27321166 +0.440429688 0.27350676 +0.440917969 0.27380186 +0.441406250 0.27409691 +0.441894531 0.27439195 +0.442382813 0.27468696 +0.442871094 0.27498195 +0.443359375 0.2752769 +0.443847656 0.27557182 +0.444335938 0.27586672 +0.444824219 0.27616161 +0.445312500 0.27645645 +0.445800781 0.27675128 +0.446289063 0.27704608 +0.446777344 0.27734086 +0.447265625 0.2776356 +0.447753906 0.27793032 +0.448242188 0.27822503 +0.448730469 0.27851969 +0.449218750 0.27881435 +0.449707031 0.27910894 +0.450195313 0.27940354 +0.450683594 0.2796981 +0.451171875 0.27999264 +0.451660156 0.28028715 +0.452148438 0.28058165 +0.452636719 0.2808761 +0.453125000 0.28117052 +0.453613281 0.28146493 +0.454101563 0.28175932 +0.454589844 0.28205368 +0.455078125 0.28234801 +0.455566406 0.2826423 +0.456054688 0.28293657 +0.456542969 0.28323081 +0.457031250 0.28352505 +0.457519531 0.28381923 +0.458007813 0.28411341 +0.458496094 0.28440753 +0.458984375 0.28470165 +0.459472656 0.28499573 +0.459960938 0.28528979 +0.460449219 0.28558382 +0.460937500 0.28587782 +0.461425781 0.28617182 +0.461914063 0.28646576 +0.462402344 0.2867597 +0.462890625 0.28705359 +0.463378906 0.28734747 +0.463867188 0.28764132 +0.464355469 0.28793511 +0.464843750 0.2882289 +0.465332031 0.28852266 +0.465820313 0.28881642 +0.466308594 0.28911012 +0.466796875 0.2894038 +0.467285156 0.28969744 +0.467773438 0.28999108 +0.468261719 0.29028466 +0.468750000 0.29057825 +0.469238281 0.2908718 +0.469726563 0.29116532 +0.470214844 0.29145882 +0.470703125 0.29175225 +0.471191406 0.29204571 +0.471679688 0.29233912 +0.472167969 0.29263249 +0.472656250 0.29292583 +0.473144531 0.29321915 +0.473632813 0.29351246 +0.474121094 0.29380572 +0.474609375 0.29409897 +0.475097656 0.2943922 +0.475585938 0.29468536 +0.476074219 0.29497853 +0.476562500 0.29527166 +0.477050781 0.29556477 +0.477539063 0.29585785 +0.478027344 0.29615089 +0.478515625 0.29644391 +0.479003906 0.2967369 +0.479492188 0.29702985 +0.479980469 0.29732281 +0.480468750 0.29761571 +0.480957031 0.29790857 +0.481445313 0.29820144 +0.481933594 0.29849425 +0.482421875 0.29878706 +0.482910156 0.29907984 +0.483398438 0.29937255 +0.483886719 0.29966527 +0.484375000 0.29995796 +0.484863281 0.30025062 +0.485351563 0.30054325 +0.485839844 0.30083585 +0.486328125 0.30112842 +0.486816406 0.30142096 +0.487304688 0.30171347 +0.487792969 0.30200595 +0.488281250 0.3022984 +0.488769531 0.30259085 +0.489257813 0.30288324 +0.489746094 0.3031756 +0.490234375 0.30346796 +0.490722656 0.30376026 +0.491210938 0.30405253 +0.491699219 0.3043448 +0.492187500 0.30463704 +0.492675781 0.30492923 +0.493164063 0.30522141 +0.493652344 0.30551353 +0.494140625 0.30580565 +0.494628906 0.30609775 +0.495117188 0.30638981 +0.495605469 0.30668181 +0.496093750 0.30697381 +0.496582031 0.30726579 +0.497070313 0.30755773 +0.497558594 0.30784965 +0.498046875 0.30814153 +0.498535156 0.30843338 +0.499023438 0.30872521 +0.499511719 0.309017 +0.500000000 0.30930877 +0.500488281 0.3096005 +0.500976563 0.30989221 +0.501464844 0.31018388 +0.501953125 0.31047553 +0.502441406 0.31076714 +0.502929688 0.31105873 +0.503417969 0.31135032 +0.503906250 0.31164184 +0.504394531 0.31193334 +0.504882813 0.31222481 +0.505371094 0.31251627 +0.505859375 0.31280768 +0.506347656 0.31309906 +0.506835938 0.3133904 +0.507324219 0.31368175 +0.507812500 0.31397304 +0.508300781 0.3142643 +0.508789063 0.31455556 +0.509277344 0.31484675 +0.509765625 0.31513792 +0.510253906 0.31542909 +0.510742188 0.3157202 +0.511230469 0.31601128 +0.511718750 0.31630236 +0.512207031 0.31659338 +0.512695313 0.31688437 +0.513183594 0.31717536 +0.513671875 0.31746629 +0.514160156 0.31775719 +0.514648438 0.31804809 +0.515136719 0.31833893 +0.515625000 0.31862974 +0.516113281 0.31892055 +0.516601563 0.3192113 +0.517089844 0.31950203 +0.517578125 0.31979272 +0.518066406 0.32008341 +0.518554688 0.32037404 +0.519042969 0.32066464 +0.519531250 0.32095525 +0.520019531 0.32124579 +0.520507813 0.3215363 +0.520996094 0.32182679 +0.521484375 0.32211724 +0.521972656 0.32240769 +0.522460938 0.32269809 +0.522949219 0.32298845 +0.523437500 0.32327878 +0.523925781 0.32356909 +0.524414063 0.32385936 +0.524902344 0.32414961 +0.525390625 0.32443982 +0.525878906 0.32473001 +0.526367188 0.32502016 +0.526855469 0.32531029 +0.527343750 0.32560039 +0.527832031 0.32589045 +0.528320313 0.32618049 +0.528808594 0.32647049 +0.529296875 0.32676044 +0.529785156 0.32705039 +0.530273438 0.3273403 +0.530761719 0.32763019 +0.531250000 0.32792002 +0.531738281 0.32820985 +0.532226563 0.32849962 +0.532714844 0.32878938 +0.533203125 0.32907912 +0.533691406 0.3293688 +0.534179688 0.32965845 +0.534667969 0.3299481 +0.535156250 0.33023769 +0.535644531 0.33052728 +0.536132813 0.33081681 +0.536621094 0.33110631 +0.537109375 0.33139578 +0.537597656 0.33168522 +0.538085938 0.33197463 +0.538574219 0.33226401 +0.539062500 0.33255336 +0.539550781 0.33284268 +0.540039063 0.33313197 +0.540527344 0.33342123 +0.541015625 0.33371046 +0.541503906 0.33399966 +0.541992188 0.33428881 +0.542480469 0.33457795 +0.542968750 0.33486703 +0.543457031 0.33515611 +0.543945313 0.33544514 +0.544433594 0.33573416 +0.544921875 0.33602312 +0.545410156 0.33631206 +0.545898438 0.33660099 +0.546386719 0.33688986 +0.546875000 0.33717871 +0.547363281 0.33746752 +0.547851563 0.33775631 +0.548339844 0.33804506 +0.548828125 0.33833376 +0.549316406 0.33862245 +0.549804688 0.33891112 +0.550292969 0.33919972 +0.550781250 0.33948833 +0.551269531 0.33977687 +0.551757813 0.34006542 +0.552246094 0.34035391 +0.552734375 0.34064236 +0.553222656 0.34093079 +0.553710938 0.34121922 +0.554199219 0.34150758 +0.554687500 0.34179589 +0.555175781 0.3420842 +0.555664063 0.34237248 +0.556152344 0.34266073 +0.556640625 0.34294891 +0.557128906 0.3432371 +0.557617188 0.34352523 +0.558105469 0.34381336 +0.558593750 0.34410143 +0.559082031 0.34438947 +0.559570313 0.34467748 +0.560058594 0.34496546 +0.560546875 0.34525341 +0.561035156 0.34554133 +0.561523438 0.34582922 +0.562011719 0.34611705 +0.562500000 0.34640488 +0.562988281 0.34669265 +0.563476563 0.34698042 +0.563964844 0.34726813 +0.564453125 0.34755582 +0.564941406 0.34784347 +0.565429688 0.34813109 +0.565917969 0.34841868 +0.566406250 0.34870625 +0.566894531 0.34899375 +0.567382813 0.34928125 +0.567871094 0.34956869 +0.568359375 0.34985614 +0.568847656 0.35014352 +0.569335938 0.35043088 +0.569824219 0.3507182 +0.570312500 0.35100549 +0.570800781 0.35129276 +0.571289063 0.35157999 +0.571777344 0.35186717 +0.572265625 0.35215434 +0.572753906 0.35244146 +0.573242188 0.35272855 +0.573730469 0.3530156 +0.574218750 0.35330266 +0.574707031 0.35358962 +0.575195313 0.35387659 +0.575683594 0.35416353 +0.576171875 0.3544504 +0.576660156 0.35473728 +0.577148438 0.3550241 +0.577636719 0.35531089 +0.578125000 0.35559767 +0.578613281 0.3558844 +0.579101563 0.35617107 +0.579589844 0.35645774 +0.580078125 0.35674438 +0.580566406 0.35703096 +0.581054688 0.35731751 +0.581542969 0.35760406 +0.582031250 0.35789055 +0.582519531 0.35817701 +0.583007813 0.35846341 +0.583496094 0.35874981 +0.583984375 0.35903618 +0.584472656 0.35932249 +0.584960938 0.35960877 +0.585449219 0.35989505 +0.585937500 0.36018127 +0.586425781 0.36046743 +0.586914063 0.3607536 +0.587402344 0.36103973 +0.587890625 0.3613258 +0.588378906 0.36161184 +0.588867188 0.36189789 +0.589355469 0.36218387 +0.589843750 0.36246982 +0.590332031 0.36275572 +0.590820313 0.36304161 +0.591308594 0.36332744 +0.591796875 0.36361328 +0.592285156 0.36389905 +0.592773438 0.3641848 +0.593261719 0.36447051 +0.593750000 0.36475617 +0.594238281 0.36504182 +0.594726563 0.36532742 +0.595214844 0.36561298 +0.595703125 0.36589855 +0.596191406 0.36618403 +0.596679688 0.3664695 +0.597167969 0.36675495 +0.597656250 0.36704034 +0.598144531 0.36732572 +0.598632813 0.36761105 +0.599121094 0.36789635 +0.599609375 0.36818162 +0.600097656 0.36846682 +0.600585938 0.36875203 +0.601074219 0.36903718 +0.601562500 0.3693223 +0.602050781 0.36960739 +0.602539063 0.36989245 +0.603027344 0.37017748 +0.603515625 0.37046245 +0.604003906 0.37074739 +0.604492188 0.37103233 +0.604980469 0.37131721 +0.605468750 0.37160203 +0.605957031 0.37188685 +0.606445313 0.37217161 +0.606933594 0.37245637 +0.607421875 0.37274107 +0.607910156 0.37302575 +0.608398438 0.37331036 +0.608886719 0.37359497 +0.609375000 0.37387952 +0.609863281 0.37416407 +0.610351563 0.37444857 +0.610839844 0.374733 +0.611328125 0.37501743 +0.611816406 0.37530184 +0.612304688 0.37558618 +0.612792969 0.3758705 +0.613281250 0.37615478 +0.613769531 0.37643903 +0.614257813 0.37672323 +0.614746094 0.37700742 +0.615234375 0.37729156 +0.615722656 0.37757567 +0.616210938 0.37785971 +0.616699219 0.37814376 +0.617187500 0.37842774 +0.617675781 0.37871173 +0.618164063 0.37899566 +0.618652344 0.37927952 +0.619140625 0.37956339 +0.619628906 0.3798472 +0.620117188 0.38013101 +0.620605469 0.38041475 +0.621093750 0.38069844 +0.621582031 0.38098213 +0.622070313 0.38126576 +0.622558594 0.38154939 +0.623046875 0.38183293 +0.623535156 0.38211647 +0.624023438 0.38239998 +0.624511719 0.38268343 +0.625000000 0.38296685 +0.625488281 0.38325024 +0.625976563 0.3835336 +0.626464844 0.38381693 +0.626953125 0.3841002 +0.627441406 0.38438344 +0.627929688 0.38466665 +0.628417969 0.38494983 +0.628906250 0.38523296 +0.629394531 0.38551605 +0.629882813 0.38579911 +0.630371094 0.38608214 +0.630859375 0.38636515 +0.631347656 0.38664809 +0.631835938 0.386931 +0.632324219 0.38721389 +0.632812500 0.38749674 +0.633300781 0.38777953 +0.633789063 0.3880623 +0.634277344 0.38834503 +0.634765625 0.38862774 +0.635253906 0.38891041 +0.635742188 0.38919303 +0.636230469 0.38947561 +0.636718750 0.38975817 +0.637207031 0.3900407 +0.637695313 0.39032316 +0.638183594 0.3906056 +0.638671875 0.39088801 +0.639160156 0.39117038 +0.639648438 0.39145273 +0.640136719 0.39173502 +0.640625000 0.39201728 +0.641113281 0.3922995 +0.641601563 0.39258167 +0.642089844 0.39286381 +0.642578125 0.39314592 +0.643066406 0.393428 +0.643554688 0.39371005 +0.644042969 0.39399204 +0.644531250 0.394274 +0.645019531 0.39455593 +0.645507813 0.39483783 +0.645996094 0.39511967 +0.646484375 0.39540148 +0.646972656 0.39568326 +0.647460938 0.39596498 +0.647949219 0.3962467 +0.648437500 0.39652836 +0.648925781 0.39681 +0.649414063 0.39709157 +0.649902344 0.39737314 +0.650390625 0.39765465 +0.650878906 0.39793614 +0.651367188 0.39821756 +0.651855469 0.39849895 +0.652343750 0.39878032 +0.652832031 0.39906165 +0.653320313 0.39934295 +0.653808594 0.3996242 +0.654296875 0.39990541 +0.654785156 0.4001866 +0.655273438 0.40046772 +0.655761719 0.40074882 +0.656250000 0.40102988 +0.656738281 0.40131092 +0.657226563 0.40159193 +0.657714844 0.40187287 +0.658203125 0.40215379 +0.658691406 0.40243465 +0.659179688 0.40271547 +0.659667969 0.4029963 +0.660156250 0.40327704 +0.660644531 0.40355778 +0.661132813 0.40383846 +0.661621094 0.4041191 +0.662109375 0.40439972 +0.662597656 0.40468028 +0.663085938 0.40496081 +0.663574219 0.40524131 +0.664062500 0.40552178 +0.664550781 0.40580219 +0.665039063 0.40608257 +0.665527344 0.40636292 +0.666015625 0.40664321 +0.666503906 0.40692347 +0.666992188 0.4072037 +0.667480469 0.40748391 +0.667968750 0.40776405 +0.668457031 0.40804416 +0.668945313 0.40832424 +0.669433594 0.40860426 +0.669921875 0.40888426 +0.670410156 0.40916422 +0.670898438 0.40944415 +0.671386719 0.40972403 +0.671875000 0.41000387 +0.672363281 0.41028368 +0.672851563 0.41056344 +0.673339844 0.41084316 +0.673828125 0.41112286 +0.674316406 0.41140252 +0.674804688 0.41168213 +0.675292969 0.4119617 +0.675781250 0.41224122 +0.676269531 0.41252071 +0.676757813 0.41280016 +0.677246094 0.41307959 +0.677734375 0.41335899 +0.678222656 0.41363832 +0.678710938 0.4139176 +0.679199219 0.41419688 +0.679687500 0.4144761 +0.680175781 0.41475528 +0.680664063 0.41503441 +0.681152344 0.41531354 +0.681640625 0.41559261 +0.682128906 0.41587162 +0.682617188 0.4161506 +0.683105469 0.41642955 +0.683593750 0.41670847 +0.684082031 0.41698733 +0.684570313 0.41726616 +0.685058594 0.41754496 +0.685546875 0.4178237 +0.686035156 0.41810244 +0.686523438 0.41838109 +0.687011719 0.41865975 +0.687500000 0.41893834 +0.687988281 0.4192169 +0.688476563 0.4194954 +0.688964844 0.41977388 +0.689453125 0.42005232 +0.689941406 0.4203307 +0.690429688 0.42060909 +0.690917969 0.42088738 +0.691406250 0.42116567 +0.691894531 0.42144391 +0.692382813 0.42172211 +0.692871094 0.42200026 +0.693359375 0.4222784 +0.693847656 0.42255646 +0.694335938 0.42283452 +0.694824219 0.42311251 +0.695312500 0.42339048 +0.695800781 0.42366838 +0.696289063 0.42394629 +0.696777344 0.42422411 +0.697265625 0.42450193 +0.697753906 0.42477968 +0.698242188 0.42505741 +0.698730469 0.42533508 +0.699218750 0.42561272 +0.699707031 0.42589033 +0.700195313 0.42616788 +0.700683594 0.42644542 +0.701171875 0.42672288 +0.701660156 0.42700034 +0.702148438 0.42727774 +0.702636719 0.42755508 +0.703125000 0.42783242 +0.703613281 0.42810971 +0.704101563 0.42838693 +0.704589844 0.42866415 +0.705078125 0.42894128 +0.705566406 0.42921841 +0.706054688 0.42949548 +0.706542969 0.42977253 +0.707031250 0.43004954 +0.707519531 0.43032649 +0.708007813 0.43060338 +0.708496094 0.43088028 +0.708984375 0.43115711 +0.709472656 0.43143392 +0.709960938 0.43171066 +0.710449219 0.43198738 +0.710937500 0.43226403 +0.711425781 0.43254068 +0.711914063 0.43281728 +0.712402344 0.43309382 +0.712890625 0.43337032 +0.713378906 0.4336468 +0.713867188 0.43392321 +0.714355469 0.4341996 +0.714843750 0.43447596 +0.715332031 0.43475226 +0.715820313 0.43502852 +0.716308594 0.43530476 +0.716796875 0.43558094 +0.717285156 0.43585709 +0.717773438 0.43613318 +0.718261719 0.43640924 +0.718750000 0.43668526 +0.719238281 0.43696123 +0.719726563 0.43723717 +0.720214844 0.43751308 +0.720703125 0.43778893 +0.721191406 0.43806472 +0.721679688 0.43834051 +0.722167969 0.43861625 +0.722656250 0.43889192 +0.723144531 0.43916759 +0.723632813 0.43944317 +0.724121094 0.43971875 +0.724609375 0.43999428 +0.725097656 0.44026977 +0.725585938 0.4405452 +0.726074219 0.4408206 +0.726562500 0.44109595 +0.727050781 0.44137126 +0.727539063 0.44164655 +0.728027344 0.44192177 +0.728515625 0.44219697 +0.729003906 0.44247213 +0.729492188 0.44274724 +0.729980469 0.44302228 +0.730468750 0.44329733 +0.730957031 0.44357231 +0.731445313 0.44384724 +0.731933594 0.44412214 +0.732421875 0.444397 +0.732910156 0.44467181 +0.733398438 0.44494659 +0.733886719 0.44522133 +0.734375000 0.44549602 +0.734863281 0.44577065 +0.735351563 0.44604528 +0.735839844 0.44631985 +0.736328125 0.44659436 +0.736816406 0.44686884 +0.737304688 0.44714329 +0.737792969 0.44741768 +0.738281250 0.44769204 +0.738769531 0.44796634 +0.739257813 0.44824061 +0.739746094 0.44851485 +0.740234375 0.44878903 +0.740722656 0.44906318 +0.741210938 0.44933727 +0.741699219 0.44961134 +0.742187500 0.44988534 +0.742675781 0.45015931 +0.743164063 0.45043325 +0.743652344 0.45070714 +0.744140625 0.45098099 +0.744628906 0.45125479 +0.745117188 0.45152855 +0.745605469 0.45180228 +0.746093750 0.45207596 +0.746582031 0.45234957 +0.747070313 0.45262319 +0.747558594 0.45289671 +0.748046875 0.45317024 +0.748535156 0.45344371 +0.749023438 0.45371711 +0.749511719 0.45399049 +0.750000000 0.45426384 +0.750488281 0.45453712 +0.750976563 0.45481038 +0.751464844 0.45508358 +0.751953125 0.45535675 +0.752441406 0.45562989 +0.752929688 0.45590296 +0.753417969 0.45617598 +0.753906250 0.45644897 +0.754394531 0.45672193 +0.754882813 0.45699483 +0.755371094 0.4572677 +0.755859375 0.45754051 +0.756347656 0.45781329 +0.756835938 0.45808604 +0.757324219 0.45835873 +0.757812500 0.45863137 +0.758300781 0.458904 +0.758789063 0.45917654 +0.759277344 0.45944905 +0.759765625 0.45972154 +0.760253906 0.45999399 +0.760742188 0.46026635 +0.761230469 0.46053872 +0.761718750 0.46081102 +0.762207031 0.46108326 +0.762695313 0.46135548 +0.763183594 0.46162766 +0.763671875 0.46189979 +0.764160156 0.46217188 +0.764648438 0.46244392 +0.765136719 0.46271592 +0.765625000 0.46298787 +0.766113281 0.46325979 +0.766601563 0.46353164 +0.767089844 0.46380347 +0.767578125 0.46407527 +0.768066406 0.464347 +0.768554688 0.46461868 +0.769042969 0.46489033 +0.769531250 0.46516195 +0.770019531 0.46543351 +0.770507813 0.46570501 +0.770996094 0.46597651 +0.771484375 0.46624792 +0.771972656 0.46651933 +0.772460938 0.46679065 +0.772949219 0.46706197 +0.773437500 0.4673332 +0.773925781 0.46760443 +0.774414063 0.4678756 +0.774902344 0.46814671 +0.775390625 0.46841779 +0.775878906 0.46868882 +0.776367188 0.46895981 +0.776855469 0.46923077 +0.777343750 0.46950167 +0.777832031 0.46977252 +0.778320313 0.47004333 +0.778808594 0.47031412 +0.779296875 0.47058484 +0.779785156 0.4708555 +0.780273438 0.47112614 +0.780761719 0.47139674 +0.781250000 0.47166729 +0.781738281 0.47193778 +0.782226563 0.47220826 +0.782714844 0.47247866 +0.783203125 0.47274902 +0.783691406 0.47301936 +0.784179688 0.47328964 +0.784667969 0.47355989 +0.785156250 0.47383007 +0.785644531 0.4741002 +0.786132813 0.47437033 +0.786621094 0.47464037 +0.787109375 0.47491038 +0.787597656 0.47518036 +0.788085938 0.47545028 +0.788574219 0.47572017 +0.789062500 0.47599 +0.789550781 0.4762598 +0.790039063 0.47652954 +0.790527344 0.47679922 +0.791015625 0.47706887 +0.791503906 0.47733849 +0.791992188 0.47760805 +0.792480469 0.47787759 +0.792968750 0.47814706 +0.793457031 0.47841647 +0.793945313 0.47868589 +0.794433594 0.47895521 +0.794921875 0.4792245 +0.795410156 0.47949377 +0.795898438 0.47976297 +0.796386719 0.48003212 +0.796875000 0.48030123 +0.797363281 0.48057032 +0.797851563 0.48083934 +0.798339844 0.48110831 +0.798828125 0.48137724 +0.799316406 0.48164612 +0.799804688 0.48191497 +0.800292969 0.48218378 +0.800781250 0.48245251 +0.801269531 0.48272124 +0.801757813 0.48298991 +0.802246094 0.48325852 +0.802734375 0.48352706 +0.803222656 0.48379561 +0.803710938 0.48406407 +0.804199219 0.48433253 +0.804687500 0.4846009 +0.805175781 0.48486924 +0.805664063 0.48513755 +0.806152344 0.4854058 +0.806640625 0.48567399 +0.807128906 0.48594216 +0.807617188 0.48621029 +0.808105469 0.48647836 +0.808593750 0.48674637 +0.809082031 0.48701435 +0.809570313 0.48728228 +0.810058594 0.48755017 +0.810546875 0.487818 +0.811035156 0.48808581 +0.811523438 0.48835355 +0.812011719 0.48862123 +0.812500000 0.48888889 +0.812988281 0.48915651 +0.813476563 0.48942408 +0.813964844 0.48969159 +0.814453125 0.48995906 +0.814941406 0.49022648 +0.815429688 0.49049386 +0.815917969 0.49076119 +0.816406250 0.49102849 +0.816894531 0.49129573 +0.817382813 0.4915629 +0.817871094 0.49183005 +0.818359375 0.49209717 +0.818847656 0.49236423 +0.819335938 0.49263123 +0.819824219 0.4928982 +0.820312500 0.49316511 +0.820800781 0.49343199 +0.821289063 0.49369881 +0.821777344 0.49396557 +0.822265625 0.4942323 +0.822753906 0.494499 +0.823242188 0.49476564 +0.823730469 0.49503222 +0.824218750 0.49529877 +0.824707031 0.49556527 +0.825195313 0.4958317 +0.825683594 0.49609813 +0.826171875 0.49636447 +0.826660156 0.49663079 +0.827148438 0.49689704 +0.827636719 0.49716327 +0.828125000 0.49742943 +0.828613281 0.49769557 +0.829101563 0.49796164 +0.829589844 0.49822766 +0.830078125 0.49849364 +0.830566406 0.4987596 +0.831054688 0.49902546 +0.831542969 0.49929133 +0.832031250 0.49955711 +0.832519531 0.49982285 +0.833007813 0.50008857 +0.833496094 0.50035423 +0.833984375 0.50061983 +0.834472656 0.50088537 +0.834960938 0.50115091 +0.835449219 0.50141639 +0.835937500 0.5016818 +0.836425781 0.50194716 +0.836914063 0.50221246 +0.837402344 0.50247777 +0.837890625 0.50274301 +0.838378906 0.50300819 +0.838867188 0.50327331 +0.839355469 0.50353837 +0.839843750 0.50380343 +0.840332031 0.50406843 +0.840820313 0.50433338 +0.841308594 0.50459826 +0.841796875 0.50486308 +0.842285156 0.50512791 +0.842773438 0.50539267 +0.843261719 0.50565737 +0.843750000 0.50592202 +0.844238281 0.50618666 +0.844726563 0.50645119 +0.845214844 0.50671571 +0.845703125 0.50698018 +0.846191406 0.50724465 +0.846679688 0.50750899 +0.847167969 0.50777334 +0.847656250 0.50803757 +0.848144531 0.50830185 +0.848632813 0.50856602 +0.849121094 0.50883013 +0.849609375 0.50909424 +0.850097656 0.50935829 +0.850585938 0.50962228 +0.851074219 0.50988621 +0.851562500 0.51015007 +0.852050781 0.51041394 +0.852539063 0.51067775 +0.853027344 0.51094151 +0.853515625 0.5112052 +0.854003906 0.51146883 +0.854492188 0.51173246 +0.854980469 0.51199603 +0.855468750 0.51225954 +0.855957031 0.512523 +0.856445313 0.51278639 +0.856933594 0.51304978 +0.857421875 0.51331306 +0.857910156 0.51357633 +0.858398438 0.51383954 +0.858886719 0.51410276 +0.859375000 0.51436585 +0.859863281 0.51462895 +0.860351563 0.51489198 +0.860839844 0.51515496 +0.861328125 0.51541787 +0.861816406 0.51568073 +0.862304688 0.51594359 +0.862792969 0.51620638 +0.863281250 0.51646912 +0.863769531 0.5167318 +0.864257813 0.51699442 +0.864746094 0.51725703 +0.865234375 0.51751959 +0.865722656 0.51778203 +0.866210938 0.51804453 +0.866699219 0.51830691 +0.867187500 0.51856923 +0.867675781 0.51883155 +0.868164063 0.51909381 +0.868652344 0.51935601 +0.869140625 0.51961815 +0.869628906 0.51988024 +0.870117188 0.52014232 +0.870605469 0.52040428 +0.871093750 0.52066624 +0.871582031 0.52092814 +0.872070313 0.52118999 +0.872558594 0.52145183 +0.873046875 0.52171355 +0.873535156 0.52197528 +0.874023438 0.52223694 +0.874511719 0.52249855 +0.875000000 0.52276015 +0.875488281 0.52302164 +0.875976563 0.52328312 +0.876464844 0.52354449 +0.876953125 0.52380586 +0.877441406 0.52406722 +0.877929688 0.52432847 +0.878417969 0.52458966 +0.878906250 0.52485085 +0.879394531 0.52511197 +0.879882813 0.52537304 +0.880371094 0.52563405 +0.880859375 0.525895 +0.881347656 0.52615595 +0.881835938 0.52641684 +0.882324219 0.52667767 +0.882812500 0.52693844 +0.883300781 0.52719915 +0.883789063 0.5274598 +0.884277344 0.52772045 +0.884765625 0.52798098 +0.885253906 0.52824152 +0.885742188 0.52850199 +0.886230469 0.5287624 +0.886718750 0.52902281 +0.887207031 0.52928311 +0.887695313 0.5295434 +0.888183594 0.52980363 +0.888671875 0.53006381 +0.889160156 0.53032392 +0.889648438 0.53058398 +0.890136719 0.53084403 +0.890625000 0.53110403 +0.891113281 0.5313639 +0.891601563 0.53162378 +0.892089844 0.53188366 +0.892578125 0.53214341 +0.893066406 0.53240311 +0.893554688 0.53266281 +0.894042969 0.53292245 +0.894531250 0.53318202 +0.895019531 0.53344154 +0.895507813 0.533701 +0.895996094 0.5339604 +0.896484375 0.5342198 +0.896972656 0.53447914 +0.897460938 0.53473842 +0.897949219 0.53499764 +0.898437500 0.5352568 +0.898925781 0.5355159 +0.899414063 0.53577501 +0.899902344 0.53603399 +0.900390625 0.53629297 +0.900878906 0.53655189 +0.901367188 0.53681076 +0.901855469 0.53706962 +0.902343750 0.53732836 +0.902832031 0.53758705 +0.903320313 0.53784573 +0.903808594 0.53810436 +0.904296875 0.53836292 +0.904785156 0.53862143 +0.905273438 0.53887993 +0.905761719 0.53913832 +0.906250000 0.5393967 +0.906738281 0.53965497 +0.907226563 0.53991324 +0.907714844 0.54017144 +0.908203125 0.54042965 +0.908691406 0.54068774 +0.909179688 0.54094583 +0.909667969 0.5412038 +0.910156250 0.54146177 +0.910644531 0.54171968 +0.911132813 0.54197752 +0.911621094 0.54223531 +0.912109375 0.5424931 +0.912597656 0.54275078 +0.913085938 0.54300845 +0.913574219 0.54326606 +0.914062500 0.54352361 +0.914550781 0.5437811 +0.915039063 0.54403853 +0.915527344 0.54429591 +0.916015625 0.54455328 +0.916503906 0.54481053 +0.916992188 0.54506779 +0.917480469 0.54532498 +0.917968750 0.54558212 +0.918457031 0.54583919 +0.918945313 0.54609627 +0.919433594 0.54635322 +0.919921875 0.54661018 +0.920410156 0.54686707 +0.920898438 0.54712385 +0.921386719 0.54738069 +0.921875000 0.5476374 +0.922363281 0.54789406 +0.922851563 0.54815066 +0.923339844 0.54840726 +0.923828125 0.54866379 +0.924316406 0.54892027 +0.924804688 0.54917663 +0.925292969 0.54943305 +0.925781250 0.54968935 +0.926269531 0.54994559 +0.926757813 0.55020183 +0.927246094 0.55045795 +0.927734375 0.55071408 +0.928222656 0.55097014 +0.928710938 0.55122614 +0.929199219 0.55148208 +0.929687500 0.55173796 +0.930175781 0.55199385 +0.930664063 0.55224961 +0.931152344 0.55250537 +0.931640625 0.55276108 +0.932128906 0.55301672 +0.932617188 0.55327231 +0.933105469 0.55352783 +0.933593750 0.5537833 +0.934082031 0.55403876 +0.934570313 0.55429411 +0.935058594 0.55454946 +0.935546875 0.55480474 +0.936035156 0.55505997 +0.936523438 0.55531514 +0.937011719 0.55557024 +0.937500000 0.55582529 +0.937988281 0.55608034 +0.938476563 0.55633527 +0.938964844 0.5565902 +0.939453125 0.55684501 +0.939941406 0.55709982 +0.940429688 0.55735457 +0.940917969 0.55760932 +0.941406250 0.55786395 +0.941894531 0.55811852 +0.942382813 0.55837309 +0.942871094 0.55862755 +0.943359375 0.558882 +0.943847656 0.55913639 +0.944335938 0.55939072 +0.944824219 0.559645 +0.945312500 0.55989921 +0.945800781 0.56015337 +0.946289063 0.56040752 +0.946777344 0.56066155 +0.947265625 0.56091559 +0.947753906 0.56116956 +0.948242188 0.56142348 +0.948730469 0.56167734 +0.949218750 0.56193113 +0.949707031 0.56218487 +0.950195313 0.56243855 +0.950683594 0.56269222 +0.951171875 0.56294578 +0.951660156 0.56319934 +0.952148438 0.56345284 +0.952636719 0.56370628 +0.953125000 0.56395966 +0.953613281 0.56421298 +0.954101563 0.56446624 +0.954589844 0.56471944 +0.955078125 0.56497264 +0.955566406 0.56522572 +0.956054688 0.5654788 +0.956542969 0.56573182 +0.957031250 0.56598479 +0.957519531 0.56623769 +0.958007813 0.56649053 +0.958496094 0.56674331 +0.958984375 0.56699604 +0.959472656 0.56724876 +0.959960938 0.56750137 +0.960449219 0.56775397 +0.960937500 0.56800646 +0.961425781 0.56825894 +0.961914063 0.56851137 +0.962402344 0.56876373 +0.962890625 0.56901604 +0.963378906 0.56926829 +0.963867188 0.56952053 +0.964355469 0.56977266 +0.964843750 0.57002479 +0.965332031 0.5702768 +0.965820313 0.57052881 +0.966308594 0.57078075 +0.966796875 0.57103264 +0.967285156 0.57128447 +0.967773438 0.57153624 +0.968261719 0.57178795 +0.968750000 0.5720396 +0.969238281 0.57229125 +0.969726563 0.57254279 +0.970214844 0.57279432 +0.970703125 0.57304579 +0.971191406 0.57329714 +0.971679688 0.5735485 +0.972167969 0.57379979 +0.972656250 0.57405102 +0.973144531 0.5743022 +0.973632813 0.57455337 +0.974121094 0.57480443 +0.974609375 0.57505548 +0.975097656 0.57530642 +0.975585938 0.57555735 +0.976074219 0.57580817 +0.976562500 0.57605898 +0.977050781 0.57630974 +0.977539063 0.57656044 +0.978027344 0.57681108 +0.978515625 0.57706165 +0.979003906 0.57731223 +0.979492188 0.57756269 +0.979980469 0.57781309 +0.980468750 0.57806349 +0.980957031 0.57831377 +0.981445313 0.57856405 +0.981933594 0.57881427 +0.982421875 0.57906443 +0.982910156 0.57931453 +0.983398438 0.57956457 +0.983886719 0.57981455 +0.984375000 0.58006448 +0.984863281 0.58031434 +0.985351563 0.5805642 +0.985839844 0.58081394 +0.986328125 0.58106369 +0.986816406 0.58131331 +0.987304688 0.58156294 +0.987792969 0.5818125 +0.988281250 0.58206201 +0.988769531 0.58231145 +0.989257813 0.58256084 +0.989746094 0.58281016 +0.990234375 0.58305943 +0.990722656 0.58330864 +0.991210938 0.58355784 +0.991699219 0.58380693 +0.992187500 0.58405602 +0.992675781 0.58430499 +0.993164063 0.58455396 +0.993652344 0.58480281 +0.994140625 0.58505166 +0.994628906 0.58530045 +0.995117188 0.58554918 +0.995605469 0.58579785 +0.996093750 0.58604646 +0.996582031 0.58629501 +0.997070313 0.58654356 +0.997558594 0.58679199 +0.998046875 0.58704036 +0.998535156 0.58728874 +0.999023438 0.58753705 +0.999511719 0.58778524 +1.000000000 0.58803344 +1.000488281 0.58828157 +1.000976563 0.58852959 +1.001464844 0.5887776 +1.001953125 0.58902556 +1.002441406 0.58927345 +1.002929688 0.58952129 +1.003417969 0.58976912 +1.003906250 0.59001684 +1.004394531 0.5902645 +1.004882813 0.59051216 +1.005371094 0.59075969 +1.005859375 0.59100723 +1.006347656 0.59125465 +1.006835938 0.59150207 +1.007324219 0.59174943 +1.007812500 0.59199667 +1.008300781 0.59224391 +1.008789063 0.59249109 +1.009277344 0.59273821 +1.009765625 0.59298527 +1.010253906 0.59323227 +1.010742188 0.59347928 +1.011230469 0.59372616 +1.011718750 0.59397298 +1.012207031 0.59421974 +1.012695313 0.59446651 +1.013183594 0.59471315 +1.013671875 0.5949598 +1.014160156 0.59520638 +1.014648438 0.59545285 +1.015136719 0.59569931 +1.015625000 0.59594572 +1.016113281 0.59619206 +1.016601563 0.59643829 +1.017089844 0.59668452 +1.017578125 0.59693068 +1.018066406 0.59717685 +1.018554688 0.5974229 +1.019042969 0.59766889 +1.019531250 0.59791481 +1.020019531 0.59816068 +1.020507813 0.59840655 +1.020996094 0.5986523 +1.021484375 0.59889805 +1.021972656 0.59914368 +1.022460938 0.59938931 +1.022949219 0.59963483 +1.023437500 0.59988034 +1.023925781 0.60012579 +1.024414063 0.60037118 +1.024902344 0.60061646 +1.025390625 0.60086173 +1.025878906 0.60110694 +1.026367188 0.6013521 +1.026855469 0.60159719 +1.027343750 0.60184222 +1.027832031 0.60208726 +1.028320313 0.60233217 +1.028808594 0.60257703 +1.029296875 0.60282183 +1.029785156 0.60306662 +1.030273438 0.6033113 +1.030761719 0.60355592 +1.031250000 0.60380054 +1.031738281 0.60404503 +1.032226563 0.60428953 +1.032714844 0.60453397 +1.033203125 0.60477829 +1.033691406 0.60502261 +1.034179688 0.60526687 +1.034667969 0.60551107 +1.035156250 0.60575515 +1.035644531 0.60599923 +1.036132813 0.60624325 +1.036621094 0.60648721 +1.037109375 0.60673112 +1.037597656 0.60697496 +1.038085938 0.60721874 +1.038574219 0.60746247 +1.039062500 0.60770619 +1.039550781 0.60794979 +1.040039063 0.60819334 +1.040527344 0.60843682 +1.041015625 0.60868031 +1.041503906 0.60892367 +1.041992188 0.60916704 +1.042480469 0.60941029 +1.042968750 0.60965347 +1.043457031 0.60989666 +1.043945313 0.61013979 +1.044433594 0.6103828 +1.044921875 0.6106258 +1.045410156 0.61086869 +1.045898438 0.61111158 +1.046386719 0.61135441 +1.046875000 0.61159718 +1.047363281 0.61183989 +1.047851563 0.61208248 +1.048339844 0.61232507 +1.048828125 0.6125676 +1.049316406 0.61281008 +1.049804688 0.61305249 +1.050292969 0.61329484 +1.050781250 0.61353713 +1.051269531 0.61377937 +1.051757813 0.61402154 +1.052246094 0.61426365 +1.052734375 0.61450577 +1.053222656 0.61474776 +1.053710938 0.6149897 +1.054199219 0.61523157 +1.054687500 0.61547345 +1.055175781 0.61571521 +1.055664063 0.6159569 +1.056152344 0.6161986 +1.056640625 0.61644018 +1.057128906 0.61668169 +1.057617188 0.61692321 +1.058105469 0.61716461 +1.058593750 0.61740601 +1.059082031 0.61764729 +1.059570313 0.61788857 +1.060058594 0.61812973 +1.060546875 0.61837089 +1.061035156 0.61861199 +1.061523438 0.61885297 +1.062011719 0.61909395 +1.062500000 0.61933488 +1.062988281 0.61957568 +1.063476563 0.61981648 +1.063964844 0.62005723 +1.064453125 0.62029791 +1.064941406 0.62053847 +1.065429688 0.62077904 +1.065917969 0.62101954 +1.066406250 0.62125999 +1.066894531 0.62150037 +1.067382813 0.6217407 +1.067871094 0.62198091 +1.068359375 0.62222111 +1.068847656 0.62246126 +1.069335938 0.62270135 +1.069824219 0.62294137 +1.070312500 0.62318134 +1.070800781 0.62342125 +1.071289063 0.6236611 +1.071777344 0.62390089 +1.072265625 0.62414062 +1.072753906 0.62438029 +1.073242188 0.62461996 +1.073730469 0.62485951 +1.074218750 0.625099 +1.074707031 0.62533844 +1.075195313 0.62557781 +1.075683594 0.62581712 +1.076171875 0.62605637 +1.076660156 0.62629557 +1.077148438 0.62653476 +1.077636719 0.62677383 +1.078125000 0.62701285 +1.078613281 0.6272518 +1.079101563 0.6274907 +1.079589844 0.62772959 +1.080078125 0.62796837 +1.080566406 0.62820709 +1.081054688 0.62844574 +1.081542969 0.6286844 +1.082031250 0.62892294 +1.082519531 0.62916142 +1.083007813 0.62939984 +1.083496094 0.62963825 +1.083984375 0.62987655 +1.084472656 0.63011479 +1.084960938 0.63035303 +1.085449219 0.63059115 +1.085937500 0.63082922 +1.086425781 0.63106728 +1.086914063 0.63130522 +1.087402344 0.6315431 +1.087890625 0.63178098 +1.088378906 0.63201874 +1.088867188 0.63225645 +1.089355469 0.63249415 +1.089843750 0.63273174 +1.090332031 0.63296926 +1.090820313 0.63320678 +1.091308594 0.63344419 +1.091796875 0.63368154 +1.092285156 0.63391882 +1.092773438 0.63415611 +1.093261719 0.63439327 +1.093750000 0.63463038 +1.094238281 0.63486749 +1.094726563 0.63510448 +1.095214844 0.63534141 +1.095703125 0.63557833 +1.096191406 0.63581514 +1.096679688 0.63605189 +1.097167969 0.63628864 +1.097656250 0.63652527 +1.098144531 0.63676184 +1.098632813 0.63699841 +1.099121094 0.63723487 +1.099609375 0.63747126 +1.100097656 0.63770759 +1.100585938 0.63794392 +1.101074219 0.63818014 +1.101562500 0.63841629 +1.102050781 0.63865238 +1.102539063 0.63888848 +1.103027344 0.63912445 +1.103515625 0.63936037 +1.104003906 0.63959622 +1.104492188 0.63983202 +1.104980469 0.64006782 +1.105468750 0.64030349 +1.105957031 0.64053911 +1.106445313 0.64077467 +1.106933594 0.64101017 +1.107421875 0.6412456 +1.107910156 0.64148104 +1.108398438 0.64171636 +1.108886719 0.64195162 +1.109375000 0.64218682 +1.109863281 0.64242196 +1.110351563 0.64265704 +1.110839844 0.64289206 +1.111328125 0.64312702 +1.111816406 0.64336193 +1.112304688 0.64359677 +1.112792969 0.64383155 +1.113281250 0.64406627 +1.113769531 0.64430094 +1.114257813 0.64453554 +1.114746094 0.64477009 +1.115234375 0.64500451 +1.115722656 0.64523894 +1.116210938 0.6454733 +1.116699219 0.64570761 +1.117187500 0.64594185 +1.117675781 0.64617604 +1.118164063 0.64641011 +1.118652344 0.64664418 +1.119140625 0.64687818 +1.119628906 0.64711207 +1.120117188 0.64734596 +1.120605469 0.64757979 +1.121093750 0.6478135 +1.121582031 0.64804721 +1.122070313 0.64828086 +1.122558594 0.64851439 +1.123046875 0.64874792 +1.123535156 0.64898133 +1.124023438 0.64921474 +1.124511719 0.64944804 +1.125000000 0.64968133 +1.125488281 0.6499145 +1.125976563 0.65014762 +1.126464844 0.65038073 +1.126953125 0.65061373 +1.127441406 0.65084666 +1.127929688 0.6510796 +1.128417969 0.65131241 +1.128906250 0.65154517 +1.129394531 0.65177786 +1.129882813 0.65201056 +1.130371094 0.65224314 +1.130859375 0.65247566 +1.131347656 0.65270811 +1.131835938 0.65294051 +1.132324219 0.65317285 +1.132812500 0.65340513 +1.133300781 0.65363735 +1.133789063 0.65386951 +1.134277344 0.65410161 +1.134765625 0.65433359 +1.135253906 0.65456557 +1.135742188 0.65479749 +1.136230469 0.65502936 +1.136718750 0.65526116 +1.137207031 0.65549284 +1.137695313 0.65572453 +1.138183594 0.65595609 +1.138671875 0.65618765 +1.139160156 0.65641916 +1.139648438 0.65665054 +1.140136719 0.65688193 +1.140625000 0.65711319 +1.141113281 0.6573444 +1.141601563 0.65757561 +1.142089844 0.65780669 +1.142578125 0.65803772 +1.143066406 0.65826869 +1.143554688 0.65849966 +1.144042969 0.65873051 +1.144531250 0.6589613 +1.145019531 0.65919203 +1.145507813 0.6594227 +1.145996094 0.65965331 +1.146484375 0.65988386 +1.146972656 0.66011435 +1.147460938 0.66034478 +1.147949219 0.66057515 +1.148437500 0.6608054 +1.148925781 0.66103566 +1.149414063 0.66126585 +1.149902344 0.66149592 +1.150390625 0.661726 +1.150878906 0.66195601 +1.151367188 0.66218591 +1.151855469 0.6624158 +1.152343750 0.66264558 +1.152832031 0.66287529 +1.153320313 0.66310501 +1.153808594 0.66333461 +1.154296875 0.66356415 +1.154785156 0.66379362 +1.155273438 0.6640231 +1.155761719 0.66425246 +1.156250000 0.66448176 +1.156738281 0.664711 +1.157226563 0.66494018 +1.157714844 0.66516924 +1.158203125 0.6653983 +1.158691406 0.6656273 +1.159179688 0.66585624 +1.159667969 0.66608512 +1.160156250 0.66631389 +1.160644531 0.66654265 +1.161132813 0.66677129 +1.161621094 0.66699994 +1.162109375 0.66722846 +1.162597656 0.66745698 +1.163085938 0.66768539 +1.163574219 0.66791373 +1.164062500 0.66814202 +1.164550781 0.66837025 +1.165039063 0.66859847 +1.165527344 0.66882658 +1.166015625 0.66905463 +1.166503906 0.66928262 +1.166992188 0.66951048 +1.167480469 0.66973835 +1.167968750 0.66996616 +1.168457031 0.67019391 +1.168945313 0.67042154 +1.169433594 0.67064917 +1.169921875 0.67087668 +1.170410156 0.67110419 +1.170898438 0.67133158 +1.171386719 0.67155898 +1.171875000 0.67178625 +1.172363281 0.67201346 +1.172851563 0.67224061 +1.173339844 0.67246771 +1.173828125 0.67269474 +1.174316406 0.67292172 +1.174804688 0.67314863 +1.175292969 0.67337549 +1.175781250 0.67360228 +1.176269531 0.67382902 +1.176757813 0.67405564 +1.177246094 0.67428225 +1.177734375 0.67450875 +1.178222656 0.67473525 +1.178710938 0.67496163 +1.179199219 0.675188 +1.179687500 0.67541426 +1.180175781 0.67564046 +1.180664063 0.6758666 +1.181152344 0.67609268 +1.181640625 0.67631871 +1.182128906 0.67654467 +1.182617188 0.67677057 +1.183105469 0.67699641 +1.183593750 0.67722219 +1.184082031 0.67744786 +1.184570313 0.67767352 +1.185058594 0.67789906 +1.185546875 0.67812461 +1.186035156 0.67835003 +1.186523438 0.6785754 +1.187011719 0.67880076 +1.187500000 0.67902601 +1.187988281 0.67925119 +1.188476563 0.67947632 +1.188964844 0.67970139 +1.189453125 0.6799264 +1.189941406 0.68015134 +1.190429688 0.68037617 +1.190917969 0.680601 +1.191406250 0.68082577 +1.191894531 0.68105042 +1.192382813 0.68127501 +1.192871094 0.6814996 +1.193359375 0.68172407 +1.193847656 0.68194848 +1.194335938 0.68217283 +1.194824219 0.68239713 +1.195312500 0.68262136 +1.195800781 0.68284553 +1.196289063 0.68306965 +1.196777344 0.6832937 +1.197265625 0.68351763 +1.197753906 0.68374157 +1.198242188 0.68396538 +1.198730469 0.6841892 +1.199218750 0.6844129 +1.199707031 0.68463653 +1.200195313 0.68486017 +1.200683594 0.68508369 +1.201171875 0.68530715 +1.201660156 0.68553054 +1.202148438 0.68575382 +1.202636719 0.6859771 +1.203125000 0.68620032 +1.203613281 0.68642342 +1.204101563 0.68664652 +1.204589844 0.6868695 +1.205078125 0.68709248 +1.205566406 0.68731534 +1.206054688 0.68753815 +1.206542969 0.68776089 +1.207031250 0.68798357 +1.207519531 0.6882062 +1.208007813 0.68842876 +1.208496094 0.68865126 +1.208984375 0.68887365 +1.209472656 0.68909603 +1.209960938 0.6893183 +1.210449219 0.68954057 +1.210937500 0.68976271 +1.211425781 0.6899848 +1.211914063 0.69020683 +1.212402344 0.69042879 +1.212890625 0.6906507 +1.213378906 0.69087255 +1.213867188 0.69109434 +1.214355469 0.69131601 +1.214843750 0.69153768 +1.215332031 0.69175923 +1.215820313 0.69198078 +1.216308594 0.69220221 +1.216796875 0.69242358 +1.217285156 0.69264489 +1.217773438 0.69286615 +1.218261719 0.69308734 +1.218750000 0.69330847 +1.219238281 0.69352955 +1.219726563 0.69375056 +1.220214844 0.69397146 +1.220703125 0.69419235 +1.221191406 0.69441313 +1.221679688 0.69463384 +1.222167969 0.6948545 +1.222656250 0.69507509 +1.223144531 0.69529563 +1.223632813 0.69551611 +1.224121094 0.69573653 +1.224609375 0.69595689 +1.225097656 0.69617712 +1.225585938 0.69639736 +1.226074219 0.69661748 +1.226562500 0.69683754 +1.227050781 0.69705755 +1.227539063 0.69727749 +1.228027344 0.69749737 +1.228515625 0.69771719 +1.229003906 0.69793695 +1.229492188 0.69815665 +1.229980469 0.69837624 +1.230468750 0.69859582 +1.230957031 0.69881529 +1.231445313 0.69903469 +1.231933594 0.69925404 +1.232421875 0.69947332 +1.232910156 0.69969255 +1.233398438 0.69991171 +1.233886719 0.70013082 +1.234375000 0.70034981 +1.234863281 0.7005688 +1.235351563 0.70078766 +1.235839844 0.70100653 +1.236328125 0.70122528 +1.236816406 0.70144397 +1.237304688 0.7016626 +1.237792969 0.70188117 +1.238281250 0.70209968 +1.238769531 0.70231807 +1.239257813 0.70253646 +1.239746094 0.70275474 +1.240234375 0.70297295 +1.240722656 0.70319116 +1.241210938 0.70340925 +1.241699219 0.70362729 +1.242187500 0.70384526 +1.242675781 0.70406312 +1.243164063 0.70428097 +1.243652344 0.70449877 +1.244140625 0.70471644 +1.244628906 0.70493406 +1.245117188 0.70515168 +1.245605469 0.70536917 +1.246093750 0.70558661 +1.246582031 0.70580393 +1.247070313 0.70602125 +1.247558594 0.70623851 +1.248046875 0.70645565 +1.248535156 0.70667279 +1.249023438 0.70688981 +1.249511719 0.70710677 +1.250000000 0.70732367 +1.250488281 0.70754051 +1.250976563 0.70775729 +1.251464844 0.70797402 +1.251953125 0.70819062 +1.252441406 0.70840722 +1.252929688 0.70862371 +1.253417969 0.70884013 +1.253906250 0.7090565 +1.254394531 0.7092728 +1.254882813 0.70948905 +1.255371094 0.70970523 +1.255859375 0.70992136 +1.256347656 0.71013737 +1.256835938 0.71035337 +1.257324219 0.71056926 +1.257812500 0.71078509 +1.258300781 0.71100086 +1.258789063 0.71121657 +1.259277344 0.71143222 +1.259765625 0.71164775 +1.260253906 0.71186328 +1.260742188 0.71207869 +1.261230469 0.71229404 +1.261718750 0.71250939 +1.262207031 0.71272463 +1.262695313 0.7129398 +1.263183594 0.71315485 +1.263671875 0.71336991 +1.264160156 0.71358484 +1.264648438 0.71379977 +1.265136719 0.71401459 +1.265625000 0.71422935 +1.266113281 0.71444404 +1.266601563 0.71465868 +1.267089844 0.71487325 +1.267578125 0.71508777 +1.268066406 0.71530217 +1.268554688 0.71551651 +1.269042969 0.71573085 +1.269531250 0.71594507 +1.270019531 0.71615922 +1.270507813 0.71637332 +1.270996094 0.71658731 +1.271484375 0.71680129 +1.271972656 0.71701515 +1.272460938 0.71722901 +1.272949219 0.71744275 +1.273437500 0.71765643 +1.273925781 0.71787006 +1.274414063 0.71808362 +1.274902344 0.71829706 +1.275390625 0.71851051 +1.275878906 0.71872383 +1.276367188 0.7189371 +1.276855469 0.71915036 +1.277343750 0.71936345 +1.277832031 0.71957654 +1.278320313 0.71978956 +1.278808594 0.72000253 +1.279296875 0.72021538 +1.279785156 0.72042817 +1.280273438 0.7206409 +1.280761719 0.72085357 +1.281250000 0.72106618 +1.281738281 0.72127873 +1.282226563 0.72149122 +1.282714844 0.72170359 +1.283203125 0.72191596 +1.283691406 0.72212821 +1.284179688 0.7223404 +1.284667969 0.72255254 +1.285156250 0.72276455 +1.285644531 0.72297657 +1.286132813 0.72318846 +1.286621094 0.72340035 +1.287109375 0.72361213 +1.287597656 0.72382385 +1.288085938 0.7240355 +1.288574219 0.7242471 +1.289062500 0.72445858 +1.289550781 0.72467005 +1.290039063 0.72488141 +1.290527344 0.72509271 +1.291015625 0.72530395 +1.291503906 0.72551513 +1.291992188 0.72572625 +1.292480469 0.72593731 +1.292968750 0.72614825 +1.293457031 0.72635913 +1.293945313 0.72657001 +1.294433594 0.72678077 +1.294921875 0.72699142 +1.295410156 0.72720206 +1.295898438 0.72741264 +1.296386719 0.72762311 +1.296875000 0.72783351 +1.297363281 0.72804391 +1.297851563 0.7282542 +1.298339844 0.72846437 +1.298828125 0.72867453 +1.299316406 0.72888464 +1.299804688 0.72909462 +1.300292969 0.72930455 +1.300781250 0.72951442 +1.301269531 0.72972423 +1.301757813 0.72993398 +1.302246094 0.73014367 +1.302734375 0.73035324 +1.303222656 0.73056275 +1.303710938 0.73077226 +1.304199219 0.73098165 +1.304687500 0.73119092 +1.305175781 0.73140019 +1.305664063 0.7316094 +1.306152344 0.7318185 +1.306640625 0.73202753 +1.307128906 0.7322365 +1.307617188 0.73244542 +1.308105469 0.73265427 +1.308593750 0.73286307 +1.309082031 0.73307174 +1.309570313 0.73328036 +1.310058594 0.73348892 +1.310546875 0.73369741 +1.311035156 0.73390585 +1.311523438 0.73411423 +1.312011719 0.73432249 +1.312500000 0.73453075 +1.312988281 0.73473889 +1.313476563 0.73494697 +1.313964844 0.73515499 +1.314453125 0.73536289 +1.314941406 0.73557079 +1.315429688 0.73577857 +1.315917969 0.73598635 +1.316406250 0.73619401 +1.316894531 0.73640156 +1.317382813 0.7366091 +1.317871094 0.73681659 +1.318359375 0.73702395 +1.318847656 0.73723125 +1.319335938 0.7374385 +1.319824219 0.73764569 +1.320312500 0.73785281 +1.320800781 0.73805988 +1.321289063 0.73826683 +1.321777344 0.73847371 +1.322265625 0.73868054 +1.322753906 0.73888731 +1.323242188 0.73909402 +1.323730469 0.73930067 +1.324218750 0.7395072 +1.324707031 0.73971367 +1.325195313 0.73992008 +1.325683594 0.74012643 +1.326171875 0.74033272 +1.326660156 0.7405389 +1.327148438 0.74074507 +1.327636719 0.74095112 +1.328125000 0.74115711 +1.328613281 0.74136305 +1.329101563 0.74156892 +1.329589844 0.74177468 +1.330078125 0.74198043 +1.330566406 0.74218607 +1.331054688 0.74239165 +1.331542969 0.74259716 +1.332031250 0.74280256 +1.332519531 0.74300796 +1.333007813 0.74321324 +1.333496094 0.74341846 +1.333984375 0.74362361 +1.334472656 0.74382871 +1.334960938 0.74403375 +1.335449219 0.74423867 +1.335937500 0.7444436 +1.336425781 0.7446484 +1.336914063 0.74485314 +1.337402344 0.74505776 +1.337890625 0.74526238 +1.338378906 0.74546689 +1.338867188 0.74567139 +1.339355469 0.74587578 +1.339843750 0.7460801 +1.340332031 0.74628431 +1.340820313 0.74648851 +1.341308594 0.7466926 +1.341796875 0.74689662 +1.342285156 0.74710059 +1.342773438 0.7473045 +1.343261719 0.74750835 +1.343750000 0.74771208 +1.344238281 0.74791574 +1.344726563 0.74811935 +1.345214844 0.7483229 +1.345703125 0.74852639 +1.346191406 0.74872983 +1.346679688 0.74893314 +1.347167969 0.74913639 +1.347656250 0.74933958 +1.348144531 0.74954271 +1.348632813 0.74974579 +1.349121094 0.74994874 +1.349609375 0.75015163 +1.350097656 0.75035447 +1.350585938 0.75055724 +1.351074219 0.75075996 +1.351562500 0.75096256 +1.352050781 0.75116515 +1.352539063 0.75136763 +1.353027344 0.75157005 +1.353515625 0.7517724 +1.354003906 0.75197464 +1.354492188 0.75217682 +1.354980469 0.752379 +1.355468750 0.75258106 +1.355957031 0.75278306 +1.356445313 0.75298494 +1.356933594 0.75318682 +1.357421875 0.75338858 +1.357910156 0.75359029 +1.358398438 0.75379193 +1.358886719 0.75399351 +1.359375000 0.75419497 +1.359863281 0.75439638 +1.360351563 0.75459772 +1.360839844 0.75479901 +1.361328125 0.75500023 +1.361816406 0.7552014 +1.362304688 0.75540245 +1.362792969 0.75560343 +1.363281250 0.75580436 +1.363769531 0.75600523 +1.364257813 0.75620598 +1.364746094 0.75640672 +1.365234375 0.75660735 +1.365722656 0.75680792 +1.366210938 0.75700843 +1.366699219 0.75720882 +1.367187500 0.75740921 +1.367675781 0.75760949 +1.368164063 0.7578097 +1.368652344 0.75800985 +1.369140625 0.75820988 +1.369628906 0.75840992 +1.370117188 0.75860983 +1.370605469 0.75880969 +1.371093750 0.75900948 +1.371582031 0.75920922 +1.372070313 0.75940883 +1.372558594 0.75960839 +1.373046875 0.75980788 +1.373535156 0.76000732 +1.374023438 0.7602067 +1.374511719 0.76040596 +1.375000000 0.76060516 +1.375488281 0.7608043 +1.375976563 0.76100338 +1.376464844 0.76120239 +1.376953125 0.7614013 +1.377441406 0.76160014 +1.377929688 0.76179898 +1.378417969 0.76199764 +1.378906250 0.7621963 +1.379394531 0.76239485 +1.379882813 0.76259339 +1.380371094 0.76279181 +1.380859375 0.76299012 +1.381347656 0.76318842 +1.381835938 0.76338661 +1.382324219 0.76358473 +1.382812500 0.7637828 +1.383300781 0.76398081 +1.383789063 0.76417875 +1.384277344 0.76437658 +1.384765625 0.76457435 +1.385253906 0.76477206 +1.385742188 0.76496971 +1.386230469 0.76516724 +1.386718750 0.76536477 +1.387207031 0.76556218 +1.387695313 0.76575953 +1.388183594 0.76595682 +1.388671875 0.76615399 +1.389160156 0.7663511 +1.389648438 0.76654816 +1.390136719 0.76674515 +1.390625000 0.76694208 +1.391113281 0.7671389 +1.391601563 0.76733565 +1.392089844 0.76753235 +1.392578125 0.76772898 +1.393066406 0.76792556 +1.393554688 0.76812202 +1.394042969 0.76831841 +1.394531250 0.76851475 +1.395019531 0.76871103 +1.395507813 0.76890725 +1.395996094 0.76910335 +1.396484375 0.76929939 +1.396972656 0.76949537 +1.397460938 0.76969123 +1.397949219 0.76988709 +1.398437500 0.77008283 +1.398925781 0.77027851 +1.399414063 0.77047414 +1.399902344 0.77066964 +1.400390625 0.77086514 +1.400878906 0.77106053 +1.401367188 0.77125585 +1.401855469 0.77145112 +1.402343750 0.77164626 +1.402832031 0.77184135 +1.403320313 0.77203637 +1.403808594 0.77223134 +1.404296875 0.77242625 +1.404785156 0.77262104 +1.405273438 0.77281576 +1.405761719 0.77301043 +1.406250000 0.77320504 +1.406738281 0.77339959 +1.407226563 0.77359402 +1.407714844 0.77378839 +1.408203125 0.7739827 +1.408691406 0.7741769 +1.409179688 0.77437109 +1.409667969 0.77456516 +1.410156250 0.77475917 +1.410644531 0.77495313 +1.411132813 0.77514696 +1.411621094 0.77534074 +1.412109375 0.77553451 +1.412597656 0.77572811 +1.413085938 0.7759217 +1.413574219 0.77611518 +1.414062500 0.7763086 +1.414550781 0.77650195 +1.415039063 0.77669525 +1.415527344 0.77688849 +1.416015625 0.77708161 +1.416503906 0.77727467 +1.416992188 0.77746767 +1.417480469 0.77766055 +1.417968750 0.77785343 +1.418457031 0.77804619 +1.418945313 0.77823889 +1.419433594 0.77843148 +1.419921875 0.77862406 +1.420410156 0.77881652 +1.420898438 0.77900892 +1.421386719 0.77920127 +1.421875000 0.77939349 +1.422363281 0.77958566 +1.422851563 0.77977777 +1.423339844 0.77996981 +1.423828125 0.7801618 +1.424316406 0.78035367 +1.424804688 0.78054547 +1.425292969 0.78073722 +1.425781250 0.78092891 +1.426269531 0.78112048 +1.426757813 0.78131199 +1.427246094 0.78150344 +1.427734375 0.78169483 +1.428222656 0.78188616 +1.428710938 0.78207737 +1.429199219 0.78226852 +1.429687500 0.78245962 +1.430175781 0.78265059 +1.430664063 0.7828415 +1.431152344 0.78303236 +1.431640625 0.78322315 +1.432128906 0.78341389 +1.432617188 0.7836045 +1.433105469 0.78379506 +1.433593750 0.78398556 +1.434082031 0.78417599 +1.434570313 0.78436631 +1.435058594 0.78455657 +1.435546875 0.78474677 +1.436035156 0.7849369 +1.436523438 0.78512698 +1.437011719 0.78531694 +1.437500000 0.78550684 +1.437988281 0.78569663 +1.438476563 0.78588641 +1.438964844 0.78607607 +1.439453125 0.78626567 +1.439941406 0.78645521 +1.440429688 0.7866447 +1.440917969 0.78683406 +1.441406250 0.78702337 +1.441894531 0.78721261 +1.442382813 0.78740174 +1.442871094 0.7875908 +1.443359375 0.78777987 +1.443847656 0.78796875 +1.444335938 0.78815764 +1.444824219 0.78834641 +1.445312500 0.78853512 +1.445800781 0.78872377 +1.446289063 0.78891236 +1.446777344 0.78910083 +1.447265625 0.78928924 +1.447753906 0.78947759 +1.448242188 0.78966588 +1.448730469 0.78985405 +1.449218750 0.79004216 +1.449707031 0.79023021 +1.450195313 0.79041821 +1.450683594 0.79060608 +1.451171875 0.7907939 +1.451660156 0.79098165 +1.452148438 0.79116935 +1.452636719 0.79135692 +1.453125000 0.79154444 +1.453613281 0.79173189 +1.454101563 0.79191929 +1.454589844 0.79210657 +1.455078125 0.79229379 +1.455566406 0.79248095 +1.456054688 0.79266804 +1.456542969 0.79285502 +1.457031250 0.79304194 +1.457519531 0.79322881 +1.458007813 0.79341561 +1.458496094 0.79360229 +1.458984375 0.79378891 +1.459472656 0.79397547 +1.459960938 0.79416198 +1.460449219 0.79434836 +1.460937500 0.79453468 +1.461425781 0.79472095 +1.461914063 0.79490715 +1.462402344 0.79509324 +1.462890625 0.79527926 +1.463378906 0.79546523 +1.463867188 0.79565108 +1.464355469 0.79583693 +1.464843750 0.79602265 +1.465332031 0.79620826 +1.465820313 0.79639387 +1.466308594 0.79657936 +1.466796875 0.79676479 +1.467285156 0.79695016 +1.467773438 0.79713547 +1.468261719 0.79732066 +1.468750000 0.7975058 +1.469238281 0.79769087 +1.469726563 0.79787582 +1.470214844 0.79806072 +1.470703125 0.79824555 +1.471191406 0.79843032 +1.471679688 0.79861498 +1.472167969 0.79879957 +1.472656250 0.79898411 +1.473144531 0.79916859 +1.473632813 0.79935294 +1.474121094 0.79953724 +1.474609375 0.79972148 +1.475097656 0.79990566 +1.475585938 0.80008972 +1.476074219 0.80027372 +1.476562500 0.80045766 +1.477050781 0.80064154 +1.477539063 0.8008253 +1.478027344 0.801009 +1.478515625 0.80119264 +1.479003906 0.80137616 +1.479492188 0.80155963 +1.479980469 0.80174303 +1.480468750 0.80192637 +1.480957031 0.8021096 +1.481445313 0.80229282 +1.481933594 0.80247587 +1.482421875 0.80265892 +1.482910156 0.80284184 +1.483398438 0.80302471 +1.483886719 0.80320752 +1.484375000 0.80339026 +1.484863281 0.80357289 +1.485351563 0.80375546 +1.485839844 0.80393797 +1.486328125 0.80412036 +1.486816406 0.80430269 +1.487304688 0.80448496 +1.487792969 0.80466717 +1.488281250 0.80484927 +1.488769531 0.80503136 +1.489257813 0.80521327 +1.489746094 0.80539519 +1.490234375 0.80557698 +1.490722656 0.80575871 +1.491210938 0.80594039 +1.491699219 0.80612195 +1.492187500 0.8063035 +1.492675781 0.80648494 +1.493164063 0.80666625 +1.493652344 0.80684757 +1.494140625 0.80702877 +1.494628906 0.80720991 +1.495117188 0.80739093 +1.495605469 0.80757189 +1.496093750 0.80775285 +1.496582031 0.80793363 +1.497070313 0.80811441 +1.497558594 0.80829507 +1.498046875 0.80847567 +1.498535156 0.80865616 +1.499023438 0.80883664 +1.499511719 0.809017 +1.500000000 0.80919731 +1.500488281 0.80937749 +1.500976563 0.80955762 +1.501464844 0.80973768 +1.501953125 0.80991769 +1.502441406 0.81009758 +1.502929688 0.81027746 +1.503417969 0.81045717 +1.503906250 0.81063688 +1.504394531 0.81081647 +1.504882813 0.810996 +1.505371094 0.81117547 +1.505859375 0.81135488 +1.506347656 0.81153417 +1.506835938 0.8117134 +1.507324219 0.81189251 +1.507812500 0.81207156 +1.508300781 0.81225061 +1.508789063 0.81242949 +1.509277344 0.81260836 +1.509765625 0.81278712 +1.510253906 0.81296581 +1.510742188 0.81314439 +1.511230469 0.81332296 +1.511718750 0.81350142 +1.512207031 0.81367981 +1.512695313 0.81385809 +1.513183594 0.81403631 +1.513671875 0.81421447 +1.514160156 0.81439257 +1.514648438 0.81457055 +1.515136719 0.81474847 +1.515625000 0.81492633 +1.516113281 0.81510413 +1.516601563 0.81528181 +1.517089844 0.81545943 +1.517578125 0.81563693 +1.518066406 0.81581444 +1.518554688 0.81599182 +1.519042969 0.81616908 +1.519531250 0.81634635 +1.520019531 0.81652349 +1.520507813 0.81670058 +1.520996094 0.8168776 +1.521484375 0.81705451 +1.521972656 0.81723136 +1.522460938 0.81740814 +1.522949219 0.81758481 +1.523437500 0.81776142 +1.523925781 0.81793797 +1.524414063 0.81811446 +1.524902344 0.81829083 +1.525390625 0.81846714 +1.525878906 0.81864339 +1.526367188 0.81881952 +1.526855469 0.81899559 +1.527343750 0.81917161 +1.527832031 0.8193475 +1.528320313 0.81952339 +1.528808594 0.81969911 +1.529296875 0.81987482 +1.529785156 0.82005042 +1.530273438 0.82022595 +1.530761719 0.82040143 +1.531250000 0.82057685 +1.531738281 0.82075214 +1.532226563 0.82092738 +1.532714844 0.8211025 +1.533203125 0.82127762 +1.533691406 0.82145256 +1.534179688 0.8216275 +1.534667969 0.82180238 +1.535156250 0.82197714 +1.535644531 0.82215178 +1.536132813 0.82232642 +1.536621094 0.82250094 +1.537109375 0.82267541 +1.537597656 0.82284981 +1.538085938 0.82302409 +1.538574219 0.82319832 +1.539062500 0.82337242 +1.539550781 0.82354653 +1.540039063 0.82372051 +1.540527344 0.82389444 +1.541015625 0.82406825 +1.541503906 0.824242 +1.541992188 0.82441568 +1.542480469 0.82458931 +1.542968750 0.82476282 +1.543457031 0.82493627 +1.543945313 0.82510966 +1.544433594 0.82528293 +1.544921875 0.82545614 +1.545410156 0.82562929 +1.545898438 0.82580233 +1.546386719 0.82597536 +1.546875000 0.82614821 +1.547363281 0.82632107 +1.547851563 0.8264938 +1.548339844 0.82666647 +1.548828125 0.82683909 +1.549316406 0.82701159 +1.549804688 0.82718402 +1.550292969 0.8273564 +1.550781250 0.82752866 +1.551269531 0.82770085 +1.551757813 0.82787299 +1.552246094 0.82804507 +1.552734375 0.82821703 +1.553222656 0.82838893 +1.553710938 0.82856071 +1.554199219 0.82873243 +1.554687500 0.82890409 +1.555175781 0.82907569 +1.555664063 0.82924718 +1.556152344 0.8294186 +1.556640625 0.82958996 +1.557128906 0.82976121 +1.557617188 0.82993245 +1.558105469 0.83010352 +1.558593750 0.83027458 +1.559082031 0.83044553 +1.559570313 0.83061641 +1.560058594 0.83078718 +1.560546875 0.83095795 +1.561035156 0.83112854 +1.561523438 0.83129913 +1.562011719 0.8314696 +1.562500000 0.83164001 +1.562988281 0.83181036 +1.563476563 0.83198059 +1.563964844 0.83215076 +1.564453125 0.83232087 +1.564941406 0.83249086 +1.565429688 0.83266079 +1.565917969 0.83283067 +1.566406250 0.83300048 +1.566894531 0.83317018 +1.567382813 0.83333981 +1.567871094 0.83350933 +1.568359375 0.83367878 +1.568847656 0.83384818 +1.569335938 0.83401752 +1.569824219 0.83418673 +1.570312500 0.83435589 +1.570800781 0.83452499 +1.571289063 0.83469397 +1.571777344 0.83486289 +1.572265625 0.83503169 +1.572753906 0.83520049 +1.573242188 0.83536917 +1.573730469 0.83553773 +1.574218750 0.83570629 +1.574707031 0.83587474 +1.575195313 0.83604312 +1.575683594 0.83621138 +1.576171875 0.83637959 +1.576660156 0.83654773 +1.577148438 0.83671576 +1.577636719 0.83688372 +1.578125000 0.83705163 +1.578613281 0.83721948 +1.579101563 0.8373872 +1.579589844 0.83755487 +1.580078125 0.83772242 +1.580566406 0.83788997 +1.581054688 0.83805734 +1.581542969 0.83822471 +1.582031250 0.83839196 +1.582519531 0.83855915 +1.583007813 0.83872628 +1.583496094 0.83889329 +1.583984375 0.83906025 +1.584472656 0.83922708 +1.584960938 0.83939391 +1.585449219 0.83956063 +1.585937500 0.83972722 +1.586425781 0.83989382 +1.586914063 0.84006029 +1.587402344 0.84022665 +1.587890625 0.84039301 +1.588378906 0.84055924 +1.588867188 0.84072536 +1.589355469 0.84089148 +1.589843750 0.84105748 +1.590332031 0.84122336 +1.590820313 0.84138924 +1.591308594 0.841555 +1.591796875 0.84172064 +1.592285156 0.84188628 +1.592773438 0.8420518 +1.593261719 0.84221721 +1.593750000 0.84238261 +1.594238281 0.84254789 +1.594726563 0.84271312 +1.595214844 0.84287822 +1.595703125 0.84304327 +1.596191406 0.84320825 +1.596679688 0.84337312 +1.597167969 0.84353793 +1.597656250 0.84370267 +1.598144531 0.8438673 +1.598632813 0.84403187 +1.599121094 0.84419638 +1.599609375 0.84436083 +1.600097656 0.84452516 +1.600585938 0.84468937 +1.601074219 0.84485358 +1.601562500 0.84501767 +1.602050781 0.8451817 +1.602539063 0.84534562 +1.603027344 0.84550947 +1.603515625 0.84567326 +1.604003906 0.84583694 +1.604492188 0.84600055 +1.604980469 0.84616411 +1.605468750 0.84632754 +1.605957031 0.84649092 +1.606445313 0.84665424 +1.606933594 0.84681743 +1.607421875 0.84698057 +1.607910156 0.84714365 +1.608398438 0.84730661 +1.608886719 0.84746957 +1.609375000 0.84763235 +1.609863281 0.84779513 +1.610351563 0.84795779 +1.610839844 0.84812033 +1.611328125 0.84828287 +1.611816406 0.8484453 +1.612304688 0.8486076 +1.612792969 0.84876984 +1.613281250 0.84893203 +1.613769531 0.84909415 +1.614257813 0.84925616 +1.614746094 0.8494181 +1.615234375 0.84957999 +1.615722656 0.84974176 +1.616210938 0.84990346 +1.616699219 0.85006511 +1.617187500 0.85022664 +1.617675781 0.85038811 +1.618164063 0.85054946 +1.618652344 0.85071081 +1.619140625 0.85087198 +1.619628906 0.85103315 +1.620117188 0.8511942 +1.620605469 0.8513552 +1.621093750 0.85151607 +1.621582031 0.85167694 +1.622070313 0.85183764 +1.622558594 0.85199833 +1.623046875 0.8521589 +1.623535156 0.85231942 +1.624023438 0.85247982 +1.624511719 0.85264015 +1.625000000 0.85280043 +1.625488281 0.85296059 +1.625976563 0.85312068 +1.626464844 0.85328072 +1.626953125 0.85344064 +1.627441406 0.8536005 +1.627929688 0.8537603 +1.628417969 0.85391998 +1.628906250 0.8540796 +1.629394531 0.85423917 +1.629882813 0.85439861 +1.630371094 0.85455799 +1.630859375 0.85471731 +1.631347656 0.85487652 +1.631835938 0.85503566 +1.632324219 0.85519469 +1.632812500 0.85535365 +1.633300781 0.85551256 +1.633789063 0.85567135 +1.634277344 0.85583013 +1.634765625 0.85598874 +1.635253906 0.85614735 +1.635742188 0.85630584 +1.636230469 0.85646421 +1.636718750 0.85662258 +1.637207031 0.85678083 +1.637695313 0.85693896 +1.638183594 0.85709709 +1.638671875 0.8572551 +1.639160156 0.85741299 +1.639648438 0.85757083 +1.640136719 0.8577286 +1.640625000 0.85788631 +1.641113281 0.85804391 +1.641601563 0.85820144 +1.642089844 0.85835886 +1.642578125 0.85851622 +1.643066406 0.85867351 +1.643554688 0.85883069 +1.644042969 0.85898781 +1.644531250 0.85914487 +1.645019531 0.85930181 +1.645507813 0.85945868 +1.645996094 0.8596155 +1.646484375 0.85977221 +1.646972656 0.85992885 +1.647460938 0.86008537 +1.647949219 0.86024189 +1.648437500 0.86039823 +1.648925781 0.86055458 +1.649414063 0.8607108 +1.649902344 0.86086696 +1.650390625 0.86102301 +1.650878906 0.86117899 +1.651367188 0.86133492 +1.651855469 0.86149073 +1.652343750 0.86164647 +1.652832031 0.8618021 +1.653320313 0.86195773 +1.653808594 0.86211318 +1.654296875 0.86226863 +1.654785156 0.86242396 +1.655273438 0.86257923 +1.655761719 0.86273438 +1.656250000 0.86288947 +1.656738281 0.8630445 +1.657226563 0.86319941 +1.657714844 0.86335427 +1.658203125 0.86350906 +1.658691406 0.86366373 +1.659179688 0.86381835 +1.659667969 0.86397284 +1.660156250 0.86412728 +1.660644531 0.86428165 +1.661132813 0.86443597 +1.661621094 0.86459017 +1.662109375 0.86474425 +1.662597656 0.86489826 +1.663085938 0.86505222 +1.663574219 0.86520612 +1.664062500 0.8653599 +1.664550781 0.86551362 +1.665039063 0.86566722 +1.665527344 0.86582083 +1.666015625 0.86597425 +1.666503906 0.86612767 +1.666992188 0.86628097 +1.667480469 0.86643416 +1.667968750 0.86658734 +1.668457031 0.86674035 +1.668945313 0.86689335 +1.669433594 0.86704624 +1.669921875 0.86719906 +1.670410156 0.86735177 +1.670898438 0.86750442 +1.671386719 0.86765701 +1.671875000 0.86780947 +1.672363281 0.86796188 +1.672851563 0.86811423 +1.673339844 0.86826646 +1.673828125 0.86841863 +1.674316406 0.86857069 +1.674804688 0.86872268 +1.675292969 0.86887461 +1.675781250 0.86902642 +1.676269531 0.86917818 +1.676757813 0.86932987 +1.677246094 0.86948144 +1.677734375 0.86963296 +1.678222656 0.86978441 +1.678710938 0.86993575 +1.679199219 0.87008697 +1.679687500 0.87023818 +1.680175781 0.87038928 +1.680664063 0.87054026 +1.681152344 0.87069124 +1.681640625 0.87084204 +1.682128906 0.87099284 +1.682617188 0.87114352 +1.683105469 0.87129414 +1.683593750 0.87144464 +1.684082031 0.87159508 +1.684570313 0.87174547 +1.685058594 0.87189573 +1.685546875 0.87204593 +1.686035156 0.87219602 +1.686523438 0.87234604 +1.687011719 0.87249601 +1.687500000 0.87264585 +1.687988281 0.87279564 +1.688476563 0.87294537 +1.688964844 0.87309498 +1.689453125 0.87324452 +1.689941406 0.87339395 +1.690429688 0.87354332 +1.690917969 0.87369263 +1.691406250 0.87384182 +1.691894531 0.87399095 +1.692382813 0.87414002 +1.692871094 0.87428898 +1.693359375 0.87443787 +1.693847656 0.87458664 +1.694335938 0.87473536 +1.694824219 0.87488401 +1.695312500 0.87503254 +1.695800781 0.87518102 +1.696289063 0.87532938 +1.696777344 0.87547773 +1.697265625 0.87562591 +1.697753906 0.87577409 +1.698242188 0.87592214 +1.698730469 0.87607008 +1.699218750 0.87621796 +1.699707031 0.87636578 +1.700195313 0.87651354 +1.700683594 0.87666118 +1.701171875 0.8768087 +1.701660156 0.87695622 +1.702148438 0.87710363 +1.702636719 0.87725091 +1.703125000 0.87739813 +1.703613281 0.8775453 +1.704101563 0.87769234 +1.704589844 0.87783933 +1.705078125 0.87798625 +1.705566406 0.87813306 +1.706054688 0.87827981 +1.706542969 0.87842643 +1.707031250 0.878573 +1.707519531 0.87871951 +1.708007813 0.8788659 +1.708496094 0.87901223 +1.708984375 0.87915844 +1.709472656 0.87930465 +1.709960938 0.87945068 +1.710449219 0.87959671 +1.710937500 0.87974262 +1.711425781 0.87988842 +1.711914063 0.88003415 +1.712402344 0.88017982 +1.712890625 0.88032538 +1.713378906 0.88047087 +1.713867188 0.88061631 +1.714355469 0.88076162 +1.714843750 0.88090688 +1.715332031 0.88105202 +1.715820313 0.88119709 +1.716308594 0.88134211 +1.716796875 0.88148701 +1.717285156 0.88163185 +1.717773438 0.88177657 +1.718261719 0.88192129 +1.718750000 0.88206583 +1.719238281 0.88221031 +1.719726563 0.88235474 +1.720214844 0.8824991 +1.720703125 0.88264334 +1.721191406 0.88278753 +1.721679688 0.88293159 +1.722167969 0.88307559 +1.722656250 0.88321948 +1.723144531 0.88336337 +1.723632813 0.88350707 +1.724121094 0.88365078 +1.724609375 0.88379437 +1.725097656 0.88393784 +1.725585938 0.88408124 +1.726074219 0.88422459 +1.726562500 0.88436782 +1.727050781 0.88451099 +1.727539063 0.8846541 +1.728027344 0.8847971 +1.728515625 0.88494003 +1.729003906 0.88508284 +1.729492188 0.88522559 +1.729980469 0.88536829 +1.730468750 0.88551086 +1.730957031 0.88565338 +1.731445313 0.88579577 +1.731933594 0.88593811 +1.732421875 0.88608038 +1.732910156 0.88622254 +1.733398438 0.88636464 +1.733886719 0.88650662 +1.734375000 0.88664854 +1.734863281 0.88679039 +1.735351563 0.88693213 +1.735839844 0.88707381 +1.736328125 0.88721538 +1.736816406 0.88735688 +1.737304688 0.88749826 +1.737792969 0.88763964 +1.738281250 0.88778085 +1.738769531 0.88792205 +1.739257813 0.88806313 +1.739746094 0.8882041 +1.740234375 0.88834506 +1.740722656 0.88848585 +1.741210938 0.88862664 +1.741699219 0.8887673 +1.742187500 0.88890785 +1.742675781 0.88904834 +1.743164063 0.88918877 +1.743652344 0.88932908 +1.744140625 0.88946933 +1.744628906 0.88960952 +1.745117188 0.88974959 +1.745605469 0.8898896 +1.746093750 0.89002949 +1.746582031 0.89016932 +1.747070313 0.89030904 +1.747558594 0.89044875 +1.748046875 0.89058828 +1.748535156 0.89072782 +1.749023438 0.89086717 +1.749511719 0.89100653 +1.750000000 0.89114577 +1.750488281 0.89128494 +1.750976563 0.891424 +1.751464844 0.891563 +1.751953125 0.89170188 +1.752441406 0.8918407 +1.752929688 0.89197946 +1.753417969 0.8921181 +1.753906250 0.89225668 +1.754394531 0.89239514 +1.754882813 0.89253354 +1.755371094 0.89267188 +1.755859375 0.89281011 +1.756347656 0.89294827 +1.756835938 0.89308631 +1.757324219 0.8932243 +1.757812500 0.89336222 +1.758300781 0.89350003 +1.758789063 0.89363772 +1.759277344 0.8937754 +1.759765625 0.89391297 +1.760253906 0.89405042 +1.760742188 0.89418781 +1.761230469 0.89432514 +1.761718750 0.89446235 +1.762207031 0.8945995 +1.762695313 0.89473653 +1.763183594 0.8948735 +1.763671875 0.89501041 +1.764160156 0.8951472 +1.764648438 0.89528394 +1.765136719 0.89542055 +1.765625000 0.89555711 +1.766113281 0.8956936 +1.766601563 0.89582998 +1.767089844 0.89596623 +1.767578125 0.89610249 +1.768066406 0.89623857 +1.768554688 0.89637464 +1.769042969 0.8965106 +1.769531250 0.8966465 +1.770019531 0.89678228 +1.770507813 0.89691794 +1.770996094 0.8970536 +1.771484375 0.89718914 +1.771972656 0.89732456 +1.772460938 0.89745992 +1.772949219 0.89759523 +1.773437500 0.89773041 +1.773925781 0.89786553 +1.774414063 0.8980006 +1.774902344 0.89813554 +1.775390625 0.89827037 +1.775878906 0.89840519 +1.776367188 0.89853984 +1.776855469 0.89867449 +1.777343750 0.89880902 +1.777832031 0.89894342 +1.778320313 0.89907777 +1.778808594 0.89921206 +1.779296875 0.89934623 +1.779785156 0.89948034 +1.780273438 0.89961433 +1.780761719 0.89974827 +1.781250000 0.89988214 +1.781738281 0.90001589 +1.782226563 0.90014958 +1.782714844 0.90028316 +1.783203125 0.90041667 +1.783691406 0.90055007 +1.784179688 0.9006834 +1.784667969 0.90081668 +1.785156250 0.90094984 +1.785644531 0.90108293 +1.786132813 0.90121591 +1.786621094 0.90134883 +1.787109375 0.90148169 +1.787597656 0.90161443 +1.788085938 0.90174711 +1.788574219 0.90187967 +1.789062500 0.90201217 +1.789550781 0.90214455 +1.790039063 0.90227687 +1.790527344 0.90240908 +1.791015625 0.90254128 +1.791503906 0.9026733 +1.791992188 0.90280527 +1.792480469 0.90293717 +1.792968750 0.90306902 +1.793457031 0.90320075 +1.793945313 0.90333235 +1.794433594 0.9034639 +1.794921875 0.90359539 +1.795410156 0.90372676 +1.795898438 0.90385807 +1.796386719 0.90398932 +1.796875000 0.90412045 +1.797363281 0.90425146 +1.797851563 0.90438241 +1.798339844 0.9045133 +1.798828125 0.90464407 +1.799316406 0.90477479 +1.799804688 0.90490544 +1.800292969 0.90503597 +1.800781250 0.90516639 +1.801269531 0.90529674 +1.801757813 0.90542704 +1.802246094 0.90555722 +1.802734375 0.90568733 +1.803222656 0.90581739 +1.803710938 0.90594727 +1.804199219 0.90607715 +1.804687500 0.90620691 +1.805175781 0.90633661 +1.805664063 0.90646619 +1.806152344 0.90659571 +1.806640625 0.90672511 +1.807128906 0.90685445 +1.807617188 0.90698373 +1.808105469 0.9071129 +1.808593750 0.907242 +1.809082031 0.90737098 +1.809570313 0.90749991 +1.810058594 0.90762872 +1.810546875 0.90775746 +1.811035156 0.90788609 +1.811523438 0.90801471 +1.812011719 0.90814316 +1.812500000 0.90827155 +1.812988281 0.90839988 +1.813476563 0.90852809 +1.813964844 0.90865624 +1.814453125 0.90878433 +1.814941406 0.9089123 +1.815429688 0.90904015 +1.815917969 0.909168 +1.816406250 0.90929568 +1.816894531 0.90942335 +1.817382813 0.90955085 +1.817871094 0.90967834 +1.818359375 0.90980572 +1.818847656 0.90993297 +1.819335938 0.91006023 +1.819824219 0.9101873 +1.820312500 0.91031432 +1.820800781 0.91044128 +1.821289063 0.91056818 +1.821777344 0.9106949 +1.822265625 0.91082162 +1.822753906 0.91094822 +1.823242188 0.91107476 +1.823730469 0.91120118 +1.824218750 0.91132748 +1.824707031 0.91145378 +1.825195313 0.91157997 +1.825683594 0.91170603 +1.826171875 0.91183203 +1.826660156 0.91195798 +1.827148438 0.9120838 +1.827636719 0.91220951 +1.828125000 0.91233516 +1.828613281 0.91246074 +1.829101563 0.91258627 +1.829589844 0.91271162 +1.830078125 0.91283697 +1.830566406 0.9129622 +1.831054688 0.91308731 +1.831542969 0.91321242 +1.832031250 0.91333735 +1.832519531 0.91346222 +1.833007813 0.91358703 +1.833496094 0.91371179 +1.833984375 0.91383636 +1.834472656 0.91396093 +1.834960938 0.91408539 +1.835449219 0.91420978 +1.835937500 0.91433406 +1.836425781 0.91445822 +1.836914063 0.91458237 +1.837402344 0.91470635 +1.837890625 0.91483033 +1.838378906 0.91495419 +1.838867188 0.91507792 +1.839355469 0.9152016 +1.839843750 0.91532522 +1.840332031 0.91544873 +1.840820313 0.91557217 +1.841308594 0.91569549 +1.841796875 0.91581875 +1.842285156 0.91594189 +1.842773438 0.91606498 +1.843261719 0.91618794 +1.843750000 0.91631085 +1.844238281 0.91643369 +1.844726563 0.91655642 +1.845214844 0.91667908 +1.845703125 0.91680163 +1.846191406 0.91692412 +1.846679688 0.91704649 +1.847167969 0.9171688 +1.847656250 0.91729099 +1.848144531 0.91741312 +1.848632813 0.91753519 +1.849121094 0.91765714 +1.849609375 0.91777897 +1.850097656 0.9179008 +1.850585938 0.91802245 +1.851074219 0.91814411 +1.851562500 0.91826558 +1.852050781 0.91838706 +1.852539063 0.91850841 +1.853027344 0.91862965 +1.853515625 0.91875082 +1.854003906 0.91887194 +1.854492188 0.91899294 +1.854980469 0.91911387 +1.855468750 0.91923469 +1.855957031 0.91935545 +1.856445313 0.91947609 +1.856933594 0.91959667 +1.857421875 0.91971713 +1.857910156 0.91983753 +1.858398438 0.91995788 +1.858886719 0.9200781 +1.859375000 0.9201982 +1.859863281 0.92031831 +1.860351563 0.92043823 +1.860839844 0.92055809 +1.861328125 0.9206779 +1.861816406 0.92079765 +1.862304688 0.92091721 +1.862792969 0.92103678 +1.863281250 0.92115623 +1.863769531 0.92127556 +1.864257813 0.92139482 +1.864746094 0.92151403 +1.865234375 0.92163312 +1.865722656 0.92175215 +1.866210938 0.92187107 +1.866699219 0.92198992 +1.867187500 0.92210865 +1.867675781 0.92222732 +1.868164063 0.92234594 +1.868652344 0.92246443 +1.869140625 0.92258281 +1.869628906 0.92270112 +1.870117188 0.92281938 +1.870605469 0.92293751 +1.871093750 0.92305559 +1.871582031 0.92317355 +1.872070313 0.92329144 +1.872558594 0.92340922 +1.873046875 0.92352694 +1.873535156 0.92364454 +1.874023438 0.92376208 +1.874511719 0.9238795 +1.875000000 0.92399687 +1.875488281 0.92411417 +1.875976563 0.92423135 +1.876464844 0.92434847 +1.876953125 0.92446548 +1.877441406 0.92458242 +1.877929688 0.92469925 +1.878417969 0.92481601 +1.878906250 0.92493266 +1.879394531 0.92504925 +1.879882813 0.92516571 +1.880371094 0.92528212 +1.880859375 0.92539847 +1.881347656 0.9255147 +1.881835938 0.92563081 +1.882324219 0.92574686 +1.882812500 0.92586285 +1.883300781 0.92597872 +1.883789063 0.92609453 +1.884277344 0.92621022 +1.884765625 0.92632586 +1.885253906 0.92644137 +1.885742188 0.92655683 +1.886230469 0.92667222 +1.886718750 0.9267875 +1.887207031 0.92690265 +1.887695313 0.92701775 +1.888183594 0.92713279 +1.888671875 0.9272477 +1.889160156 0.9273625 +1.889648438 0.9274773 +1.890136719 0.92759192 +1.890625000 0.92770648 +1.891113281 0.92782098 +1.891601563 0.92793542 +1.892089844 0.92804968 +1.892578125 0.92816395 +1.893066406 0.92827809 +1.893554688 0.92839211 +1.894042969 0.92850608 +1.894531250 0.92861998 +1.895019531 0.92873377 +1.895507813 0.92884743 +1.895996094 0.92896104 +1.896484375 0.92907459 +1.896972656 0.92918801 +1.897460938 0.92930138 +1.897949219 0.92941463 +1.898437500 0.92952782 +1.898925781 0.92964089 +1.899414063 0.9297539 +1.899902344 0.92986679 +1.900390625 0.92997962 +1.900878906 0.93009239 +1.901367188 0.93020505 +1.901855469 0.93031758 +1.902343750 0.93043005 +1.902832031 0.93054247 +1.903320313 0.93065476 +1.903808594 0.93076694 +1.904296875 0.93087906 +1.904785156 0.93099111 +1.905273438 0.93110305 +1.905761719 0.93121493 +1.906250000 0.93132669 +1.906738281 0.93143839 +1.907226563 0.93154997 +1.907714844 0.93166149 +1.908203125 0.93177295 +1.908691406 0.93188429 +1.909179688 0.93199551 +1.909667969 0.93210667 +1.910156250 0.93221778 +1.910644531 0.93232876 +1.911132813 0.93243963 +1.911621094 0.93255043 +1.912109375 0.93266118 +1.912597656 0.9327718 +1.913085938 0.93288237 +1.913574219 0.93299282 +1.914062500 0.93310314 +1.914550781 0.93321347 +1.915039063 0.93332362 +1.915527344 0.93343377 +1.916015625 0.9335438 +1.916503906 0.93365371 +1.916992188 0.93376356 +1.917480469 0.9338733 +1.917968750 0.93398297 +1.918457031 0.93409252 +1.918945313 0.93420202 +1.919433594 0.93431145 +1.919921875 0.93442076 +1.920410156 0.93452996 +1.920898438 0.93463916 +1.921386719 0.93474817 +1.921875000 0.93485713 +1.922363281 0.93496603 +1.922851563 0.93507481 +1.923339844 0.93518353 +1.923828125 0.93529212 +1.924316406 0.93540066 +1.924804688 0.93550909 +1.925292969 0.93561745 +1.925781250 0.93572569 +1.926269531 0.93583387 +1.926757813 0.93594193 +1.927246094 0.93604994 +1.927734375 0.93615782 +1.928222656 0.93626565 +1.928710938 0.93637341 +1.929199219 0.93648106 +1.929687500 0.93658859 +1.930175781 0.93669605 +1.930664063 0.93680346 +1.931152344 0.93691075 +1.931640625 0.93701792 +1.932128906 0.93712503 +1.932617188 0.93723208 +1.933105469 0.93733901 +1.933593750 0.93744588 +1.934082031 0.93755263 +1.934570313 0.93765932 +1.935058594 0.9377659 +1.935546875 0.93787235 +1.936035156 0.9379788 +1.936523438 0.93808508 +1.937011719 0.93819135 +1.937500000 0.93829745 +1.937988281 0.93840355 +1.938476563 0.93850952 +1.938964844 0.93861538 +1.939453125 0.93872118 +1.939941406 0.93882686 +1.940429688 0.93893248 +1.940917969 0.93903798 +1.941406250 0.93914342 +1.941894531 0.9392488 +1.942382813 0.93935406 +1.942871094 0.9394592 +1.943359375 0.93956429 +1.943847656 0.93966931 +1.944335938 0.93977422 +1.944824219 0.939879 +1.945312500 0.93998373 +1.945800781 0.94008839 +1.946289063 0.94019294 +1.946777344 0.94029742 +1.947265625 0.94040179 +1.947753906 0.94050604 +1.948242188 0.94061029 +1.948730469 0.94071436 +1.949218750 0.94081837 +1.949707031 0.94092232 +1.950195313 0.94102615 +1.950683594 0.94112992 +1.951171875 0.94123358 +1.951660156 0.94133717 +1.952148438 0.94144064 +1.952636719 0.94154406 +1.953125000 0.94164735 +1.953613281 0.94175059 +1.954101563 0.94185376 +1.954589844 0.94195676 +1.955078125 0.94205976 +1.955566406 0.94216263 +1.956054688 0.94226539 +1.956542969 0.94236809 +1.957031250 0.94247067 +1.957519531 0.94257319 +1.958007813 0.94267565 +1.958496094 0.94277793 +1.958984375 0.94288021 +1.959472656 0.94298238 +1.959960938 0.94308442 +1.960449219 0.9431864 +1.960937500 0.94328833 +1.961425781 0.94339013 +1.961914063 0.94349182 +1.962402344 0.94359344 +1.962890625 0.94369501 +1.963378906 0.94379646 +1.963867188 0.94389778 +1.964355469 0.94399905 +1.964843750 0.94410026 +1.965332031 0.94420135 +1.965820313 0.94430238 +1.966308594 0.94440329 +1.966796875 0.94450408 +1.967285156 0.94460481 +1.967773438 0.94470549 +1.968261719 0.94480604 +1.968750000 0.94490653 +1.969238281 0.94500691 +1.969726563 0.94510722 +1.970214844 0.94520742 +1.970703125 0.94530749 +1.971191406 0.94540751 +1.971679688 0.94550747 +1.972167969 0.9456073 +1.972656250 0.94570708 +1.973144531 0.94580674 +1.973632813 0.94590634 +1.974121094 0.94600582 +1.974609375 0.94610524 +1.975097656 0.94620454 +1.975585938 0.94630378 +1.976074219 0.94640291 +1.976562500 0.94650197 +1.977050781 0.94660091 +1.977539063 0.9466998 +1.978027344 0.94679856 +1.978515625 0.94689727 +1.979003906 0.94699585 +1.979492188 0.94709438 +1.979980469 0.94719279 +1.980468750 0.94729114 +1.980957031 0.94738936 +1.981445313 0.94748753 +1.981933594 0.94758558 +1.982421875 0.94768357 +1.982910156 0.94778144 +1.983398438 0.94787925 +1.983886719 0.94797695 +1.984375000 0.94807458 +1.984863281 0.94817209 +1.985351563 0.94826955 +1.985839844 0.94836694 +1.986328125 0.94846416 +1.986816406 0.94856137 +1.987304688 0.94865841 +1.987792969 0.94875544 +1.988281250 0.94885236 +1.988769531 0.94894916 +1.989257813 0.9490459 +1.989746094 0.94914252 +1.990234375 0.94923908 +1.990722656 0.94933552 +1.991210938 0.9494319 +1.991699219 0.94952816 +1.992187500 0.94962436 +1.992675781 0.9497205 +1.993164063 0.94981647 +1.993652344 0.94991243 +1.994140625 0.95000827 +1.994628906 0.950104 +1.995117188 0.95019966 +1.995605469 0.95029521 +1.996093750 0.9503907 +1.996582031 0.95048606 +1.997070313 0.95058137 +1.997558594 0.95067656 +1.998046875 0.95077169 +1.998535156 0.9508667 +1.999023438 0.95096165 +1.999511719 0.95105654 diff --git a/gstlal-burst/tests/tests_pytest/test_trigger_01.py b/gstlal-burst/tests/tests_pytest/test_trigger_01.py new file mode 100644 index 0000000000000000000000000000000000000000..d733d2f4f90f308d6064c864a90f5dde25775dc0 --- /dev/null +++ b/gstlal-burst/tests/tests_pytest/test_trigger_01.py @@ -0,0 +1,189 @@ +"""Unittests for trigger test 01 + +""" + +import os +from collections import deque +from io import StringIO + +import gi + +from gstlal import pipeparts, simplehandler +from utils import common + +gi.require_version('Gst', '1.0') +from gi.repository import GObject +from gi.repository import Gst + + +#################### +# +# classes +# +#################### + + +class MultiChannelHandler(simplehandler.Handler): + def __init__(self, *args, **kwargs): + self.output = kwargs.pop("output") + self.instrument = kwargs.pop("instrument") + super(MultiChannelHandler, self).__init__(*args, **kwargs) + self.timedeq = deque(maxlen=10000) + + def do_on_message(self, bus, message): + return False + + def prehandler(self, elem): + buf = elem.emit("pull-preroll") + del buf + return Gst.FlowReturn.OK + + # def bufhandler(self, elem, sink_dict): + def bufhandler(self, elem): + buf = elem.emit("pull-sample").get_buffer() + buftime = int(buf.pts / 1e9) + (result, mapinfo) = buf.map(Gst.MapFlags.READ) + assert result + if mapinfo.data: + data = StringIO.StringIO(mapinfo.data).getvalue() + # channel = sink_dict[elem] + fdata = "" + for line in data.split('\n'): + if len(line) > 0: + # fdata += "%s\t" % channel + line.rstrip('\r') + "\n" + fdata += line.rstrip('\r') + "\n" + self.timedeq.append(buftime) + else: + buf.unmap(mapinfo) + del buf + return Gst.FlowReturn.OK + + # Save a "latest" + self.to_trigger_file(os.path.join(self.output, "output_triggers.txt"), fdata) + + buf.unmap(mapinfo) + del buf + return Gst.FlowReturn.OK + + def to_trigger_file(self, path, data): + # print path + with open(path, 'a') as f: + f.write(data) + + +# +# ============================================================================= +# +# Pipeline Builder +# +# ============================================================================= +# + + +def build_and_run(pipelinefunc, name, segment=None, **pipelinefunc_kwargs): + for key, value in pipelinefunc_kwargs.items(): + print("{0} = {1}".format(key, value)) + print("=== Running Test %s ===" % name) + mainloop = GObject.MainLoop() + pipeline = Gst.Pipeline(name=name) + handler = MultiChannelHandler(mainloop, pipeline, output="./", instrument=None) + pipeline = pipelinefunc(pipeline, name, handler, **pipelinefunc_kwargs) + if segment is not None: + if pipeline.set_state(Gst.State.PAUSED) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + pipeline.seek(1.0, Gst.Format(Gst.Format.TIME), Gst.SeekFlags.FLUSH, Gst.SeekType.SET, segment[0].ns(), Gst.SeekType.SET, segment[1].ns()) + # TODO: figure out why the below line causes process to crash + # if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE: + # raise RuntimeError("pipeline failed to enter PLAYING state") + # mainloop.run() + + +# +# ============================================================================= +# +# Pipelines +# +# ============================================================================= +# + + +# +# check for proper peak finding +# + + +def peak_test_01a(pipeline, name, handler): + # + # try changing these. test should still work! + # + + initial_channels = 2 + rate = 2048 # Hz + width = 32 + sine_frequency = 1 + gap_frequency = 0.1 # Hz + gap_threshold = 0.7 # of 1 + buffer_length = 1.0 # seconds + test_duration = 10.0 # seconds + peak_window = 2048 # samples + wave = 0 + + # + # build pipeline + # + + head = common.gapped_test_src(pipeline, buffer_length=buffer_length, rate=rate, width=width, channels=initial_channels, test_duration=test_duration, + gap_frequency=gap_frequency, gap_threshold=gap_threshold, control_dump_filename="%s_control.dump" % name) + head = pipeparts.mktogglecomplex(pipeline, head) + head = pipeparts.mktaginject(pipeline, head, "instrument=H1,channel-name=LSC-STRAIN,units=strain") + + # head = common.gapped_complex_test_src(pipeline, buffer_length = buffer_length, rate = in_rate, test_duration = test_duration, wave = wave, freq = sine_frequency, gap_frequency = gap_frequency, gap_threshold = gap_threshold, control_dump_filename = "itac_test_01a_control.dump", tags = "instrument=H1,channel-name=LSC-STRAIN,units=strain") + # head = tee = pipeparts.mktee(pipeline, head) + # pipeparts.mktrigger(pipeline, head, peak_window, "test_bank.xml") + + # Does not recieve EOS, hangs + # pipeparts.mktrigger(pipeline, head, peak_window,autocorrelation_matrix = numpy.ones((1,21), dtype=numpy.complex)) + + # head = pipeparts.mkqueue(pipeline, pipeparts.mkitac(pipeline, head, peak_window, "test_bank.xml", autocorrelation_matrix = numpy.array([[0+0.j, 0+0.j, 1+1.j, 0+0.j, 0+0.j]]))) + # head = pipeparts.mkprogressreport(pipeline, head, "test") + + # + # output the before and after + # + # pipeparts.mknxydumpsink(pipeline, pipeparts.mkqueue(pipeline, head), "%s_out.dump" % name) + # pipeparts.mkfakesink(pipeline, head) + + # a = pipeparts.mkappsink(pipeline, pipeparts.mkqueue(pipeline, head)) + + head = pipeparts.mkgeneric(pipeline, head, "lal_nxydump") + + sink = pipeparts.mkappsink(pipeline, head, max_buffers=1, sync=False) + sink.connect("new-sample", handler.bufhandler) + sink.connect("new-preroll", handler.prehandler) + + # outfile = open("itac_test_01a_out.dump", "w") + + # def dump_triggers(elem, output = outfile): + # for row in SnglInspiralTable.from_buffer(elem.emit("pull-buffer")): + # print >>outfile, row.end_time + row.end_time_ns*1e-9, row.snr, row.chisq, row.chisq_dof + + # a.connect_after("new-buffer", dump_triggers) + # pipeparts.mknxydumpsink(pipeline, pipeparts.mktogglecomplex(pipeline, pipeparts.mkqueue(pipeline, tee)), "itac_test_01a_in.dump") + + # + # done + # + + # if "GST_DEBUG_DUMP_DOT_DIR" in os.environ: + # gst.DEBUG_BIN_TO_DOT_FILE(pipeline, gst.DEBUG_GRAPH_SHOW_ALL, "peak_test_01a") + + return pipeline + + +class TestTrigger01: + """Test class group for tigger 01""" + + def test_peak_01a(self): + """Test peak""" + build_and_run(peak_test_01a, "peak_test_01a") + assert True diff --git a/gstlal-burst/tests/tests_pytest/utils/common.py b/gstlal-burst/tests/tests_pytest/utils/common.py new file mode 100644 index 0000000000000000000000000000000000000000..5842024b1c8596a067e713a2a755d7151ca6f415 --- /dev/null +++ b/gstlal-burst/tests/tests_pytest/utils/common.py @@ -0,0 +1,171 @@ +# Copyright (C) 2009--2011,2013 Kipp Cannon +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# ============================================================================= +# +# Preamble +# +# ============================================================================= +# + + +import numpy +import sys + + +import gi +gi.require_version('Gst', '1.0') +from gi.repository import GObject +from gi.repository import Gst + + +from gstlal import pipeparts +from gstlal import pipeio +from gstlal import simplehandler + + +GObject.threads_init() +Gst.init(None) + + +if sys.byteorder == "little": + BYTE_ORDER = "LE" +else: + BYTE_ORDER = "BE" + + +# +# ============================================================================= +# +# Utilities +# +# ============================================================================= +# + + +def complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + assert not width % 8 + samplesperbuffer = int(round(buffer_length * rate)) + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, volume = 1, blocksize = (width / 8 * 2) * samplesperbuffer, samplesperbuffer = samplesperbuffer, num_buffers = int(round(test_duration / buffer_length)), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=Z%d%s, rate=%d, channels=2" % (width, BYTE_ORDER, rate)) + head = pipeparts.mktogglecomplex(pipeline, head) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + + +def test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + assert not width % 8 + if wave == "ligo": + head = pipeparts.mkfakeLIGOsrc(pipeline, instrument = "H1", channel_name = "LSC-STRAIN") + else: + samplesperbuffer = int(round(buffer_length * rate)) + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, volume = 1, blocksize = (width / 8 * channels) * samplesperbuffer, samplesperbuffer = samplesperbuffer, num_buffers = int(round(test_duration / buffer_length)), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=F%d%s, rate=%d, channels=%d" % (width, BYTE_ORDER, rate, channels)) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + + +def add_gaps(pipeline, head, buffer_length, rate, test_duration, gap_frequency = None, gap_threshold = None, control_dump_filename = None): + if gap_frequency is None: + return head + samplesperbuffer = int(round(buffer_length * rate)) + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, volume = 1, blocksize = 4 * samplesperbuffer, samplesperbuffer = samplesperbuffer, num_buffers = int(round(test_duration / buffer_length))), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mknxydumpsinktee(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mkgate(pipeline, head, control = control, threshold = gap_threshold) + + +def gapped_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, tags = None, is_live = False, verbose = True): + src = test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, channels = channels, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if tags is not None: + src = pipeparts.mktaginject(pipeline, src, tags) + return add_gaps(pipeline, src, buffer_length = buffer_length, rate = rate, test_duration = test_duration, gap_frequency = gap_frequency, gap_threshold = gap_threshold, control_dump_filename = control_dump_filename) + + +def gapped_complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, tags = None, is_live = False, verbose = True): + src = complex_test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if tags is not None: + src = pipeparts.mktaginject(pipeline, src, tags) + return pipeparts.mktogglecomplex(pipeline, add_gaps(pipeline, pipeparts.mktogglecomplex(pipeline, src), buffer_length = buffer_length, rate = rate, test_duration = test_duration, gap_frequency = gap_frequency, gap_threshold = gap_threshold, control_dump_filename = control_dump_filename)) + + +# +# ============================================================================= +# +# Pipeline Builder +# +# ============================================================================= +# + + +def build_and_run(pipelinefunc, name, segment = None, **pipelinefunc_kwargs): + print("=== Running Test %s ===" % name, file=sys.stderr) + mainloop = GObject.MainLoop() + pipeline = pipelinefunc(Gst.Pipeline(name = name), name, **pipelinefunc_kwargs) + handler = simplehandler.Handler(mainloop, pipeline) + if segment is not None: + if pipeline.set_state(Gst.State.PAUSED) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + pipeline.seek(1.0, Gst.Format(Gst.Format.TIME), Gst.SeekFlags.FLUSH, Gst.SeekType.SET, segment[0].ns(), Gst.SeekType.SET, segment[1].ns()) + if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + mainloop.run() + + +# +# ============================================================================= +# +# Push Arrays Through an Element +# +# ============================================================================= +# + + +def transform_arrays(input_arrays, elemfunc, name, rate = 1, **elemfunc_kwargs): + input_arrays = list(input_arrays) # so we can modify it + output_arrays = [] + + pipeline = Gst.Pipeline(name = name) + + head = pipeparts.mkgeneric(pipeline, None, "appsrc", caps = pipeio.caps_from_array(input_arrays[0], rate = rate)) + def need_data(elem, arg, input_array_rate_pair): + input_arrays, rate = input_array_rate_pair + if input_arrays: + arr = input_arrays.pop(0) + elem.set_property("caps", pipeio.caps_from_array(arr, rate)) + buf = pipeio.audio_buffer_from_array(arr, 0, 0, rate) + elem.emit("push-buffer", pipeio.audio_buffer_from_array(arr, 0, 0, rate)) + return Gst.FlowReturn.OK + else: + elem.emit("end-of-stream") + return Gst.FlowReturn.EOS + head.connect("need-data", need_data, (input_arrays, rate)) + + head = elemfunc(pipeline, head, **elemfunc_kwargs) + + head = pipeparts.mkappsink(pipeline, head) + def appsink_get_array(elem, output_arrays): + output_arrays.append(pipeio.array_from_audio_sample(elem.emit("pull-sample"))) + return Gst.FlowReturn.OK + + head.connect("new-sample", appsink_get_array, output_arrays) + build_and_run((lambda *args, **kwargs: pipeline), name) + + return output_arrays diff --git a/gstlal-calibration/pytest.ini b/gstlal-calibration/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..6c2fc59b24dc9f978f466afae074bdb70e6d74d1 --- /dev/null +++ b/gstlal-calibration/pytest.ini @@ -0,0 +1,7 @@ +# Configuration file for pytest within gstlal-calibration +[pytest] +norecursedirs = gst/python share tests +testpaths = tests/tests_pytest python +addopts = + -v + --doctest-modules diff --git a/gstlal-calibration/tests/tests_pytest/test_pyfilter.py b/gstlal-calibration/tests/tests_pytest/test_pyfilter.py new file mode 100755 index 0000000000000000000000000000000000000000..1208ac9b06a51fe9ea9cfe85d5a99e2b7ceb1cc4 --- /dev/null +++ b/gstlal-calibration/tests/tests_pytest/test_pyfilter.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +# Copyright (C) 2016 Aaron Viets +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +from gstlal import calibration_parts +from gstlal import pipeparts +from utils import common + + +# +# ============================================================================= +# +# Pipelines +# +# ============================================================================= +# + +def pyfilter_test_01(pipeline, name): + # + # This test removes the DC component from a stream of ones (i.e., the result should be zero) + # + + rate = 16384 # Hz + buffer_length = 1.0 # seconds + test_duration = 10.0 # seconds + DC = 1.0 + wave = 0 + freq = 90 + volume = 1.0 + + # + # build pipeline + # + + src = common.test_src(pipeline, buffer_length=buffer_length, rate=rate, freq=freq, test_duration=test_duration, wave=wave, width=64) + head = pipeparts.mkaudioamplify(pipeline, src, volume) + head = pipeparts.mkgeneric(pipeline, head, "lal_add_constant", value=DC) + head = pipeparts.mktee(pipeline, head) + pipeparts.mknxydumpsink(pipeline, head, "%s_in.txt" % name) + head = calibration_parts.bandstop(pipeline, head, rate) + pipeparts.mknxydumpsink(pipeline, head, "%s_out.txt" % name) + + # + # done + # + + return pipeline + + +class TestPyFilter: + """PyFilter test class""" + + def test_pyfilter(self): + """Test pyfilter""" + common.build_and_run(pyfilter_test_01, "pyfilter_test_01") diff --git a/gstlal-calibration/tests/tests_pytest/utils/__init__.py b/gstlal-calibration/tests/tests_pytest/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/gstlal-calibration/tests/tests_pytest/utils/common.py b/gstlal-calibration/tests/tests_pytest/utils/common.py new file mode 100644 index 0000000000000000000000000000000000000000..42a2225d5c911661aa1b0ed0e35d48d1cb2007f5 --- /dev/null +++ b/gstlal-calibration/tests/tests_pytest/utils/common.py @@ -0,0 +1,185 @@ +# Copyright (C) 2009--2011,2013 Kipp Cannon +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# ============================================================================= +# +# Preamble +# +# ============================================================================= +# + + +import numpy +import sys + + +import gi +gi.require_version('Gst', '1.0') +from gi.repository import GObject +from gi.repository import Gst + + +from gstlal import pipeparts +from gstlal import pipeio +from gstlal import simplehandler +from gstlal import datasource + + +GObject.threads_init() +Gst.init(None) + + +if sys.byteorder == "little": + BYTE_ORDER = "LE" +else: + BYTE_ORDER = "BE" + + +# +# ============================================================================= +# +# Utilities +# +# ============================================================================= +# + + +def complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True, src_suffix = ""): + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, samplesperbuffer = int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=F%d%s, rate=%d, channels=2" % (width, BYTE_ORDER, rate)) + head = pipeparts.mktogglecomplex(pipeline, head) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src%s" % src_suffix) + return head + +def int_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, samplesperbuffer = int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=S%d%s, rate=%d, channels=%d" % (width, BYTE_ORDER, rate, channels)) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + +def test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, volume = 1, is_live = False, verbose = True, src_suffix = ""): + if wave == "ligo": + head = pipeparts.mkfakeLIGOsrc(pipeline, instrument = "H1", channel_name = "LSC-STRAIN") + else: + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, volume = volume, samplesperbuffer = int(buffer_length * rate), num_buffers = int(test_duration / buffer_length), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=F%d%s, rate=%d, channels=%d, channel-mask=(bitmask)0x0" % (width, BYTE_ORDER, rate, channels)) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src%s" % src_suffix) + return head + + +def gapped_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, volume = 0.8, gap_frequency = None, gap_threshold = None, control_dump_filename = None, is_live = False, verbose = True): + src = test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, channels = channels, test_duration = test_duration, wave = wave, freq = freq, volume = volume, is_live = is_live, verbose = verbose) + if gap_frequency is None: + return src + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length)), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mktee(pipeline, control) + pipeparts.mknxydumpsink(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mkgate(pipeline, src, control = control, threshold = gap_threshold) + +def gapped_int_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, is_live = False, verbose = True): + src = int_test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, channels = channels, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if gap_frequency is None: + return src + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length)), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mktee(pipeline, control) + pipeparts.mknxydumpsink(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mkgate(pipeline, src, control = control, threshold = gap_threshold) + +def gapped_complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, tags = None, is_live = False, verbose = True): + src = complex_test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if tags is not None: + src = pipeparts.mktaginject(pipeline, src, tags) + if gap_frequency is None: + return src + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length)), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mknxydumpsinktee(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mktogglecomplex(pipeline, pipeparts.mkgate(pipeline, pipeparts.mktogglecomplex(pipeline, src), control = control, threshold = gap_threshold)) + + +# +# ============================================================================= +# +# Pipeline Builder +# +# ============================================================================= +# + + +def build_and_run(pipelinefunc, name, segment = None, **pipelinefunc_kwargs): + print("=== Running Test %s ===" % name) + mainloop = GObject.MainLoop() + pipeline = pipelinefunc(Gst.Pipeline(name = name), name, **pipelinefunc_kwargs) + handler = simplehandler.Handler(mainloop, pipeline) + if segment is not None: + if pipeline.set_state(Gst.State.READY) != Gst.StateChangeReturn.SUCCESS: + raise RuntimeError("pipeline failed to enter READY state") + datasource.pipeline_seek_for_gps(pipeline, segment[0].ns() / 1000000000, segment[1].ns() / 1000000000) + if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + # TODO: find a way to write to temp files + # pipeparts.write_dump_dot(pipeline, "test_%s" % name, verbose = True) + mainloop.run() + + +# +# ============================================================================= +# +# Push Arrays Through an Element +# +# ============================================================================= +# + + +def transform_arrays(input_arrays, elemfunc, name, rate = 1, **elemfunc_kwargs): + input_arrays = list(input_arrays) # so we can modify it + output_arrays = [] + + pipeline = Gst.Pipeline(name = name) + + head = pipeparts.mkgeneric(pipeline, None, "appsrc", caps = pipeio.caps_from_array(input_arrays[0], rate = rate)) + def need_data(elem, arg, input_arrays, rate): + if input_arrays: + arr = input_arrays.pop(0) + elem.set_property("caps", pipeio.caps_from_array(arr, rate)) + buf = pipeio.audio_buffer_from_array(arr, 0, 0, rate) + elem.emit("push-buffer", pipeio.audio_buffer_from_array(arr, 0, 0, rate)) + return Gst.FlowReturn.OK + else: + elem.emit("end-of-stream") + return Gst.FlowReturn.EOS + head.connect("need-data", need_data, input_arrays, rate) + + head = elemfunc(pipeline, head, **elemfunc_kwargs) + + head = pipeparts.mkappsink(pipeline, head) + def appsink_get_array(elem, output_arrays): + output_arrays.append(pipeio.array_from_audio_sample(elem.emit("pull-sample"))) + return Gst.FlowReturn.OK + + head.connect("new-sample", appsink_get_array, output_arrays) + build_and_run((lambda *args, **kwargs: pipeline), name) + + return output_arrays diff --git a/gstlal-inspiral/pytest.ini b/gstlal-inspiral/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..26292aeb8be7b7985525cabfa749adf1ed1377ec --- /dev/null +++ b/gstlal-inspiral/pytest.ini @@ -0,0 +1,17 @@ +# Configuration file for pytest within gstlal-inspiral +[pytest] +norecursedirs = gst/python share tests +testpaths = tests/tests_pytest python +addopts = + -v + --doctest-modules + --ignore gst/python + --ignore tests + --ignore python/snglinspiraltable.py + --ignore python/spawaveform.py + --ignore python/imr_utils.py + --ignore python/stats/inspiral_extrinsics.py + --ignore python/templates.py + --ignore python/inspiral_pipe.py + --ignore python/p_astro_gstlal.py + --ignore python/rio.py diff --git a/gstlal-inspiral/tests/tests_pytest/itac_test_01.py b/gstlal-inspiral/tests/tests_pytest/itac_test_01.py new file mode 100644 index 0000000000000000000000000000000000000000..921f7e2002513cf2a6a96c82b474349fd8cb7fcd --- /dev/null +++ b/gstlal-inspiral/tests/tests_pytest/itac_test_01.py @@ -0,0 +1,87 @@ +# +# ============================================================================= +# +# Preamble +# +# ============================================================================= +# + + +import numpy + +from gstlal import pipeparts +from gstlal.snglinspiraltable import GSTLALSnglInspiral +from utils import common + + +# +# ============================================================================= +# +# Pipelines +# +# ============================================================================= +# + + +# +# check for proper peak finding +# + + +def peak_test_01a(pipeline): + # + # try changing these. test should still work! + # + + in_rate = 32 # Hz + sine_frequency = 1 + gap_frequency = 0.1 # Hz + gap_threshold = 0.7 # of 1 + buffer_length = 1.0 # seconds + test_duration = 10.0 # seconds + peak_window = 16 # samples + wave = 0 + + # + # build pipeline + # + + head = common.gapped_complex_test_src(pipeline, buffer_length=buffer_length, rate=in_rate, test_duration=test_duration, wave=wave, freq=sine_frequency, + gap_frequency=gap_frequency, gap_threshold=gap_threshold, control_dump_filename="itac_test_01a_control.dump", + tags="instrument=H1,channel-name=LSC-STRAIN,units=strain") + head = tee = pipeparts.mktee(pipeline, head) + head = pipeparts.mkqueue(pipeline, + pipeparts.mkitac(pipeline, head, peak_window, "test_bank.xml", autocorrelation_matrix=numpy.array([[0 + 0.j, 0 + 0.j, 1 + 1.j, 0 + 0.j, 0 + 0.j]]))) + head = pipeparts.mkprogressreport(pipeline, head, "test") + + # + # output the before and after + # + + a = pipeparts.mkappsink(pipeline, pipeparts.mkqueue(pipeline, head)) + + outfile = open("itac_test_01a_out.dump", "w") + + def dump_triggers(elem, output=outfile): + for row in GSTLALSnglInspiral.from_buffer(elem.emit("pull-buffer")): + print(row.end_time + row.end_time_ns * 1e-9, row.snr, row.chisq, row.chisq_dof, file=outfile) + + a.connect_after("new-buffer", dump_triggers) + pipeparts.mknxydumpsink(pipeline, pipeparts.mktogglecomplex(pipeline, pipeparts.mkqueue(pipeline, tee)), "itac_test_01a_in.dump") + + # + # done + # + + # if "GST_DEBUG_DUMP_DOT_DIR" in os.environ: + # gst.DEBUG_BIN_TO_DOT_FILE(pipeline, gst.DEBUG_GRAPH_SHOW_ALL, "peak_test_01a") + + return pipeline + + +class TestITAC: + """Test class group for itac""" + + def test_itac(self): + """Test for itac""" + common.build_and_run(peak_test_01a, "peak_test_01a") diff --git a/gstlal-inspiral/tests/tests_pytest/utils/common.py b/gstlal-inspiral/tests/tests_pytest/utils/common.py new file mode 100644 index 0000000000000000000000000000000000000000..5842024b1c8596a067e713a2a755d7151ca6f415 --- /dev/null +++ b/gstlal-inspiral/tests/tests_pytest/utils/common.py @@ -0,0 +1,171 @@ +# Copyright (C) 2009--2011,2013 Kipp Cannon +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# ============================================================================= +# +# Preamble +# +# ============================================================================= +# + + +import numpy +import sys + + +import gi +gi.require_version('Gst', '1.0') +from gi.repository import GObject +from gi.repository import Gst + + +from gstlal import pipeparts +from gstlal import pipeio +from gstlal import simplehandler + + +GObject.threads_init() +Gst.init(None) + + +if sys.byteorder == "little": + BYTE_ORDER = "LE" +else: + BYTE_ORDER = "BE" + + +# +# ============================================================================= +# +# Utilities +# +# ============================================================================= +# + + +def complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + assert not width % 8 + samplesperbuffer = int(round(buffer_length * rate)) + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, volume = 1, blocksize = (width / 8 * 2) * samplesperbuffer, samplesperbuffer = samplesperbuffer, num_buffers = int(round(test_duration / buffer_length)), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=Z%d%s, rate=%d, channels=2" % (width, BYTE_ORDER, rate)) + head = pipeparts.mktogglecomplex(pipeline, head) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + + +def test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + assert not width % 8 + if wave == "ligo": + head = pipeparts.mkfakeLIGOsrc(pipeline, instrument = "H1", channel_name = "LSC-STRAIN") + else: + samplesperbuffer = int(round(buffer_length * rate)) + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, volume = 1, blocksize = (width / 8 * channels) * samplesperbuffer, samplesperbuffer = samplesperbuffer, num_buffers = int(round(test_duration / buffer_length)), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=F%d%s, rate=%d, channels=%d" % (width, BYTE_ORDER, rate, channels)) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + + +def add_gaps(pipeline, head, buffer_length, rate, test_duration, gap_frequency = None, gap_threshold = None, control_dump_filename = None): + if gap_frequency is None: + return head + samplesperbuffer = int(round(buffer_length * rate)) + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, volume = 1, blocksize = 4 * samplesperbuffer, samplesperbuffer = samplesperbuffer, num_buffers = int(round(test_duration / buffer_length))), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mknxydumpsinktee(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mkgate(pipeline, head, control = control, threshold = gap_threshold) + + +def gapped_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, tags = None, is_live = False, verbose = True): + src = test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, channels = channels, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if tags is not None: + src = pipeparts.mktaginject(pipeline, src, tags) + return add_gaps(pipeline, src, buffer_length = buffer_length, rate = rate, test_duration = test_duration, gap_frequency = gap_frequency, gap_threshold = gap_threshold, control_dump_filename = control_dump_filename) + + +def gapped_complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, tags = None, is_live = False, verbose = True): + src = complex_test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if tags is not None: + src = pipeparts.mktaginject(pipeline, src, tags) + return pipeparts.mktogglecomplex(pipeline, add_gaps(pipeline, pipeparts.mktogglecomplex(pipeline, src), buffer_length = buffer_length, rate = rate, test_duration = test_duration, gap_frequency = gap_frequency, gap_threshold = gap_threshold, control_dump_filename = control_dump_filename)) + + +# +# ============================================================================= +# +# Pipeline Builder +# +# ============================================================================= +# + + +def build_and_run(pipelinefunc, name, segment = None, **pipelinefunc_kwargs): + print("=== Running Test %s ===" % name, file=sys.stderr) + mainloop = GObject.MainLoop() + pipeline = pipelinefunc(Gst.Pipeline(name = name), name, **pipelinefunc_kwargs) + handler = simplehandler.Handler(mainloop, pipeline) + if segment is not None: + if pipeline.set_state(Gst.State.PAUSED) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + pipeline.seek(1.0, Gst.Format(Gst.Format.TIME), Gst.SeekFlags.FLUSH, Gst.SeekType.SET, segment[0].ns(), Gst.SeekType.SET, segment[1].ns()) + if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + mainloop.run() + + +# +# ============================================================================= +# +# Push Arrays Through an Element +# +# ============================================================================= +# + + +def transform_arrays(input_arrays, elemfunc, name, rate = 1, **elemfunc_kwargs): + input_arrays = list(input_arrays) # so we can modify it + output_arrays = [] + + pipeline = Gst.Pipeline(name = name) + + head = pipeparts.mkgeneric(pipeline, None, "appsrc", caps = pipeio.caps_from_array(input_arrays[0], rate = rate)) + def need_data(elem, arg, input_array_rate_pair): + input_arrays, rate = input_array_rate_pair + if input_arrays: + arr = input_arrays.pop(0) + elem.set_property("caps", pipeio.caps_from_array(arr, rate)) + buf = pipeio.audio_buffer_from_array(arr, 0, 0, rate) + elem.emit("push-buffer", pipeio.audio_buffer_from_array(arr, 0, 0, rate)) + return Gst.FlowReturn.OK + else: + elem.emit("end-of-stream") + return Gst.FlowReturn.EOS + head.connect("need-data", need_data, (input_arrays, rate)) + + head = elemfunc(pipeline, head, **elemfunc_kwargs) + + head = pipeparts.mkappsink(pipeline, head) + def appsink_get_array(elem, output_arrays): + output_arrays.append(pipeio.array_from_audio_sample(elem.emit("pull-sample"))) + return Gst.FlowReturn.OK + + head.connect("new-sample", appsink_get_array, output_arrays) + build_and_run((lambda *args, **kwargs: pipeline), name) + + return output_arrays diff --git a/gstlal-ugly/pytest.ini b/gstlal-ugly/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..f77b9ababb9842c6f8f9d50e66a63a2274c81b1a --- /dev/null +++ b/gstlal-ugly/pytest.ini @@ -0,0 +1,9 @@ +# Configuration file for pytest within gstlal-ugly +[pytest] +norecursedirs = gst/python share tests +testpaths = tests/tests_pytest python +addopts = + -v + --doctest-modules + --ignore gst/python + --ignore tests diff --git a/gstlal-ugly/tests/tests_pytest/test_ratefaker.py b/gstlal-ugly/tests/tests_pytest/test_ratefaker.py new file mode 100755 index 0000000000000000000000000000000000000000..0552d3c8e625a59d96e4dc1908e68bf982ce61f5 --- /dev/null +++ b/gstlal-ugly/tests/tests_pytest/test_ratefaker.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +# +# ============================================================================= +# +# Preamble +# +# ============================================================================= +# + + +from gstlal import pipeparts +from utils import common + + +# +# ============================================================================= +# +# Pipelines +# +# ============================================================================= +# + + +# +# test rate faker +# + + +def ratefaker_test_01a(pipeline, dummy): + # + # try changing these. test should still work! + # + + wave = 0 # gst-inspect audiotestsrc + freq = 25 # Hz + in_rate = 2048 # Hz + out_rate = 1024 # Hz + gap_frequency = 1.0 # Hz + gap_threshold = 0.8 # of 1 + buffer_length = 1.0 # seconds + test_duration = 200.0 # seconds + + # + # build pipeline + # + + head = common.gapped_test_src(pipeline, buffer_length=buffer_length, rate=in_rate, test_duration=test_duration, wave=wave, freq=freq, gap_frequency=gap_frequency, + gap_threshold=gap_threshold) + head = pipeparts.mktee(pipeline, head) + pipeparts.mknxydumpsink(pipeline, head, "in.txt") + head = pipeparts.mkprogressreport(pipeline, head, "progress_src") + head = pipeparts.mkgeneric(pipeline, head, "audioratefaker") + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw-float, rate=%d" % out_rate) + pipeparts.mknxydumpsink(pipeline, head, "out.txt") + + # + # done + # + + return pipeline + + +class TestRateFaker: + """Class to group rate faker tests""" + + def test_rate_faker(self): + """Test rate faker""" + common.build_and_run(ratefaker_test_01a, "ratefaker_test_01a") diff --git a/gstlal-ugly/tests/tests_pytest/utils/common.py b/gstlal-ugly/tests/tests_pytest/utils/common.py new file mode 100644 index 0000000000000000000000000000000000000000..71f3f11d496a39c92c35dacf872b241d2680858d --- /dev/null +++ b/gstlal-ugly/tests/tests_pytest/utils/common.py @@ -0,0 +1,168 @@ +# Copyright (C) 2009--2011,2013 Kipp Cannon +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# ============================================================================= +# +# Preamble +# +# ============================================================================= +# + + +import numpy +import sys + + +import gi +gi.require_version('Gst', '1.0') +from gi.repository import GObject +from gi.repository import Gst + + +from gstlal import pipeparts +from gstlal import pipeio +from gstlal import simplehandler + + +GObject.threads_init() +Gst.init(None) + + +if sys.byteorder == "little": + BYTE_ORDER = "LE" +else: + BYTE_ORDER = "BE" + + +# +# ============================================================================= +# +# Utilities +# +# ============================================================================= +# + + +def complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=Z%d%s, rate=%d, channels=2" % (width, BYTE_ORDER, rate)) + head = pipeparts.mktogglecomplex(pipeline, head) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + + +def test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, is_live = False, verbose = True): + if wave == "ligo": + head = pipeparts.mkfakeLIGOsrc(pipeline, instrument = "H1", channel_name = "LSC-STRAIN") + else: + head = pipeparts.mkaudiotestsrc(pipeline, wave = wave, freq = freq, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length), is_live = is_live) + head = pipeparts.mkcapsfilter(pipeline, head, "audio/x-raw, format=F%d%s, rate=%d, channels=%d" % (width, BYTE_ORDER, rate, channels)) + if verbose: + head = pipeparts.mkprogressreport(pipeline, head, "src") + return head + + +def gapped_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, channels = 1, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, is_live = False, verbose = True): + src = test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, channels = channels, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if gap_frequency is None: + return src + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length)), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mktee(pipeline, control) + pipeparts.mknxydumpsink(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mkgate(pipeline, src, control = control, threshold = gap_threshold) + + +def gapped_complex_test_src(pipeline, buffer_length = 1.0, rate = 2048, width = 64, test_duration = 10.0, wave = 5, freq = 0, gap_frequency = None, gap_threshold = None, control_dump_filename = None, tags = None, is_live = False, verbose = True): + src = complex_test_src(pipeline, buffer_length = buffer_length, rate = rate, width = width, test_duration = test_duration, wave = wave, freq = freq, is_live = is_live, verbose = verbose) + if tags is not None: + src = pipeparts.mktaginject(pipeline, src, tags) + if gap_frequency is None: + return src + control = pipeparts.mkcapsfilter(pipeline, pipeparts.mkaudiotestsrc(pipeline, wave = 0, freq = gap_frequency, blocksize = 8 * int(buffer_length * rate), volume = 1, num_buffers = int(test_duration / buffer_length)), "audio/x-raw, format=F32%s, rate=%d, channels=1" % (BYTE_ORDER, rate)) + if control_dump_filename is not None: + control = pipeparts.mknxydumpsinktee(pipeline, pipeparts.mkqueue(pipeline, control), control_dump_filename) + control = pipeparts.mkqueue(pipeline, control) + return pipeparts.mktogglecomplex(pipeline, pipeparts.mkgate(pipeline, pipeparts.mktogglecomplex(pipeline, src), control = control, threshold = gap_threshold)) + + +# +# ============================================================================= +# +# Pipeline Builder +# +# ============================================================================= +# + + +def build_and_run(pipelinefunc, name, segment = None, **pipelinefunc_kwargs): + print("=== Running Test %s ===" % name, file=sys.stderr) + mainloop = GObject.MainLoop() + pipeline = pipelinefunc(Gst.Pipeline(name = name), name, **pipelinefunc_kwargs) + handler = simplehandler.Handler(mainloop, pipeline) + if segment is not None: + if pipeline.set_state(Gst.State.PAUSED) == Gst.StateChangeReturn.FAILURE: + raise RuntimeError("pipeline failed to enter PLAYING state") + pipeline.seek(1.0, Gst.Format(Gst.Format.TIME), Gst.SeekFlags.FLUSH, Gst.SeekType.SET, segment[0].ns(), Gst.SeekType.SET, segment[1].ns()) + # TODO: figure out why the below causes process to crash + # if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE: + # raise RuntimeError("pipeline failed to enter PLAYING state") + # mainloop.run() + + +# +# ============================================================================= +# +# Push Arrays Through an Element +# +# ============================================================================= +# + + +def transform_arrays(input_arrays, elemfunc, name, rate = 1, **elemfunc_kwargs): + input_arrays = list(input_arrays) # so we can modify it + output_arrays = [] + + pipeline = Gst.Pipeline(name = name) + + head = pipeparts.mkgeneric(pipeline, None, "appsrc", caps = pipeio.caps_from_array(input_arrays[0], rate = rate)) + def need_data(elem, arg, x): + input_arrays, rate = x + if input_arrays: + arr = input_arrays.pop(0) + elem.set_property("caps", pipeio.caps_from_array(arr, rate)) + buf = pipeio.audio_buffer_from_array(arr, 0, 0, rate) + elem.emit("push-buffer", pipeio.audio_buffer_from_array(arr, 0, 0, rate)) + return Gst.FlowReturn.OK + else: + elem.emit("end-of-stream") + return Gst.FlowReturn.EOS + head.connect("need-data", need_data, (input_arrays, rate)) + + head = elemfunc(pipeline, head, **elemfunc_kwargs) + + head = pipeparts.mkappsink(pipeline, head) + def appsink_get_array(elem, output_arrays): + output_arrays.append(pipeio.array_from_audio_sample(elem.emit("pull-sample"))) + return Gst.FlowReturn.OK + + head.connect("new-sample", appsink_get_array, output_arrays) + build_and_run((lambda *args, **kwargs: pipeline), name) + + return output_arrays diff --git a/gstlal/python/utilities/Makefile.am b/gstlal/python/utilities/Makefile.am index 6ee006bd28e1e4f922e8119d08264830f9394222..b1dd765b5a6fa5e0f88a79c5628d7d415404dc4b 100644 --- a/gstlal/python/utilities/Makefile.am +++ b/gstlal/python/utilities/Makefile.am @@ -3,4 +3,5 @@ utilitiesdir = $(pkgpythondir)/utilities utilities_PYTHON = \ __init__.py \ - admin.py + admin.py \ + testtools.py diff --git a/gstlal/tests/tests_pytest/testtools.py b/gstlal/python/utilities/testtools.py similarity index 100% rename from gstlal/tests/tests_pytest/testtools.py rename to gstlal/python/utilities/testtools.py diff --git a/gstlal/tests/tests_pytest/test_datasource.py b/gstlal/tests/tests_pytest/test_datasource.py index c44a4788148c3dc3ec36fe5ef3548ca83ee12990..eb58534d80d141b83fedfe3bd444e1e85b27ff6a 100644 --- a/gstlal/tests/tests_pytest/test_datasource.py +++ b/gstlal/tests/tests_pytest/test_datasource.py @@ -15,7 +15,7 @@ Gst.init(None) from gstlal import datasource from gstlal.datasource import DataSource, Detector, DEFAULT_STATE_CHANNEL, DEFAULT_DQ_CHANNEL -from testtools import GstLALTestManager, skip_osx, clean_str +from gstlal.utilities.testtools import GstLALTestManager, skip_osx, clean_str # Comment out test of possible alternate copyright mechanism