From 6b66316f7e7252298fd96e51c34e45069b0e637c Mon Sep 17 00:00:00 2001 From: Nakata Date: Mon, 24 Jul 2023 19:17:04 +0900 Subject: [PATCH 01/23] Add libc document --- .gitignore | 4 +- docs/libclient-py/Makefile | 20 ++ docs/libclient-py/Pipfile | 15 ++ docs/libclient-py/Pipfile.lock | 406 +++++++++++++++++++++++++++++ docs/libclient-py/make.bat | 35 +++ docs/libclient-py/source/conf.py | 31 +++ docs/libclient-py/source/index.rst | 20 ++ 7 files changed, 530 insertions(+), 1 deletion(-) create mode 100644 docs/libclient-py/Makefile create mode 100644 docs/libclient-py/Pipfile create mode 100644 docs/libclient-py/Pipfile.lock create mode 100644 docs/libclient-py/make.bat create mode 100644 docs/libclient-py/source/conf.py create mode 100644 docs/libclient-py/source/index.rst diff --git a/.gitignore b/.gitignore index aa54e4ff7..0c220febe 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,6 @@ __pycache__ **/db/*/** !**/db/**/.gitkeep -scripts/.env \ No newline at end of file +scripts/.env + +docs/*/build/** diff --git a/docs/libclient-py/Makefile b/docs/libclient-py/Makefile new file mode 100644 index 000000000..d0c3cbf10 --- /dev/null +++ b/docs/libclient-py/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/libclient-py/Pipfile b/docs/libclient-py/Pipfile new file mode 100644 index 000000000..dcfad6cad --- /dev/null +++ b/docs/libclient-py/Pipfile @@ -0,0 +1,15 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +sphinx = "*" +sphinx-autobuild = "*" +sphinx-rtd-theme = "*" + +[dev-packages] + +[requires] +python_version = "3.7" +python_full_version = "3.7.10" diff --git a/docs/libclient-py/Pipfile.lock b/docs/libclient-py/Pipfile.lock new file mode 100644 index 000000000..4ce6c9380 --- /dev/null +++ b/docs/libclient-py/Pipfile.lock @@ -0,0 +1,406 @@ +{ + "_meta": { + "hash": { + "sha256": "2ab23883e3ac8e272243a581467b07dcf4ca7d145959e5dd5c52f1af8cb07b63" + }, + "pipfile-spec": 6, + "requires": { + "python_full_version": "3.7.10", + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "alabaster": { + "hashes": [ + "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", + "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.13" + }, + "babel": { + "hashes": [ + "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", + "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" + ], + "markers": "python_version >= '3.7'", + "version": "==2.12.1" + }, + "certifi": { + "hashes": [ + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.7.22" + }, + "charset-normalizer": { + "hashes": [ + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.2.0" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "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": "==0.4.6" + }, + "docutils": { + "hashes": [ + "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c", + "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.18.1" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "imagesize": { + "hashes": [ + "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.4.1" + }, + "importlib-metadata": { + "hashes": [ + "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", + "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5" + ], + "markers": "python_version < '3.10'", + "version": "==6.7.0" + }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.2" + }, + "livereload": { + "hashes": [ + "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869", + "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4" + ], + "version": "==2.6.3" + }, + "markupsafe": { + "hashes": [ + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.3" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "pygments": { + "hashes": [ + "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c", + "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.15.1" + }, + "pytz": { + "hashes": [ + "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", + "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" + ], + "markers": "python_version < '3.9'", + "version": "==2023.3" + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "snowballstemmer": { + "hashes": [ + "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + ], + "version": "==2.2.0" + }, + "sphinx": { + "hashes": [ + "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d", + "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5" + ], + "index": "pypi", + "version": "==5.3.0" + }, + "sphinx-autobuild": { + "hashes": [ + "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac", + "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05" + ], + "index": "pypi", + "version": "==2021.3.14" + }, + "sphinx-rtd-theme": { + "hashes": [ + "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7", + "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689" + ], + "index": "pypi", + "version": "==1.2.2" + }, + "sphinxcontrib-applehelp": { + "hashes": [ + "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", + "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.2" + }, + "sphinxcontrib-devhelp": { + "hashes": [ + "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", + "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.2" + }, + "sphinxcontrib-htmlhelp": { + "hashes": [ + "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", + "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" + ], + "markers": "python_version >= '3.6'", + "version": "==2.0.0" + }, + "sphinxcontrib-jquery": { + "hashes": [ + "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", + "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" + ], + "markers": "python_version >= '2.7'", + "version": "==4.1" + }, + "sphinxcontrib-jsmath": { + "hashes": [ + "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.1" + }, + "sphinxcontrib-qthelp": { + "hashes": [ + "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", + "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.3" + }, + "sphinxcontrib-serializinghtml": { + "hashes": [ + "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", + "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" + ], + "markers": "python_version >= '3.5'", + "version": "==1.1.5" + }, + "tornado": { + "hashes": [ + "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", + "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", + "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", + "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", + "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", + "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", + "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", + "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", + "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", + "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", + "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b" + ], + "markers": "python_version > '2.7'", + "version": "==6.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + ], + "markers": "python_version < '3.8'", + "version": "==4.7.1" + }, + "urllib3": { + "hashes": [ + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.4" + }, + "zipp": { + "hashes": [ + "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", + "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" + ], + "markers": "python_version >= '3.7'", + "version": "==3.15.0" + } + }, + "develop": {} +} diff --git a/docs/libclient-py/make.bat b/docs/libclient-py/make.bat new file mode 100644 index 000000000..747ffb7b3 --- /dev/null +++ b/docs/libclient-py/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/libclient-py/source/conf.py b/docs/libclient-py/source/conf.py new file mode 100644 index 000000000..99f1deb8f --- /dev/null +++ b/docs/libclient-py/source/conf.py @@ -0,0 +1,31 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'quickmpc-libclient-py' +copyright = '2023, Acompany Co., Ltd.' +author = 'Acompany Co., Ltd.' +release = '1.0.0' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + 'sphinx.ext.autodoc', # docstringから自動で取り込めるように + 'sphinx.ext.napoleon', # numpy styleを取り込めるように + 'sphinx_rtd_theme', # pageのテーマ +] + +templates_path = ['_templates'] +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'sphinx_rtd_theme' +html_static_path = ['_static'] diff --git a/docs/libclient-py/source/index.rst b/docs/libclient-py/source/index.rst new file mode 100644 index 000000000..bc4478067 --- /dev/null +++ b/docs/libclient-py/source/index.rst @@ -0,0 +1,20 @@ +.. quickmpc-libclient-py documentation master file, created by + sphinx-quickstart on Mon Jul 24 19:08:23 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to quickmpc-libclient-py's documentation! +================================================= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` From 6ab6b86b9434c2ac807e3fdbae5cb2a2ab29eb0e Mon Sep 17 00:00:00 2001 From: Nakata Date: Mon, 24 Jul 2023 22:23:29 +0900 Subject: [PATCH 02/23] Remove setup.py --- packages/client/libclient-py/pyproject.toml | 22 ++++++++++++++++++++- packages/client/libclient-py/setup.cfg | 19 ------------------ packages/client/libclient-py/setup.py | 4 ---- 3 files changed, 21 insertions(+), 24 deletions(-) delete mode 100644 packages/client/libclient-py/setup.cfg delete mode 100644 packages/client/libclient-py/setup.py diff --git a/packages/client/libclient-py/pyproject.toml b/packages/client/libclient-py/pyproject.toml index beb044643..b996157c7 100644 --- a/packages/client/libclient-py/pyproject.toml +++ b/packages/client/libclient-py/pyproject.toml @@ -2,6 +2,26 @@ requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=6.2"] build-backend = "setuptools.build_meta" +[project] +name = "quickmpc" +readme = "README.md" +license = {file = "LICENSE"} +authors = [ {name = "Acompany"} ] +requires-python = ">=3.7" +dependencies = [ + "numpy", + "grpcio-tools", + "grpcio-status", + "pynacl", + "tqdm", + "natsort", + "pandas", +] +dynamic = ["version"] + +[tool.setuptools] +package-dir = {"quickmpc" = "quickmpc"} + [tool.setuptools_scm] write_to = "packages/client/libclient-py/quickmpc/_version.py" -root = "../../../" \ No newline at end of file +root = "../../../" diff --git a/packages/client/libclient-py/setup.cfg b/packages/client/libclient-py/setup.cfg deleted file mode 100644 index 15ae61518..000000000 --- a/packages/client/libclient-py/setup.cfg +++ /dev/null @@ -1,19 +0,0 @@ -[metadata] -name = quickmpc -author = Acompany -license=Apache 2.0 Licences -license_file=LICENSE - -[options] -setup_requires=setuptools>=45; setuptools_scm[toml]>=6.2 -python_requires=>=3.7 -install_requires = - numpy - grpcio-tools - grpcio-status - pynacl - tqdm - natsort - pandas -include_package_data = True -packages = find: diff --git a/packages/client/libclient-py/setup.py b/packages/client/libclient-py/setup.py deleted file mode 100644 index b024da80e..000000000 --- a/packages/client/libclient-py/setup.py +++ /dev/null @@ -1,4 +0,0 @@ -from setuptools import setup - - -setup() From 9095cd070a7ab669fd08237b47e1d991b0488896 Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 25 Jul 2023 13:46:00 +0900 Subject: [PATCH 03/23] Add libclient version to doc --- docs/libclient-py/Pipfile | 15 - docs/libclient-py/Pipfile.lock | 406 -------------------- docs/libclient-py/source/conf.py | 5 +- packages/client/libclient-py/pyproject.toml | 8 +- 4 files changed, 11 insertions(+), 423 deletions(-) delete mode 100644 docs/libclient-py/Pipfile delete mode 100644 docs/libclient-py/Pipfile.lock diff --git a/docs/libclient-py/Pipfile b/docs/libclient-py/Pipfile deleted file mode 100644 index dcfad6cad..000000000 --- a/docs/libclient-py/Pipfile +++ /dev/null @@ -1,15 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -sphinx = "*" -sphinx-autobuild = "*" -sphinx-rtd-theme = "*" - -[dev-packages] - -[requires] -python_version = "3.7" -python_full_version = "3.7.10" diff --git a/docs/libclient-py/Pipfile.lock b/docs/libclient-py/Pipfile.lock deleted file mode 100644 index 4ce6c9380..000000000 --- a/docs/libclient-py/Pipfile.lock +++ /dev/null @@ -1,406 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "2ab23883e3ac8e272243a581467b07dcf4ca7d145959e5dd5c52f1af8cb07b63" - }, - "pipfile-spec": 6, - "requires": { - "python_full_version": "3.7.10", - "python_version": "3.7" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", - "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.13" - }, - "babel": { - "hashes": [ - "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", - "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" - ], - "markers": "python_version >= '3.7'", - "version": "==2.12.1" - }, - "certifi": { - "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" - ], - "markers": "python_version >= '3.6'", - "version": "==2023.7.22" - }, - "charset-normalizer": { - "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.2.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "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": "==0.4.6" - }, - "docutils": { - "hashes": [ - "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c", - "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.18.1" - }, - "idna": { - "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" - ], - "markers": "python_version >= '3.5'", - "version": "==3.4" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", - "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5" - ], - "markers": "python_version < '3.10'", - "version": "==6.7.0" - }, - "jinja2": { - "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.2" - }, - "livereload": { - "hashes": [ - "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869", - "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4" - ], - "version": "==2.6.3" - }, - "markupsafe": { - "hashes": [ - "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", - "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", - "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", - "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", - "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", - "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", - "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", - "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", - "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", - "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", - "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", - "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", - "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", - "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", - "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", - "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", - "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", - "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", - "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", - "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", - "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", - "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", - "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", - "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", - "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", - "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", - "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", - "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.3" - }, - "packaging": { - "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1" - }, - "pygments": { - "hashes": [ - "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c", - "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1" - ], - "markers": "python_version >= '3.7'", - "version": "==2.15.1" - }, - "pytz": { - "hashes": [ - "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" - ], - "markers": "python_version < '3.9'", - "version": "==2023.3" - }, - "requests": { - "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" - ], - "markers": "python_version >= '3.7'", - "version": "==2.31.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d", - "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5" - ], - "index": "pypi", - "version": "==5.3.0" - }, - "sphinx-autobuild": { - "hashes": [ - "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac", - "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05" - ], - "index": "pypi", - "version": "==2021.3.14" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7", - "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689" - ], - "index": "pypi", - "version": "==1.2.2" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", - "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.2" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", - "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.2" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", - "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", - "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.3" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", - "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" - ], - "markers": "python_version >= '3.5'", - "version": "==1.1.5" - }, - "tornado": { - "hashes": [ - "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", - "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", - "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", - "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", - "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", - "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", - "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", - "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", - "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", - "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", - "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b" - ], - "markers": "python_version > '2.7'", - "version": "==6.2" - }, - "typing-extensions": { - "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" - ], - "markers": "python_version < '3.8'", - "version": "==4.7.1" - }, - "urllib3": { - "hashes": [ - "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", - "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.4" - }, - "zipp": { - "hashes": [ - "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", - "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" - ], - "markers": "python_version >= '3.7'", - "version": "==3.15.0" - } - }, - "develop": {} -} diff --git a/docs/libclient-py/source/conf.py b/docs/libclient-py/source/conf.py index 99f1deb8f..125b47d1c 100644 --- a/docs/libclient-py/source/conf.py +++ b/docs/libclient-py/source/conf.py @@ -3,13 +3,16 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html +import quickmpc # noqa + # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = 'quickmpc-libclient-py' copyright = '2023, Acompany Co., Ltd.' author = 'Acompany Co., Ltd.' -release = '1.0.0' +version = quickmpc.__version__ +release = quickmpc.__version__ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/packages/client/libclient-py/pyproject.toml b/packages/client/libclient-py/pyproject.toml index b996157c7..3cb5d013d 100644 --- a/packages/client/libclient-py/pyproject.toml +++ b/packages/client/libclient-py/pyproject.toml @@ -4,7 +4,6 @@ build-backend = "setuptools.build_meta" [project] name = "quickmpc" -readme = "README.md" license = {file = "LICENSE"} authors = [ {name = "Acompany"} ] requires-python = ">=3.7" @@ -19,6 +18,13 @@ dependencies = [ ] dynamic = ["version"] +[project.optional-dependencies] +document = [ + "sphinx", + "sphinx-autobuild", + "sphinx-rtd-theme", +] + [tool.setuptools] package-dir = {"quickmpc" = "quickmpc"} From d6cef8bb15c09012226049c4052acc702315618a Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 25 Jul 2023 20:09:03 +0900 Subject: [PATCH 04/23] Add module to doc --- .gitignore | 3 ++- docs/libclient-py/Makefile | 14 ++++++++++++-- docs/libclient-py/source/conf.py | 11 +++++++++++ docs/libclient-py/source/index.rst | 1 + docs/libclient-py/source/reference/index.rst | 12 ++++++++++++ .../source/reference/quickmpc.pandas.rst | 14 ++++++++++++++ .../source/reference/quickmpc.proto.rst | 14 ++++++++++++++ .../source/reference/quickmpc.request.rst | 13 +++++++++++++ .../source/reference/quickmpc.rst | 16 ++++++++++++++++ .../source/reference/quickmpc.share.rst | 13 +++++++++++++ .../source/reference/quickmpc.utils.rst | 19 +++++++++++++++++++ .../client/libclient-py/quickmpc/__init__.py | 1 - 12 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 docs/libclient-py/source/reference/index.rst create mode 100644 docs/libclient-py/source/reference/quickmpc.pandas.rst create mode 100644 docs/libclient-py/source/reference/quickmpc.proto.rst create mode 100644 docs/libclient-py/source/reference/quickmpc.request.rst create mode 100644 docs/libclient-py/source/reference/quickmpc.rst create mode 100644 docs/libclient-py/source/reference/quickmpc.share.rst create mode 100644 docs/libclient-py/source/reference/quickmpc.utils.rst diff --git a/.gitignore b/.gitignore index 0c220febe..42474435b 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,5 @@ __pycache__ scripts/.env -docs/*/build/** +docs/**/_build/** +docs/**/_generated/** diff --git a/docs/libclient-py/Makefile b/docs/libclient-py/Makefile index d0c3cbf10..3e32bd4dd 100644 --- a/docs/libclient-py/Makefile +++ b/docs/libclient-py/Makefile @@ -4,9 +4,10 @@ # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build +SPHINXBUILD = sphinx-build SOURCEDIR = source -BUILDDIR = build +BUILDDIR = _build +APIDIR = ../../packages/client/libclient-py/quickmpc # Put it first so that "make" without argument is like "make help". help: @@ -18,3 +19,12 @@ help: # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: apidoc +apidoc: + sphinx-apidoc -e -f -T -o $(SOURCEDIR)/reference $(APIDIR) + +.PHONY: autobuild +autobuild: + sphinx-autobuild $(SOURCEDIR) $(BUILDDIR)/html + diff --git a/docs/libclient-py/source/conf.py b/docs/libclient-py/source/conf.py index 125b47d1c..58a645e07 100644 --- a/docs/libclient-py/source/conf.py +++ b/docs/libclient-py/source/conf.py @@ -19,6 +19,7 @@ extensions = [ 'sphinx.ext.autodoc', # docstringから自動で取り込めるように + "sphinx.ext.autosummary", # summaryのリストを生成する 'sphinx.ext.napoleon', # numpy styleを取り込めるように 'sphinx_rtd_theme', # pageのテーマ ] @@ -32,3 +33,13 @@ html_theme = 'sphinx_rtd_theme' html_static_path = ['_static'] + + +# -- Extension configuration ------------------------------------------------- +autosummary_generate = True +autodoc_typehints = "description" +autodoc_default_options = { + "members": True, + "inherited-members": True, + "exclude-members": "with_traceback", +} diff --git a/docs/libclient-py/source/index.rst b/docs/libclient-py/source/index.rst index bc4478067..55403f59d 100644 --- a/docs/libclient-py/source/index.rst +++ b/docs/libclient-py/source/index.rst @@ -10,6 +10,7 @@ Welcome to quickmpc-libclient-py's documentation! :maxdepth: 2 :caption: Contents: + reference/index Indices and tables diff --git a/docs/libclient-py/source/reference/index.rst b/docs/libclient-py/source/reference/index.rst new file mode 100644 index 000000000..5a2b3e165 --- /dev/null +++ b/docs/libclient-py/source/reference/index.rst @@ -0,0 +1,12 @@ +API Reference +============= + +.. toctree:: + :maxdepth: 1 + + quickmpc + quickmpc.pandas + quickmpc.proto + quickmpc.request + quickmpc.share + quickmpc.utils diff --git a/docs/libclient-py/source/reference/quickmpc.pandas.rst b/docs/libclient-py/source/reference/quickmpc.pandas.rst new file mode 100644 index 000000000..9a3726c94 --- /dev/null +++ b/docs/libclient-py/source/reference/quickmpc.pandas.rst @@ -0,0 +1,14 @@ +.. module:: quickmpc.pandas + +quickmpc.pandas +=============== + +quickmpc.pandas is quickmpc.pandas. + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + quickmpc.pandas.ShareDataFrame + quickmpc.pandas.parse + quickmpc.pandas.read_csv diff --git a/docs/libclient-py/source/reference/quickmpc.proto.rst b/docs/libclient-py/source/reference/quickmpc.proto.rst new file mode 100644 index 000000000..d2c3d3b1a --- /dev/null +++ b/docs/libclient-py/source/reference/quickmpc.proto.rst @@ -0,0 +1,14 @@ +.. module:: quickmpc.proto + +quickmpc.proto +============== + +quickmpc.proto is quickmpc.proto + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + quickmpc.proto.common_types.common_types_pb2.JobErrorInfo + quickmpc.proto.common_types.common_types_pb2.JobStatus + quickmpc.proto.common_types.common_types_pb2.JobProgress diff --git a/docs/libclient-py/source/reference/quickmpc.request.rst b/docs/libclient-py/source/reference/quickmpc.request.rst new file mode 100644 index 000000000..65075efa7 --- /dev/null +++ b/docs/libclient-py/source/reference/quickmpc.request.rst @@ -0,0 +1,13 @@ +.. module:: quickmpc.request + +quickmpc.request +================ + +quickmpc.request is quickmpc.request. + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + quickmpc.request.QMPCRequest + quickmpc.request.QMPCRequestInterface diff --git a/docs/libclient-py/source/reference/quickmpc.rst b/docs/libclient-py/source/reference/quickmpc.rst new file mode 100644 index 000000000..a5b6e6b7d --- /dev/null +++ b/docs/libclient-py/source/reference/quickmpc.rst @@ -0,0 +1,16 @@ +.. module:: quickmpc + +quickmpc +======== + +quickmpc is quickmpc. + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + quickmpc.ArgumentError + quickmpc.QMPC + quickmpc.QMPCJobError + quickmpc.QMPCServerError + quickmpc.get_logger diff --git a/docs/libclient-py/source/reference/quickmpc.share.rst b/docs/libclient-py/source/reference/quickmpc.share.rst new file mode 100644 index 000000000..2fb0efa6e --- /dev/null +++ b/docs/libclient-py/source/reference/quickmpc.share.rst @@ -0,0 +1,13 @@ +.. module:: quickmpc.share + +quickmpc.share +=============== + +quickmpc.share is quickmpc.share + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + quickmpc.share.Share + quickmpc.share.restore diff --git a/docs/libclient-py/source/reference/quickmpc.utils.rst b/docs/libclient-py/source/reference/quickmpc.utils.rst new file mode 100644 index 000000000..d550fab7d --- /dev/null +++ b/docs/libclient-py/source/reference/quickmpc.utils.rst @@ -0,0 +1,19 @@ +.. module:: quickmpc.utils + +quickmpc.utils +============== + +quickmpc.utils is quickmpc.utils + +.. autosummary:: + :toctree: _generated/ + :nosignatures: + + quickmpc.utils.Dim1 + quickmpc.utils.Dim2 + quickmpc.utils.Dim3 + quickmpc.utils.DictList + quickmpc.utils.DictList2 + quickmpc.utils.MakePiece + quickmpc.utils.if_present + quickmpc.utils.methoddispatch diff --git a/packages/client/libclient-py/quickmpc/__init__.py b/packages/client/libclient-py/quickmpc/__init__.py index 1f1d8d52f..993370100 100644 --- a/packages/client/libclient-py/quickmpc/__init__.py +++ b/packages/client/libclient-py/quickmpc/__init__.py @@ -9,6 +9,5 @@ "QMPC", "QMPCJobError", "QMPCServerError", - "ShareDataFrame", "get_logger", ] From aceb162399a1ee0b792b9606dcfdf0ef87ee619c Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 25 Jul 2023 20:27:27 +0900 Subject: [PATCH 05/23] Add installation to doc --- docs/libclient-py/source/index.rst | 7 ++++--- docs/libclient-py/source/installation.rst | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 docs/libclient-py/source/installation.rst diff --git a/docs/libclient-py/source/index.rst b/docs/libclient-py/source/index.rst index 55403f59d..fe21c7986 100644 --- a/docs/libclient-py/source/index.rst +++ b/docs/libclient-py/source/index.rst @@ -3,13 +3,14 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to quickmpc-libclient-py's documentation! -================================================= +quickmpc-libclient-py's documentation +===================================== .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Contents: + installation reference/index diff --git a/docs/libclient-py/source/installation.rst b/docs/libclient-py/source/installation.rst new file mode 100644 index 000000000..f05ea2809 --- /dev/null +++ b/docs/libclient-py/source/installation.rst @@ -0,0 +1,8 @@ +Installation +============ +quickmpc requires Python 3.7 or later to run. You can install quickmp using pip: + +.. code-block:: bash + + $ pip install quickmpc + From 724ea2b881455f39278bfe6a1e97de1e60ca705b Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 25 Jul 2023 21:57:43 +0900 Subject: [PATCH 06/23] Add quickstart to doc --- docs/libclient-py/source/index.rst | 1 + docs/libclient-py/source/installation.rst | 2 + docs/libclient-py/source/quickstart.rst | 72 +++++++++++++++++++ docs/libclient-py/source/reference/index.rst | 2 + .../source/reference/quickmpc.pandas.rst | 2 + .../source/reference/quickmpc.rst | 2 + 6 files changed, 81 insertions(+) create mode 100644 docs/libclient-py/source/quickstart.rst diff --git a/docs/libclient-py/source/index.rst b/docs/libclient-py/source/index.rst index fe21c7986..4e9b77a2d 100644 --- a/docs/libclient-py/source/index.rst +++ b/docs/libclient-py/source/index.rst @@ -11,6 +11,7 @@ quickmpc-libclient-py's documentation :caption: Contents: installation + quickstart reference/index diff --git a/docs/libclient-py/source/installation.rst b/docs/libclient-py/source/installation.rst index f05ea2809..2fbb1af4e 100644 --- a/docs/libclient-py/source/installation.rst +++ b/docs/libclient-py/source/installation.rst @@ -1,3 +1,5 @@ +.. _installation: + Installation ============ quickmpc requires Python 3.7 or later to run. You can install quickmp using pip: diff --git a/docs/libclient-py/source/quickstart.rst b/docs/libclient-py/source/quickstart.rst new file mode 100644 index 000000000..6788bd65e --- /dev/null +++ b/docs/libclient-py/source/quickstart.rst @@ -0,0 +1,72 @@ +.. _quickstart: + +.. _quickmpc-libclient-py: https://github.com/acompany-develop/QuickMPC/tree/main/packages/client/libclient-py +.. _pandas: https://pandas.pydata.org/ + +Quickstart +========== +本ページでは `quickmpc-libclient-py`_ を用いたMPC(Multi Party Computation)の始め方を説明します. +まだquickmpc-libclient-pyをinstallしていない方は :ref:`Installation ` を参考にinstallをしてください. + +csvデータの操作 +------------- +quickmpc-libclient-pyは `pandas`_ likeなinterfaceを提供します. +例えばcsvファイルの読み取りはpandasと同じように :ref:`read_csv関数 ` により実現できます. +また, 返り値はpandas.DataFrameになっており,pandasと同じように加工することができます. + +.. code-block:: python3 + + import quickmpc.pandas as qpd + + df = qpd.read_csv("data.csv", index_col="ID") + df = df.applymap(lambda x: x%2) + + +MPCの開始 +--------- +:ref:`qmpcクラス ` を使用して,あらかじめ用意した2つ以上のQuickMPCサーバに接続します. + +.. code-block:: python3 + + import quickmpc + + qmpc = quickmpc.QMPC([ + "http://~~~:~~~", + "http://~~~:~~~", + "http://~~~:~~~", + ]) + +読み込んだcsvデータを次のようにしてサーバに送信します. + +.. code-block:: python3 + + sdf = qmpc.send_to(df) + +自分以外のユーザが送信したデータは次のようにして取得します. + +.. code-block:: python3 + + data_id = "~~~~" # 他者が sdf.get_id() により出力したID + sdf = qmpc.load_from(data_id) + +使用するデータをすべてサーバに送信したら各種MPCを実行します. + +.. code-block:: python3 + + sdf_res = sdf.sum() + sdf_res = sdf.join(sdf_other) + +計算結果の取得 +-------------- +MPCの結果はファイルに出力するか,pandas.DataFrameに出力して引き続き加工することができます. + +.. code-block:: python3 + + df = sdf_res.to_csv("filename.csv") # ファイルに出力 + df = sdf_res.to_data_frame() # DataFrameに出力 + +一部の実行時間の長い計算は `progress` オプションを設定して計算ステータスをログに出力できます. + +.. code-block:: python3 + + df = sdf_res.to_data_frame(progress=True) diff --git a/docs/libclient-py/source/reference/index.rst b/docs/libclient-py/source/reference/index.rst index 5a2b3e165..b9635ab1f 100644 --- a/docs/libclient-py/source/reference/index.rst +++ b/docs/libclient-py/source/reference/index.rst @@ -1,3 +1,5 @@ +.. _api_reference: + API Reference ============= diff --git a/docs/libclient-py/source/reference/quickmpc.pandas.rst b/docs/libclient-py/source/reference/quickmpc.pandas.rst index 9a3726c94..c60a3adc8 100644 --- a/docs/libclient-py/source/reference/quickmpc.pandas.rst +++ b/docs/libclient-py/source/reference/quickmpc.pandas.rst @@ -1,3 +1,5 @@ +.. _quickmpc.pandas: + .. module:: quickmpc.pandas quickmpc.pandas diff --git a/docs/libclient-py/source/reference/quickmpc.rst b/docs/libclient-py/source/reference/quickmpc.rst index a5b6e6b7d..1d3d3d062 100644 --- a/docs/libclient-py/source/reference/quickmpc.rst +++ b/docs/libclient-py/source/reference/quickmpc.rst @@ -1,3 +1,5 @@ +.. _quickmpc: + .. module:: quickmpc quickmpc From 1f59ca0cbe5b48a8f3da0ddda47b3c8cc6369ebd Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 25 Jul 2023 23:36:50 +0900 Subject: [PATCH 07/23] Add QMPC doc --- docs/libclient-py/Makefile | 12 ++- .../client/libclient-py/quickmpc/exception.py | 16 ++++ packages/client/libclient-py/quickmpc/qmpc.py | 91 ++++++++++++++++--- 3 files changed, 101 insertions(+), 18 deletions(-) diff --git a/docs/libclient-py/Makefile b/docs/libclient-py/Makefile index 3e32bd4dd..82f26d63f 100644 --- a/docs/libclient-py/Makefile +++ b/docs/libclient-py/Makefile @@ -20,11 +20,15 @@ help: %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -.PHONY: apidoc -apidoc: - sphinx-apidoc -e -f -T -o $(SOURCEDIR)/reference $(APIDIR) - .PHONY: autobuild autobuild: sphinx-autobuild $(SOURCEDIR) $(BUILDDIR)/html +.PHONY: autogen +autogen: + sphinx-autogen source/**/*.rst + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + rm -rf $(SOURCEDIR)/reference/_generated/ diff --git a/packages/client/libclient-py/quickmpc/exception.py b/packages/client/libclient-py/quickmpc/exception.py index e6dfa358f..dd3d2cdd8 100644 --- a/packages/client/libclient-py/quickmpc/exception.py +++ b/packages/client/libclient-py/quickmpc/exception.py @@ -6,13 +6,29 @@ @dataclass(frozen=True) class QMPCJobError(Exception): + """MPCの計算中にエラーが発生した場合のエラー + + Attributes + ---------- + err_info: Union[str, JobErrorInfo] + エラーの詳細 + """ err_info: Union[str, JobErrorInfo] @dataclass(frozen=True) class QMPCServerError(Exception): + """QMPCサーバで何らかの異常が発生した場合エラー + + Attributes + ---------- + err_info: Union[str, JobErrorInfo] + エラーの詳細 + """ err_info: Union[str, JobErrorInfo] class ArgumentError(Exception): + """想定していない引数が与えられた時のエラー""" + # TODO: NotImplementedErrorに置き換えられるので削除する pass diff --git a/packages/client/libclient-py/quickmpc/qmpc.py b/packages/client/libclient-py/quickmpc/qmpc.py index 8a581a9b1..2ab9c5c88 100644 --- a/packages/client/libclient-py/quickmpc/qmpc.py +++ b/packages/client/libclient-py/quickmpc/qmpc.py @@ -17,11 +17,22 @@ class QMPC: Attributes ---------- - arg: Union[List[str], QMPCRequestInterface]] - parties: List[str] - serverのIP - qmpc_request: QMPCRequestMock - qmpc serverに対してrequestを送るinterface + __qmpc_request: QMPCRequestInterface + qmpc serverに対してrequestを送るinterface + + Examples + -------- + .. code-block:: python3 + + # 直接IPを指定する場合 + qmpc = QMPC([ + "http://localhost:50001", + "http://localhost:50002", + "http://localhost:50003" + ]) + # mockなどでrequestクラスを指定する場合 + request = QMPCRequest([~~~]) + qmpc = QMPC(request) """ arg: InitVar[Union[List[str], QMPCRequestInterface]] @@ -43,27 +54,47 @@ def __post_init__original(self, qmpc_request: QMPCRequest): object.__setattr__(self, "_QMPC__qmpc_request", qmpc_request) def send_to(self, df: pd.DataFrame) -> qpd.ShareDataFrame: - """QuickMPCサーバにデータを送信する. + """QuickMPCサーバにデータを送信する - `quickmpc.pandas.read_csv()`により読み込んだデータをQuickMPCサーバに送信する. - `quickmpc.pandas.read_csv()`では``__qmpc_sort_index__``と呼ばれるデータの順序を保持した列がcolumnsに追加されており,send_shareではこの列があることを要求している. - `quickmpc.pandas.read_csv()`を経由せずにsend_shareする場合は,あらかじめデータ順序を求めて``__qmpc_sort_index__``列を追加しておく必要がある. + :doc:`quickmpc.pandas.read_csv` により読み込んだデータをQuickMPCサーバに送信する. + :doc:`quickmpc.pandas.read_csv` では ``__qmpc_sort_index__`` と呼ばれるデータの順序を保持した列がcolumnsに追加されており, + このメソッドではこの列があることを要求している. + :doc:`quickmpc.pandas.read_csv` を経由せずにQuickMPCサーバにデータを送信する場合は, + あらかじめデータ順序を求めて ``__qmpc_sort_index__`` 列を追加しておく必要がある. Parameters ---------- - df: df.DataFrame + df: pandas.DataFrame 送信するデータ Returns ---------- quickmpc.pandas.ShareDataFrame QuickMPC形式のDataframe + + Examples + -------- + .. code-block:: python3 + + # quickmpc.pandas.read_csv で読み込んだデータを送信する + df = qpd.read_csv("filepath") + qmpc.send_to(df) + + # 自分で定義したデータを送信する + qmpc.send_to(df) + df = pd.DataFrame([[1,2,0], [3,4,1]], + columns=["a", "b", "__qmpc_sort_index__"])), + + See Also + -------- + quickmpc.pandas.read_csv + quickmpc形式に則る専用のcsv読み取り関数 """ res = self.__qmpc_request.send_share(df, piece_size=1_000_000) return qpd.ShareDataFrame(res.data_id, self.__qmpc_request) def load_from(self, id_str: str) -> qpd.ShareDataFrame: - """既に送信してあるデータを参照する. + """QuickMPCサーバに送信してあるデータを参照する Parameters ---------- @@ -71,9 +102,19 @@ def load_from(self, id_str: str) -> qpd.ShareDataFrame: 既に送信してあるデータのIDか計算で発行したID Returns - ---------- + ------- quickmpc.pandas.ShareDataFrame QuickMPC形式のDataframe + + Raises + ------ + RuntimeError + 形式が異なるIDを指定した場合 + + See Also + -------- + quickmpc.pandas.ShareDataFrame.get_id + 参照するIDを取得するためのメソッド """ # data_id (256bit hash) if re.fullmatch(r'[a-z0-9]{64}', id_str): @@ -88,7 +129,7 @@ def load_from(self, id_str: str) -> qpd.ShareDataFrame: # TODO: job_uuidとparty_sizeは指定しなくても良いようにしたい def restore(self, job_uuid: str, filepath: str, party_size: int) \ -> qpd.ShareDataFrame: - """既に送信してあるデータを参照する. + """ファイルに保存したMPC結果を復元して取得する. Parameters ---------- @@ -96,11 +137,33 @@ def restore(self, job_uuid: str, filepath: str, party_size: int) \ データのID filepath: str dataが保存してあるディレクトリ + party_size: int + MPCのパーティ数 Returns - ---------- + ------- quickmpc.pandas.ShareDataFrame QuickMPC形式のDataframe + + Examples + -------- + .. code-block:: python3 + + # 計算結果をファイルに保存する + filepath: str # 保存するディレクトリ + sdf: qpd.ShareDataFrame # 計算結果 + sdf.to_csv(filepath) # 結果を保存 + + # 計算結果をファイルから復元する + job_uuid = sdf.get_id() + sdf = qmpc.restore(job_uuid, filepath, 3) + + See Also + -------- + quickmpc.pandas.ShareDataFrame.get_id + 参照するIDを取得するためのメソッド + quickmpc.pandas.ShareDataFrame.to_csv + 計算結果をファイルに保存するメソッド.restoreはこのメソッドで保存したファイル群に対して適用できる. """ # TODO: get_computation_resultと同じ処理なのでうまくまとめる res = restore(job_uuid, filepath, party_size) From f5cf3a2379fd573c02db7608f8596c4b3913a200 Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 25 Jul 2023 23:42:01 +0900 Subject: [PATCH 08/23] Update quickstart --- docs/libclient-py/source/quickstart.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/libclient-py/source/quickstart.rst b/docs/libclient-py/source/quickstart.rst index 6788bd65e..c2800ad95 100644 --- a/docs/libclient-py/source/quickstart.rst +++ b/docs/libclient-py/source/quickstart.rst @@ -9,9 +9,9 @@ Quickstart まだquickmpc-libclient-pyをinstallしていない方は :ref:`Installation ` を参考にinstallをしてください. csvデータの操作 -------------- +--------------- quickmpc-libclient-pyは `pandas`_ likeなinterfaceを提供します. -例えばcsvファイルの読み取りはpandasと同じように :ref:`read_csv関数 ` により実現できます. +例えばcsvファイルの読み取りはpandasと同じように :py:func:`read_csv関数 ` により実現できます. また, 返り値はpandas.DataFrameになっており,pandasと同じように加工することができます. .. code-block:: python3 @@ -24,7 +24,7 @@ quickmpc-libclient-pyは `pandas`_ likeなinterfaceを提供します. MPCの開始 --------- -:ref:`qmpcクラス ` を使用して,あらかじめ用意した2つ以上のQuickMPCサーバに接続します. +:py:class:`QMPCクラス ` を使用して,あらかじめ用意した2つ以上のQuickMPCサーバに接続します. .. code-block:: python3 From 85079ab708fa38d5ff93cf619c418751b78c6d6e Mon Sep 17 00:00:00 2001 From: Nakata Date: Wed, 26 Jul 2023 16:43:06 +0900 Subject: [PATCH 09/23] Add qmpc_request doc --- .../quickmpc/request/qmpc_request.py | 324 +++++++++++++++++- 1 file changed, 316 insertions(+), 8 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/request/qmpc_request.py b/packages/client/libclient-py/quickmpc/request/qmpc_request.py index 88112b8db..f35469db8 100644 --- a/packages/client/libclient-py/quickmpc/request/qmpc_request.py +++ b/packages/client/libclient-py/quickmpc/request/qmpc_request.py @@ -44,6 +44,27 @@ def _create_grpc_channel(endpoint: str) -> grpc.Channel: + """gppcのchannnelを生成する + + 入力形式をパースして自動で適切なチャンネルを生成する. + 現在サポートしているのはhttpとhttpsの2つで, + いずれも `http://~~~` という文字列である必要がある. + + Parameters + ---------- + endpoint: str + endpointのIP + + Returns + -------- + grpc.channel + grpcのchannel + + Raises + ------- + ArgumentError + サポートしていないプロトコルを指定した場合 + """ channel: grpc.Channel = None o = urlparse(endpoint) if o.scheme == 'http': @@ -66,12 +87,29 @@ def _create_grpc_channel(endpoint: str) -> grpc.Channel: class QMPCRequest(QMPCRequestInterface): """QuickMPCサーバと通信を行う + Args + ---- + endpoints: List[str] + 各PartyのIP + _QMPCRequest__retry_num: int + 通信のretry回数 + _QMPCRequest__retry_wait_time : int + 通信のretry待機時間 + Attributes ---------- - __endpoints: List[url] - QuickMPCサーバのURL + __client_stubs: Tuple[LibcToManageStub] + 各Partyのgrpcのstub + __client_channels: Tuple[grpc.Channel] + 各Partyのgrpcのchannnel + __party_size: int + Partyの数 __token: str - QuickMPCサーバへの通信を担う + MPCサーバへの通信のtoken + __retry_num: int + 通信のretry回数 + __retry_wait_time: int + 通信のretry待機時間 """ endpoints: InitVar[List[str]] @@ -95,6 +133,27 @@ def __post_init__(self, endpoints: List[str]) -> None: object.__setattr__(self, "_QMPCRequest__token", token) def __retry(self, f: Callable, *request: Any) -> Any: + """リトライポリシーに従って特定の関数を実行する + + Parameters + ---------- + f: Callable + 実行するgrpc request + request: Any + fに渡す全ての引数 + + Returns + ------- + Any + f(*request)の実行結果 + + Raises + ------ + QMPCServerError + MPCサーバへの接続が確立できないなどサーバのエラーが起きた場合 + QMPCJobError + 計算中に何らかのエラーが発生していた場合 + """ for ch in self.__client_channels: # channelの接続チェック is_channel_ready = False @@ -143,7 +202,25 @@ def __retry(self, f: Callable, *request: Any) -> Any: @staticmethod def __futures_result( futures: Iterable, enable_progress_bar=True) -> List: - """ エラーチェックしてfutureのresultを得る """ + """進捗ログを出しながらfutureの結果を取得する + + Parameters + ---------- + futures: concurrent.futures.Executor + 非同期実行している実体 + enable_progress_bar: bool, default=True + 進捗ログを出すかどうか + + Returns + ------- + List + 各futuresの返り値のリスト + + Raises + ------ + Exception + futures実行中の例外 + """ try: if enable_progress_bar: futures = tqdm.tqdm(futures, desc='receive') @@ -154,7 +231,25 @@ def __futures_result( def send_share(self, df: pd.DataFrame, piece_size: int = 1_000_000) \ -> SendShareResponse: - """ Shareをコンテナに送信 """ + """ShareをMPCサーバに送信する + + Parameters + ---------- + df: pd.DataFrame + 送信するデータ + piece_size: int, default=1_000_000 + 分割pieceの各size + + Returns + ------- + SendShareResponse + SendSharesRequestの結果 + + Raises + ------ + RuntimeError + 規定されていない引数を与えた場合 + """ if piece_size < 1000 or piece_size > 1_000_000: raise RuntimeError( "piece_size must be in the range of 1000 to 1000000") @@ -206,7 +301,27 @@ def __execute_computation(self, method_id: ComputationMethod.ValueType, columns: Tuple[List, List], *, debug_mode: bool = False) \ -> ExecuteResponse: - """ 計算リクエストを送信 """ + """計算リクエストをMPCサーバに送信する + + MPCサーバ上でJobと呼ばれる計算リクエストを発行する. + `data_ids` で指定したIDはサーバ内で全てinner_joinされる. + + Parameters + ---------- + method_id: ComputationMethod.ValueType + 計算の種類を管理するID + data_ids: List[str] + 計算に用いるデータのID + columns: Tuple[List, List] + 計算に用いるデータの列番号(1-index) + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ req = ExecuteComputationRequest( method_id=method_id, token=self.__token, @@ -229,12 +344,44 @@ def __execute_computation(self, method_id: ComputationMethod.ValueType, def sum(self, data_ids: List[str], columns: List[int], *, debug_mode: bool = False) -> ExecuteResponse: + """総和計算リクエストをMPCサーバに送信する + + Parameters + ---------- + data_ids: List[str] + 計算に用いるデータのID + columns: List[int] + 計算に用いるデータの列番号(1-index) + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ return self.__execute_computation( ComputationMethod.COMPUTATION_METHOD_SUM, data_ids, (columns, []), debug_mode=debug_mode) def mean(self, data_ids: List[str], columns: List[int], *, debug_mode: bool = False) -> ExecuteResponse: + """平均計算リクエストをMPCサーバに送信する + + Parameters + ---------- + data_ids: List[str] + 計算に用いるデータのID + columns: List[int] + 計算に用いるデータの列番号(1-index) + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ return self.__execute_computation( ComputationMethod.COMPUTATION_METHOD_MEAN, data_ids, (columns, []), debug_mode=debug_mode) @@ -242,6 +389,22 @@ def mean(self, data_ids: List[str], columns: List[int], def variance(self, data_ids: List[str], columns: List[int], *, debug_mode: bool = False) \ -> ExecuteResponse: + """分散計算リクエストをMPCサーバに送信する + + Parameters + ---------- + data_ids: List[str] + 計算に用いるデータのID + columns: List[int] + 計算に用いるデータの列番号(1-index) + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ return self.__execute_computation( ComputationMethod.COMPUTATION_METHOD_VARIANCE, data_ids, (columns, []), debug_mode=debug_mode) @@ -249,6 +412,24 @@ def variance(self, data_ids: List[str], columns: List[int], def correl(self, data_ids: List[str], inp1: List[int], inp2: List[int], *, debug_mode: bool = False) \ -> ExecuteResponse: + """相関係数計算リクエストをMPCサーバに送信する + + Parameters + ---------- + data_ids: List[str] + 計算に用いるデータのID + inp1: List[int] + 相関係数の左項に該当する列番号(1-index) + inp2: List[int] + 相関係数の右項に該当する列番号(1-index) + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ return self.__execute_computation( ComputationMethod.COMPUTATION_METHOD_CORREL, data_ids, (inp1, inp2), debug_mode=debug_mode) @@ -256,12 +437,42 @@ def correl(self, data_ids: List[str], inp1: List[int], inp2: List[int], def meshcode(self, data_ids: List[str], inp1: List[int], *, debug_mode: bool = False) \ -> ExecuteResponse: + """meshcodeリクエストをMPCサーバに送信する + + Parameters + ---------- + data_ids: List[str] + 計算に用いるデータのID + inp1: List[int] + 計算に用いるデータの列番号(1-index) + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ return self.__execute_computation( ComputationMethod.COMPUTATION_METHOD_MESH_CODE, data_ids, (inp1, []), debug_mode=debug_mode) def join(self, data_ids: List[str], *, debug_mode: bool = False) -> ExecuteResponse: + """inner_joinリクエストをMPCサーバに送信する + + Parameters + ---------- + data_ids: List[str] + 計算に用いるデータのID + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか + + Returns + ------- + ExecuteResponse + 計算リクエストの結果 + """ return self.__execute_computation( ComputationMethod.COMPUTATION_METHOD_JOIN_TABLE, data_ids, ([], []), debug_mode=debug_mode) @@ -269,7 +480,27 @@ def join(self, data_ids: List[str], @staticmethod def __stream_result(stream: Iterable, job_uuid: str, party: int, output_path: Optional[str]) -> Dict: - """ エラーチェックしてstreamのresultを得る """ + """streamから計算結果を取得して結合する + + `output_path` を指定すると計算結果をファイルに書き込み,返り値にデータ本体は含まれない. + `output_path` がNoneの場合は計算結果はファイルには書き込まれず,返り値に全て含まれる. + + Parameters + ---------- + stream: Iterable + grpcのstreamインスタンス + job_uuid: str + jobのID + party: int + Partyの番号(1-index) + output_path: Optional[str] + 出力するファイルのパス + + Returns + ------- + Dict + streamの結果を結合した辞書 + """ is_ok: bool = True res_list = [] for res in stream: @@ -298,7 +529,23 @@ def __stream_result(stream: Iterable, job_uuid: str, party: int, def get_computation_result(self, job_uuid: str, output_path: Optional[str] = None) \ -> GetResultResponse: - """ コンテナから結果を取得 """ + """計算結果をMPCサーバから取得する + + `output_path` を指定すると計算結果をファイルに書き込み,返り値にデータ本体は含まれない. + `output_path` がNoneの場合は計算結果はファイルには書き込まれず,返り値に全て含まれる. + + Parameters + ---------- + job_uuid + jobのID + output_path: Optional[str] + 出力するファイルのパス + + Returns + ------- + GetResultResponse + 計算結果取得リクエストの結果 + """ # リクエストパラメータを設定 req = GetComputationRequest( job_uuid=job_uuid, @@ -361,6 +608,18 @@ def get_computation_result(self, job_uuid: str, def get_computation_status(self, job_uuid: str) \ -> GetComputationStatusResponse: + """計算ステータスをMPCサーバから取得する + + Parameters + ---------- + job_uuid: str + jobのID + + Returns + ------- + GetComputationStatusResponse + 計算ステータス + """ # リクエストパラメータを設定 req = GetComputationRequest( job_uuid=job_uuid, @@ -381,6 +640,18 @@ def get_computation_status(self, job_uuid: str) \ return GetComputationStatusResponse(statuses, progresses) def get_job_error_info(self, job_uuid: str) -> GetJobErrorInfoResponse: + """計算のエラー情報をMPCサーバから取得する + + Parameters + ---------- + job_uuid: str + jobのID + + Returns + ------- + GetJobErrorInfoResponse + 計算のエラー情報 + """ # リクエストパラメータを設定 req = GetComputationRequest( job_uuid=job_uuid, @@ -400,6 +671,18 @@ def get_job_error_info(self, job_uuid: str) -> GetJobErrorInfoResponse: return GetJobErrorInfoResponse(job_error_info) def get_elapsed_time(self, job_uuid: str) -> GetElapsedTimeResponse: + """計算にかかった時間をMPCサーバから取得する + + Parameters + ---------- + job_uuid: str + jobのID + + Returns + ------- + GetElapsedTimeResponse + 計算にかかった時間 + """ # リクエストパラメータを設定 req = GetElapsedTimeRequest( job_uuid=job_uuid, @@ -416,6 +699,17 @@ def get_elapsed_time(self, job_uuid: str) -> GetElapsedTimeResponse: return GetElapsedTimeResponse(elapsed_time) def delete_share(self, data_ids: List[str]) -> None: + """送信したShareをMPCサーバから削除する + + Parameters + ---------- + data_ids: List[str] + 削除したいShareのIDリスト + + Returns + ------- + None + """ req = DeleteSharesRequest(dataIds=data_ids, token=self.__token) # 非同期にリクエスト送信 with ThreadPoolExecutor() as executor: @@ -425,6 +719,20 @@ def delete_share(self, data_ids: List[str]) -> None: def add_share_data_frame(self, base_data_id: str, add_data_id: str) \ -> AddShareDataFrameResponse: + """テーブル加算リクエストをMPCサーバに送信する + + Parameters + ---------- + base_data_id: str + 左項のテーブルのID + add_data_id: str + 右項のテーブルのID + + Returns + ------- + AddShareDataFrameResponse + テーブル加算の結果 + """ req = AddShareDataFrameRequest(base_data_id=base_data_id, add_data_id=add_data_id, token=self.__token) From 696c2f402d45b8835c99d400d922865c1e13f14f Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 16:16:23 +0900 Subject: [PATCH 10/23] Add qmpc.pandas doc --- .../libclient-py/quickmpc/pandas/parser.py | 219 +++++++++++++++++- .../libclient-py/quickmpc/pandas/progress.py | 42 ++++ .../quickmpc/pandas/share_data_frame.py | 129 ++++++++++- 3 files changed, 372 insertions(+), 18 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/parser.py b/packages/client/libclient-py/quickmpc/pandas/parser.py index dad49fd6e..736446e64 100644 --- a/packages/client/libclient-py/quickmpc/pandas/parser.py +++ b/packages/client/libclient-py/quickmpc/pandas/parser.py @@ -23,34 +23,90 @@ @dataclass(frozen=True) class FormatChecker: + """Formatが正しいかをチェックする + """ @methoddispatch(is_static_method=True) @staticmethod - def check_duplicate(_): + def check_duplicate(*args, **kw): raise ArgumentError("不正な引数が与えられています.") - @check_duplicate.register(Dim1) @staticmethod - def check_duplicate_dummy(schema: List[str]): + @check_duplicate.register(Dim1) + def check_duplicate_dummy(*args, **kw): raise ArgumentError("不正な引数が与えられています.") @check_duplicate.register((Dim1, str)) @staticmethod - def check_duplicate_strs(schema: List[str]) -> bool: - return len(schema) == len(set(schema)) + def check_duplicate_strs(lst: List[str]) -> bool: + """文字列配列に重複要素があるかチェックする + + Parameters + ---------- + lst: List[str] + チェックする配列 + + Returns + ------- + bool + 違反してないかどうか + """ + return len(lst) == len(set(lst)) @check_duplicate.register((Dim1, Schema)) @staticmethod def check_duplicate_typed(schema: List[Schema]) -> bool: + """スキーマ配列に重複要素があるかチェックする + + スキーマ種別による区別はなく,スキーマの名前だけで重複チェックを行う + + Parameters + ---------- + schema: List[str] + チェックする配列 + + Returns + ------- + bool + 違反してないかどうか + """ return len(schema) == len(set([sch.name for sch in schema])) @staticmethod def check_size(secrets: Sequence[Sequence[Union[str, ShareValueType]]], schema: Sequence[Union[str, Schema]]) -> np.bool_: + """Schemaサイズとテーブルの列サイズが等しいかをチェックする + + Parameters + ---------- + secrets: Sequence[Sequence[Union[str, ShareValueType]]] + チェックするテーブルデータ + schema: Sequence[Union[str, Schema]]) + チェックするスキーマ + + Returns + ------- + np.bool_ + 違反してないかどうか + """ return np.all([len(s) == len(schema) for s in secrets]) def format_check(secrets: List[List[ShareValueType]], schema: Sequence[Union[str, Schema]]) -> bool: + """Schemaとテーブルデータが要件を満たすかチェックする + + Parameters + ---------- + secrets: List[List[ShareValueType]], + チェックするテーブルデータ + schema: Sequence[Union[str, Schema]]) + チェックするスキーマ + + Returns + ------- + bool + 違反してないかどうか + """ # 存在チェック if not (schema and secrets): logger.error("Schema or secrets table are not exists.") @@ -67,7 +123,32 @@ def format_check(secrets: List[List[ShareValueType]], def to_float(val: str) -> float: - """ If val is a float, convert as is; if it is a string, hash it. """ + """stringをfloatに変換する + + stringが数値に変換可能な場合は数値に変換する. + 変換できない場合は512bitのhashに変換した上で上位k bitを切り取り, + 整数部(k-m) bit,小数部m bitの値をfloatに変換して返す. + ただし,k,mはMPCサーバ内部のLTZ(Less Than Zero)プロトコルで使用されるハイパーパラメータである. + + Parameters + ---------- + val: str + 変換する文字列 + + Returns + ------- + float + 変換された実数 + + Examples + --------- + >>> to_float("1") + 1.0 + >>> to_float("1.01") + 1.01 + >>> to_float("string") + 41254067.792910576 + """ try: return float(val) except ValueError: @@ -83,11 +164,49 @@ def to_float(val: str) -> float: def to_int(val: str, encoding='utf-8') -> int: + """stringをintに変換する + + 文字列を `encoding` の形式で数値に変換する. + 元々数値に変換できる文字列だったとしても全て `encoding` の形式に変換する. + + Parameters + ---------- + val: str + 変換する文字列 + encoding: str, default="utf-8" + 変換形式 + + Returns + ------- + int + 変換された実数 + + Examples + --------- + >>> to_int("1") + 49 + >>> to_int("1.01") + 825110577 + >>> to_int("string") + 126943972912743 + """ encoded = val.encode(encoding) return int.from_bytes(encoded, byteorder='big') def check_float_data(val: str) -> bool: + """文字列がfloatに変換可能であるかチェックする + + Parameters + ---------- + val: str + チェックする文字列 + + Returns + ------- + bool + 変換可能かどうか + """ try: _ = float(val) return True @@ -98,6 +217,36 @@ def check_float_data(val: str) -> bool: def find_type(col_schema: str, col_data: List[str], is_matching_column: bool) \ -> ShareValueTypeEnum.ValueType: + """スキーマにタグを検索する + + スキーマ名に `:` という形式のタグがついている場合はこのタグを返す. + ついていない場合はテーブルデータの文字列から推測する. + + Parameters + ---------- + col_schema: str, + スキーマの名前 + col_data: List[str], + 列の全てのデータ + is_matching_column: bool) + その列がID列かどうか + + Returns + ------- + ShareValueTypeEnum.ValueType + スキーマのタグ + + Examples + -------- + >>> find_type("s:id", ["a"], True) + ShareValueTypeEnum.SHARE_VALUE_TYPE_FIXED_POINT + >>> find_type("s", ["a"], True) + ShareValueTypeEnum.SHARE_VALUE_TYPE_FIXED_POINT + >>> find_type("s", ["a"], False) + ShareValueTypeEnum.SHARE_VALUE_TYPE_UTF_8_INTEGER_REPRESENTATION + >>> find_type("s", ["100"], False) + ShareValueTypeEnum.SHARE_VALUE_TYPE_FIXED_POINT + """ # check tag type_str, *remains = col_schema.split(':') @@ -124,6 +273,22 @@ def find_types(schema: List[str], data: List[List[str]], matching_column: Optional[int] = None ) -> List[ShareValueTypeEnum.ValueType]: + """各スキーマのタグを検索する + + Parameters + ---------- + schema: List[str] + テーブルデータのスキーマ + data: List[List[str]] + テーブルデータ + matching_column: Optional[int], default=None + ID列のindex(1-index) + + Returns + ------- + List[ShareValueTypeEnum.ValueType] + 各スキーマのタグ + """ # transpose to get column oriented list transposed: Iterable[List[str]] = map(list, zip(*data)) return [find_type(sch, col, idx == matching_column) @@ -132,6 +297,20 @@ def find_types(schema: List[str], def convert(element: str, type_info: ShareValueTypeEnum.ValueType) -> ShareValueType: + """スキーマのタグに沿って文字列を数値に変換する + + Parameters + ---------- + element: str + 変換する文字列 + type_info: ShareValueTypeEnum.ValueType + スキーマタグ + + Returns + ------- + ShareValueType + 変換後の値 + """ if type_info == ShareValueTypeEnum.Value('SHARE_VALUE_TYPE_FIXED_POINT'): return to_float(element) if type_info == ShareValueTypeEnum.Value( @@ -142,6 +321,20 @@ def convert(element: str, def parse(data: List[List[str]], matching_column: Optional[int] = None) \ -> Tuple[List[List[ShareValueType]], List[Schema]]: + """テーブルデータをMPCで使用できる形式にparseする + + Parameters + ---------- + data: List[List[str]] + テーブルデータ + matching_column: Optional[int], default=None + ID列のindex(1-index) + + Returns + ------- + Tuple[List[List[ShareValueType]], List[Schema]]: + parseしたスキーマとテーブルデータ + """ schema_name: List[str] = data[0] types = find_types(schema_name, data[1:], matching_column) schema = [Schema(name=name, type=type) @@ -165,6 +358,20 @@ def parse(data: List[List[str]], matching_column: Optional[int] = None) \ def parse_csv( filename: str, matching_column: Optional[int] = None) \ -> Tuple[List[List[ShareValueType]], List[Schema]]: + """csvのテーブルデータをMPCで使用できる形式にparseする + + Parameters + ---------- + filename: str + 入力ファイルのpath + matching_column: Optional[int], default=None + ID列のindex(1-index) + + Returns + ------- + Tuple[List[List[ShareValueType]], List[Schema]]: + parseしたスキーマとテーブルデータ + """ with open(filename) as f: reader = csv.reader(f) text: List[List[str]] = [row for row in reader] diff --git a/packages/client/libclient-py/quickmpc/pandas/progress.py b/packages/client/libclient-py/quickmpc/pandas/progress.py index 293ef7454..2a66c433d 100644 --- a/packages/client/libclient-py/quickmpc/pandas/progress.py +++ b/packages/client/libclient-py/quickmpc/pandas/progress.py @@ -10,12 +10,54 @@ @dataclass class Progress: + """計算の進捗を管理するクラス + + Attributes + ---------- + pbars: OrderedDict[Tuple[int, int], + Tuple[Optional[tqdm.tqdm], float]] + 計算Statusを保持する辞書 + + Examples + -------- + .. code-block:: python3 + + progress = Progress() + while runinng: + status = get_status() + progress.update(status) + + output + + .. code-block:: console + + [0] status: 100%|███████████████| 6/6 [00:01<00:00, 5.88it/s, status=COMPLETED] + [1] status: 100%|███████████████| 6/6 [00:01<00:00, 5.88it/s, status=COMPLETED] + [2] status: 100%|███████████████| 6/6 [00:01<00:00, 5.88it/s, status=COMPLETED] + [0] hjoin: core: 100%|█████████| 100.0/100 [00:01<00:00, 97.96it/s, details=1/4] + [0] hjoin: binary search: 100%|█| 100.0/100 [00:01<00:00, 97.97it/s, details=0/2 + [1] hjoin: core: 100%|█████████| 100.0/100 [00:01<00:00, 97.98it/s, details=1/4] + [1] hjoin: binary search: 100%|█| 100.0/100 [00:01<00:00, 97.99it/s, details=0/2 + [2] hjoin: core: 100%|█████████| 100.0/100 [00:01<00:00, 98.00it/s, details=1/4] + [2] hjoin: binary search: 100%|█| 100.0/100 [00:01<00:00, 98.01it/s, details=0/2 + """ # noqa: E501 pbars: OrderedDict[Tuple[int, int], Tuple[Optional[tqdm.tqdm], float]] \ = field(default_factory=collections.OrderedDict) # TODO: statusとprogreassを受け取るようにする(疎にするため) def update(self, res: GetComputationStatusResponse): + """進捗Statusを更新する + + Parameters + ---------- + res: GetComputationStatusResponse + 計算Status + + Returns + ------- + None + """ if res.job_statuses is not None: for party_id, status in enumerate(res.job_statuses): key = (party_id, -1) diff --git a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py index fab6230dc..d2f0d2e9a 100644 --- a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py +++ b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py @@ -18,6 +18,8 @@ class ShareDataFrameStatus(Enum): + """Jobの計算Status + """ OK = 1 EXECUTE = 2 ERROR = 3 @@ -49,16 +51,16 @@ def wrapper(self: "ShareDataFrame", *args, class ShareDataFrame: """テーブルデータを管理するクラス - Attributes - ---------- - __id: str + Args + ---- + _ShareDataFrame__id: str データのID - __qmpc_request: quickmpc.request.QMPCClientInterface + _ShareDataFrame__qmpc_request: quickmpc.request.QMPCClientInterface QuickMPCとの通信を担うClient - __is_result: bool + _ShareDataFrame__is_result: bool send由来のDataFrame(False)なのかexecute由来のDataFrameなのか(True) - __status: ShareDataFrameStatus - 現在の状態 + _ShareDataFrame__status: ShareDataFrameStatus + 現在のデータの状態 """ __id: str @@ -67,6 +69,27 @@ class ShareDataFrame: __status: ShareDataFrameStatus = ShareDataFrameStatus.OK def _wait_execute(self, progress: bool) -> None: + """計算が終了するまで待機する + + 管理しているIDがjob_uuid(execute由来のID)である場合,計算が終了するまで待機する. + send_shareしたdata_idを管理している場合は待機する必要がないためすぐにreturnする. + + 待機は計算終了まで永遠に行われ,1秒おきにMPCサーバに現在Statusの確認リクエストが送信される. + + Parameters + ---------- + progress: bool + 計算Statusをログに出力するかどうか + + Returns + ---------- + None + + Raises + ------ + QMPCJobError + 計算中に何らかのエラーが発生している時 + """ if self.__status == ShareDataFrameStatus.ERROR: raise QMPCJobError("ShareDataFrame's status is `ERROR`") if self.__status == ShareDataFrameStatus.EXECUTE: @@ -92,14 +115,14 @@ def _wait_execute(self, progress: bool) -> None: time.sleep(1) def __add__(self, other: "ShareDataFrame") -> "ShareDataFrame": - """テーブルを加算する. + """テーブルデータを加算する. - qmpc.send_toで送ったデータでかつ,行数,列数が一致している場合のみ正常に動作する. + :any:`quickmpc.send_to` で送ったデータでかつ,行数,列数が一致している場合のみ正常に動作する. Parameters ---------- other: ShareDataFrame - 結合したいDataFrame + 加算したいDataFrame Returns ---------- @@ -114,12 +137,14 @@ def join(self, other: "ShareDataFrame", *, debug_mode=False) \ -> "ShareDataFrame": """テーブルデータを結合する. - inner_joinのみ. + 内部ではinner_joinを行う. Parameters ---------- other: ShareDataFrame 結合したいDataFrame + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか Returns ---------- @@ -133,12 +158,14 @@ def join_list(self, others: List["ShareDataFrame"], *, debug_mode=False)\ -> "ShareDataFrame": """テーブルデータを結合する. - inner_joinのみ. + 内部ではinner_joinを行う. Parameters ---------- others: List[ShareDataFrame] 結合したいDataFrameのリスト + debug_mode: bool, default=False + 違法な高速結合による高速化をするかどうか Returns ---------- @@ -151,27 +178,89 @@ def join_list(self, others: List["ShareDataFrame"], *, debug_mode=False)\ True, ShareDataFrameStatus.EXECUTE) def sum(self, columns: list) -> "ShareDataFrame": + """列の総和を取得する + + Parameters + ---------- + columns: list + 計算に用いる列番号(1-index) + + Returns + ---------- + Result + 結果のDataFrame + """ res = self.__qmpc_request.sum([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) def mean(self, columns: list) -> "ShareDataFrame": + """列の平均を取得する + + Parameters + ---------- + columns: list + 計算に用いる列番号(1-index) + + Returns + ---------- + Result + 結果のDataFrame + """ res = self.__qmpc_request.mean([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) def variance(self, columns: list) -> "ShareDataFrame": + """列の分散を取得する + + Parameters + ---------- + columns: list + 計算に用いる列番号(1-index) + + Returns + ---------- + Result + 結果のDataFrame + """ res = self.__qmpc_request.variance([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) def correl(self, columns1: list, columns2: list) -> "ShareDataFrame": + """列同士の分散を取得する + + Parameters + ---------- + columns1: list + 計算に用いる左項の列番号(1-index) + columns2: list + 計算に用いる右項の列番号(1-index) + + Returns + ---------- + Result + 結果のDataFrame + """ res = self.__qmpc_request.correl([self.__id], columns1, columns2) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) def meshcode(self, columns: list) \ -> "ShareDataFrame": + """列のmeshcodeを取得する + + Parameters + ---------- + columns: list + 計算に用いる列番号(1-index) + + Returns + ---------- + Result + 結果のDataFrame + """ res = self.__qmpc_request.meshcode([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) @@ -189,6 +278,12 @@ def to_csv(self, output_path: str) -> None: Returns ---------- + None + + Raises + ------ + RuntimeError + 送信したデータをそのまま保存しようとした場合 """ # 計算結果でないなら保存されないようにする if not self.__is_result: @@ -208,6 +303,11 @@ def to_data_frame(self) -> pd.DataFrame: ---------- pd.DataFrame 計算結果 + + Raises + ------ + RuntimeError + 送信したデータをそのまま取得しようとした場合 """ # 計算結果でないなら取得できないようにする if not self.__is_result: @@ -246,6 +346,11 @@ def get_elapsed_time(self) -> List[float]: ---------- float 計算時間 + + Raises + ------ + RuntimeError + 計算していないデータを指定した場合 """ # 計算していない場合は計算時間が存在しない if not self.__is_result: From f1b99380981663be2319f8a245bfd5b45e81b91c Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 19:05:58 +0900 Subject: [PATCH 11/23] Add qmpc.share doc --- .../libclient-py/quickmpc/share/random.py | 111 ++++++- .../libclient-py/quickmpc/share/restore.py | 46 ++- .../libclient-py/quickmpc/share/share.py | 313 ++++++++++++++++-- 3 files changed, 443 insertions(+), 27 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/share/random.py b/packages/client/libclient-py/quickmpc/share/random.py index 73b923086..4db1084ef 100644 --- a/packages/client/libclient-py/quickmpc/share/random.py +++ b/packages/client/libclient-py/quickmpc/share/random.py @@ -23,20 +23,44 @@ def get_list(self, a, b, size: int) -> List[int]: @dataclass(frozen=True) class ChaCha20(RandomInterface): + """ChaCha20による乱数生成器 + + args + ---- + mx: int + 乱数最大値 + mn: int + 乱数最小値 + """ # 128bit符号付き整数最大,最小値 mx: ClassVar[int] = (1 << 128)-1 mn: ClassVar[int] = -(1 << 128) @methoddispatch() - def get(self, a, b): + def get(self, *args, **kw): + """乱数を生成する + + overloadして使用される. + """ raise ArgumentError( "乱数の閾値はどちらもintもしくはdecimalでなければなりません." f"a is {type(a)}, b is {type(b)}") @get.register(int) def __get_int(self, a: int, b: int) -> int: - # TRNGで [a,b) の乱数生成 + """TRNGで整数の乱数を生成する + + Parameters + ---------- + a, b: int + [a, b)の範囲で生成する + + Returns + ------- + int + 整数乱数 + """ self.__exception_check(a, b) interval_byte = self.__get_byte_size(b-a) byte_val: bytes = random(interval_byte) @@ -45,19 +69,51 @@ def __get_int(self, a: int, b: int) -> int: @get.register(Decimal) def __get_decimal(self, a: Decimal, b: Decimal) -> Decimal: + """TRNGで実数の乱数を生成する + + Parameters + ---------- + a, b: Decimal + [a, b)の範囲で生成する + + Returns + ------- + Decimal + 整数乱数 + """ # 256bit整数を取り出して[a,b]に正規化する self.__exception_check(a, b) val: int = self.get(self.mn, self.mx) return Decimal(val-self.mn)/(self.mx-self.mn)*(b-a)+a @methoddispatch() - def get_list(self, a, b, size: int): + def get_list(self, *args, **kw): + """乱数配列を生成する + + overloadして使用される. + """ raise ArgumentError( "乱数の閾値はどちらもintもしくはdecimalでなければなりません." f"a is {type(a)}, b is {type(b)}") @get_list.register(int) def __get_list_int(self, a: int, b: int, size: int) -> List[int]: + """CSPRNGで整数の乱数配列を生成する + + seedをTRNGで生成して配列サイズ分の乱数はCSPRNGで生成する. + + Parameters + ---------- + a, b: int + [a, b)の範囲で生成する + size: int + 配列サイズ + + Returns + ------- + List[int] + 整数乱数の配列 + """ # TRNGの32byteをseedとしてCSPRNGでsize分生成 byte_size: int = self.__get_byte_size(b-a) self.__exception_check(a, b) @@ -70,6 +126,20 @@ def __get_list_int(self, a: int, b: int, size: int) -> List[int]: @get_list.register(Decimal) def __get_list_decimal(self, a: Decimal, b: Decimal, size: int) \ -> List[Decimal]: + """CSPRNGで実数の乱数配列を生成する + + Parameters + ---------- + a, b: Decimal + [a, b)の範囲で生成する + size: int + 配列サイズ + + Returns + ------- + List[Decimal] + 実数乱数の配列 + """ # 128bit整数を取り出して[a,b]に正規化する self.__exception_check(a, b) valList: List[int] = self.get_list(self.mn, self.mx, size) @@ -77,13 +147,46 @@ def __get_list_decimal(self, a: Decimal, b: Decimal, size: int) \ for val in valList] def __get_byte_size(self, x: int) -> int: - # 整数の byte サイズを取得 + """整数のbyteサイズを取得する + + Parameters + ---------- + x: int + 整数 + + Returns + ------- + int + 入力整数のbyteサイズ + """ return max(math.ceil(math.log2(x))//8 + 1, 32) def __get_32byte(self) -> bytes: + """32bit乱数を/dev/randomから取得する + + Parameters + ---------- + + Returns + ------- + bytes + 乱数byte列 + """ return random() def __exception_check(self, a, b) -> None: + """乱数生成関数のvalidation checkをする + + Parameters + ---------- + a, b: any + 生成したい乱数の範囲[a,b) + + + Returns + ------- + None + """ if a >= b: raise ArgumentError( "乱数の下限は上限より小さい必要があります." diff --git a/packages/client/libclient-py/quickmpc/share/restore.py b/packages/client/libclient-py/quickmpc/share/restore.py index 3dec1f23c..a5fdb27e5 100644 --- a/packages/client/libclient-py/quickmpc/share/restore.py +++ b/packages/client/libclient-py/quickmpc/share/restore.py @@ -11,7 +11,21 @@ from quickmpc.utils import if_present -def get_meta(job_uuid: str, path: str): +def get_meta(job_uuid: str, path: str) -> int: + """結果データからmeta情報を取り出す + + Parameters + ---------- + job_uuid: str + 計算結果のID + path: str + 計算結果を保存したpath + + Returns + ------- + int + metaデータ + """ file_name = glob.glob(f"{path}/dim?-{job_uuid}-*")[0] with open(file_name, 'r') as f: reader = csv.reader(f) @@ -21,6 +35,20 @@ def get_meta(job_uuid: str, path: str): def get_result(job_uuid: str, path: str, party: int): + """結果データからmeta情報を取り出す + + Parameters + ---------- + job_uuid: str + 計算結果のID + path: str + 計算結果を保存したpath + + Yields + ------ + List[str] + テーブルデータの行 + """ for file_name in natsorted(glob.glob(f"{path}-{job_uuid}-{party}-*")): with open(file_name, 'r') as f: reader = csv.reader(f) @@ -32,6 +60,22 @@ def get_result(job_uuid: str, path: str, party: int): def restore(job_uuid: str, path: str, party_size: int) -> Any: + """ファイルに保存された結果データを復元する + + Parameters + ---------- + job_uuid: str + 計算結果のID + path: str + 計算結果を保存したpath + party_size: int + MPCのパーティ数 + + Returns + ------- + Any + 復元した計算結果 + """ column_number = get_meta(job_uuid, path) schema: Any = [None]*column_number diff --git a/packages/client/libclient-py/quickmpc/share/share.py b/packages/client/libclient-py/quickmpc/share/share.py index 8e4bb7065..39e98a740 100644 --- a/packages/client/libclient-py/quickmpc/share/share.py +++ b/packages/client/libclient-py/quickmpc/share/share.py @@ -18,49 +18,105 @@ @dataclass(frozen=True) class Share: + """Share関連の処理をまとめているクラス + + Attributes + ---------- + _Share__share_random_range: Tuple[Decimal, Decimal] + share乱数の範囲 + """ __share_random_range: ClassVar[Tuple[Decimal, Decimal]] =\ (Decimal(-(1 << 64)), Decimal(1 << 64)) @methoddispatch(is_static_method=True) @staticmethod - def __to_str(_): - logger.error("Invalid argument on stringfy.") + def __to_str(*args, **kw): + """文字列に変換する + + overloadして使用される. + """ raise ArgumentError("不正な引数が与えられています.") @__to_str.register(Decimal) @staticmethod def __decimal_to_str(val: Decimal) -> str: + """decimalを文字列に変換する + + Parameters + ---------- + val: Decimal + 変換する値 + + Returns + ------- + str + 変換された文字列 + """ # InfinityをCCで読み込めるinfに変換 return 'inf' if Decimal.is_infinite(val) else str(val) @__to_str.register(int) @staticmethod def __int_to_str(val: int) -> str: + """intを文字列に変換する + + Parameters + ---------- + val: int + 変換する値 + + Returns + ------- + str + 変換された文字列 + """ return str(val) @methoddispatch(is_static_method=True) @staticmethod - def sharize(_, __): - logger.error("Invalid argument on sharize.") + def sharize(*args, **kw): + """sharizeする + + overloadして使用される. + """ raise ArgumentError("不正な引数が与えられています.") @methoddispatch(is_static_method=True) @staticmethod - def recons(_): - logger.error("Invalid argument on recons.") + def recons(*args, **kw): + """Shareを復元する + + overloadして使用される. + """ raise ArgumentError("不正な引数が与えられています.") @methoddispatch(is_static_method=True) @staticmethod - def convert_type(_, __): - logger.error("Invalid argument on convert_type.") + def convert_type(*args, **kw): + """値を変換する + + overloadして使用される. + """ raise ArgumentError("不正な引数が与えられています.") @sharize.register(int) @sharize.register(float) @staticmethod def __sharize_scalar(secrets: float, party_size: int = 3) -> List[str]: - """ スカラ値のシェア化 """ + """スカラ値をシェア化する + + Parameters + ---------- + secrets: float + スカラ値 + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[str] + シェア + """ rnd: RandomInterface = ChaCha20() shares: List[int] = rnd.get_list( *Share.__share_random_range, party_size) @@ -73,7 +129,20 @@ def __sharize_scalar(secrets: float, party_size: int = 3) -> List[str]: def __sharize_1dimension_float(secrets: List[Union[float, Decimal]], party_size: int = 3) \ -> List[List[str]]: - """ 1次元リストのシェア化 """ + """実数の1次元リストをシェア化する + + Parameters + ---------- + secrets: List[Union[float, Decimal]] + 1次元リスト + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[List[str]] + シェアのリスト + """ rnd: RandomInterface = ChaCha20() secrets_size: int = len(secrets) shares: np.ndarray = np.array([ @@ -90,13 +159,40 @@ def __sharize_1dimension_float(secrets: List[Union[float, Decimal]], def __sharize_1dimension_decimal(secrets: List[Decimal], party_size: int = 3) \ -> List[List[str]]: + """1次元リストをシェア化する + + Parameters + ---------- + secrets: List[Decimal] + 1次元リスト + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[List[str]] + シェアのリスト + """ return Share.__sharize_1dimension_float(secrets, party_size) @sharize.register((Dim1, int)) @staticmethod def __sharize_1dimension_int(secrets: List[int], party_size: int = 3) \ -> List[List[str]]: - """ 1次元リストのシェア化 """ + """整数の1次元リストをシェア化する + + Parameters + ---------- + secrets: List[int] + 1次元リスト + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[List[str]] + シェアのリスト + """ rnd: RandomInterface = ChaCha20() secrets_size: int = len(secrets) max_val = (max(secrets)+1) * 2 @@ -113,7 +209,20 @@ def __sharize_1dimension_int(secrets: List[int], party_size: int = 3) \ @staticmethod def __sharize_2dimension(secrets: List[List[Union[float, int]]], party_size: int = 3) -> List[List[List[str]]]: - """ 2次元リストのシェア化 """ + """2次元リストをシェア化する + + Parameters + ---------- + secrets: List[int] + 1次元リスト + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[List[List[str]]] + シェアのリスト + """ transposed: List[Union[List[int], List[float]]] \ = np.array(secrets, dtype=object).transpose().tolist() dst: List[List[List[str]]] = [ @@ -126,7 +235,20 @@ def __sharize_2dimension(secrets: List[List[Union[float, int]]], @sharize.register(dict) @staticmethod def __sharize_dict(secrets: dict, party_size: int = 3) -> List[dict]: - """ 辞書型のシェア化 """ + """辞書型をシェア化する + + Parameters + ---------- + secrets: List[int] + 1次元リスト + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[dict] + シェアのリスト + """ shares_str: List[dict] = [dict() for _ in range(party_size)] for key, val in secrets.items(): for i, share_val in enumerate(Share.sharize(val, party_size)): @@ -137,7 +259,20 @@ def __sharize_dict(secrets: dict, party_size: int = 3) -> List[dict]: @staticmethod def __sharize_dictlist(secrets: dict, party_size: int = 3) \ -> List[List[dict]]: - """ 辞書型配列のシェア化 """ + """辞書型配列をシェア化する + + Parameters + ---------- + secrets: List[int] + 1次元リスト + party_size: int, defulat=3 + MPCのパーティ数 + + Returns + ------- + List[List[dict]] + シェアのリスト + """ shares_str: List[List[dict]] = [[] for _ in range(party_size)] for secret_dict in secrets: share_dict: List[dict] = Share.sharize(secret_dict, party_size) @@ -148,14 +283,36 @@ def __sharize_dictlist(secrets: dict, party_size: int = 3) \ @recons.register(Dim1) @staticmethod def __recons_list1(shares: List[Union[int, Decimal]]): - """ 1次元リストのシェアを復元 """ + """1次元リストのシェアを復元 + + Parameters + ---------- + shares: List[Union[int, Decimal]] + シェア + + Returns + ------- + Union[int, Decimal] + 復元した値 + """ return sum(shares) @recons.register(Dim2) @recons.register(Dim3) @staticmethod def __recons_list(shares: List[List[Union[int, Decimal]]]) -> List: - """ リストのシェアを復元 """ + """リストのシェアを復元 + + Parameters + ---------- + shares: List[List[Union[int, Decimal]]] + シェア + + Returns + ------- + List + 復元した値 + """ secrets: List = [ Share.recons([shares_pi[i] for shares_pi in shares]) for i in range(len(shares[0])) @@ -165,7 +322,18 @@ def __recons_list(shares: List[List[Union[int, Decimal]]]) -> List: @recons.register(DictList) @staticmethod def __recons_dictlist(shares: List[dict]) -> dict: - """ 辞書型を復元 """ + """辞書型のシェアを復元 + + Parameters + ---------- + shares: List[dict] + シェア + + Returns + ------- + dict + 復元した値 + """ secrets: dict = dict() for key in shares[0].keys(): val = [] @@ -177,7 +345,18 @@ def __recons_dictlist(shares: List[dict]) -> dict: @recons.register(DictList2) @staticmethod def __recons_dictlist2(shares: List[List[dict]]) -> list: - """ 辞書型配列を復元 """ + """辞書型配列のシェアを復元 + + Parameters + ---------- + shares: List[List[dict]] + シェア + + Returns + ------- + List[dict] + 復元した値 + """ secrets: list = list() for i in range(len(shares[0])): val = [] @@ -189,7 +368,18 @@ def __recons_dictlist2(shares: List[List[dict]]) -> list: @staticmethod def get_pre_convert_func( schema: Optional[Schema]) -> Callable[[str], Any]: - """ スキーマに合った変換関数を返す """ + """スキーマに合った変換関数を返す + + Parameters + ---------- + schema: Optional[Schema]) + スキーマ + + Returns + ------- + Callable[[str], Any]: + 変換関数 + """ if schema is None: return Decimal type = schema.type @@ -205,6 +395,18 @@ def get_pre_convert_func( @staticmethod def convert_int_to_str(x: int): + """intをstrに変換する + + Parameters + ---------- + x: int + 整数 + + Returns + ------- + str + 変換した文字列 + """ bytes_repr: bytes = x.to_bytes((x.bit_length() + 7) // 8, byteorder='big') str_repr: str = bytes_repr.decode('utf-8') @@ -213,7 +415,18 @@ def convert_int_to_str(x: int): @staticmethod def get_convert_func( schema: Optional[Schema]) -> Callable[[Any], Any]: - """ スキーマに合った変換関数を返す """ + """スキーマに合った変換関数を返す + + Parameters + ---------- + schema: Optional[Schema]) + スキーマ + + Returns + ------- + Callable[[str], Any]: + 変換関数 + """ if schema is None: return float type = schema.type @@ -228,8 +441,22 @@ def get_convert_func( @convert_type.register(str) @staticmethod - def __pre_convert_type_str( - value: str, schema: Optional[Schema] = None) -> list: + def __pre_convert_type_str(value: str, schema: Optional[Schema] = None) \ + -> Union[int, float, Decimal]: + """文字列をスキーマタグに沿って数値に変換する + + Parameters + ---------- + value: str + 変換する文字列 + schema: Optional[Schema], default=None + スキーマ + + Returns + ------- + Union[int, float, Decimal]: + 変換した数値 + """ func = Share.get_pre_convert_func(schema) return func(value) @@ -238,6 +465,20 @@ def __pre_convert_type_str( def __convert_type_list( values: List[Any], schema: Optional[Sequence[Optional[Schema]]] = None) -> list: + """リストをスキーマタグに沿って数値に変換する + + Parameters + ---------- + value: List[Any] + 変換する文字列 + schema: Optional[Sequence[Optional[Schema]]], default=None + スキーマ + + Returns + ------- + list + 変換した数値 + """ if schema is None: schema = [None] * len(values) return [Share.convert_type(x, sch) @@ -249,6 +490,20 @@ def __convert_type_list( def __convert_type_elem( value: Union[Decimal, int], schema: Optional[Schema] = None) -> Union[float, str]: + """数値をスキーマタグに沿って数値に変換する + + Parameters + ---------- + value: Union[Decimal, int] + 変換する文字列 + schema: Optional[Schema], default=None + スキーマ + + Returns + ------- + Union[float, int] + 変換した数値 + """ func = Share.get_convert_func(schema) return func(value) @@ -257,4 +512,18 @@ def __convert_type_elem( def __convert_type_table( table: List[List], schema: Optional[List[Schema]] = None) -> list: + """テーブルデータをスキーマタグに沿って数値に変換する + + Parameters + ---------- + value: Union[Decimal, int] + 変換する文字列 + schema: Optional[List[Schema]], default=None + スキーマ + + Returns + ------- + List + 変換した数値 + """ return [Share.convert_type(row, schema) for row in table] From f9f74039c5092278f398a41768776b7db644398e Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 20:58:50 +0900 Subject: [PATCH 12/23] Add qmpc.utils doc --- .../libclient-py/quickmpc/utils/if_present.py | 20 +++- .../quickmpc/utils/make_pieces.py | 97 ++++++++++++++++++- .../quickmpc/utils/overload_tools.py | 69 ++++++++++++- 3 files changed, 181 insertions(+), 5 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/utils/if_present.py b/packages/client/libclient-py/quickmpc/utils/if_present.py index 8c31cb382..b6d3d459c 100644 --- a/packages/client/libclient-py/quickmpc/utils/if_present.py +++ b/packages/client/libclient-py/quickmpc/utils/if_present.py @@ -3,8 +3,24 @@ def if_present(optional: Optional[Any], func: Callable[[Any], Any], - *arg: Any + *args: Any ) -> Optional[Any]: + """optional変数を評価して関数を実行する + + Parameters + ---------- + optional: Optional[Any] + 何らかのoptional変数 + func: Callable[[Any], Any] + 実行する関数 + *args: Any + 実行する関数の引数列 + + Returns + ------- + Optional[Any] + 関数の実行結果 + """ if optional is None: return None - return func(optional, *arg) + return func(optional, *args) diff --git a/packages/client/libclient-py/quickmpc/utils/make_pieces.py b/packages/client/libclient-py/quickmpc/utils/make_pieces.py index 10dd17769..44cf19242 100644 --- a/packages/client/libclient-py/quickmpc/utils/make_pieces.py +++ b/packages/client/libclient-py/quickmpc/utils/make_pieces.py @@ -9,30 +9,81 @@ @dataclass(frozen=True) class MakePiece: + """値をいくつかのpieceに分割するクラス + """ @methoddispatch(is_static_method=True) @staticmethod - def __get_byte(p): ... + def __get_byte(*args, **kw): + """型のbyte数を取得する + + overloadして使用される + """ + raise NotImplementedError("not implemented.") @__get_byte.register(float) @__get_byte.register(int) @staticmethod def __get_byte_number(f): + """数値型のbyte数を取得する + + Parameters + ---------- + f + 数値 + + Returns + ------- + int + byte数 + """ # 扱う数値は64bitなので8byte return 8 @__get_byte.register(str) @staticmethod def __get_byte_str(s: str): + """文字列のbyte数を取得する + + Parameters + ---------- + s: str + 文字列 + + Returns + ------- + int + byte数 + """ return len(s) @methoddispatch(is_static_method=True) @staticmethod - def make_pieces(_, __): + def make_pieces(*args, **kw): + """値をいpieceに分割する + + overloadして使用される + """ raise ArgumentError("不正な引数が与えられています.") @staticmethod def check_max_size(max_size: int): + """piece_sizeのvalidator + + Parameters + ---------- + max_size: int + 分割サイズ + + Returns + ------- + None + + Raises + ------ + RuntimeError + 分割サイズがgrpcの要件を満たさないとき + """ # NOTE: grpcの送受信データサイズ上限:4MB lower_limit_size: int = 1 upper_limit_size: int = 1_000_000 @@ -50,6 +101,20 @@ def check_max_size(max_size: int): @make_pieces.register(Dim1) @staticmethod def __make_pieces_1d(src: List[str], max_size: int) -> List[List[str]]: + """1次元配列をpiece分割する + + Parameters + ---------- + src: List[str] + 分割する配列 + max_size: int + 分割1pieceごとの最大byte数 + + Returns + ------- + List[List[str]] + 分割した配列 + """ MakePiece.check_max_size(max_size) cur_size = 0 index = 0 @@ -76,6 +141,20 @@ def __make_pieces_1d(src: List[str], max_size: int) -> List[List[str]]: def __make_pieces_2d(src: List[List[str]], max_size: int ) -> List[List[List[str]]]: + """2次元配列をpiece分割する + + Parameters + ---------- + src: List[List[str]] + 分割する配列 + max_size: int + 分割1pieceごとの最大byte数 + + Returns + ------- + List[List[List[str]]] + 分割した配列 + """ MakePiece.check_max_size(max_size) cur_size = 0 index = 0 @@ -102,6 +181,20 @@ def __make_pieces_2d(src: List[List[str]], @make_pieces.register(str) @staticmethod def __make_pieces_str(src: str, max_size: int) -> List[str]: + """文字列をpiece分割する + + Parameters + ---------- + src: str + 分割する文字列 + max_size: int + 分割1pieceごとの最大byte数 + + Returns + ------- + [List[str] + 分割した配列 + """ MakePiece.check_max_size(max_size) dst: List[str] = [] current: str = "" diff --git a/packages/client/libclient-py/quickmpc/utils/overload_tools.py b/packages/client/libclient-py/quickmpc/utils/overload_tools.py index 7339bf936..51d80b7b2 100644 --- a/packages/client/libclient-py/quickmpc/utils/overload_tools.py +++ b/packages/client/libclient-py/quickmpc/utils/overload_tools.py @@ -6,26 +6,43 @@ class Dim1: + """1次元配列であることを示すクラス""" ... class Dim2: + """2次元配列であることを示すクラス""" ... class Dim3: + """3次元配列であることを示すクラス""" ... class DictList: + """1次元辞書型配列であることを示すクラス""" ... class DictList2: + """2次元辞書型配列であることを示すクラス""" ... -def d(lst): +def d(lst) -> int: + """次元数を取得する + + Parameters + ---------- + lst: any + 次元数を取得する変数 + + Returns + ------- + int + 次元数 + """ if not isinstance(lst, list): return 0 if not lst: @@ -34,6 +51,18 @@ def d(lst): def find_element_type(lst) -> type: + """配列の要素の型を取得する + + Parameters + ---------- + lst: any + 要素の型を取得する変数 + + Returns + ------- + type + 要素の型 + """ if not isinstance(lst, list): return lst.__class__ if not lst: @@ -42,6 +71,18 @@ def find_element_type(lst) -> type: def _get_dim_class(lst: list): + """次元数を加味したクラス分類を取得する + + Parameters + ---------- + lst: any + クラス分類を取得する変数 + + Returns + ------- + Any + クラス分類 + """ dim: int = d(lst) if dim == 1: if len(lst) and isinstance(lst[0], dict): @@ -57,6 +98,20 @@ def _get_dim_class(lst: list): def _convert_list_type(registry, type): + """次元数を加味したクラス分類を取得する + + Parameters + ---------- + registry: dict + 登録されている型集合 + type: any + 分類するクラス + + Returns + ------- + Any + クラス分類 + """ if type.__class__ is not list: return type for Dim in (Dim1, Dim2, Dim3, DictList): @@ -66,6 +121,18 @@ def _convert_list_type(registry, type): def methoddispatch(is_static_method: bool = False): + """overloadするための関数 + + Parameters + ---------- + is_static_method: bool + staticmethodかどうか + + Returns + ------- + Callable + dispatch関数 + """ def _dimdispatch(func): registry: dict = {} default_function = func From 9fb068175e6892d293a9306dc39ae0462d75142f Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 21:13:30 +0900 Subject: [PATCH 13/23] Add doc to toppage --- docs/libclient-py/source/index.rst | 5 + .../client/libclient-py/quickmpc/README.md | 155 ------------------ 2 files changed, 5 insertions(+), 155 deletions(-) delete mode 100644 packages/client/libclient-py/quickmpc/README.md diff --git a/docs/libclient-py/source/index.rst b/docs/libclient-py/source/index.rst index 4e9b77a2d..e5f68ec25 100644 --- a/docs/libclient-py/source/index.rst +++ b/docs/libclient-py/source/index.rst @@ -6,6 +6,11 @@ quickmpc-libclient-py's documentation ===================================== +.. _QuickMPC: https://github.com/acompany-develop/QuickMPC + +quickmpc-libclient-py はMPCを行う `QuickMPC`_ を簡単に操作するためのPythonライブラリです. +pandas likeなinterfaceでMPCについて知らないユーザでも簡単に秘匿計算を行うことができます. + .. toctree:: :maxdepth: 1 :caption: Contents: diff --git a/packages/client/libclient-py/quickmpc/README.md b/packages/client/libclient-py/quickmpc/README.md deleted file mode 100644 index 182ce428d..000000000 --- a/packages/client/libclient-py/quickmpc/README.md +++ /dev/null @@ -1,155 +0,0 @@ -# QuickMPC-libClient-pyが提供する機能 - -## QMPC.send_share_from_csv_file -csvファイルからテーブルデータを読み込みShare化して送信する -### Parameters -- file: `str` - - 読み込むファイル名 - -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["data_id"]: `str` - - テーブルデータのID - -## QMPC.send_share_from_csv_data -テーブルデータをShare化して送信する -### Parameters -- data: `List[List[str]]` - - パースするテーブルデータ - -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["data_id"]: `str` - - テーブルデータのID - -## QMPC.delete_share -エンジンに保存されたテーブルデータの削除する -### Parameters -- data_ids: `List[str]` - - 削除するdata_idのリスト -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - -## QMPC.mean -平均値を計算する -### Parameters -- data_ids: `List[str]` - - data_idのリスト -- src: `List[int]` - - 平均値を計算する列リスト -- debug_mode: `bool` - - keyword引数.`True`の場合はdebug用の違法高速マッチングを行う -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["job_uuid"]: `str` - - 計算スレッドのUUID - -## QMPC.variance -分散を計算する -### Parameters -- data_ids: `List[str]` - - data_idのリスト -- src: `List[int]` - - 分散を計算する列リスト -- debug_mode: `bool` - - keyword引数.`True`の場合はdebug用の違法高速マッチングを行う -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["job_uuid"]: `str` - - 計算スレッドのUUID - -## QMPC.sum -総和を計算する -### Parameters -- data_ids: `List[str]` - - data_idのリスト -- src: `List[int]` - - 総和を計算する列リスト -- debug_mode: `bool` - - keyword引数.`True`の場合はdebug用の違法高速マッチングを行う -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["job_uuid"]: `str` - - 計算スレッドのUUID - -## QMPC.correl -相関係数を計算する -### Parameters -- data_ids: `List[str]` - - data_idのリスト -- inp: `Tuple[List[int], List[int]]` - - inp[0]: 相関係数の左列リスト - - inp[1]: 相関係数の右列リスト -- debug_mode: `bool` - - keyword引数.`True`の場合はdebug用の違法高速マッチングを行う -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["job_uuid"]: `str` - - 計算スレッドのUUID - -## QMPC.meshcode -メッシュコードを計算する -### Parameters -- data_ids: `List[str]` - - data_idのリスト -- src: `List[int]` - - メッシュコードを計算する列リスト -- debug_mode: `bool` - - keyword引数.`True`の場合はdebug用の違法高速マッチングを行う -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["job_uuid"]: `str` - - 計算スレッドのUUID - -## QMPC.get_join_table -テーブルを結合する -### Parameters -- data_ids: `List[str]` - - data_idのリスト -- debug_mode: `bool` - - keyword引数.`True`の場合はdebug用の違法高速マッチングを行う -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["job_uuid"]: `str` - - 計算スレッドのUUID - -## QMPC.get_computation_result -計算結果を取得する -### Parameters -- job_uuid: `str` - - 計算スレッドのUUID -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["results"]: `List[float]` - - 計算結果 - -## QMPC.get_data_list -[deplecated] -エンジンに保存されているテーブルデータのIDを全て取得する -### Parameters -### Returns -- res: `Dict` - - res["is_ok"]: `bool` - - 送信が成功したかどうか - - res["results"]: `List[str]` - - テーブルデータのIDのリスト From 4cdf3f47a29556980bf56b5f7b9e3c6897dc7f57 Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 21:19:18 +0900 Subject: [PATCH 14/23] Add readthedocs yaml --- .readthedocs.yaml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..ffee8e34a --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,34 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.7" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/libclient-py/source/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - method: pip + path: ./packages/client/libclient-py + extra_requirements: + - document From b0584abf26893b283f1e7c444074867b2879025e Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 22:22:42 +0900 Subject: [PATCH 15/23] Fix flake8 error --- packages/client/libclient-py/quickmpc/pandas/parser.py | 4 ++-- packages/client/libclient-py/quickmpc/qmpc.py | 2 +- packages/client/libclient-py/quickmpc/share/random.py | 8 ++------ packages/client/libclient-py/quickmpc/share/share.py | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/parser.py b/packages/client/libclient-py/quickmpc/pandas/parser.py index 736446e64..a54a4dc52 100644 --- a/packages/client/libclient-py/quickmpc/pandas/parser.py +++ b/packages/client/libclient-py/quickmpc/pandas/parser.py @@ -178,7 +178,7 @@ def to_int(val: str, encoding='utf-8') -> int: Returns ------- - int + int 変換された実数 Examples @@ -226,7 +226,7 @@ def find_type(col_schema: str, ---------- col_schema: str, スキーマの名前 - col_data: List[str], + col_data: List[str], 列の全てのデータ is_matching_column: bool) その列がID列かどうか diff --git a/packages/client/libclient-py/quickmpc/qmpc.py b/packages/client/libclient-py/quickmpc/qmpc.py index 2ab9c5c88..061160345 100644 --- a/packages/client/libclient-py/quickmpc/qmpc.py +++ b/packages/client/libclient-py/quickmpc/qmpc.py @@ -89,7 +89,7 @@ def send_to(self, df: pd.DataFrame) -> qpd.ShareDataFrame: -------- quickmpc.pandas.read_csv quickmpc形式に則る専用のcsv読み取り関数 - """ + """ # noqa #501 res = self.__qmpc_request.send_share(df, piece_size=1_000_000) return qpd.ShareDataFrame(res.data_id, self.__qmpc_request) diff --git a/packages/client/libclient-py/quickmpc/share/random.py b/packages/client/libclient-py/quickmpc/share/random.py index 4db1084ef..5eeec8d00 100644 --- a/packages/client/libclient-py/quickmpc/share/random.py +++ b/packages/client/libclient-py/quickmpc/share/random.py @@ -43,9 +43,7 @@ def get(self, *args, **kw): overloadして使用される. """ - raise ArgumentError( - "乱数の閾値はどちらもintもしくはdecimalでなければなりません." - f"a is {type(a)}, b is {type(b)}") + raise ArgumentError("乱数の閾値はintもしくはdecimalでなければなりません.") @get.register(int) def __get_int(self, a: int, b: int) -> int: @@ -92,9 +90,7 @@ def get_list(self, *args, **kw): overloadして使用される. """ - raise ArgumentError( - "乱数の閾値はどちらもintもしくはdecimalでなければなりません." - f"a is {type(a)}, b is {type(b)}") + raise ArgumentError("乱数の閾値はintもしくはdecimalでなければなりません.") @get_list.register(int) def __get_list_int(self, a: int, b: int, size: int) -> List[int]: diff --git a/packages/client/libclient-py/quickmpc/share/share.py b/packages/client/libclient-py/quickmpc/share/share.py index 39e98a740..3bcd4d254 100644 --- a/packages/client/libclient-py/quickmpc/share/share.py +++ b/packages/client/libclient-py/quickmpc/share/share.py @@ -62,7 +62,7 @@ def __int_to_str(val: int) -> str: Parameters ---------- - val: int + val: int 変換する値 Returns From 2b32ca10abb1c02a72d62f6e707c8130d31153c6 Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 22:45:06 +0900 Subject: [PATCH 16/23] Remove pipenv from container test CI --- .../actions/prepare_container_test/action.yml | 8 +- .github/workflows/test-server-all.yml | 15 +-- scripts/container_test/Pipfile | 2 - scripts/container_test/Pipfile.lock | 102 ------------------ scripts/container_test/run_medium_test.sh | 5 +- 5 files changed, 11 insertions(+), 121 deletions(-) delete mode 100644 scripts/container_test/Pipfile.lock diff --git a/.github/actions/prepare_container_test/action.yml b/.github/actions/prepare_container_test/action.yml index de8e2d00a..095c1d988 100644 --- a/.github/actions/prepare_container_test/action.yml +++ b/.github/actions/prepare_container_test/action.yml @@ -6,10 +6,12 @@ runs: with: python-version: 3.7 - - name: Install pipenv + - name: Install dependencies shell: bash - run: pip install pipenv - working-directory: ./scripts + run: | + pip install -U pip + pip install pytest + pip install ./packages/client/libclient-py - name: Set up Docker buildx id: buildx diff --git a/.github/workflows/test-server-all.yml b/.github/workflows/test-server-all.yml index eba03c9d3..f8a88f54d 100644 --- a/.github/workflows/test-server-all.yml +++ b/.github/workflows/test-server-all.yml @@ -246,10 +246,7 @@ jobs: - uses: ./.github/actions/prepare_container_test - name: Run container test - run: | - pipenv sync - pipenv install --skip-lock ../../packages/client/libclient-py - pipenv run pytest ./tests/test_up.py -s -v -log-cli-level=DEBUG + run: pytest ./tests/test_up.py -s -v -log-cli-level=DEBUG working-directory: ./scripts/container_test medium_test_container_restart: @@ -284,10 +281,7 @@ jobs: - uses: ./.github/actions/prepare_container_test - name: Run container test - run: | - pipenv sync - pipenv install --skip-lock ../../packages/client/libclient-py - pipenv run pytest ./tests/test_restart_request.py::test_success_${{ matrix.test_name }}_with_restart -s -v -log-cli-level=DEBUG + run: pytest ./tests/test_restart_request.py::test_success_${{ matrix.test_name }}_with_restart -s -v -log-cli-level=DEBUG working-directory: ./scripts/container_test medium_test_container_down: @@ -321,10 +315,7 @@ jobs: - uses: ./.github/actions/prepare_container_test - name: Run container test - run: | - pipenv sync - pipenv install --skip-lock ../../packages/client/libclient-py - pipenv run pytest ./tests/test_down_request.py::test_failed_${{ matrix.test_name }}_with_down -s -v -log-cli-level=DEBUG + run: pipenv run pytest ./tests/test_down_request.py::test_failed_${{ matrix.test_name }}_with_down -s -v -log-cli-level=DEBUG working-directory: ./scripts/container_test medium_test_container: diff --git a/scripts/container_test/Pipfile b/scripts/container_test/Pipfile index 39a013ef8..de3b78ff1 100644 --- a/scripts/container_test/Pipfile +++ b/scripts/container_test/Pipfile @@ -4,8 +4,6 @@ verify_ssl = true name = "pypi" [packages] -pytest = "*" -quickmpc = {path = "./../../packages/client/libclient-py"} [dev-packages] diff --git a/scripts/container_test/Pipfile.lock b/scripts/container_test/Pipfile.lock deleted file mode 100644 index 599aaa080..000000000 --- a/scripts/container_test/Pipfile.lock +++ /dev/null @@ -1,102 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "ad8090164c262479972d022fd437f633973a2687fb75d9996397acd5647af680" - }, - "pipfile-spec": 6, - "requires": { - "python_full_version": "3.7.10", - "python_version": "3.7" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "attrs": { - "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" - ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" - }, - "exceptiongroup": { - "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" - ], - "markers": "python_version < '3.11'", - "version": "==1.1.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20", - "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09" - ], - "markers": "python_version < '3.8'", - "version": "==6.1.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "packaging": { - "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" - ], - "markers": "python_version >= '3.7'", - "version": "==23.0" - }, - "pluggy": { - "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" - ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" - }, - "pytest": { - "hashes": [ - "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", - "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" - ], - "index": "pypi", - "version": "==7.2.2" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" - }, - "typing-extensions": { - "hashes": [ - "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", - "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" - ], - "markers": "python_version < '3.8'", - "version": "==4.5.0" - }, - "zipp": { - "hashes": [ - "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", - "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" - ], - "markers": "python_version >= '3.7'", - "version": "==3.15.0" - } - }, - "develop": {} -} diff --git a/scripts/container_test/run_medium_test.sh b/scripts/container_test/run_medium_test.sh index 0db48806b..6dd2f03d5 100755 --- a/scripts/container_test/run_medium_test.sh +++ b/scripts/container_test/run_medium_test.sh @@ -9,6 +9,7 @@ if [[ ! $PIP_LIST =~ "pipenv" ]]; then fi # 環境を構築してTestを走らせる -pipenv sync -pipenv install --skip-lock ../../packages/client/libclient-py +pipenv run pip install -U pip +pipenv run pip install pytest +pipenv run pip install ../../packages/client/libclient-py pipenv run pytest ./tests -s -v -log-cli-level=DEBUG From b77cf8885b7cce9d7fb1bffc814c332ad3dec100 Mon Sep 17 00:00:00 2001 From: Nakata Date: Fri, 28 Jul 2023 23:16:55 +0900 Subject: [PATCH 17/23] Fix container test CI --- .github/workflows/test-server-all.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-server-all.yml b/.github/workflows/test-server-all.yml index f8a88f54d..41167af8c 100644 --- a/.github/workflows/test-server-all.yml +++ b/.github/workflows/test-server-all.yml @@ -315,7 +315,7 @@ jobs: - uses: ./.github/actions/prepare_container_test - name: Run container test - run: pipenv run pytest ./tests/test_down_request.py::test_failed_${{ matrix.test_name }}_with_down -s -v -log-cli-level=DEBUG + run: pytest ./tests/test_down_request.py::test_failed_${{ matrix.test_name }}_with_down -s -v -log-cli-level=DEBUG working-directory: ./scripts/container_test medium_test_container: From e7838c176a84787eeba3021f7649fcd826f4e77d Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 1 Aug 2023 18:00:47 +0900 Subject: [PATCH 18/23] Update ShareDataFrame execute doc --- .../quickmpc/pandas/share_data_frame.py | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py index d2f0d2e9a..435b8b2e1 100644 --- a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py +++ b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py @@ -126,8 +126,8 @@ def __add__(self, other: "ShareDataFrame") -> "ShareDataFrame": Returns ---------- - Result - 加算して得られたDataFrameのResult + ShareDataFrame + 加算して得られた :class:`ShareDataFrame` """ res = self.__qmpc_request.add_share_data_frame(self.__id, other.__id) return ShareDataFrame(res.data_id, self.__qmpc_request) @@ -148,8 +148,8 @@ def join(self, other: "ShareDataFrame", *, debug_mode=False) \ Returns ---------- - Result - 結合したDataFrameのResult + result: ShareDataFrame + 結合して得られた :class:`ShareDataFrame` """ return self.join([other], debug_mode=debug_mode) @@ -169,8 +169,8 @@ def join_list(self, others: List["ShareDataFrame"], *, debug_mode=False)\ Returns ---------- - Result - 結合したDataFrameのResult + ShareDataFrame + 結合して得られた :class:`ShareDataFrame` """ res = self.__qmpc_request.join([self.__id] + [o.__id for o in others], debug_mode=debug_mode) @@ -187,7 +187,7 @@ def sum(self, columns: list) -> "ShareDataFrame": Returns ---------- - Result + ShareDataFrame 結果のDataFrame """ res = self.__qmpc_request.sum([self.__id], columns) @@ -195,7 +195,10 @@ def sum(self, columns: list) -> "ShareDataFrame": True, ShareDataFrameStatus.EXECUTE) def mean(self, columns: list) -> "ShareDataFrame": - """列の平均を取得する + """指定した列の平均を取得する + + 結果として得られる行列の `i` 行目には + 入力テーブルの `columns[i]` 列目の平均が入る. Parameters ---------- @@ -204,15 +207,18 @@ def mean(self, columns: list) -> "ShareDataFrame": Returns ---------- - Result - 結果のDataFrame + ShareDataFrame + `len(columns)` 行 1列行列の :class:`ShareDataFrame` """ res = self.__qmpc_request.mean([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) def variance(self, columns: list) -> "ShareDataFrame": - """列の分散を取得する + """指定した列の分散を取得する + + 結果として得られる行列の `i` 行目には + 入力テーブルの `columns[i]` 列目の分散が入る. Parameters ---------- @@ -221,15 +227,18 @@ def variance(self, columns: list) -> "ShareDataFrame": Returns ---------- - Result - 結果のDataFrame + ShareDataFrame + `len(columns)` 行 1列行列の :class:`ShareDataFrame` """ res = self.__qmpc_request.variance([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) def correl(self, columns1: list, columns2: list) -> "ShareDataFrame": - """列同士の分散を取得する + """指定した列同士の相関係数を取得する + + 結果として得られる行列の `i` 行 `j` 列目には + 入力テーブルの `columns1[i]` 列目と `columns1[j]` 列目の相関係数が入る. Parameters ---------- @@ -240,16 +249,18 @@ def correl(self, columns1: list, columns2: list) -> "ShareDataFrame": Returns ---------- - Result - 結果のDataFrame + ShareDataFrame + `len(columns1)` 行 `len(columns2)` 列行列の :class:`ShareDataFrame` """ res = self.__qmpc_request.correl([self.__id], columns1, columns2) return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def meshcode(self, columns: list) \ - -> "ShareDataFrame": - """列のmeshcodeを取得する + def meshcode(self, columns: list) -> "ShareDataFrame": + """指定した列のmeshcodeを取得する + + 結果として得られる行列の `i` 行目には + 入力テーブルの `columns[i]` 列目のmeshcodeが入る. Parameters ---------- @@ -258,8 +269,8 @@ def meshcode(self, columns: list) \ Returns ---------- - Result - 結果のDataFrame + ShareDataFrame + `len(columns)` 行 1列行列の :class:`ShareDataFrame` """ res = self.__qmpc_request.meshcode([self.__id], columns) return ShareDataFrame(res.job_uuid, self.__qmpc_request, From a150c5e9d4b61599522b4afb1d70f2141ebda310 Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 1 Aug 2023 21:20:50 +0900 Subject: [PATCH 19/23] Update list to List[int] --- .../quickmpc/pandas/share_data_frame.py | 24 +++++++++---------- .../quickmpc/request/qmpc_request.py | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py index 435b8b2e1..f2d718858 100644 --- a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py +++ b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py @@ -177,12 +177,12 @@ def join_list(self, others: List["ShareDataFrame"], *, debug_mode=False)\ return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def sum(self, columns: list) -> "ShareDataFrame": + def sum(self, columns: List[int]) -> "ShareDataFrame": """列の総和を取得する Parameters ---------- - columns: list + columns: List[int] 計算に用いる列番号(1-index) Returns @@ -194,7 +194,7 @@ def sum(self, columns: list) -> "ShareDataFrame": return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def mean(self, columns: list) -> "ShareDataFrame": + def mean(self, columns: List[int]) -> "ShareDataFrame": """指定した列の平均を取得する 結果として得られる行列の `i` 行目には @@ -202,7 +202,7 @@ def mean(self, columns: list) -> "ShareDataFrame": Parameters ---------- - columns: list + columns: List[int] 計算に用いる列番号(1-index) Returns @@ -214,7 +214,7 @@ def mean(self, columns: list) -> "ShareDataFrame": return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def variance(self, columns: list) -> "ShareDataFrame": + def variance(self, columns: List[int]) -> "ShareDataFrame": """指定した列の分散を取得する 結果として得られる行列の `i` 行目には @@ -222,7 +222,7 @@ def variance(self, columns: list) -> "ShareDataFrame": Parameters ---------- - columns: list + columns: List[int] 計算に用いる列番号(1-index) Returns @@ -234,7 +234,7 @@ def variance(self, columns: list) -> "ShareDataFrame": return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def correl(self, columns1: list, columns2: list) -> "ShareDataFrame": + def correl(self, columns1: List[int], columns2: List[int]) -> "ShareDataFrame": """指定した列同士の相関係数を取得する 結果として得られる行列の `i` 行 `j` 列目には @@ -242,9 +242,9 @@ def correl(self, columns1: list, columns2: list) -> "ShareDataFrame": Parameters ---------- - columns1: list + columns1: List[int] 計算に用いる左項の列番号(1-index) - columns2: list + columns2: List[int] 計算に用いる右項の列番号(1-index) Returns @@ -256,7 +256,7 @@ def correl(self, columns1: list, columns2: list) -> "ShareDataFrame": return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def meshcode(self, columns: list) -> "ShareDataFrame": + def meshcode(self, columns: List[int]) -> "ShareDataFrame": """指定した列のmeshcodeを取得する 結果として得られる行列の `i` 行目には @@ -264,7 +264,7 @@ def meshcode(self, columns: list) -> "ShareDataFrame": Parameters ---------- - columns: list + columns: List[int] 計算に用いる列番号(1-index) Returns @@ -355,7 +355,7 @@ def get_elapsed_time(self) -> List[float]: Returns ---------- - float + List[float] 計算時間 Raises diff --git a/packages/client/libclient-py/quickmpc/request/qmpc_request.py b/packages/client/libclient-py/quickmpc/request/qmpc_request.py index f35469db8..14a5587b7 100644 --- a/packages/client/libclient-py/quickmpc/request/qmpc_request.py +++ b/packages/client/libclient-py/quickmpc/request/qmpc_request.py @@ -298,7 +298,7 @@ def send_share(self, df: pd.DataFrame, piece_size: int = 1_000_000) \ def __execute_computation(self, method_id: ComputationMethod.ValueType, data_ids: List[str], - columns: Tuple[List, List], + columns: Tuple[List[int], List[int]], *, debug_mode: bool = False) \ -> ExecuteResponse: """計算リクエストをMPCサーバに送信する @@ -312,7 +312,7 @@ def __execute_computation(self, method_id: ComputationMethod.ValueType, 計算の種類を管理するID data_ids: List[str] 計算に用いるデータのID - columns: Tuple[List, List] + columns: Tuple[List[int], List[int]] 計算に用いるデータの列番号(1-index) debug_mode: bool, default=False 違法な高速結合による高速化をするかどうか From 727c1919f212f93c938e7541bc8bed9d091a10bc Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 1 Aug 2023 21:21:25 +0900 Subject: [PATCH 20/23] Fix flake8 error --- .../client/libclient-py/quickmpc/pandas/share_data_frame.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py index f2d718858..dc9f12e01 100644 --- a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py +++ b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py @@ -234,7 +234,8 @@ def variance(self, columns: List[int]) -> "ShareDataFrame": return ShareDataFrame(res.job_uuid, self.__qmpc_request, True, ShareDataFrameStatus.EXECUTE) - def correl(self, columns1: List[int], columns2: List[int]) -> "ShareDataFrame": + def correl(self, columns1: List[int], columns2: List[int]) \ + -> "ShareDataFrame": """指定した列同士の相関係数を取得する 結果として得られる行列の `i` 行 `j` 列目には From 793f7a172144834d109d992b646707386296e11a Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 1 Aug 2023 21:24:25 +0900 Subject: [PATCH 21/23] Fix typo --- docs/libclient-py/source/index.rst | 2 +- docs/libclient-py/source/installation.rst | 2 +- .../client/libclient-py/quickmpc/pandas/share_data_frame.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/libclient-py/source/index.rst b/docs/libclient-py/source/index.rst index e5f68ec25..c37f62d9e 100644 --- a/docs/libclient-py/source/index.rst +++ b/docs/libclient-py/source/index.rst @@ -8,7 +8,7 @@ quickmpc-libclient-py's documentation .. _QuickMPC: https://github.com/acompany-develop/QuickMPC -quickmpc-libclient-py はMPCを行う `QuickMPC`_ を簡単に操作するためのPythonライブラリです. +quickmpc-libclient-py はMPC(Multi Party Computation)を行う `QuickMPC`_ を簡単に操作するためのPythonライブラリです. pandas likeなinterfaceでMPCについて知らないユーザでも簡単に秘匿計算を行うことができます. .. toctree:: diff --git a/docs/libclient-py/source/installation.rst b/docs/libclient-py/source/installation.rst index 2fbb1af4e..b9269fa57 100644 --- a/docs/libclient-py/source/installation.rst +++ b/docs/libclient-py/source/installation.rst @@ -2,7 +2,7 @@ Installation ============ -quickmpc requires Python 3.7 or later to run. You can install quickmp using pip: +quickmpc requires Python 3.7 or later to run. You can install quickmpc using pip: .. code-block:: bash diff --git a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py index dc9f12e01..649533d0f 100644 --- a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py +++ b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py @@ -319,7 +319,7 @@ def to_data_frame(self) -> pd.DataFrame: Raises ------ RuntimeError - 送信したデータをそのまま取得しようとした場合 + 送信したデータをそのまま取得しようとした場合 """ # 計算結果でないなら取得できないようにする if not self.__is_result: From e1090f1f09d33700e8789c46a044a6ee3e67aa56 Mon Sep 17 00:00:00 2001 From: Nakata Date: Tue, 1 Aug 2023 21:59:41 +0900 Subject: [PATCH 22/23] Update read_csv doc to add pandas doc --- .../libclient-py/quickmpc/pandas/readers.py | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/readers.py b/packages/client/libclient-py/quickmpc/pandas/readers.py index 07f408081..ce197dd65 100644 --- a/packages/client/libclient-py/quickmpc/pandas/readers.py +++ b/packages/client/libclient-py/quickmpc/pandas/readers.py @@ -1,26 +1,32 @@ import pandas as pd +from pandas.core.shared_docs import _shared_docs +from pandas.io.parsers.readers import _doc_read_csv_and_table +from pandas.util._decorators import Appender from quickmpc.pandas.parser import to_float +# pandas.read_csvからdocumentを持ってくる +@Appender( + _doc_read_csv_and_table.format( + func_name="read_csv", + summary="Read a comma-separated values (csv) file into DataFrame.", + _default_sep="','", + storage_options=_shared_docs["storage_options"], + decompression_options="", # TODO: 取得できなかったので原因を特定する + # decompression_options=_shared_docs["decompression_options"] + # % "filepath_or_buffer", + ) +) def read_csv(*args, index_col: str, **kwargs) -> pd.DataFrame: - """csvからテーブルデータを読み込む. + """csvからテーブルデータを読み込む - テーブル結合処理に用いる列がどの列かを`index_col`で指定する必要がある. - `index_col`以外の引数は全てpandasのread_csvと同じ. + テーブル結合処理に用いる列がどの列かを `index_col` で列名を指定する必要がある. + `index_col` 以外の引数は全てpandasのread_csvと同じ. + 以下のdocumentは `pandasのdocument `_ より. - Parameters - ---------- - filepath_or_buffer: FilePath | ReadCsvBuffer[bytes] | ReadCsvBuffer[str], - らしい - index_col: str - ID列としたいカラム名 - - Returns - ---------- - pd.DataFrame - 読み込んだテーブルデータ - """ + .. docにはpandasからコピーしたdocumentが表示される + """ # noqa: E501 df = pd.read_csv(*args, **kwargs) # ID列を数値化 df[index_col] = df[index_col].map(lambda x: to_float(x)) From 6c231fdee1baa7d1cb21c103d15d53d0f78d43be Mon Sep 17 00:00:00 2001 From: Nakata Date: Wed, 2 Aug 2023 20:32:39 +0900 Subject: [PATCH 23/23] Fix typo --- .../client/libclient-py/quickmpc/pandas/share_data_frame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py index 649533d0f..5de4061a9 100644 --- a/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py +++ b/packages/client/libclient-py/quickmpc/pandas/share_data_frame.py @@ -239,7 +239,7 @@ def correl(self, columns1: List[int], columns2: List[int]) \ """指定した列同士の相関係数を取得する 結果として得られる行列の `i` 行 `j` 列目には - 入力テーブルの `columns1[i]` 列目と `columns1[j]` 列目の相関係数が入る. + 入力テーブルの `columns1[i]` 列目と `columns2[j]` 列目の相関係数が入る. Parameters ----------