From 5f862285f3a4577cee36bbae8a951af7bacf410f Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sun, 7 Jan 2024 01:14:01 +0800 Subject: [PATCH 01/13] build(pipfile): add pre-commit and move cpplint to dev-packages --- Pipfile | 3 +- Pipfile.lock | 965 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 568 insertions(+), 400 deletions(-) diff --git a/Pipfile b/Pipfile index 9caa1d6..1d8424e 100644 --- a/Pipfile +++ b/Pipfile @@ -7,9 +7,10 @@ name = "pypi" numpy = "*" scipy = "*" matplotlib = "*" -cpplint = "*" [dev-packages] +pre-commit = "*" +cpplint = "*" pytest = "*" pytest-cov = "*" diff --git a/Pipfile.lock b/Pipfile.lock index c2c357d..11d7020 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2aaa6fc353c82968a8af4a2377351a12ac4df1b6bb221a0ecc518d0b8c36598c" + "sha256": "eda8515dd3a1ff709bab9b9e956a7b3f71c9b63d652cbca5e2a637b2b71a9954" }, "pipfile-spec": 6, "requires": { @@ -18,342 +18,385 @@ "default": { "contourpy": { "hashes": [ - "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98", - "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772", - "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2", - "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc", - "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803", - "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051", - "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc", - "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4", - "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436", - "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5", - "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5", - "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3", - "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80", - "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1", - "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0", - "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae", - "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556", - "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02", - "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566", - "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350", - "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967", - "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4", - "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66", - "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69", - "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd", - "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2", - "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810", - "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50", - "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc", - "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2", - "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0", - "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3", - "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6", - "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac", - "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d", - "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6", - "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f", - "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd", - "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566", - "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa", - "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414", - "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a", - "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c", - "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693", - "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d", - "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161", - "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e", - "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2", - "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f", - "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71", - "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd", - "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9", - "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8", - "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab", - "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad" + "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", + "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956", + "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5", + "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063", + "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286", + "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a", + "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686", + "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9", + "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f", + "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4", + "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e", + "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0", + "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e", + "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488", + "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399", + "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431", + "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779", + "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9", + "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab", + "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0", + "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd", + "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e", + "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc", + "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6", + "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316", + "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808", + "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0", + "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f", + "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843", + "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9", + "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95", + "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9", + "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de", + "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4", + "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4", + "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa", + "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8", + "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776", + "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41", + "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108", + "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e", + "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8", + "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727", + "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a" ], - "markers": "python_version >= '3.8'", - "version": "==1.0.7" - }, - "cpplint": { - "hashes": [ - "sha256:00ddc86d6e4de2a9dcfa272402dcbe21593363a93b7c475bc391e335062f34b1", - "sha256:d430ce8f67afc1839340e60daa89e90de08b874bc27149833077bba726dfc13a" - ], - "index": "pypi", - "version": "==1.6.1" + "markers": "python_version >= '3.9'", + "version": "==1.2.0" }, "cycler": { "hashes": [ - "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", - "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" ], - "markers": "python_version >= '3.6'", - "version": "==0.11.0" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "fonttools": { "hashes": [ - "sha256:909c104558835eac27faeb56be5a4c32694192dca123d073bf746ce9254054af", - "sha256:f5e764e1fd6ad54dfc201ff32af0ba111bcfbe0d05b24540af74c63db4ed6390" + "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be", + "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154", + "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8", + "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d", + "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda", + "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9", + "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767", + "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391", + "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc", + "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b", + "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca", + "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c", + "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984", + "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4", + "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7", + "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6", + "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d", + "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500", + "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5", + "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980", + "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540", + "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71", + "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd", + "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982", + "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671", + "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf", + "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c", + "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7", + "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7", + "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa", + "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11", + "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826", + "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9", + "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82", + "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff", + "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992", + "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812", + "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8", + "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78", + "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d", + "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf", + "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538" ], "markers": "python_version >= '3.8'", - "version": "==4.39.0" + "version": "==4.47.0" }, "kiwisolver": { "hashes": [ - "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b", - "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166", - "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c", - "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c", - "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0", - "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4", - "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9", - "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286", - "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767", - "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c", - "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6", - "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b", - "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004", - "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf", - "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494", - "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac", - "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626", - "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766", - "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514", - "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6", - "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f", - "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d", - "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191", - "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d", - "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51", - "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f", - "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8", - "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454", - "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb", - "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da", - "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8", - "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de", - "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a", - "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9", - "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008", - "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3", - "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32", - "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938", - "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1", - "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9", - "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d", - "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824", - "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b", - "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd", - "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2", - "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5", - "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69", - "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3", - "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae", - "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597", - "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e", - "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955", - "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca", - "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a", - "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea", - "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede", - "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4", - "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6", - "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686", - "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408", - "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871", - "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29", - "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750", - "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897", - "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0", - "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2", - "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09", - "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c" + "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", + "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", + "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", + "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", + "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", + "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", + "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", + "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", + "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", + "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", + "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", + "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", + "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", + "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", + "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", + "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", + "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", + "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", + "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", + "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", + "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", + "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", + "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", + "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", + "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", + "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", + "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", + "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", + "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", + "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", + "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", + "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", + "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", + "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", + "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", + "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", + "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", + "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", + "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", + "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", + "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", + "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", + "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", + "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", + "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", + "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", + "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", + "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", + "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", + "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", + "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", + "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", + "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", + "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", + "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", + "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", + "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", + "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", + "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", + "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", + "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", + "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", + "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", + "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", + "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", + "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", + "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", + "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", + "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", + "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", + "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", + "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", + "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", + "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", + "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", + "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", + "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", + "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", + "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", + "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", + "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", + "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", + "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", + "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", + "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", + "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", + "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", + "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", + "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", + "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", + "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", + "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", + "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", + "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", + "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", + "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", + "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", + "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", + "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", + "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", + "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", + "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", + "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", + "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" ], "markers": "python_version >= '3.7'", - "version": "==1.4.4" + "version": "==1.4.5" }, "matplotlib": { "hashes": [ - "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353", - "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1", - "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290", - "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7", - "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba", - "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717", - "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96", - "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136", - "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba", - "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613", - "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc", - "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de", - "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b", - "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500", - "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea", - "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042", - "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa", - "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb", - "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d", - "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61", - "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882", - "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0", - "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b", - "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6", - "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc", - "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332", - "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439", - "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c", - "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1", - "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529", - "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0", - "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb", - "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7", - "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24", - "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7", - "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87", - "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4", - "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556", - "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476", - "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb", - "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304" + "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1", + "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0", + "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4", + "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7", + "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630", + "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89", + "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d", + "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717", + "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a", + "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627", + "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31", + "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213", + "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843", + "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788", + "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367", + "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4", + "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a", + "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8", + "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b", + "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18", + "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6", + "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa", + "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917", + "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20", + "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331", + "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63", + "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f", + "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8" ], "index": "pypi", - "version": "==3.7.1" + "version": "==3.8.2" }, "numpy": { "hashes": [ - "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22", - "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f", - "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9", - "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96", - "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0", - "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a", - "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281", - "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04", - "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468", - "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253", - "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756", - "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a", - "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb", - "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d", - "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0", - "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910", - "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978", - "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5", - "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f", - "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a", - "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5", - "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2", - "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d", - "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95", - "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5", - "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d", - "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780", - "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa" + "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd", + "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b", + "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e", + "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f", + "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f", + "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178", + "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3", + "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4", + "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e", + "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0", + "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00", + "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419", + "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4", + "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6", + "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166", + "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b", + "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3", + "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf", + "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2", + "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2", + "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36", + "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03", + "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce", + "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6", + "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13", + "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5", + "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e", + "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485", + "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137", + "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374", + "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58", + "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b", + "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb", + "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b", + "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda", + "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511" ], "index": "pypi", - "version": "==1.24.2" + "version": "==1.26.3" }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.2" }, "pillow": { "hashes": [ - "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33", - "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b", - "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e", - "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35", - "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153", - "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9", - "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569", - "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57", - "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8", - "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1", - "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264", - "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157", - "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9", - "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133", - "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9", - "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab", - "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6", - "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5", - "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df", - "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503", - "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b", - "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa", - "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327", - "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493", - "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d", - "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4", - "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4", - "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35", - "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2", - "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c", - "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011", - "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a", - "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e", - "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f", - "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848", - "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57", - "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f", - "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c", - "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9", - "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5", - "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9", - "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d", - "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0", - "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1", - "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e", - "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815", - "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0", - "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b", - "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd", - "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c", - "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3", - "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab", - "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858", - "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5", - "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee", - "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343", - "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb", - "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47", - "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed", - "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837", - "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286", - "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28", - "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628", - "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df", - "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d", - "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d", - "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a", - "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6", - "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336", - "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132", - "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070", - "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe", - "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a", - "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd", - "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391", - "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a", - "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12" + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" ], - "markers": "python_version >= '3.7'", - "version": "==9.4.0" + "markers": "python_version >= '3.8'", + "version": "==10.2.0" }, "pyparsing": { "hashes": [ - "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", - "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", + "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.0.9" + "version": "==3.1.1" }, "python-dateutil": { "hashes": [ @@ -365,30 +408,34 @@ }, "scipy": { "hashes": [ - "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415", - "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f", - "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd", - "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f", - "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d", - "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601", - "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5", - "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88", - "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f", - "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e", - "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2", - "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353", - "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35", - "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6", - "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea", - "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35", - "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1", - "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9", - "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5", - "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019", - "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1" + "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c", + "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6", + "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8", + "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d", + "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97", + "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff", + "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993", + "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3", + "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd", + "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7", + "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446", + "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa", + "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937", + "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56", + "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd", + "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79", + "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4", + "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4", + "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710", + "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660", + "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41", + "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea", + "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65", + "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be", + "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec" ], "index": "pypi", - "version": "==1.10.1" + "version": "==1.11.4" }, "six": { "hashes": [ @@ -400,81 +447,105 @@ } }, "develop": { - "attrs": { - "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" - ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" - }, - "colorama": { + "cfgv": { "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.6" + "markers": "python_version >= '3.8'", + "version": "==3.4.0" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e", - "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b", - "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e", - "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6", - "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454", - "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80", - "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0", - "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339", - "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384", - "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616", - "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8", - "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef", - "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6", - "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54", - "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84", - "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273", - "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae", - "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff", - "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99", - "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657", - "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed", - "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993", - "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc", - "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97", - "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6", - "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63", - "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5", - "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec", - "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1", - "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58", - "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9", - "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3", - "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319", - "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd", - "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb", - "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2", - "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820", - "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a", - "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e", - "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242", - "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4", - "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a", - "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03", - "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508", - "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833", - "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8", - "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4", - "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6", - "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431", - "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa", - "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b" + "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", + "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", + "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", + "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", + "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", + "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", + "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", + "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", + "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", + "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", + "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", + "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", + "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", + "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", + "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", + "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", + "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", + "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", + "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", + "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", + "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", + "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", + "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", + "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", + "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", + "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", + "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", + "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", + "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", + "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", + "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", + "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", + "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", + "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", + "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", + "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", + "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", + "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", + "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", + "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", + "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", + "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", + "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", + "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", + "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", + "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", + "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", + "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", + "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", + "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", + "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", + "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" ], - "markers": "python_version >= '3.7'", - "version": "==7.2.1" + "markers": "python_version >= '3.8'", + "version": "==7.4.0" + }, + "cpplint": { + "hashes": [ + "sha256:00ddc86d6e4de2a9dcfa272402dcbe21593363a93b7c475bc391e335062f34b1", + "sha256:d430ce8f67afc1839340e60daa89e90de08b874bc27149833077bba726dfc13a" + ], + "index": "pypi", + "version": "==1.6.1" + }, + "distlib": { + "hashes": [ + "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", + "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" + ], + "version": "==0.3.8" + }, + "filelock": { + "hashes": [ + "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", + "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c" + ], + "markers": "python_version >= '3.8'", + "version": "==3.13.1" + }, + "identify": { + "hashes": [ + "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d", + "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34" + ], + "markers": "python_version >= '3.8'", + "version": "==2.5.33" }, "iniconfig": { "hashes": [ @@ -484,37 +555,133 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, + "nodeenv": { + "hashes": [ + "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", + "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.8.0" + }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.2" + }, + "platformdirs": { + "hashes": [ + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" + ], + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", + "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" + }, + "pre-commit": { + "hashes": [ + "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376", + "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d" + ], + "index": "pypi", + "version": "==3.6.0" }, "pytest": { "hashes": [ - "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", - "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", - "version": "==7.2.2" + "version": "==7.4.4" }, "pytest-cov": { "hashes": [ - "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b", - "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470" + "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "index": "pypi", - "version": "==4.0.0" + "version": "==4.1.0" + }, + "pyyaml": { + "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0.1" + }, + "setuptools": { + "hashes": [ + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" + ], + "markers": "python_version >= '3.8'", + "version": "==69.0.3" + }, + "virtualenv": { + "hashes": [ + "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3", + "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" + ], + "markers": "python_version >= '3.7'", + "version": "==20.25.0" } } } From ddeb59d025e28cfd0441073133b7c4199b97314e Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sat, 13 Jan 2024 13:54:56 +0800 Subject: [PATCH 02/13] feat(handler): add maximum failed iteration error handler --- uc_sgsim/exception.py | 16 ++++++++++++++++ uc_sgsim/random_field.py | 4 ++++ uc_sgsim/sgsim.py | 7 +++++++ 3 files changed, 27 insertions(+) diff --git a/uc_sgsim/exception.py b/uc_sgsim/exception.py index a052209..ac19922 100644 --- a/uc_sgsim/exception.py +++ b/uc_sgsim/exception.py @@ -8,3 +8,19 @@ class VariogramDoesNotCompute(Exception): def __init__(self, message: str = default_message): self.message = message super().__init__(self.message) + + +class IterationError(Exception): + """ + Raises when the continous failed reach the limit. + """ + + default_message = ( + 'Maximum continuous failed iterations reached. ' + + 'Please change the combination of parameters. Or set ' + + 'higher iteration_limit in sgsim instance.' + ) + + def __init__(self, message: str = default_message): + self.message = message + super().__init__(self.message) diff --git a/uc_sgsim/random_field.py b/uc_sgsim/random_field.py index c57af16..6bdcde2 100644 --- a/uc_sgsim/random_field.py +++ b/uc_sgsim/random_field.py @@ -21,6 +21,8 @@ class RandomField: __x_size (int): size of the x axis for the random field. __y_size (int): size of the y axis for the random field. __realization_number (int): number of realizations to generate. + iteration_limit (int): The maximum number for continuous iteration number of + realization error. Methods: _create_grid: create the grid for the random field. @@ -28,6 +30,8 @@ class RandomField: save_variogram: save the variogram data to files. """ + iteration_limit = 10 + def __init__(self, grid_size: int | list[int, int], realization_number: int): """ Initialize a random field object. diff --git a/uc_sgsim/sgsim.py b/uc_sgsim/sgsim.py index 78096bd..5feb2a7 100644 --- a/uc_sgsim/sgsim.py +++ b/uc_sgsim/sgsim.py @@ -10,6 +10,7 @@ from uc_sgsim.random_field import SgsimField from uc_sgsim.cov_model.base import CovModel from uc_sgsim.utils import CovModelStructure, SgsimStructure +from .exception import IterationError BASE_DIR = Path(__file__).resolve().parent @@ -62,6 +63,7 @@ def _process(self, randomseed: int = 0, parallel: bool = False) -> np.array: np.random.seed(self.randomseed) self.n_process = 1 if parallel is False else self.n_process counts = 0 + iteration_failed = 0 start_time = time.time() # Loop for randomfield generation @@ -96,7 +98,11 @@ def _process(self, randomseed: int = 0, parallel: bool = False) -> np.array: # If any simulated value over the limit than discard that realization if z[sample] >= self.z_max or z[sample] <= self.z_min: drop = True + iteration_failed += 1 + if iteration_failed >= self.iteration_limit: + raise IterationError() break + temp = np.hstack([sample, z[sample]]) grid = np.vstack([grid, temp]) @@ -111,6 +117,7 @@ def _process(self, randomseed: int = 0, parallel: bool = False) -> np.array: if drop is False: self.random_field[counts, :] = z counts = counts + 1 + iteration_failed = 0 print('Progress = %.2f' % (counts / self.realization_number * 100) + '%', end='\r') print('Progress = %.2f' % 100 + '%\n', end='\r') From 370f06c5d96de799a0cb4c68dccfece5f74fa97b Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sat, 13 Jan 2024 14:22:51 +0800 Subject: [PATCH 03/13] refactor(c): add iteration_limit for c code and add parameter in py c structure --- c_example.c | 1 + uc_sgsim/c_core/include/sgsim.h | 1 + uc_sgsim/c_core/src/sgsim.c | 15 +++++++++++++-- uc_sgsim/sgsim.py | 1 + uc_sgsim/utils.py | 1 + 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/c_example.c b/c_example.c index ee1c67e..b469292 100644 --- a/c_example.c +++ b/c_example.c @@ -20,6 +20,7 @@ int main() { .randomseed = 12345, .kriging_method = 1, .if_alloc_memory = 1, + .iteration_limit = 10, }; // you can also set max_negibor at cov_model_t. Defualt value is 4. diff --git a/uc_sgsim/c_core/include/sgsim.h b/uc_sgsim/c_core/include/sgsim.h index fc2c300..063a6ae 100644 --- a/uc_sgsim/c_core/include/sgsim.h +++ b/uc_sgsim/c_core/include/sgsim.h @@ -28,6 +28,7 @@ typedef struct { int randomseed; int kriging_method; int if_alloc_memory; // Flag to indicate memory allocation status + int iteration_limit; // The tolerance of maximum times of iteration error double* array; // Array to store the simulated values. double z_min; // Minimum simulated value. double z_max; // Maximum simulated value. diff --git a/uc_sgsim/c_core/src/sgsim.c b/uc_sgsim/c_core/src/sgsim.c index 7a68d8c..d94357e 100644 --- a/uc_sgsim/c_core/src/sgsim.c +++ b/uc_sgsim/c_core/src/sgsim.c @@ -39,8 +39,11 @@ static double epsilon = 1e-6; void set_sgsim_default(sgsim_t* sgsim, cov_model_t* cov_model) { set_cov_model_default(cov_model); double boundary_val = pow(cov_model->sill, 0.5) * 4; - sgsim->z_min = sgsim->z_min < epsilon ? -(boundary_val) : sgsim->z_min; - sgsim->z_max = sgsim->z_max < epsilon ? boundary_val : sgsim->z_max; + + sgsim->z_min = fabs(sgsim->z_min) < epsilon ? -(boundary_val) : sgsim->z_min; + sgsim->z_max = fabs(sgsim->z_max) < epsilon ? boundary_val : sgsim->z_max; + sgsim->iteration_limit = sgsim->iteration_limit == 0 ? 10 : sgsim->iteration_limit; + if (sgsim->if_alloc_memory == 1) { unsigned long size = (long)sgsim->x_len * (long)sgsim->realization_numbers; sgsim->array = calloc(size, sizeof(double)); @@ -63,6 +66,7 @@ void sgsim_run(sgsim_t* sgsim, cov_model_t* cov_model, int vario_flag) { x_grid.data = arange(sgsim->x_len); count = 0; int use_cov_cache = 0; + int error_times = 0; // The counts of continuosly error while (count < sgsim->realization_numbers) { printf("Number = %d\n", count); _sampling.currlen = 0; @@ -113,6 +117,13 @@ void sgsim_run(sgsim_t* sgsim, cov_model_t* cov_model, int vario_flag) { sgsim->realization_numbers, count); } count++; + error_times = 0; + } else { + error_times++; + if (error_times == sgsim->iteration_limit) { + fprintf(stderr, "Maximum error occurred. Exiting the program...\n"); + return; + } } } kriging_memory_free(); diff --git a/uc_sgsim/sgsim.py b/uc_sgsim/sgsim.py index 5feb2a7..3e97c0c 100644 --- a/uc_sgsim/sgsim.py +++ b/uc_sgsim/sgsim.py @@ -264,6 +264,7 @@ def _cpdll(self, randomseed: int) -> np.array: randomseed=randomseed, kirging_method=kriging, if_alloc_memory=0, + max_iteration=self.iteration_limit, array=(c_double * (mlen * realization_number))(), z_min=self.z_min, z_max=self.z_max, diff --git a/uc_sgsim/utils.py b/uc_sgsim/utils.py index f6b0d55..dabbb75 100644 --- a/uc_sgsim/utils.py +++ b/uc_sgsim/utils.py @@ -69,6 +69,7 @@ class SgsimStructure(Structure): ('randomseed', c_int), ('kriging_method', c_int), ('if_alloc_memory', c_int), + ('max_iteration', c_int), ('array', POINTER(c_double)), ('z_min', c_double), ('z_max', c_double), From 3b7f0cf3f010bcac133e4bf85b40053277a3f911 Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sat, 13 Jan 2024 16:47:00 +0800 Subject: [PATCH 04/13] test(limit): add test for iteration limit --- tests/uc_sgsim_test.py | 15 ++++++++++++++- uc_sgsim/c_core/tests/sgsim_test.c | 25 +++++++++++++++++++++++++ uc_sgsim/sgsim.py | 9 ++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/tests/uc_sgsim_test.py b/tests/uc_sgsim_test.py index 7ffc893..33758bb 100644 --- a/tests/uc_sgsim_test.py +++ b/tests/uc_sgsim_test.py @@ -3,7 +3,7 @@ import uc_sgsim as uc from uc_sgsim.kriging import SimpleKriging from uc_sgsim.cov_model import Gaussian, Spherical, Exponential -from uc_sgsim.exception import VariogramDoesNotCompute +from uc_sgsim.exception import VariogramDoesNotCompute, IterationError import os @@ -251,3 +251,16 @@ def test_sgsim_repr(self, capsys): == 'SgsimField(151, 10, SimpleKriging, GaussianModel' + '(bandwidth_len=35, bandwidth_step=1, k_range=17.32, sill=1, nugget=0))' ) + + def test_sgsim_reach_iteration_limit(self): + sgsim = uc.UCSgsim( + self.X, + 100, + self.gaussian, + z_max=1, + z_min=-1, + iteration_limit=3, + max_neighbor=12, + ) + with pytest.raises(IterationError): + sgsim.compute(n_process=1, randomseed=12312) diff --git a/uc_sgsim/c_core/tests/sgsim_test.c b/uc_sgsim/c_core/tests/sgsim_test.c index 929bd2c..252dd3d 100644 --- a/uc_sgsim/c_core/tests/sgsim_test.c +++ b/uc_sgsim/c_core/tests/sgsim_test.c @@ -149,6 +149,31 @@ UTEST(test, sgsim_ordinary_kriging_with_cov_cache) { sgsim_t_free(&sgsim_example); } +UTEST(test, sgsim_max_iteration) { + sgsim_t sgsim_example = { + .x_len = 75, + .realization_numbers = 50, + .randomseed = 15, + .kriging_method = 1, + .if_alloc_memory = 1, + .iteration_limit = 3, + .z_min = -1, + .z_max = 1 + }; + cov_model_t cov_example = { + .bw_l = 35, + .bw_s = 1, + .k_range = 12, + .use_cov_cache = 1, + .sill = 1, + .nugget = 0, + .max_neighbor = 6 + }; + + sgsim_run(&sgsim_example, &cov_example, 0); + sgsim_t_free(&sgsim_example); +} + UTEST(test, variance) { double** arr; arr = malloc(20 * sizeof(double)); diff --git a/uc_sgsim/sgsim.py b/uc_sgsim/sgsim.py index 3e97c0c..f88eabb 100644 --- a/uc_sgsim/sgsim.py +++ b/uc_sgsim/sgsim.py @@ -148,7 +148,14 @@ def compute(self, n_process: int, randomseed: int) -> np.array: parallel = [True] * n_process # Start parallel computing - z = pool.starmap(self._process, zip(rand_list, parallel)) + try: + z = pool.starmap(self._process, zip(rand_list, parallel)) + except IterationError: + # We should handle the error like this to measure the coverage of sub process + pool.close() + pool.join() + raise IterationError() + pool.close() # Use pool.join() to measure the coverage of sub process pool.join() From 83d97980e272633763497ec80bd7b04df1aba9f4 Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sat, 13 Jan 2024 17:39:49 +0800 Subject: [PATCH 05/13] build(c_core): update dynamic library --- uc_sgsim/c_core/uc_sgsim.dll | Bin 84600 -> 85624 bytes uc_sgsim/c_core/uc_sgsim.so | Bin 37016 -> 37112 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/uc_sgsim/c_core/uc_sgsim.dll b/uc_sgsim/c_core/uc_sgsim.dll index f3228119b6d1780482710c47031c1a68bf6c86a8..f6f123e2fb071838270242f3858b7425ff53d8e5 100644 GIT binary patch delta 9146 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 VmA7eOMFB#^H`x!qNFaap{~ucq1JVEh delta 8949 zcmaJ{3tUvyy5DOv0|N*%2!kMk0}L=A;Glq_rZXzKRa7)3e4zLM!2v}CGgC1EbDA)0 zmD@UIyO$I~2V z*c};2i-^I;S&Ci_+8X*i85Umw^rw%B%XTD}uUuBK4EDUyQIF<>wt@ac;^Maf{pn-k zjHcv`vbIx!jz%<3v>kLjKbt&BckyxL8Tt;s_tA^^-cLO};z$Ec_K2fOj{sWeF^IfO zw?cM|9>n)Q=?Q#)N^jx&b9;p13Lz`0x94!8pc$U2gTC3paW=2&9$sD32`}#r#h3G3 z5v}n|;UC{Y-}M|z7SdlllliN)G}>!A?<%5ey(TA}t>w5DPXcAZ=J!4r=i{q5uJZwx z%T-t}*tE|iMomG3ys zlceECq~KuTi(UnFZ6)0Ixp@!rK4u>!-sz-(j`oi8`qxAR-86$1ddH9e`;*@FK77M; z8WB`QhSL2(Tlt1*G(vlp|3t9g)_xsGvgjA_v0=(|EUem4q1Sb*7qqAioApMa`j~Lk z`C2L+n9xiX&@U6NkrLWGY~P@haG(xYKl+G@&7bv#V4W1=JTj41B(5Koi9U#=E_FcK zPgce%T_Dbc{#|yt>lo`&(}<)9zROIi)WhEA6HCiP@x zT&lbZKTs-$k~5JuCxwtedM+uJzhvMt`97Q8Wh4FTSee9_7JpWZH4H;t`_;M;+!Kp~*4=EWZr3=SI zkP7<9m?1>8?->(CW@n9rPR73_pMv$OKz?#&K!h6g6{?S_oQYuEF?BkJg2}Re3$LT$ zHP5`*oM&EQUfSu!l&m+LKaQYYle-}r_0r?*7#LG5p;^qc_&IjGf--p@KQ;~gAAbfguene?|I9Ohs-(V`R-l(*fkZ-vT4>cwmGV4))SMhHTrxA zvg%gqjhITO`fHaf%i8ID{6{&9H!~5tS*^*`Ia660fU~4L4zdpQ0_7gi!m56W>~oLF zF+e?Fmd;$gRnEn1i}=rUpfbgvuDQgsx%bP)X>2{`^zOvYUolf9Z@Id(42TN_^%~4V zi9;QrdlN!+=$M%x5!TH%f9IDyE?3H_ z7G=|V%pX4JUxxmAb4HFrz3Xc%Fd|xtDRhp33A1gcMrcv~-L2fBtaYQ><5d+tHtoY; zYfn{%nr*=|tsU5I!OYk0KTtMSr4O*#=2`1d@46z{P3nPqmd)=5NXmJk?t#Mqoi88? z^-%XTqdZ#G)mI?Ov_;IcZ4H@hJ*$56Q_?J~IL>BPanj~*9y@cu7FAVsGqL)cZK$Z9 z9o^~#hhS4i!X9cx(O#`2fMnVVZklbt$AYz0Xm;w%R)_hq4wQ72*}K)Oe#Q}l+pbFe zOtV?lTIv4)V=BF>m50hP5*v@0GtR4b#UgTeIBvGKV|O5ggaOZG)s1_B%|GWnj*`i= z%^JXxw{{CQb<1SE4jr6x_B9lhZ6?wkG`mibF>Qs0)sX_XM_Zv;J$#D6rX2@I>g}Eg z$fisMu67Wsau@(+taj}^wq8>d)_HnER-NC!aj;^Nv+9(WfH2W(tDtCwH|N1SE?4#Y zQb`ka%^PrTQ+~G&mr*t{$Wd6eXTYeRiibhxkuI!^&F^X;kq}Vh@MSgQE@`8qaxhZ20;xI)Mcv#n@J^DwUyL4Ba)1y zK3Nk8rPH$vNj@cP%_=;PN@q`t@|Fb^1cROHFd6sX5=OxmJ|Tg=n5E;B5@>T)aKd9Y z<_Z_GOS=RRF9er155W3~OIynN>az3(Yl};}k&>AsRfpMXSha7_aWf}J46$&WOUpAY zTeue@5bEZ)XQns=>sgof7rK9D6uCf~XGT=L_XJZ>z5)G|`ou&svZsZw2RI zp+Zo}1UBUf1LHEg08h)X$EDrEY}EOEJcjwK2LsReKEj4$rd`?+aF`ZmAu|NVOw37L zCgzJ*o}u}(rjcs;>a2LxS&_-pPSNwTwv$VA$?QSoB;7DuAUo(svquh?i$|{5JR2IZL^zZWx>Q{oq||Lp^uQ5Zii;H5e|{{#P4Z0EiXJH3-X zk(AK~mMtU6^u=Xkf_^u!6*IJ|AO9U=VM%$zK(8-b5S$alac4hnKYsDMv&Y&mT|9oV z`FzrdAi8+@OcF+4U9RK19RRwso5l5cWP_wRVyP1d6DifNGC<~OhGw+ zT~DVK=8+BbP+=m;pkEelBMv%$Res#N(JZ&*)^dM*E8haAu0F`iZ?bIm==mAXzoeJw zg;kr=Zz6-vE4Vyr&#QNK!!_%_j&Vud=-K3{t~m;!P`6kwjr;~9!@HvBuA=t|PiGX@ zk$LoN@yM7EgxQ&X7duxr|4>pgBw)5W-IC;_M4GaCBx$4ts|Efy9es0kDXFL7mIM@q zV3|&)Q)(He`#QqoBqV zifL-ecruu-FG=CMBIv=A6z$~*n5vxsotonnni@&%IK5Ufn7m>4Dh=bO?O4t3DObz} zH!XD295)^Brpay^;imp>dJhK)8~+m>yLQ6hLN_UM^c^=n=%#yQO5a*HHQ-NoaxPAi zwAnPHd^+i*HRZ;D#e=cjD-_!W(&p+A>cS25lk!o#GnC#dPg~X=g4%wn??4Lg1mC$? zS`QP7Bz#&Z_>%j40OJ?m=g%_zto!_I);|t>JwC3OoC5mH`YB{PJ-uT@(sH@sA*HS#x0p3Q;mss zY%&p(J@U~&#gdXAT&~wIyIey+6Vb+@WuYxb(`}P&%i}oCv86xX_1yo@H#}{By6R`% zPHL|5Rg1DXZs$KZE*~^6o8z8g7_=DeHQ+K(8(Jf9J?IUzw}H7i94DeR0XKj?G?(LA zf%8E}&f~atU=yf-KWy|cIq0)!cYzx~J@I!Hg&l8e4Zv_Tjh*9+pq>wLToAAZRF%td zdWJzKprrzvK<#MbfE}Pm(FEW&&@a)lfIC3HN6QB80{vhi0$}=}kLDpM;BBC~rML!n zg3&GIxB>ad5Lg5H+cHE6%q{1*)o6!-%RqldYXa^9tzUtRff-$mMQ>v|pu5o8nH=;0 z+6CZ7(3@x-z+3@d>}cOJohkqYc0(5!4d^Vi9^h=ykI=Zc5jE&e8G{Q)OHB5)VzuV_`H!EiV{Zla9?HsU!K#GY8d zI#3hdY4d;?{R%A~xC3-l1;-UJIp~KQIIae`{$V7r5fr%W5v(`bUf>4MqD}alC6j}G zgZ3J5$0lwP=K|9NrtMLV3)qY(fpwsXXsy6ThH=$@4r~H_1#KQ?s1fwP(7u10rYLg$ z@r0Eh=;^_EPUMXw9}j>)A1;uX?JquA;IZ4N@W9_usaO5K{a6V%PDMy4S&rVQ57V;3 zX9aJ>vyc@#E82W}L=?)nWnGR(i%0E<3bX%k+Ed9ldeO#nQFhJQ z{e2ShUiG2_F8L4x z{q|}oHC`G*cXg|Hj^E=+24k6M_9X?)@6gkYm-Kv@iRNF37&`^_>rL!Qr{j3I;<&lY zqxsL0C6F}qNs=oHHnQN#=x>)SzKs~91n1#)y5oC2-S(}Xp7>tR=TC%-!PNhVh*;@jRgTrb7kbXm`D}C3u5@0q%^s6gbL_?#mrUlj`SPzyf*PDcqTCQ415Z!V!n%=pp=j(Z@ zyEcW_2sHUrL`azzmQeU}5LJ-0NkP!2Yl(r5zRq5Q8v5Hc3rVH_-5E`HTrc4pc>B%k z5rl6OS<$_4>g<%r0SoPbo0;eppV5F@(U7pl&BZ_cRVQ*65h+u{6(;F3(6T4T_3zvOpL-$}<`0ws$ zyavDNo{HIv`^Ca^qX9Q9WGAL-s;>r>D@`QvqLCLu zsq>~DzWsikig)|`U!!BX=Jt+eEBApnO7y{ANv}PQzVNFBKPsTPk?kCv_ ziKCxnmjNOU*Y5pce}|-@Ptu!N8C}$4A?>uK$HHglN?T~wZB<}4Zd!S0uVOYWzHK48 zXV;Nv+H?DDti|hhe&-u<<;iHfGns1cHZk6$B2l39r@O1^m$&tF^B)4==oU9J@h-aY zp1?a~5q<5B5B=%ha-ySiT+t*^+)dzMuS+0ZwE14NZ`T4A2;1^XG18laQq3O%8I33` zSj2BJf)fb=lP#8F;In1KM|_@;&s;5eMZn^wxUO`^qTeO=xK%;gGdQq zR?H5V_^p`U2E428Z=t=Al&$WS^zMu@u|SIz-z$Cr!gs8e=FGQ4(qn}?R4QDtCK$;! z$t%zmOiGYz-XLNJ2?#-&$TkF-9}7X68W~Rvl~R`Ej!=xyiAjUW*C3K;Oc=TiGHznn zD3T$tG+GwDJp>|?j7Nk63o>qGI9tZa5x}`JehpaEgkTa9h63$k=rBVALV;p+Ku<9A zGDC_mpr}Zo?F=;l?HK|P5e3m!hW0UZm!ZMYK%2sW_A=DNP_Q0oLj=$>4BcdCU<~HI z%_44#A*r!C)So=@xIZh33d+lkeUjdZhwix;vf9^yttvkYqd9S6LrlpR@9#1G@3)mSQi9|x`PaiWCb)gs0kh=Fe{6|)T_mGANvcNj=6 z-(D(q7;vg}6p4y>k{T#jR^wXrKOgY#pQT=i;tlL^ZmDY zk`}nP-@sKEST9~jKl3y&fuy3qrzVgsfgN~1usch3knhiNI`QiSVhMCgd$jlU)PxRB zoIi}D1$Fi7(BSV`hb`j%VI(SWbU&X)^q9oc!w@X{KLhujl%pe8^iCuTP*W>Ff=2hN z{V^Im2tCENM3NiS)X(Jm=-K8aj!S~Gwtj(MK~KK8E{UYY82cGZ2*8Eqe&EPCrb1#A zKTGNtS7BLs@tTT4P9u_JX%b_SNgD4c6&ELyDP*Vk*JLs^u&7@!hJh@K#I_!lF*g@_*+Ng6iWuSRU^ z1}|}W3KDGZXXM!+T*ac8f_r77_)Us*?#~zj-;EY=`v|G}{x$+LS|++i5X-2BekrdC z#X$D2}PhG(=G* aJ_i!Weum1sw6MH@h03YkJ()&c3Hcw8sm68y diff --git a/uc_sgsim/c_core/uc_sgsim.so b/uc_sgsim/c_core/uc_sgsim.so index 91099ad2d50a3ec5f63b23dddd1e60425b5b6a00..38b8039ca51dfcee916ee0e0bb42a8ff1aeec5dc 100755 GIT binary patch delta 10958 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 L(b@zy(jWc5fZi4R From 1c930bc270307ae88a0d0b131b8b2eb6ec27e67b Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Mon, 22 Jan 2024 21:50:01 +0800 Subject: [PATCH 06/13] fix(sgsim): make cov cache flag set to false only when the realization is generated correctly --- uc_sgsim/sgsim.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/uc_sgsim/sgsim.py b/uc_sgsim/sgsim.py index f88eabb..7680a83 100644 --- a/uc_sgsim/sgsim.py +++ b/uc_sgsim/sgsim.py @@ -108,9 +108,6 @@ def _process(self, randomseed: int = 0, parallel: bool = False) -> np.array: if neighbor < self.max_neighbor: neighbor += 1 - - # Set cov_cache flag to False to ensure cov_cache only compute once - self.kriging._cov_cache_flag = False self.randomseed += 1 # IF drop is False then proceed to next realization generation @@ -118,6 +115,8 @@ def _process(self, randomseed: int = 0, parallel: bool = False) -> np.array: self.random_field[counts, :] = z counts = counts + 1 iteration_failed = 0 + # Set cov_cache flag to False to ensure cov_cache only compute once + self.kriging._cov_cache_flag = False print('Progress = %.2f' % (counts / self.realization_number * 100) + '%', end='\r') print('Progress = %.2f' % 100 + '%\n', end='\r') From 3c5b1a371a1846806bee8404b5cb918fbf23a278 Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Mon, 29 Jan 2024 22:21:31 +0800 Subject: [PATCH 07/13] build: add pytest-xdist --- Pipfile | 1 + Pipfile.lock | 283 ++++++++++++++++++++++++++--------------------- requirements.txt | 81 +++++++++++--- 3 files changed, 218 insertions(+), 147 deletions(-) diff --git a/Pipfile b/Pipfile index 1d8424e..d0e24b3 100644 --- a/Pipfile +++ b/Pipfile @@ -13,6 +13,7 @@ pre-commit = "*" cpplint = "*" pytest = "*" pytest-cov = "*" +pytest-xdist = "*" [requires] python_version = "3.11" diff --git a/Pipfile.lock b/Pipfile.lock index 11d7020..c84f591 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "eda8515dd3a1ff709bab9b9e956a7b3f71c9b63d652cbca5e2a637b2b71a9954" + "sha256": "f0cfe6a62376d2ef7fbb7ba4e0d49c9416742c5a75588cf2f22d85b3f9686486" }, "pipfile-spec": 6, "requires": { @@ -76,51 +76,51 @@ }, "fonttools": { "hashes": [ - "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be", - "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154", - "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8", - "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d", - "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda", - "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9", - "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767", - "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391", - "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc", - "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b", - "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca", - "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c", - "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984", - "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4", - "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7", - "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6", - "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d", - "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500", - "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5", - "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980", - "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540", - "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71", - "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd", - "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982", - "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671", - "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf", - "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c", - "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7", - "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7", - "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa", - "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11", - "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826", - "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9", - "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82", - "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff", - "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992", - "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812", - "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8", - "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78", - "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d", - "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf", - "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538" + "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e", + "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37", + "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac", + "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae", + "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b", + "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc", + "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b", + "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07", + "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70", + "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71", + "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df", + "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6", + "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1", + "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670", + "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7", + "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6", + "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635", + "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899", + "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50", + "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9", + "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085", + "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb", + "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c", + "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3", + "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184", + "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8", + "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506", + "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c", + "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c", + "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b", + "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0", + "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c", + "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa", + "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f", + "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4", + "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c", + "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1", + "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946", + "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d", + "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952", + "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703", + "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8" ], "markers": "python_version >= '3.8'", - "version": "==4.47.0" + "version": "==4.47.2" }, "kiwisolver": { "hashes": [ @@ -408,34 +408,34 @@ }, "scipy": { "hashes": [ - "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c", - "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6", - "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8", - "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d", - "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97", - "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff", - "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993", - "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3", - "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd", - "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7", - "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446", - "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa", - "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937", - "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56", - "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd", - "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79", - "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4", - "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4", - "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710", - "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660", - "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41", - "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea", - "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65", - "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be", - "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec" + "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc", + "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08", + "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3", + "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd", + "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c", + "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c", + "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490", + "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371", + "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2", + "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b", + "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a", + "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba", + "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35", + "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338", + "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc", + "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70", + "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c", + "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e", + "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067", + "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467", + "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563", + "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c", + "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372", + "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1", + "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3" ], "index": "pypi", - "version": "==1.11.4" + "version": "==1.12.0" }, "six": { "hashes": [ @@ -455,66 +455,74 @@ "markers": "python_version >= '3.8'", "version": "==3.4.0" }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", - "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", - "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", - "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", - "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", - "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", - "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", - "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", - "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", - "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", - "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", - "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", - "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", - "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", - "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", - "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", - "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", - "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", - "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", - "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", - "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", - "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", - "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", - "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", - "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", - "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", - "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", - "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", - "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", - "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", - "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", - "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", - "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", - "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", - "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", - "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", - "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", - "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", - "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", - "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", - "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", - "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", - "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", - "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", - "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", - "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", - "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", - "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", - "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", - "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", - "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", - "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" + "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61", + "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1", + "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7", + "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7", + "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75", + "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd", + "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35", + "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04", + "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6", + "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042", + "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166", + "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1", + "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d", + "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c", + "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66", + "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70", + "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1", + "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676", + "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630", + "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a", + "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74", + "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad", + "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19", + "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6", + "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448", + "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018", + "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218", + "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756", + "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54", + "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45", + "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628", + "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968", + "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d", + "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25", + "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60", + "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950", + "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06", + "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295", + "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b", + "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c", + "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc", + "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74", + "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1", + "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee", + "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011", + "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156", + "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766", + "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5", + "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581", + "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016", + "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c", + "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3" ], "markers": "python_version >= '3.8'", - "version": "==7.4.0" + "version": "==7.4.1" }, "cpplint": { "hashes": [ @@ -531,6 +539,14 @@ ], "version": "==0.3.8" }, + "execnet": { + "hashes": [ + "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41", + "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.2" + }, "filelock": { "hashes": [ "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", @@ -581,11 +597,11 @@ }, "pluggy": { "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.4.0" }, "pre-commit": { "hashes": [ @@ -597,11 +613,11 @@ }, "pytest": { "hashes": [ - "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", - "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" + "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c", + "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6" ], "index": "pypi", - "version": "==7.4.4" + "version": "==8.0.0" }, "pytest-cov": { "hashes": [ @@ -611,6 +627,14 @@ "index": "pypi", "version": "==4.1.0" }, + "pytest-xdist": { + "hashes": [ + "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a", + "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24" + ], + "index": "pypi", + "version": "==3.5.0" + }, "pyyaml": { "hashes": [ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", @@ -642,6 +666,7 @@ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", diff --git a/requirements.txt b/requirements.txt index 336bd2c..9b5f296 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,63 @@ -attrs==22.2.0 -contourpy==1.0.7 -coverage==7.2.1 -cycler==0.11.0 -fonttools==4.39.0 -iniconfig==2.0.0 -kiwisolver==1.4.4 -matplotlib==3.7.1 -numpy==1.24.2 -packaging==23.0 -Pillow==9.4.0 -pluggy==1.0.0 -pyparsing==3.0.9 -pytest==7.2.2 -pytest-cov==4.0.0 -python-dateutil==2.8.2 -scipy==1.10.1 -six==1.16.0 +-i https://pypi.org/simple + +cfgv==3.4.0 ; python_version >= '3.8' + +colorama==0.4.6 ; sys_platform == 'win32' + +contourpy==1.2.0 ; python_version >= '3.9' + +coverage[toml]==7.4.1 ; python_version >= '3.8' + +cpplint==1.6.1 + +cycler==0.12.1 ; python_version >= '3.8' + +distlib==0.3.8 + +execnet==2.0.2 ; python_version >= '3.7' + +filelock==3.13.1 ; python_version >= '3.8' + +fonttools==4.47.2 ; python_version >= '3.8' + +identify==2.5.33 ; python_version >= '3.8' + +iniconfig==2.0.0 ; python_version >= '3.7' + +kiwisolver==1.4.5 ; python_version >= '3.7' + +matplotlib==3.8.2 + +nodeenv==1.8.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6' + +numpy==1.26.3 + +packaging==23.2 ; python_version >= '3.7' + +pillow==10.2.0 ; python_version >= '3.8' + +platformdirs==4.1.0 ; python_version >= '3.8' + +pluggy==1.4.0 ; python_version >= '3.8' + +pre-commit==3.6.0 + +pyparsing==3.1.1 ; python_full_version >= '3.6.8' + +pytest==8.0.0 + +pytest-cov==4.1.0 + +pytest-xdist==3.5.0 + +python-dateutil==2.8.2 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' + +pyyaml==6.0.1 ; python_version >= '3.6' + +scipy==1.12.0 + +setuptools==69.0.3 ; python_version >= '3.8' + +six==1.16.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' + +virtualenv==20.25.0 ; python_version >= '3.7' From 4e496f76b523a180251931bea67775c55cabc075 Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Mon, 29 Jan 2024 22:21:54 +0800 Subject: [PATCH 08/13] ci(py): use pytest-xdist to run unittest in parallel --- .github/workflows/sonarcloud.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 1ed79bc..a9eac46 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -33,7 +33,7 @@ jobs: fi - name: Run tests to generate coverage statistics run: | - pytest --cov --cov-report xml:py_coverage.xml + pytest -n auto --cov --cov-report xml:py_coverage.xml - uses: actions/upload-artifact@v3 with: name: python-coverage @@ -64,7 +64,7 @@ jobs: } - name: Run tests to generate coverage statistics run: | - pytest --cov --cov-report xml:py_coverage.xml + pytest -n auto --cov --cov-report xml:py_coverage.xml c_test: name: c-unittest From 06c8580e613b4bd82478c1752edc00862960f922 Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sat, 10 Feb 2024 21:47:23 +0800 Subject: [PATCH 09/13] test(sgsim): refactor and add test cases --- tests/uc_sgsim_test.py | 532 +++++++++++++++++++++++++++++------------ 1 file changed, 379 insertions(+), 153 deletions(-) diff --git a/tests/uc_sgsim_test.py b/tests/uc_sgsim_test.py index 33758bb..3ed22af 100644 --- a/tests/uc_sgsim_test.py +++ b/tests/uc_sgsim_test.py @@ -6,21 +6,19 @@ from uc_sgsim.exception import VariogramDoesNotCompute, IterationError import os +X = 151 +nR = 10 +hs = 35 +a = 17.32 +bw = 1 +C0 = 1 +gaussian = Gaussian(hs, bw, a, C0) +spherical = Spherical(hs, bw, a, C0) +exponential = Exponential(hs, bw, a, C0) + @pytest.mark.sgsim class TestUCSgsim: - @classmethod - def setup_class(cls) -> None: - cls.X = 151 - cls.nR = 10 - cls.bw = 1 - cls.hs = 35 - cls.a = 17.32 - cls.C0 = 1 - cls.gaussian = Gaussian(cls.hs, cls.bw, cls.a, cls.C0) - cls.spherical = Spherical(cls.hs, cls.bw, cls.a, cls.C0) - cls.exponential = Exponential(cls.hs, cls.bw, cls.a, cls.C0) - def sgsim_plot(self, sgsim: uc.UCSgsim) -> None: sgsim.plot() sgsim.plot([0, 1, 2]) @@ -41,154 +39,382 @@ def sgsim_save(self, sgsim: uc.UCSgsim) -> None: sgsim.save_random_field('randomfield/', save_single=False) sgsim.save_variogram('variogram/', save_single=False) - def test_uc_sgsim_gaussian_py_single_process(self): - sgsim = uc.UCSgsim(self.X, self.nR, self.gaussian) - sgsim.compute(n_process=1, randomseed=454) - sgsim.variogram_compute(n_process=1) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_py_with_params(self): - sgsim = uc.UCSgsim( - self.X, - self.nR, - self.gaussian, - z_max=3, - z_min=-3, - max_neigh=6, - ) - sgsim.compute(n_process=1, randomseed=454) - sgsim.variogram_compute(n_process=1) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_py_with_params2(self): - sgsim = uc.UCSgsim( - self.X, - self.nR, - self.gaussian, - z_max=3, - z_min=-3, - max_neighbor=12, - constant_path=True, - cov_cache=True, - ) - sgsim.compute(n_process=1, randomseed=454) - sgsim.variogram_compute(n_process=1) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_py_multi_process(self): - sgsim = uc.UCSgsim(self.X, self.nR, self.gaussian) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_nugget_py(self): - model = Gaussian(35, 1, 17.32, 1, 0.01) - sgsim = uc.UCSgsim(self.X, self.nR, model) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_py_o_kriging_single_process(self): - sgsim = uc.UCSgsim(self.X, self.nR, self.gaussian, kriging='OrdinaryKriging') - sgsim.compute(n_process=1, randomseed=454) - sgsim.variogram_compute(n_process=1) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_py_o_kriging_single_process_with_kwargs(self): - sgsim = uc.UCSgsim( - self.X, - self.nR, - self.gaussian, - kriging='OrdinaryKriging', - constant_path=True, - cov_cache=True, - ) - sgsim.compute(n_process=1, randomseed=454) - sgsim.variogram_compute(n_process=1) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_py_o_kriging_multi_process(self): - sgsim = uc.UCSgsim(self.X, self.nR, self.gaussian, kriging='OrdinaryKriging') - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_o_kriging_nugget_py(self): - model = Gaussian(35, 1, 17.32, 1, 0.01) - sgsim = uc.UCSgsim(self.X, self.nR, model, kriging='OrdinaryKriging') - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_spherical_py(self): - sgsim = uc.UCSgsim(self.X, self.nR, self.spherical) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_spherical_nugget_py(self): - model = Spherical(35, 1, 17.32, 1, 0.01) - sgsim = uc.UCSgsim(self.X, self.nR, model) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_exponential_py(self): - sgsim = uc.UCSgsim(self.X, self.nR, self.exponential) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_exponential_nugget_py(self): - model = Exponential(35, 1, 17.32, 1, 0.01) - sgsim = uc.UCSgsim(self.X, self.nR, model) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) - self.sgsim_plot(sgsim) - self.sgsim_save(sgsim) - - def test_uc_sgsim_gaussian_c(self): - sgsim = uc.UCSgsimDLL(self.X, self.nR, self.gaussian) - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) + @pytest.mark.parametrize( + 'kriging, cov_model, n_process, kwargs', + [ + ('SimpleKriging', gaussian, 1, {}), + ('SimpleKriging', exponential, 1, {}), + ('SimpleKriging', spherical, 1, {}), + ('SimpleKriging', gaussian, 1, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', exponential, 1, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', spherical, 1, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ( + 'SimpleKriging', + gaussian, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + exponential, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + spherical, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ('SimpleKriging', gaussian, 2, {}), + ('SimpleKriging', exponential, 2, {}), + ('SimpleKriging', spherical, 2, {}), + ('SimpleKriging', gaussian, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', exponential, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', spherical, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ( + 'SimpleKriging', + gaussian, + 2, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + spherical, + 2, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + exponential, + 2, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ('OrdinaryKriging', gaussian, 1, {}), + ('OrdinaryKriging', exponential, 1, {}), + ('OrdinaryKriging', spherical, 1, {}), + ('OrdinaryKriging', gaussian, 1, {'z_max': 4, 'z_min': -4, 'max_neighbor': 6}), + ('OrdinaryKriging', exponential, 1, {'z_max': 4, 'z_min': -4, 'max_neighbor': 6}), + ('OrdinaryKriging', spherical, 1, {'z_max': 4, 'z_min': -4, 'max_neighbor': 6}), + ( + 'OrdinaryKriging', + gaussian, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + exponential, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + spherical, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ('OrdinaryKriging', gaussian, 2, {}), + ('OrdinaryKriging', exponential, 2, {}), + ('OrdinaryKriging', spherical, 2, {}), + ('OrdinaryKriging', gaussian, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('OrdinaryKriging', exponential, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('OrdinaryKriging', spherical, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ( + 'OrdinaryKriging', + gaussian, + 2, + { + 'z_max': 4, + 'z_min': -4, + 'max_neighbor': 8, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + exponential, + 2, + { + 'z_max': 4, + 'z_min': -4, + 'max_neighbor': 8, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + spherical, + 2, + { + 'z_max': 4, + 'z_min': -4, + 'max_neighbor': 8, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ], + ) + def test_uc_sgsim_gaussian_py(self, kriging, cov_model, n_process, kwargs): + sgsim = uc.UCSgsim(X, nR, cov_model, kriging=kriging, **kwargs) + sgsim.compute(n_process=n_process, randomseed=454) + sgsim.variogram_compute(n_process=n_process) self.sgsim_plot(sgsim) self.sgsim_save(sgsim) - def test_uc_sgsim_gaussian_ordinary_kriging_c(self): - sgsim = uc.UCSgsimDLL(self.X, self.nR, self.gaussian, kriging='OrdinaryKriging') - sgsim.compute(n_process=2, randomseed=454) - sgsim.variogram_compute(n_process=2) + @pytest.mark.parametrize( + 'kriging, cov_model, n_process, kwargs', + [ + ('SimpleKriging', gaussian, 1, {}), + ('SimpleKriging', exponential, 1, {}), + ('SimpleKriging', spherical, 1, {}), + ('SimpleKriging', gaussian, 1, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', exponential, 1, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', spherical, 1, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ( + 'SimpleKriging', + gaussian, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + exponential, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + spherical, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ('SimpleKriging', gaussian, 2, {}), + ('SimpleKriging', exponential, 2, {}), + ('SimpleKriging', spherical, 2, {}), + ('SimpleKriging', gaussian, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', exponential, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('SimpleKriging', spherical, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ( + 'SimpleKriging', + gaussian, + 2, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + spherical, + 2, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'SimpleKriging', + exponential, + 2, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ('OrdinaryKriging', gaussian, 1, {}), + ('OrdinaryKriging', exponential, 1, {}), + ('OrdinaryKriging', spherical, 1, {}), + ('OrdinaryKriging', gaussian, 1, {'z_max': 4, 'z_min': -4, 'max_neighbor': 6}), + ('OrdinaryKriging', exponential, 1, {'z_max': 4, 'z_min': -4, 'max_neighbor': 6}), + ('OrdinaryKriging', spherical, 1, {'z_max': 4, 'z_min': -4, 'max_neighbor': 6}), + ( + 'OrdinaryKriging', + gaussian, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + exponential, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + spherical, + 1, + { + 'z_max': 3, + 'z_min': -3, + 'max_neighbor': 12, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ('OrdinaryKriging', gaussian, 2, {}), + ('OrdinaryKriging', exponential, 2, {}), + ('OrdinaryKriging', spherical, 2, {}), + ('OrdinaryKriging', gaussian, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('OrdinaryKriging', exponential, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ('OrdinaryKriging', spherical, 2, {'z_max': 3, 'z_min': -3, 'max_neighbor': 6}), + ( + 'OrdinaryKriging', + gaussian, + 2, + { + 'z_max': 4, + 'z_min': -4, + 'max_neighbor': 8, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + exponential, + 2, + { + 'z_max': 4, + 'z_min': -4, + 'max_neighbor': 8, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ( + 'OrdinaryKriging', + spherical, + 2, + { + 'z_max': 4, + 'z_min': -4, + 'max_neighbor': 8, + 'constant_path': True, + 'cov_cache': True, + }, + ), + ], + ) + def test_uc_sgsim_gaussian_c(self, kriging, cov_model, n_process, kwargs): + sgsim = uc.UCSgsimDLL(X, nR, gaussian, kriging=kriging, **kwargs) + sgsim.compute(n_process=n_process, randomseed=454) + sgsim.variogram_compute(n_process=n_process) self.sgsim_plot(sgsim) self.sgsim_save(sgsim) def test_uc_wrong_kriging_method(self): with pytest.raises(TypeError): sgsim = uc.UCSgsim( # noqa - self.X, - self.nR, - self.gaussian, + X, + nR, + gaussian, kriging='wrongKriging', ) def test_uc_sgsim_variogram_exception(self): - sgsim = uc.UCSgsimDLL(self.X, self.nR, self.gaussian) + sgsim = uc.UCSgsimDLL(X, nR, gaussian) sgsim.compute(n_process=1, randomseed=454) with pytest.raises(VariogramDoesNotCompute): sgsim.variogram_plot() - sgsim = uc.UCSgsim(self.X, self.nR, self.gaussian) + sgsim = uc.UCSgsim(X, nR, gaussian) sgsim.compute(n_process=1, randomseed=454) with pytest.raises(VariogramDoesNotCompute): sgsim.variogram_plot() @@ -198,10 +424,10 @@ def test_uc_sgsim_variogram_exception(self): def test_sgsim_plot_params(self): import numpy as np - sgsim = uc.UCSgsim(self.X, self.nR, self.gaussian) - vbandwidth = np.arange(0, self.hs, self.bw) + sgsim = uc.UCSgsim(X, nR, gaussian) + vbandwidth = np.arange(0, hs, bw) np.testing.assert_allclose(sgsim.vbandwidth, vbandwidth) - assert sgsim.vmodel == self.gaussian + assert sgsim.vmodel == gaussian assert sgsim.vmodel_name == 'Gaussian' assert sgsim.vbandwidth_step == 1 assert sgsim.vsill == 1 @@ -209,9 +435,9 @@ def test_sgsim_plot_params(self): def test_get_all_attributes(self): sgsim = uc.UCSgsim( - self.X, - self.nR, - self.gaussian, + X, + nR, + gaussian, z_max=3, z_min=-3, max_neighbor=12, @@ -227,10 +453,10 @@ def test_get_all_attributes(self): assert attributes['constant_path'] is True assert attributes['cov_cache'] is True assert isinstance(attributes['kriging'], SimpleKriging) - assert attributes['model'] == self.gaussian + assert attributes['model'] == gaussian def test_sgsim_repr(self, capsys): - sgsim = uc.UCSgsimDLL(self.X, self.nR, self.gaussian) + sgsim = uc.UCSgsimDLL(X, nR, gaussian) # Call repr() to get the string representation repr_output = repr(sgsim) # Print the repr output (optional) @@ -254,9 +480,9 @@ def test_sgsim_repr(self, capsys): def test_sgsim_reach_iteration_limit(self): sgsim = uc.UCSgsim( - self.X, + X, 100, - self.gaussian, + gaussian, z_max=1, z_min=-1, iteration_limit=3, From 7b145d989d5132236cb88cc961342c88edefe36f Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Tue, 26 Mar 2024 11:47:23 +0800 Subject: [PATCH 10/13] ci: upgrade the version of ci action --- .github/workflows/cmake.yml | 4 +-- .github/workflows/codeql.yml | 10 +++---- .github/workflows/github-pre-commit.yml | 8 +++--- .github/workflows/pypi.yml | 8 +++--- .github/workflows/sonarcloud.yml | 38 ++++++++++++------------- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 6aaca41..f84e5cd 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: sudo apt-get update && sudo apt-get install -y valgrind - name: Configure CMake @@ -40,7 +40,7 @@ jobs: env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: build and test diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index be0de57..080bb21 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -38,9 +38,9 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install dependencies @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} setup-python-dependencies: false @@ -70,7 +70,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -83,6 +83,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/github-pre-commit.yml b/.github/workflows/github-pre-commit.yml index daa0c4d..0abf5af 100644 --- a/.github/workflows/github-pre-commit.yml +++ b/.github/workflows/github-pre-commit.yml @@ -8,9 +8,9 @@ jobs: name: pre-commit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies @@ -18,5 +18,5 @@ jobs: python -m pip install --upgrade pip python -m pip install cpplint - name: Checkout - uses: actions/checkout@v3 - - uses: pre-commit/action@v3.0.0 + uses: actions/checkout@v4 + - uses: pre-commit/action@v3.0.1 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 53e0ff9..ae352f8 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -20,9 +20,9 @@ jobs: runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') && github.event_name != 'release' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies @@ -41,9 +41,9 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'release' && github.event.action == 'published' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index a9eac46..2592723 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -17,11 +17,11 @@ jobs: python-version: ["3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies @@ -34,7 +34,7 @@ jobs: - name: Run tests to generate coverage statistics run: | pytest -n auto --cov --cov-report xml:py_coverage.xml - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: python-coverage path: ./py_coverage.xml @@ -49,11 +49,11 @@ jobs: python-version: ["3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies @@ -72,18 +72,18 @@ jobs: env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up Python 3.8 for gcovr - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.8 - name: install gcovr 5.0 run: | pip install gcovr==5.0 # 5.1 is not supported - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp@v1 + uses: SonarSource/sonarcloud-github-c-cpp - name: Run build-wrapper run: | mkdir build @@ -109,12 +109,12 @@ jobs: run: | gcovr --sonarqube > c_coverage.xml - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: c-coverage path: | ./c_coverage.xml - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: c-coverage2 path: | @@ -126,7 +126,7 @@ jobs: env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: build and test @@ -139,13 +139,13 @@ jobs: needs: [python_test] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Download artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v4 - name: Run sonar-scanner - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarcloud-github-action with: args: > -Dsonar.projectKey=zncl2222_Stochastic_UC_SGSIM_py @@ -159,7 +159,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN_PY }} # Put the name of your token here - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4.0.1 with: token: ${{secrets.CODECOV_TOKEN}} file: py_coverage.xml @@ -171,13 +171,13 @@ jobs: env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp@v2 + uses: SonarSource/sonarcloud-github-c-cpp - name: Download artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v4 - name: Run build-wrapper run: | mkdir build @@ -196,7 +196,7 @@ jobs: --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}" \ --define sonar.coverageReportPaths=c-coverage/c_coverage.xml \ - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4.0.1 with: token: ${{secrets.CODECOV_TOKEN}} file: c-coverage2/cover.info From 7359113025510d0a01b81b8417f036ee6206f8c7 Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sat, 8 Jun 2024 22:56:18 +0800 Subject: [PATCH 11/13] ci: build shared library in workflow --- .github/workflows/cmake.yml | 35 ++++++++++++----------- .github/workflows/pypi.yml | 39 ++++++++++++++++++++++++++ .github/workflows/sonarcloud.yml | 46 +++++++++++++++++++++++++++---- cmake_build.bat | 4 +-- cmake_build.sh | 8 +++--- uc_sgsim/c_core/uc_sgsim.dll | Bin 85624 -> 0 bytes uc_sgsim/c_core/uc_sgsim.so | Bin 37112 -> 0 bytes 7 files changed, 103 insertions(+), 29 deletions(-) delete mode 100644 uc_sgsim/c_core/uc_sgsim.dll delete mode 100755 uc_sgsim/c_core/uc_sgsim.so diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index f84e5cd..83b688a 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -14,25 +14,24 @@ jobs: # You can convert this to a matrix build if you need cross-platform coverage. # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - run: sudo apt-get update && sudo apt-get install -y valgrind - - - name: Configure CMake - # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. - # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} - - - name: Build - # Build your program with the given configuration - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} - - - name: Test - working-directory: ${{github.workspace}}/build - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: make test && make memcheck + - uses: actions/checkout@v4 + - run: sudo apt-get update && sudo apt-get install -y valgrind + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + + - name: Build + # Build your program with the given configuration + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: make test && make memcheck build_windows: name: c-build-windows diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index ae352f8..6e19dfc 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -16,8 +16,32 @@ on: types: [published] jobs: + build_shared_library: + strategy: + matrix: + runs-on: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.runs-on }} + steps: + - uses: actions/checkout@v4 + - name: Build DLL & Set file name windows + if: matrix.runs-on == 'windows-latest' + shell: pwsh + run: | + .\cmake_build.bat -s + echo "filename=uc_sgsim.dll" >> $env:GITHUB_ENV + - name: Build Shared Library & Set file name ubuntu + if: matrix.runs-on == 'ubuntu-latest' + run: | + sh ./cmake_build.sh -s + echo "filename=uc_sgsim.so" >> "$GITHUB_ENV" + - uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.runs-on }}-shared-library + path: ./uc_sgsim/c_core/${{ env.filename }} + test-release: runs-on: ubuntu-latest + needs: [build_shared_library] if: startsWith(github.ref, 'refs/tags/') && github.event_name != 'release' steps: - uses: actions/checkout@v4 @@ -29,6 +53,13 @@ jobs: run: | python -m pip install --upgrade pip pip install build + - name: Download All Artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + - run: | + mv ./uc_sgsim.dll ./uc_sgsim/c_core + mv ./uc_sgsim.so ./uc_sgsim/c_core - name: Build package run: python -m build - name: Publish distribution to Test PyPI @@ -39,6 +70,7 @@ jobs: release-job: runs-on: ubuntu-latest + needs: [build_shared_library] if: github.event_name == 'release' && github.event.action == 'published' steps: - uses: actions/checkout@v4 @@ -50,6 +82,13 @@ jobs: run: | python -m pip install --upgrade pip pip install build + - name: Download All Artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + - run: | + mv ./uc_sgsim.dll ./uc_sgsim/c_core + mv ./uc_sgsim.so ./uc_sgsim/c_core - name: Build package run: python -m build - name: Publish distribution to PyPI diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 2592723..5285ce4 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -7,10 +7,33 @@ on: types: [opened, synchronize, reopened] jobs: + build_shared_library: + strategy: + matrix: + runs-on: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.runs-on }} + steps: + - uses: actions/checkout@v4 + - name: Build DLL & Set file name windows + if: matrix.runs-on == 'windows-latest' + shell: pwsh + run: | + .\cmake_build.bat -s + echo "filename=uc_sgsim.dll" >> $env:GITHUB_ENV + - name: Build Shared Library & Set file name ubuntu + if: matrix.runs-on == 'ubuntu-latest' + run: | + sh ./cmake_build.sh -s + echo "filename=uc_sgsim.so" >> "$GITHUB_ENV" + - uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.runs-on }}-shared-library + path: ./uc_sgsim/c_core/${{ env.filename }} + python_test: name: py-unittest runs-on: ubuntu-latest - + needs: build_shared_library strategy: max-parallel: 5 matrix: @@ -31,10 +54,17 @@ jobs: if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Download All Artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + - run: | + mv ./uc_sgsim.so ./uc_sgsim/c_core - name: Run tests to generate coverage statistics run: | pytest -n auto --cov --cov-report xml:py_coverage.xml - uses: actions/upload-artifact@v4 + if: matrix.python-version == '3.11' with: name: python-coverage path: ./py_coverage.xml @@ -42,7 +72,7 @@ jobs: python_test_windows: name: py-unittest-windows runs-on: windows-latest - + needs: build_shared_library strategy: max-parallel: 5 matrix: @@ -62,6 +92,12 @@ jobs: pip install --upgrade pip pip install -r requirements.txt } + - name: Download All Artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + - run: | + mv ./uc_sgsim.dll ./uc_sgsim/c_core - name: Run tests to generate coverage statistics run: | pytest -n auto --cov --cov-report xml:py_coverage.xml @@ -83,7 +119,7 @@ jobs: run: | pip install gcovr==5.0 # 5.1 is not supported - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp + uses: SonarSource/sonarcloud-github-c-cpp@v2 - name: Run build-wrapper run: | mkdir build @@ -145,7 +181,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@v4 - name: Run sonar-scanner - uses: SonarSource/sonarcloud-github-action + uses: SonarSource/sonarcloud-github-action@master with: args: > -Dsonar.projectKey=zncl2222_Stochastic_UC_SGSIM_py @@ -175,7 +211,7 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp + uses: SonarSource/sonarcloud-github-c-cpp@v2 - name: Download artifacts uses: actions/download-artifact@v4 - name: Run build-wrapper diff --git a/cmake_build.bat b/cmake_build.bat index 751ce46..de646a5 100644 --- a/cmake_build.bat +++ b/cmake_build.bat @@ -5,12 +5,12 @@ cd cbuild IF /I "%1"=="-s" ( cmake -DIS_EXECUTE=OFF -G "MinGW Makefiles" .. + make + %~dp0cbuild/c_example.exe ) ELSE ( cmake -DIS_EXECUTE=ON -G "MinGW Makefiles" .. ) -make -%~dp0cbuild/c_example.exe cd .. exit /b 0 diff --git a/cmake_build.sh b/cmake_build.sh index f276452..9fd8188 100644 --- a/cmake_build.sh +++ b/cmake_build.sh @@ -20,11 +20,11 @@ cd cmake_build if [ "$is_execute" = true ]; then echo "Compile the code into an executable file !" cmake -DIS_EXECUTE=ON .. + make + make test + make memcheck else echo "Compile the code into a shared library (dynamic library) !" cmake -DIS_EXECUTE=OFF .. + make fi - -make -make test -make memcheck diff --git a/uc_sgsim/c_core/uc_sgsim.dll b/uc_sgsim/c_core/uc_sgsim.dll deleted file mode 100644 index f6f123e2fb071838270242f3858b7425ff53d8e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85624 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 Zaw%39dTbODfo_`Xex_`?$cm;T{x=C(OlSZA diff --git a/uc_sgsim/c_core/uc_sgsim.so b/uc_sgsim/c_core/uc_sgsim.so deleted file mode 100755 index 38b8039ca51dfcee916ee0e0bb42a8ff1aeec5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37112 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 Date: Sun, 9 Jun 2024 15:46:22 +0800 Subject: [PATCH 12/13] refactor: use submodule to manage c_array_tools --- .gitignore | 2 + .gitmodules | 4 + uc_sgsim/c_core/CMakeLists.txt | 4 +- uc_sgsim/c_core/c_array_tools | 1 + uc_sgsim/c_core/include/kriging.h | 2 +- uc_sgsim/c_core/include/random_tools.h | 2 +- uc_sgsim/c_core/include/sgsim.h | 2 +- uc_sgsim/c_core/lib/c_array.c | 159 ------- uc_sgsim/c_core/lib/c_array.h | 624 ------------------------- uc_sgsim/c_core/lib/c_array_mt.c | 113 ----- uc_sgsim/c_core/src/kriging.c | 8 +- uc_sgsim/c_core/src/matrix_tools.c | 2 +- uc_sgsim/c_core/src/random_tools.c | 2 +- uc_sgsim/c_core/src/sgsim.c | 2 +- uc_sgsim/c_core/src/variogram.c | 2 +- 15 files changed, 20 insertions(+), 909 deletions(-) create mode 100644 .gitmodules create mode 160000 uc_sgsim/c_core/c_array_tools delete mode 100644 uc_sgsim/c_core/lib/c_array.c delete mode 100644 uc_sgsim/c_core/lib/c_array.h delete mode 100644 uc_sgsim/c_core/lib/c_array_mt.c diff --git a/.gitignore b/.gitignore index ea5438b..63c3779 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ variogram* .coverage *.o *.exe +*.so +*.dll diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..6162ea5 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "uc_sgsim/c_core/c_array_tools"] + path = uc_sgsim/c_core/c_array_tools + url = https://github.com/Zncl2222/c_array_tools.git + branch = main diff --git a/uc_sgsim/c_core/CMakeLists.txt b/uc_sgsim/c_core/CMakeLists.txt index d68b37c..52c2949 100644 --- a/uc_sgsim/c_core/CMakeLists.txt +++ b/uc_sgsim/c_core/CMakeLists.txt @@ -19,8 +19,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") # Link each file add_library( uc_sgsim ${LIB_TYPE} - lib/c_array.c - lib/c_array_mt.c + c_array_tools/src/c_array.c + c_array_tools/src/c_array_mt.c src/cov_model.c src/kriging.c src/matrix_tools.c diff --git a/uc_sgsim/c_core/c_array_tools b/uc_sgsim/c_core/c_array_tools new file mode 160000 index 0000000..f9e570c --- /dev/null +++ b/uc_sgsim/c_core/c_array_tools @@ -0,0 +1 @@ +Subproject commit f9e570c8ecf5a41f296adf749d8a413098bec8d0 diff --git a/uc_sgsim/c_core/include/kriging.h b/uc_sgsim/c_core/include/kriging.h index d6d7f4d..cad36cb 100644 --- a/uc_sgsim/c_core/include/kriging.h +++ b/uc_sgsim/c_core/include/kriging.h @@ -12,7 +12,7 @@ #ifndef UC_SGSIM_C_CORE_INCLUDE_KRIGING_H_ #define UC_SGSIM_C_CORE_INCLUDE_KRIGING_H_ -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" # include "../include/cov_model.h" /** diff --git a/uc_sgsim/c_core/include/random_tools.h b/uc_sgsim/c_core/include/random_tools.h index 04fdfa2..ebcbc5d 100644 --- a/uc_sgsim/c_core/include/random_tools.h +++ b/uc_sgsim/c_core/include/random_tools.h @@ -13,7 +13,7 @@ #ifndef UC_SGSIM_C_CORE_INCLUDE_RANDOM_TOOLS_H_ #define UC_SGSIM_C_CORE_INCLUDE_RANDOM_TOOLS_H_ -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" /** * @brief Generate a random path of integers. diff --git a/uc_sgsim/c_core/include/sgsim.h b/uc_sgsim/c_core/include/sgsim.h index 063a6ae..61834a5 100644 --- a/uc_sgsim/c_core/include/sgsim.h +++ b/uc_sgsim/c_core/include/sgsim.h @@ -13,7 +13,7 @@ #define UC_SGSIM_C_CORE_INCLUDE_SGSIM_H_ # include "cov_model.h" -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" /** * @struct sgsim_t diff --git a/uc_sgsim/c_core/lib/c_array.c b/uc_sgsim/c_core/lib/c_array.c deleted file mode 100644 index 72c10cc..0000000 --- a/uc_sgsim/c_core/lib/c_array.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - Copyright (c) 2022 Jian Yu, Chen - License: MIT License - Version: v1.3.2 - file : c_array.c - - The latest version is avaliable at: - https://github.com/Zncl2222/c_array_tools -*/ - -# include "c_array.h" - -/* This is an implementation of c_array extension */ -// ----------------------------------------------------------------------- -/* Array Min and Max */ - -int c_array_max_int(int* arr, int size) { - c_array_maxmin_process(arr, size, "max") -} - -long long c_array_max_long_long(long long* arr, int size) { - c_array_maxmin_process(arr, size, "max") -} - -float c_array_max_float(float* arr, int size) { - c_array_maxmin_process(arr, size, "max") -} - -double c_array_max_double(double* arr, int size) { - c_array_maxmin_process(arr, size, "max") -} - -int c_array_min_int(int* arr, int size) { - c_array_maxmin_process(arr, size, "min") -} - -long long c_array_min_long_long(long long* arr, int size) { - c_array_maxmin_process(arr, size, "min") -} - -float c_array_min_float(float* arr, int size) { - c_array_maxmin_process(arr, size, "min") -} - -double c_array_min_double(double* arr, int size) { - c_array_maxmin_process(arr, size, "min") -} - -// ----------------------------------------------------------------------- -/* Array standard deviation */ - -var_t c_array_var_int(int* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return (var / size); -} - -var_t c_array_var_long_long(long long* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return (var / size); -} - -var_t c_array_var_float(float* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return (var / size); -} - -var_t c_array_var_double(double* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return (var / size); -} - -std_t c_array_std_int(int* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return sqrt(var / size); -} - -std_t c_array_std_long_long(long long* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return sqrt(var / size); -} - -std_t c_array_std_float(float* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return sqrt(var / size); -} - -std_t c_array_std_double(double* arr, int size, mean_t mean) { - c_array_var_process(arr, size, mean) - return sqrt(var / size); -} - -// ----------------------------------------------------------------------- -/* Array mean value */ - -mean_t c_array_mean_int(int* arr, int size, int sum) { - c_array_mean_process(arr, size, sum) -} - -mean_t c_array_mean_long_long(long long* arr, int size, long long sum) { - c_array_mean_process(arr, size, sum) -} - -mean_t c_array_mean_float(float* arr, int size, float sum) { - c_array_mean_process(arr, size, sum) -} - -mean_t c_array_mean_double(double* arr, int size, double sum) { - c_array_mean_process(arr, size, sum) -} - -// ----------------------------------------------------------------------- -/* Array Sum */ - -int c_array_sum_int(int* arr, int size) { - c_array_sum_process(arr, size) -} - -long long c_array_sum_long(long long* arr, int size) { - c_array_sum_process(arr, size) -} - -float c_array_sum_float(float* arr, int size) { - c_array_sum_process(arr, size) -} - -double c_array_sum_double(double* arr, int size) { - c_array_sum_process(arr, size) -} - -// ----------------------------------------------------------------------- -/* Array qsort */ - -int cmpfunc_int(const void * a, const void * b) { - return ( *(int*)a - *(int*)b ); -} - -int cmpfunc_long(const void * a, const void * b) { - return ( *(long long*)a - *(long long*)b ); -} - -int cmpfunc_float(const void * a, const void * b) { - float ret = *(float*)a - *(float*)b; - if(ret > 0){ - return 1; - } else if (ret < 0) { - return -1; - } - return 0; -} - -int cmpfunc_double(const void * a, const void * b) { - double ret = *(double*)a - *(double*)b; - if(ret > 0){ - return 1; - } else if (ret < 0) { - return -1; - } - return 0; -} diff --git a/uc_sgsim/c_core/lib/c_array.h b/uc_sgsim/c_core/lib/c_array.h deleted file mode 100644 index 7d232af..0000000 --- a/uc_sgsim/c_core/lib/c_array.h +++ /dev/null @@ -1,624 +0,0 @@ -/* - Copyright (c) 2022 Jian Yu, Chen - License: MIT License - Version: v1.3.2 - file : c_array.h - - The latest version is avaliable at: - https://github.com/Zncl2222/c_array_tools -*/ - - -# ifndef C_ARRAY_H -# define C_ARRAY_H - -# include -# include -# include -# include -# include - -typedef double mean_t; -typedef double std_t; -typedef double var_t; - -// ----------------------------------------------------------------------- -/* Array structure and initialize */ - -# define c_array(T) struct { T* data; size_t size; size_t capacity; } - -# define c_array_init(arr, c) \ - do { \ - typeof(*((arr)->data)) x; \ - (arr)->size = (c); \ - (arr)->capacity = (c); \ - (arr)->data = calloc((c), sizeof(x)); \ - } while(0) - -# define c_array_copy(arr1, arr2) \ - do { \ - char* dtype_arr1 = c_array_dtype(arr1); \ - char* dtype_arr2 = c_array_dtype(arr2); \ - char* err_msg = "The dtype of two arrays are different"; \ - c_array_assert((dtype_arr1 == dtype_arr2), err_msg); \ - (arr2)->size = (arr1)->size; \ - (arr2)->capacity = (arr1)->capacity; \ - (arr2)->data = malloc((arr2)->capacity * sizeof(typeof(*(arr2)->data))); \ - memcpy((arr2)->data, (arr1)->data, (arr2)->capacity * sizeof(typeof(*(arr2)->data))); \ - } while(0) - -/* c_array_mt.c is necessary for c_array_randnormal & c_array_rand_range */ - -# define c_array_randnormal(arr, c, rng_state) \ - do { \ - (arr)->size = (c); \ - (arr)->capacity = (c); \ - (arr)->data = malloc(sizeof(typeof(*((arr)->data))) * (c)); \ - for (int i = 0; i < (arr)->size; i++) { \ - (arr)->data[i] = random_normal(rng_state); \ - } \ - } while(0) - -# define c_array_rand_range(arr, c, rng_function) \ - do { \ - (arr)->size = (c); \ - (arr)->capacity = (c); \ - (arr)->data = malloc(sizeof(typeof(*((arr)->data))) * (c)); \ - for (int i = 0; i < (arr)->size; i++) { \ - (arr)->data[i] = rng_function; \ - } \ - } while(0) - -typedef c_array(int) c_array_int; -typedef c_array(long long) c_array_long_long; -typedef c_array(float) c_array_float; -typedef c_array(double) c_array_double; - -// ----------------------------------------------------------------------- -/* Array basic operations */ - -# define c_array_capacity(arr) ((arr) ? (arr)->capacity : 0) - -# define c_array_size(arr) ((arr) ? (arr)->size : 0) - -# define c_array_assign(arr, idx, val) \ - do { \ - char* err_msg = "Index out of range (size)"; \ - c_array_assert((idx < (arr)->size), err_msg); \ - (arr)->data[(idx)] = (val); \ - } while(0) - -// ----------------------------------------------------------------------- -/* Arrary size and attributes settings */ - -# define c_array_byte(arr) (sizeof((arr)->data[0])) - -# define c_array_grow(arr) \ - do { \ - if((arr)->capacity == 0) { \ - (arr)->capacity = 1; \ - } \ - (arr)->capacity *= 2; \ - void* ptr = realloc((arr)->data, (arr)->capacity * c_array_byte((arr))); \ - char* err_msg = "Realloc Failed"; \ - c_array_assert((ptr != NULL), err_msg); \ - (arr)->data = ptr; \ - } while(0) - -# define c_array_resize(arr, c) \ - do { \ - void* ptr = realloc((arr)->data, (c) * c_array_byte((arr))); \ - char* err_msg = "Realloc Failed"; \ - c_array_assert((ptr != NULL), err_msg); \ - (arr)->capacity = (c); \ - (arr)->data = ptr; \ - } while(0) - -# define c_array_set_size(arr, l) \ - do { \ - char* err_msg = "Size should less than or equal to capacity"; \ - c_array_assert((l <= (arr)->capacity), err_msg); \ - for (int i = (arr)->size; i < (arr)->capacity; i++) { \ - (arr)->data[i] = 0; \ - } \ - (arr)->size = (l); \ - } while(0) - -// ----------------------------------------------------------------------- -/* Arrary push_back and pop_back */ - -# define c_array_push_back(arr, val) \ - do { \ - if (c_array_capacity((arr)) <= c_array_size((arr))) { \ - c_array_grow((arr)); \ - } \ - (arr)->data[(arr)->size] = val; \ - (arr)->size++; \ - } while(0) - -# define c_array_pop_back(arr) \ - do { \ - char* err_msg = "Size should greater than 0"; \ - c_array_assert(((arr)->size > 0), err_msg); \ - (arr)->data[(arr)->size - 1] = 0; \ - (arr)->size--; \ - } while(0) - -// ----------------------------------------------------------------------- -/* Arrary insert and remove */ - -# define c_array_moveright(arr, idx) \ - do { \ - if ((arr)->capacity <= (arr)->size) { \ - c_array_grow(arr); \ - } \ - for(int i = (arr)->size; i > idx; i--) { \ - (arr)->data[i] = (arr)->data[i - 1]; \ - } \ - } while(0) - -# define c_array_moveleft(arr, idx) \ - do { \ - for(int i = idx; i < (arr)->size - 1; i++) { \ - (arr)->data[i] = (arr)->data[i + 1]; \ - } \ - } while(0) \ - -# define c_array_insert(arr, idx, val) \ - do { \ - if ((idx) < (arr)->size) { \ - c_array_moveright((arr), (idx)); \ - (arr)->data[(idx)] = (val); \ - (arr)->size++; \ - } \ - } while(0) - -# define c_array_remove(arr, idx) \ - do { \ - char* err_msg = "Size should greater than 0"; \ - c_array_assert(((arr)->size > 0), err_msg); \ - char* err_msg2 = "Index out of range (size)"; \ - c_array_assert(((arr)->size > idx), err_msg); \ - c_array_moveleft(arr, idx); \ - (arr)->size--; \ - } while(0) - -// ----------------------------------------------------------------------- -/* Arrary concatenation */ - -# define c_array_concat(arr1, arr2) \ - do { \ - char* err_msg = "The data type of two arrays should be the same"; \ - c_array_assert((c_array_dtype((arr1)) == c_array_dtype((arr2))), err_msg); \ - size_t new_capacity = (arr1)->capacity + (arr2)->capacity; \ - size_t new_size = (arr1)->size + (arr2)->size; \ - if ((arr1)->capacity < new_size) { \ - c_array_resize(arr1, new_capacity); \ - } \ - for (int i = 0; i < (arr2)->size; i++) { \ - (arr1)->data[i + (arr1)->size] = (arr2)->data[i]; \ - } \ - (arr1)->size = new_size; \ - } while(0) - -// ----------------------------------------------------------------------- -/* Array qsort */ - -# define c_array_qsort(arr) \ - do { \ - qsort((arr)->data, (arr)->size, sizeof(typeof((*(arr)->data))), c_array_qsort_cmp((arr)));\ - } while(0) - -# define c_array_qsort_cmp(arr) \ - _Generic((arr)->data, \ - int*: cmpfunc_int, \ - long long*: cmpfunc_long, \ - float*: cmpfunc_float, \ - double*: cmpfunc_double \ - ) - -int cmpfunc_int(const void * a, const void * b); - -int cmpfunc_long(const void * a, const void * b); - -int cmpfunc_float(const void * a, const void * b); - -int cmpfunc_double(const void * a, const void * b); - -// ----------------------------------------------------------------------- -/* Array msort */ - -# define c_array_msort(arr) \ - do { \ - int i, j, k, l1, r1, l2, r2; \ - int curr_size; \ - typeof(*(arr)->data) temp[(arr)->size]; \ - for (curr_size = 1; curr_size < (arr)->size; curr_size *= 2) { \ - l1 = 0; \ - k = 0; \ - while (l1 + curr_size < (arr)->size) { \ - r1 = l1 + curr_size - 1; \ - l2 = r1 + 1; \ - r2 = l2 + curr_size - 1; \ - if(r2 >= (arr)->size) { \ - r2 = (arr)->size - 1; \ - } \ - i = l1; \ - j = l2; \ - while (i <= r1 && j <= r2) { \ - if ((arr)->data[i] <= (arr)->data[j]) { \ - temp[k++] = (arr)->data[i++]; \ - } else { \ - temp[k++] = (arr)->data[j++]; \ - } \ - } \ - while (i <= r1) { \ - temp[k++] = (arr)->data[i++]; \ - } \ - while (j <= r2) { \ - temp[k++] = (arr)->data[j++]; \ - } \ - l1 = r2 + 1; \ - } \ - for (i = l1; k < (arr)->size; i++) { \ - temp[k++] = (arr)->data[i]; \ - } \ - for (i = 0; i < (arr)->size; i++) { \ - (arr)->data[i] = temp[i]; \ - } \ - } \ - } while(0) - -// ----------------------------------------------------------------------- -/* Array Sum */ - -# define c_array_sum(arr) \ - _Generic((arr)->data, \ - int*: c_array_sum_int, \ - long long*: c_array_sum_long, \ - float*: c_array_sum_float, \ - double*: c_array_sum_double \ - )((arr)->data, (arr)->size) - -# define c_array_sum_process(arr, size) \ - typeof(*(arr)) sum = 0; \ - for (int i = 0; i < size; i++) { \ - sum += arr[i]; \ - } \ - return sum; \ - -int c_array_sum_int(int* arr, int size); - -long long c_array_sum_long(long long* arr, int size); - -float c_array_sum_float(float* arr, int size); - -double c_array_sum_double(double* arr, int size); - -// ----------------------------------------------------------------------- -/* Array mean value */ - -# define c_array_mean(arr) \ - _Generic((arr)->data, \ - int*: c_array_mean_int, \ - long long*: c_array_mean_long_long, \ - float*: c_array_mean_float, \ - double*: c_array_mean_double \ - )((arr)->data, (arr)->size, c_array_sum((arr))) - -# define c_array_mean_process(arr, size, sum) \ - mean_t mean = (mean_t)(sum) / (size); \ - return mean; - -mean_t c_array_mean_int(int* arr, int size, int sum); - -mean_t c_array_mean_long_long(long long* arr, int size, long long sum); - -mean_t c_array_mean_float(float* arr, int size, float sum); - -mean_t c_array_mean_double(double* arr, int size, double sum); - -// ----------------------------------------------------------------------- -/* Array standard deviation */ - -# define c_array_std(arr) \ - _Generic((arr)->data, \ - int*: c_array_std_int, \ - long long*: c_array_std_long_long, \ - float*: c_array_std_float, \ - double*: c_array_std_double \ - )((arr)->data, (arr)->size, c_array_mean((arr))) - -# define c_array_var(arr) \ - _Generic((arr)->data, \ - int*: c_array_var_int, \ - long long*: c_array_var_long_long, \ - float*: c_array_var_float, \ - double*: c_array_var_double \ - )((arr)->data, (arr)->size, c_array_mean((arr))) - -# define c_array_var_process(arr, size, mean) \ - var_t var = 0; \ - for (int i = 0; i < (size); i++) { \ - var += pow((arr)[i] - (mean), 2); \ - } \ - -var_t c_array_var_int(int* arr, int size, mean_t mean); - -var_t c_array_var_long_long(long long* arr, int size, mean_t mean); - -var_t c_array_var_float(float* arr, int size, mean_t mean); - -var_t c_array_var_double(double* arr, int size, mean_t mean); - -std_t c_array_std_int(int* arr, int size, mean_t mean); - -std_t c_array_std_long_long(long long* arr, int size, mean_t mean); - -std_t c_array_std_float(float* arr, int size, mean_t mean); - -std_t c_array_std_double(double* arr, int size, mean_t mean); - -// ----------------------------------------------------------------------- -/* Array Min and Max */ - -# define c_array_max(arr) \ - _Generic((arr)->data, \ - int*: c_array_max_int, \ - long long*: c_array_max_long_long, \ - float*: c_array_max_float, \ - double*: c_array_max_double \ - )((arr)->data, (arr)->size) - -# define c_array_min(arr) \ - _Generic((arr)->data, \ - int*: c_array_min_int, \ - long long*: c_array_min_long_long, \ - float*: c_array_min_float, \ - double*: c_array_min_double \ - )((arr)->data, (arr)->size) - -# define c_array_maxmin_process(arr, n, mode) \ - int odd = (n) & 1; \ - typeof(*(arr)) max = -pow(2, (((sizeof(typeof(*(arr)))- 1) * 8))); \ - typeof(*(arr)) min = pow(2, (((sizeof(typeof(*(arr)))- 1) * 8))) - 1; \ - if (odd) { \ - (n)--; \ - } \ - typeof(*(arr)) minimum = arr[0]; \ - typeof(*(arr)) maximum = arr[0]; \ - for (int i = 0; i < n; i = i + 2) { \ - if (arr[i] > arr[i + 1]) { \ - minimum = arr[i + 1], \ - maximum = arr[i]; \ - } else { \ - minimum = arr[i], \ - maximum = arr[i + 1]; \ - } \ - if (maximum > max) { \ - max = maximum; \ - } \ - if (minimum < min) { \ - min = minimum; \ - } \ - } \ - if (odd) { \ - if (arr[n] > max) { \ - max = arr[n]; \ - } \ - if (arr[n] < min) { \ - min = arr[n]; \ - } \ - } \ - if (mode == "max") { \ - return max; \ - } else { \ - return min; \ - } \ - -int c_array_max_int(int* arr, int size); - -long long c_array_max_long_long(long long* arr, int size); - -float c_array_max_float(float* arr, int size); - -double c_array_max_double(double* arr, int size); - -int c_array_min_int(int* arr, int size); - -long long c_array_min_long_long(long long* arr, int size); - -float c_array_min_float(float* arr, int size); - -double c_array_min_double(double* arr, int size); - -// ----------------------------------------------------------------------- -/* Arrary utils */ - -# define c_array_autoformat(arr) \ - _Generic((arr).data, \ - int*: "%d", \ - long long*: "%lld", \ - float*: "%f", \ - double*: "%lf" \ - ) - -# define c_array_dtype(arr) \ - _Generic((arr)->data, \ - int*: "int", \ - long long*: "long long", \ - float*: "float", \ - double*: "double" \ - ) - -# define c_array_print(arr) \ - do { \ - printf(#arr); \ - printf(" = ["); \ - for (int i = 0; i < (arr).size; i++) { \ - if (i < (arr).size - 1) { \ - printf(c_array_autoformat((arr)), (arr).data[i]); \ - printf(", "); \ - } else { \ - printf(c_array_autoformat((arr)), (arr).data[i]); \ - } \ - } \ - printf("]\n"); \ - } while(0) - -# define c_array_printf(arr, format) \ - do { \ - printf(#arr); \ - printf(" = ["); \ - for(int i = 0; i < (arr).size; i++) { \ - if (i < (arr).size - 1) { \ - printf((format), arr.data[i]); \ - printf(", "); \ - } else { \ - printf((format), arr.data[i]); \ - } \ - } \ - printf("]\n"); \ - } while(0) - -# define c_array_empty(arr) ((arr)->size == 0) - -# define c_array_swap(arr, idx1, idx2) \ - do { \ - char* err_msg = "Index out of range (size)"; \ - c_array_assert(((idx1) < (arr)->size && (idx2) < (arr)->size), err_msg); \ - typeof(*((arr)->data)) x; \ - x = (arr)->data[idx2]; \ - (arr)->data[idx2] = (arr)->data[idx1]; \ - (arr)->data[idx1] = x; \ - } while(0) \ - -# define c_array_reverse(arr) \ - do { \ - typeof(*((arr)->data)) x; \ - for (int i = 0; i < ((arr)->size / 2); i++) { \ - x = (arr)->data[i]; \ - (arr)->data[i] = (arr)->data[(arr)->size - 1 - i]; \ - (arr)->data[(arr)->size - 1 - i] = x; \ - } \ - } while(0) - -# define c_array_free(arr) (free((arr)->data)) - -# define c_array_assert(expr, msg) \ - do { \ - if (!(expr)) { \ - printf("Error: %s\n", (msg)); \ - assert((expr)); \ - } \ - } while(0) - -// ----------------------------------------------------------------------- -/* Matrix structure and initialize */ - -# define c_matrix(T) struct { T** data; size_t rows; size_t cols; } - -# define c_matrix_init(mat, r, c) \ - do{ \ - typeof(**((mat)->data)) m; \ - typeof(*((mat)->data)) n; \ - (mat)->rows = (r); \ - (mat)->cols = (c); \ - (mat)->data = malloc(r * sizeof(n)); \ - for (int i = 0; i < (r); i++) { \ - (mat)->data[i] = malloc(c * sizeof(m)); \ - }\ - } while(0) - -typedef c_matrix(int) c_matrix_int; -typedef c_matrix(long long) c_matrix_long_long; -typedef c_matrix(float) c_matrix_float; -typedef c_matrix(double) c_matrix_double; - -// ----------------------------------------------------------------------- -/* Matrix basic operations */ - -# define c_matrix_rows(mat) ((mat) ? (mat)->rows : 0) - -# define c_matrix_cols(mat) ((mat) ? (mat)->cols : 0) - -# define c_matrix_assign(mat, row, col, val) \ - do { \ - char* err_msg = "Index out of range (row)"; \ - c_array_assert((row < (mat)->rows), err_msg); \ - char* err_msg2 = "Index out of range(col)"; \ - c_array_assert((col < (mat)->cols), err_msg2); \ - (mat)->data[row][col] = val; \ - } while(0) - -// ----------------------------------------------------------------------- -/* Matrix utils */ - -# define c_matrix_print(mat, format) \ - do { \ - printf(#mat); \ - printf(" =\n [ "); \ - for (int i = 0; i < (mat).rows; i++) { \ - if (i != 0) \ - printf(" "); \ - printf("[ "); \ - for(int j = 0; j < (mat).cols; j++) { \ - if (j < (mat).cols) { \ - printf((format), (mat).data[i][j]); \ - printf(", "); \ - } else { \ - printf((format), (mat).data[i][j]); \ - } \ - } \ - printf("]"); \ - if (i < (mat).rows - 1){ \ - printf("\n"); \ - } \ - } \ - printf(" ]\n"); \ - } while(0) - -# define c_matrix_free(mat) \ - do { \ - for (int i = 0; i < (mat)->rows; i++) { \ - free((mat)->data[i]); \ - } \ - free((mat)->data); \ - } while(0) - -// ----------------------------------------------------------------------- -/* Random number generator */ - -/* mt19937 license is declared in c_array_mt.c */ -# ifndef M_PI -# define M_PI 3.1415926 -# endif - -# define MT_N 624 -# define MT_M 397 -# define MT_MATRIX_A 0x9908b0df -# define MT_UPPER_MASK 0x80000000 -# define MT_LOWER_MASK 0x7fffffff - -typedef struct { - unsigned int state[MT_N]; - int index; -} mt19937_state; - -void mt19937_init(mt19937_state* state, unsigned int seed); - -unsigned long mt19937_generate(mt19937_state* state); - -float mt19937_get_float(mt19937_state* state); - -float mt19937_get_float_range(mt19937_state* state, float m, float n); - -double mt19937_get_double(mt19937_state* state); - -double mt19937_get_double_range(mt19937_state* state, double m, double n); - -int mt19937_get_int32_range(mt19937_state* state, int m, int n); - -double mt19937_random_normal(mt19937_state* state); - -# endif diff --git a/uc_sgsim/c_core/lib/c_array_mt.c b/uc_sgsim/c_core/lib/c_array_mt.c deleted file mode 100644 index de58edf..0000000 --- a/uc_sgsim/c_core/lib/c_array_mt.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 1996 - 2002, Makoto Matsumoto and Takuji Nishimura, - * All rights reserved. - * - * Copyright 2022, Jian Yu, Chen - * All rights reserved. - * - * ----------------------------------------------------------------------- - * Version: v1.3.2 - * file : c_array_mt.c - * - * The latest version is avaliable at: - * https://github.com/Zncl2222/c_array_tools - * - * ----------------------------------------------------------------------- - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. The names of its contributors may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -# include -# include -# include "c_array.h" - - -void mt19937_init(mt19937_state* state, unsigned int seed) { - state->state[0] = seed; - - for (int i = 1; i < MT_N; i++) { - state->state[i] = (1812433253 * (state->state[i - 1] ^ (state->state[i - 1] >> 30)) + i); - } - - state->index = MT_N; -} - -unsigned long mt19937_generate(mt19937_state* state) { - if (state->index >= MT_N) { - for (int i = 0; i < MT_N - MT_M; i++) { - unsigned long x = (state->state[i] & MT_UPPER_MASK) | (state->state[i + 1] & MT_LOWER_MASK); - state->state[i] = state->state[i + MT_M] ^ (x >> 1) ^ ((x & 1) * MT_MATRIX_A); - } - - for (int i = MT_N - MT_M; i < MT_N-1; i++) { - unsigned long x = (state->state[i] & MT_UPPER_MASK) | (state->state[i + 1] & MT_LOWER_MASK); - state->state[i] = state->state[i + (MT_M-MT_N)] ^ (x >> 1) ^ ((x & 1) * MT_MATRIX_A); - } - - unsigned long x = (state->state[MT_N - 1] & MT_UPPER_MASK) | (state->state[0] & MT_LOWER_MASK); - state->state[MT_N - 1] = state->state[MT_M - 1] ^ (x >> 1) ^ ((x & 1) * MT_MATRIX_A); - - state->index = 0; - } - - unsigned long y = state->state[state->index++]; - y ^= (y >> 11); - y ^= (y << 7) & 0x9d2c5680; - y ^= (y << 15) & 0xefc60000; - y ^= (y >> 18); - - return y; -} - -int mt19937_get_int32_range(mt19937_state* state, int m, int n) { - return mt19937_generate(state) % (n - m + 1) + m; -}; - -float mt19937_get_float(mt19937_state* state) { - return (float)mt19937_generate(state) / (float)4294967296.0; -} - -float mt19937_get_float_range(mt19937_state* state, float m, float n) { - return ((float)mt19937_generate(state) / (float)4294967296.0) * (n - m) + m; -} - -double mt19937_get_double(mt19937_state* state) { - return (double)mt19937_generate(state) / 4294967296.0; -} - -double mt19937_get_double_range(mt19937_state* state, double m, double n) { - return ((double)mt19937_generate(state) / 4294967296.0) * (n - m) + m; -} - -double mt19937_random_normal(mt19937_state* state) { - double x = mt19937_get_double(state); - double y = mt19937_get_double(state); - double z = sqrt(-2 * log(x)) * cos(2 * M_PI * y); - return z; -} diff --git a/uc_sgsim/c_core/src/kriging.c b/uc_sgsim/c_core/src/kriging.c index 5fd1d75..273e251 100644 --- a/uc_sgsim/c_core/src/kriging.c +++ b/uc_sgsim/c_core/src/kriging.c @@ -18,7 +18,7 @@ # include "../include/cov_model.h" # include "../include/matrix_tools.h" # include "../include/sort_tools.h" -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" static cov_model_t* model; static double k_range; @@ -118,7 +118,7 @@ void simple_kriging( kriging_var = model->sill - kriging_var; if (kriging_var < 0) kriging_var = 0; - fix = mt19937_random_normal(rng_state) * pow(kriging_var, 0.5); + fix = random_normal(rng_state) * pow(kriging_var, 0.5); array[(int)sampling->unsampled_point] = estimation + fix; } @@ -126,7 +126,7 @@ void simple_kriging( int find_neighbor(double* array, sampling_state* sampling, mt19937_state* rng_state) { if (sampling->neighbor == 0) { - array[(int)sampling->unsampled_point] = mt19937_random_normal(rng_state) * model->sill; + array[(int)sampling->unsampled_point] = random_normal(rng_state) * model->sill; sampling->sampled.data[sampling->idx] = sampling->unsampled_point; return 0; } @@ -140,7 +140,7 @@ int find_neighbor(double* array, sampling_state* sampling, } if (close == 0) { - array[(int)sampling->unsampled_point] = mt19937_random_normal(rng_state) * model->sill; + array[(int)sampling->unsampled_point] = random_normal(rng_state) * model->sill; sampling->sampled.data[sampling->idx] = sampling->unsampled_point; return 0; } diff --git a/uc_sgsim/c_core/src/matrix_tools.c b/uc_sgsim/c_core/src/matrix_tools.c index ddf6661..8f677c9 100644 --- a/uc_sgsim/c_core/src/matrix_tools.c +++ b/uc_sgsim/c_core/src/matrix_tools.c @@ -16,7 +16,7 @@ # include # include # include "../include/matrix_tools.h" -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" # ifdef __WIN32__ # include # elif defined(__linux__) || defined(__unix__) diff --git a/uc_sgsim/c_core/src/random_tools.c b/uc_sgsim/c_core/src/random_tools.c index c5a78d3..ec08c40 100644 --- a/uc_sgsim/c_core/src/random_tools.c +++ b/uc_sgsim/c_core/src/random_tools.c @@ -15,7 +15,7 @@ # include # include "../include/random_tools.h" -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" # ifndef M_PI # define M_PI 3.1415926 diff --git a/uc_sgsim/c_core/src/sgsim.c b/uc_sgsim/c_core/src/sgsim.c index d94357e..c8fa898 100644 --- a/uc_sgsim/c_core/src/sgsim.c +++ b/uc_sgsim/c_core/src/sgsim.c @@ -23,7 +23,7 @@ # include "../include/matrix_tools.h" # include "../include/variogram.h" # include "../include/sort_tools.h" -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" static c_array_int x_grid; static c_array_double u_array; diff --git a/uc_sgsim/c_core/src/variogram.c b/uc_sgsim/c_core/src/variogram.c index d2df5ae..a65f6ab 100644 --- a/uc_sgsim/c_core/src/variogram.c +++ b/uc_sgsim/c_core/src/variogram.c @@ -16,7 +16,7 @@ # include "../include/variogram.h" # include "../include/matrix_tools.h" -# include "../lib/c_array.h" +# include "../c_array_tools/src/c_array.h" void variogram(const double* array, double* v, int mlen, int bw, int bw_s) { double z_temp; From a8b9862c26a3e33ac8815e8503fb3fdbb7edd6ec Mon Sep 17 00:00:00 2001 From: Zncl2222 <3002shinning@gmail.com> Date: Sun, 9 Jun 2024 16:16:10 +0800 Subject: [PATCH 13/13] ci: pull submoudules before build --- .github/workflows/cmake.yml | 3 +++ .github/workflows/codeql.yml | 2 ++ .github/workflows/pypi.yml | 2 ++ .github/workflows/sonarcloud.yml | 8 ++++++++ 4 files changed, 15 insertions(+) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 83b688a..c7808e0 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -17,6 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - run: sudo apt-get update && sudo apt-get install -y valgrind + - run: git submodule update --init --recursive - name: Configure CMake # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. @@ -42,6 +43,8 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Pull Submodule + run: git submodule update --init --recursive - name: build and test run: | .\cmake_build.bat diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 080bb21..d8e7172 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -39,6 +39,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + - name: Pull Submodule + run: git submodule update --init --recursive - name: Set up Python uses: actions/setup-python@v5 with: diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 6e19dfc..7d362d9 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -23,6 +23,8 @@ jobs: runs-on: ${{ matrix.runs-on }} steps: - uses: actions/checkout@v4 + - name: Pull Submodule + run: git submodule update --init --recursive - name: Build DLL & Set file name windows if: matrix.runs-on == 'windows-latest' shell: pwsh diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 5285ce4..aad72d2 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -14,6 +14,8 @@ jobs: runs-on: ${{ matrix.runs-on }} steps: - uses: actions/checkout@v4 + - name: Pull Submodule + run: git submodule update --init --recursive - name: Build DLL & Set file name windows if: matrix.runs-on == 'windows-latest' shell: pwsh @@ -111,6 +113,8 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Pull Submodule + run: git submodule update --init --recursive - name: Set up Python 3.8 for gcovr uses: actions/setup-python@v5 with: @@ -165,6 +169,8 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Pull Submodule + run: git submodule update --init --recursive - name: build and test run: | .\cmake_build.bat @@ -212,6 +218,8 @@ jobs: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Install sonar-scanner and build-wrapper uses: SonarSource/sonarcloud-github-c-cpp@v2 + - name: Pull Submodule + run: git submodule update --init --recursive - name: Download artifacts uses: actions/download-artifact@v4 - name: Run build-wrapper