charm-crypto-framework 0.61.1__cp313-cp313-macosx_10_13_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. charm/__init__.py +5 -0
  2. charm/adapters/__init__.py +0 -0
  3. charm/adapters/abenc_adapt_hybrid.py +90 -0
  4. charm/adapters/dabenc_adapt_hybrid.py +145 -0
  5. charm/adapters/ibenc_adapt_hybrid.py +72 -0
  6. charm/adapters/ibenc_adapt_identityhash.py +80 -0
  7. charm/adapters/kpabenc_adapt_hybrid.py +91 -0
  8. charm/adapters/pkenc_adapt_bchk05.py +121 -0
  9. charm/adapters/pkenc_adapt_chk04.py +91 -0
  10. charm/adapters/pkenc_adapt_hybrid.py +98 -0
  11. charm/adapters/pksig_adapt_naor01.py +89 -0
  12. charm/config.py +7 -0
  13. charm/core/__init__.py +0 -0
  14. charm/core/benchmark/benchmark_util.c +353 -0
  15. charm/core/benchmark/benchmark_util.h +61 -0
  16. charm/core/benchmark/benchmarkmodule.c +476 -0
  17. charm/core/benchmark/benchmarkmodule.h +162 -0
  18. charm/core/benchmark.cpython-313-darwin.so +0 -0
  19. charm/core/crypto/AES/AES.c +1464 -0
  20. charm/core/crypto/AES.cpython-313-darwin.so +0 -0
  21. charm/core/crypto/DES/DES.c +113 -0
  22. charm/core/crypto/DES.cpython-313-darwin.so +0 -0
  23. charm/core/crypto/DES3/DES3.c +26 -0
  24. charm/core/crypto/DES3.cpython-313-darwin.so +0 -0
  25. charm/core/crypto/__init__.py +0 -0
  26. charm/core/crypto/cryptobase/XOR.c +80 -0
  27. charm/core/crypto/cryptobase/_counter.c +496 -0
  28. charm/core/crypto/cryptobase/_counter.h +54 -0
  29. charm/core/crypto/cryptobase/block_template.c +900 -0
  30. charm/core/crypto/cryptobase/block_template.h +69 -0
  31. charm/core/crypto/cryptobase/cryptobasemodule.c +220 -0
  32. charm/core/crypto/cryptobase/libtom/tomcrypt.h +90 -0
  33. charm/core/crypto/cryptobase/libtom/tomcrypt_argchk.h +44 -0
  34. charm/core/crypto/cryptobase/libtom/tomcrypt_cfg.h +186 -0
  35. charm/core/crypto/cryptobase/libtom/tomcrypt_cipher.h +941 -0
  36. charm/core/crypto/cryptobase/libtom/tomcrypt_custom.h +556 -0
  37. charm/core/crypto/cryptobase/libtom/tomcrypt_des.c +1912 -0
  38. charm/core/crypto/cryptobase/libtom/tomcrypt_hash.h +407 -0
  39. charm/core/crypto/cryptobase/libtom/tomcrypt_mac.h +496 -0
  40. charm/core/crypto/cryptobase/libtom/tomcrypt_macros.h +435 -0
  41. charm/core/crypto/cryptobase/libtom/tomcrypt_math.h +534 -0
  42. charm/core/crypto/cryptobase/libtom/tomcrypt_misc.h +103 -0
  43. charm/core/crypto/cryptobase/libtom/tomcrypt_pk.h +653 -0
  44. charm/core/crypto/cryptobase/libtom/tomcrypt_pkcs.h +90 -0
  45. charm/core/crypto/cryptobase/libtom/tomcrypt_prng.h +199 -0
  46. charm/core/crypto/cryptobase/stream_template.c +271 -0
  47. charm/core/crypto/cryptobase/strxor.c +229 -0
  48. charm/core/crypto/cryptobase.cpython-313-darwin.so +0 -0
  49. charm/core/engine/__init__.py +5 -0
  50. charm/core/engine/protocol.py +293 -0
  51. charm/core/engine/util.py +174 -0
  52. charm/core/math/__init__.py +0 -0
  53. charm/core/math/elliptic_curve/ecmodule.c +1986 -0
  54. charm/core/math/elliptic_curve/ecmodule.h +230 -0
  55. charm/core/math/elliptic_curve.cpython-313-darwin.so +0 -0
  56. charm/core/math/elliptic_curve.pyi +63 -0
  57. charm/core/math/integer/integermodule.c +2539 -0
  58. charm/core/math/integer/integermodule.h +145 -0
  59. charm/core/math/integer.cpython-313-darwin.so +0 -0
  60. charm/core/math/integer.pyi +76 -0
  61. charm/core/math/pairing/miracl/miracl_config.h +37 -0
  62. charm/core/math/pairing/miracl/miracl_interface.h +118 -0
  63. charm/core/math/pairing/miracl/miracl_interface2.h +126 -0
  64. charm/core/math/pairing/miracl/pairingmodule2.c +2094 -0
  65. charm/core/math/pairing/miracl/pairingmodule2.h +307 -0
  66. charm/core/math/pairing/pairingmodule.c +2230 -0
  67. charm/core/math/pairing/pairingmodule.h +241 -0
  68. charm/core/math/pairing/relic/pairingmodule3.c +1853 -0
  69. charm/core/math/pairing/relic/pairingmodule3.h +233 -0
  70. charm/core/math/pairing/relic/relic_interface.c +1337 -0
  71. charm/core/math/pairing/relic/relic_interface.h +217 -0
  72. charm/core/math/pairing/relic/test_relic.c +171 -0
  73. charm/core/math/pairing.cpython-313-darwin.so +0 -0
  74. charm/core/math/pairing.pyi +69 -0
  75. charm/core/utilities/base64.c +248 -0
  76. charm/core/utilities/base64.h +15 -0
  77. charm/schemes/__init__.py +0 -0
  78. charm/schemes/abenc/__init__.py +0 -0
  79. charm/schemes/abenc/abenc_accountability_jyjxgd20.py +647 -0
  80. charm/schemes/abenc/abenc_bsw07.py +146 -0
  81. charm/schemes/abenc/abenc_ca_cpabe_ar17.py +684 -0
  82. charm/schemes/abenc/abenc_dacmacs_yj14.py +298 -0
  83. charm/schemes/abenc/abenc_lsw08.py +159 -0
  84. charm/schemes/abenc/abenc_maabe_rw15.py +236 -0
  85. charm/schemes/abenc/abenc_maabe_yj14.py +297 -0
  86. charm/schemes/abenc/abenc_tbpre_lww14.py +309 -0
  87. charm/schemes/abenc/abenc_unmcpabe_yahk14.py +223 -0
  88. charm/schemes/abenc/abenc_waters09.py +144 -0
  89. charm/schemes/abenc/abenc_yct14.py +208 -0
  90. charm/schemes/abenc/abenc_yllc15.py +178 -0
  91. charm/schemes/abenc/ac17.py +248 -0
  92. charm/schemes/abenc/bsw07.py +141 -0
  93. charm/schemes/abenc/cgw15.py +277 -0
  94. charm/schemes/abenc/dabe_aw11.py +204 -0
  95. charm/schemes/abenc/dfa_fe12.py +144 -0
  96. charm/schemes/abenc/pk_hve08.py +179 -0
  97. charm/schemes/abenc/waters11.py +143 -0
  98. charm/schemes/aggrsign_MuSig.py +150 -0
  99. charm/schemes/aggrsign_bls.py +267 -0
  100. charm/schemes/blindsig_ps16.py +654 -0
  101. charm/schemes/chamhash_adm05.py +113 -0
  102. charm/schemes/chamhash_rsa_hw09.py +100 -0
  103. charm/schemes/commit/__init__.py +0 -0
  104. charm/schemes/commit/commit_gs08.py +77 -0
  105. charm/schemes/commit/commit_pedersen92.py +53 -0
  106. charm/schemes/encap_bchk05.py +62 -0
  107. charm/schemes/grpsig/__init__.py +0 -0
  108. charm/schemes/grpsig/groupsig_bgls04.py +114 -0
  109. charm/schemes/grpsig/groupsig_bgls04_var.py +115 -0
  110. charm/schemes/hibenc/__init__.py +0 -0
  111. charm/schemes/hibenc/hibenc_bb04.py +105 -0
  112. charm/schemes/hibenc/hibenc_lew11.py +193 -0
  113. charm/schemes/ibenc/__init__.py +0 -0
  114. charm/schemes/ibenc/clpkc_rp03.py +119 -0
  115. charm/schemes/ibenc/ibenc_CW13_z.py +168 -0
  116. charm/schemes/ibenc/ibenc_bb03.py +94 -0
  117. charm/schemes/ibenc/ibenc_bf01.py +121 -0
  118. charm/schemes/ibenc/ibenc_ckrs09.py +120 -0
  119. charm/schemes/ibenc/ibenc_cllww12_z.py +172 -0
  120. charm/schemes/ibenc/ibenc_lsw08.py +120 -0
  121. charm/schemes/ibenc/ibenc_sw05.py +238 -0
  122. charm/schemes/ibenc/ibenc_waters05.py +144 -0
  123. charm/schemes/ibenc/ibenc_waters05_z.py +164 -0
  124. charm/schemes/ibenc/ibenc_waters09.py +107 -0
  125. charm/schemes/ibenc/ibenc_waters09_z.py +147 -0
  126. charm/schemes/joye_scheme.py +106 -0
  127. charm/schemes/lem_scheme.py +207 -0
  128. charm/schemes/pk_fre_ccv11.py +107 -0
  129. charm/schemes/pk_vrf.py +127 -0
  130. charm/schemes/pkenc/__init__.py +0 -0
  131. charm/schemes/pkenc/pkenc_cs98.py +108 -0
  132. charm/schemes/pkenc/pkenc_elgamal85.py +122 -0
  133. charm/schemes/pkenc/pkenc_gm82.py +98 -0
  134. charm/schemes/pkenc/pkenc_paillier99.py +118 -0
  135. charm/schemes/pkenc/pkenc_rabin.py +254 -0
  136. charm/schemes/pkenc/pkenc_rsa.py +186 -0
  137. charm/schemes/pksig/__init__.py +0 -0
  138. charm/schemes/pksig/pksig_CW13_z.py +135 -0
  139. charm/schemes/pksig/pksig_bls04.py +87 -0
  140. charm/schemes/pksig/pksig_boyen.py +156 -0
  141. charm/schemes/pksig/pksig_chch.py +97 -0
  142. charm/schemes/pksig/pksig_chp.py +70 -0
  143. charm/schemes/pksig/pksig_cl03.py +150 -0
  144. charm/schemes/pksig/pksig_cl04.py +87 -0
  145. charm/schemes/pksig/pksig_cllww12_z.py +142 -0
  146. charm/schemes/pksig/pksig_cyh.py +132 -0
  147. charm/schemes/pksig/pksig_dsa.py +76 -0
  148. charm/schemes/pksig/pksig_ecdsa.py +71 -0
  149. charm/schemes/pksig/pksig_hess.py +104 -0
  150. charm/schemes/pksig/pksig_hw.py +110 -0
  151. charm/schemes/pksig/pksig_lamport.py +63 -0
  152. charm/schemes/pksig/pksig_ps01.py +135 -0
  153. charm/schemes/pksig/pksig_ps02.py +124 -0
  154. charm/schemes/pksig/pksig_ps03.py +119 -0
  155. charm/schemes/pksig/pksig_rsa_hw09.py +206 -0
  156. charm/schemes/pksig/pksig_schnorr91.py +77 -0
  157. charm/schemes/pksig/pksig_waters.py +115 -0
  158. charm/schemes/pksig/pksig_waters05.py +121 -0
  159. charm/schemes/pksig/pksig_waters09.py +121 -0
  160. charm/schemes/pre_mg07.py +150 -0
  161. charm/schemes/prenc/pre_afgh06.py +126 -0
  162. charm/schemes/prenc/pre_bbs98.py +123 -0
  163. charm/schemes/prenc/pre_nal16.py +216 -0
  164. charm/schemes/protocol_a01.py +272 -0
  165. charm/schemes/protocol_ao00.py +215 -0
  166. charm/schemes/protocol_cns07.py +274 -0
  167. charm/schemes/protocol_schnorr91.py +125 -0
  168. charm/schemes/sigma1.py +64 -0
  169. charm/schemes/sigma2.py +129 -0
  170. charm/schemes/sigma3.py +126 -0
  171. charm/schemes/threshold/__init__.py +59 -0
  172. charm/schemes/threshold/dkls23_dkg.py +556 -0
  173. charm/schemes/threshold/dkls23_presign.py +1089 -0
  174. charm/schemes/threshold/dkls23_sign.py +761 -0
  175. charm/schemes/threshold/xrpl_wallet.py +967 -0
  176. charm/test/__init__.py +0 -0
  177. charm/test/adapters/__init__.py +0 -0
  178. charm/test/adapters/abenc_adapt_hybrid_test.py +29 -0
  179. charm/test/adapters/dabenc_adapt_hybrid_test.py +56 -0
  180. charm/test/adapters/ibenc_adapt_hybrid_test.py +36 -0
  181. charm/test/adapters/ibenc_adapt_identityhash_test.py +32 -0
  182. charm/test/adapters/kpabenc_adapt_hybrid_test.py +30 -0
  183. charm/test/benchmark/abenc_yllc15_bench.py +92 -0
  184. charm/test/benchmark/benchmark_test.py +148 -0
  185. charm/test/benchmark_threshold.py +260 -0
  186. charm/test/conftest.py +38 -0
  187. charm/test/fuzz/__init__.py +1 -0
  188. charm/test/fuzz/conftest.py +5 -0
  189. charm/test/fuzz/fuzz_policy_parser.py +76 -0
  190. charm/test/fuzz/fuzz_serialization.py +83 -0
  191. charm/test/schemes/__init__.py +0 -0
  192. charm/test/schemes/abenc/__init__.py +0 -0
  193. charm/test/schemes/abenc/abenc_bsw07_test.py +39 -0
  194. charm/test/schemes/abenc/abenc_dacmacs_yj14_test.py +16 -0
  195. charm/test/schemes/abenc/abenc_lsw08_test.py +33 -0
  196. charm/test/schemes/abenc/abenc_maabe_yj14_test.py +16 -0
  197. charm/test/schemes/abenc/abenc_tbpre_lww14_test.py +16 -0
  198. charm/test/schemes/abenc/abenc_waters09_test.py +38 -0
  199. charm/test/schemes/abenc/abenc_yllc15_test.py +74 -0
  200. charm/test/schemes/chamhash_adm05_test.py +31 -0
  201. charm/test/schemes/chamhash_rsa_hw09_test.py +29 -0
  202. charm/test/schemes/commit/__init__.py +0 -0
  203. charm/test/schemes/commit/commit_gs08_test.py +24 -0
  204. charm/test/schemes/commit/commit_pedersen92_test.py +26 -0
  205. charm/test/schemes/dabe_aw11_test.py +45 -0
  206. charm/test/schemes/encap_bchk05_test.py +21 -0
  207. charm/test/schemes/grpsig/__init__.py +0 -0
  208. charm/test/schemes/grpsig/groupsig_bgls04_test.py +35 -0
  209. charm/test/schemes/grpsig/groupsig_bgls04_var_test.py +39 -0
  210. charm/test/schemes/hibenc/__init__.py +0 -0
  211. charm/test/schemes/hibenc/hibenc_bb04_test.py +28 -0
  212. charm/test/schemes/ibenc/__init__.py +0 -0
  213. charm/test/schemes/ibenc/ibenc_bb03_test.py +26 -0
  214. charm/test/schemes/ibenc/ibenc_bf01_test.py +24 -0
  215. charm/test/schemes/ibenc/ibenc_ckrs09_test.py +25 -0
  216. charm/test/schemes/ibenc/ibenc_lsw08_test.py +31 -0
  217. charm/test/schemes/ibenc/ibenc_sw05_test.py +32 -0
  218. charm/test/schemes/ibenc/ibenc_waters05_test.py +31 -0
  219. charm/test/schemes/ibenc/ibenc_waters09_test.py +27 -0
  220. charm/test/schemes/pk_vrf_test.py +29 -0
  221. charm/test/schemes/pkenc/__init__.py +0 -0
  222. charm/test/schemes/pkenc_test.py +255 -0
  223. charm/test/schemes/pksig/__init__.py +0 -0
  224. charm/test/schemes/pksig_test.py +376 -0
  225. charm/test/schemes/rsa_alg_test.py +340 -0
  226. charm/test/schemes/threshold_test.py +1792 -0
  227. charm/test/serialize/__init__.py +0 -0
  228. charm/test/serialize/serialize_test.py +40 -0
  229. charm/test/toolbox/__init__.py +0 -0
  230. charm/test/toolbox/conversion_test.py +30 -0
  231. charm/test/toolbox/ecgroup_test.py +53 -0
  232. charm/test/toolbox/integer_arithmetic_test.py +441 -0
  233. charm/test/toolbox/paddingschemes_test.py +238 -0
  234. charm/test/toolbox/policy_parser_stress_test.py +969 -0
  235. charm/test/toolbox/secretshare_test.py +28 -0
  236. charm/test/toolbox/symcrypto_test.py +108 -0
  237. charm/test/toolbox/test_policy_expression.py +16 -0
  238. charm/test/vectors/__init__.py +1 -0
  239. charm/test/vectors/test_bls_vectors.py +289 -0
  240. charm/test/vectors/test_pedersen_vectors.py +315 -0
  241. charm/test/vectors/test_schnorr_vectors.py +368 -0
  242. charm/test/zkp_compiler/__init__.py +9 -0
  243. charm/test/zkp_compiler/benchmark_zkp.py +258 -0
  244. charm/test/zkp_compiler/test_and_proof.py +240 -0
  245. charm/test/zkp_compiler/test_batch_verify.py +248 -0
  246. charm/test/zkp_compiler/test_dleq_proof.py +264 -0
  247. charm/test/zkp_compiler/test_or_proof.py +231 -0
  248. charm/test/zkp_compiler/test_proof_serialization.py +121 -0
  249. charm/test/zkp_compiler/test_range_proof.py +241 -0
  250. charm/test/zkp_compiler/test_representation_proof.py +325 -0
  251. charm/test/zkp_compiler/test_schnorr_proof.py +221 -0
  252. charm/test/zkp_compiler/test_thread_safety.py +169 -0
  253. charm/test/zkp_compiler/test_zkp_parser.py +139 -0
  254. charm/toolbox/ABEnc.py +26 -0
  255. charm/toolbox/ABEncMultiAuth.py +66 -0
  256. charm/toolbox/ABEnumeric.py +800 -0
  257. charm/toolbox/Commit.py +24 -0
  258. charm/toolbox/DFA.py +89 -0
  259. charm/toolbox/FSA.py +1254 -0
  260. charm/toolbox/Hash.py +39 -0
  261. charm/toolbox/IBEnc.py +62 -0
  262. charm/toolbox/IBSig.py +64 -0
  263. charm/toolbox/PKEnc.py +66 -0
  264. charm/toolbox/PKSig.py +56 -0
  265. charm/toolbox/PREnc.py +32 -0
  266. charm/toolbox/ZKProof.py +289 -0
  267. charm/toolbox/__init__.py +0 -0
  268. charm/toolbox/bitstring.py +49 -0
  269. charm/toolbox/broadcast.py +220 -0
  270. charm/toolbox/conversion.py +100 -0
  271. charm/toolbox/eccurve.py +149 -0
  272. charm/toolbox/ecgroup.py +143 -0
  273. charm/toolbox/enum.py +60 -0
  274. charm/toolbox/hash_module.py +91 -0
  275. charm/toolbox/integergroup.py +323 -0
  276. charm/toolbox/iterate.py +22 -0
  277. charm/toolbox/matrixops.py +76 -0
  278. charm/toolbox/mpc_utils.py +296 -0
  279. charm/toolbox/msp.py +175 -0
  280. charm/toolbox/mta.py +985 -0
  281. charm/toolbox/node.py +120 -0
  282. charm/toolbox/ot/__init__.py +22 -0
  283. charm/toolbox/ot/base_ot.py +374 -0
  284. charm/toolbox/ot/dpf.py +642 -0
  285. charm/toolbox/ot/mpfss.py +228 -0
  286. charm/toolbox/ot/ot_extension.py +589 -0
  287. charm/toolbox/ot/silent_ot.py +378 -0
  288. charm/toolbox/paddingschemes.py +423 -0
  289. charm/toolbox/paddingschemes_test.py +238 -0
  290. charm/toolbox/pairingcurves.py +85 -0
  291. charm/toolbox/pairinggroup.py +186 -0
  292. charm/toolbox/policy_expression_spec.py +70 -0
  293. charm/toolbox/policytree.py +189 -0
  294. charm/toolbox/reCompiler.py +346 -0
  295. charm/toolbox/redundancyschemes.py +65 -0
  296. charm/toolbox/schemebase.py +188 -0
  297. charm/toolbox/secretshare.py +104 -0
  298. charm/toolbox/secretutil.py +174 -0
  299. charm/toolbox/securerandom.py +73 -0
  300. charm/toolbox/sigmaprotocol.py +46 -0
  301. charm/toolbox/specialprimes.py +45 -0
  302. charm/toolbox/symcrypto.py +279 -0
  303. charm/toolbox/threshold_sharing.py +553 -0
  304. charm/toolbox/xmlserialize.py +94 -0
  305. charm/toolbox/zknode.py +105 -0
  306. charm/zkp_compiler/__init__.py +89 -0
  307. charm/zkp_compiler/and_proof.py +460 -0
  308. charm/zkp_compiler/batch_verify.py +324 -0
  309. charm/zkp_compiler/dleq_proof.py +423 -0
  310. charm/zkp_compiler/or_proof.py +305 -0
  311. charm/zkp_compiler/range_proof.py +417 -0
  312. charm/zkp_compiler/representation_proof.py +466 -0
  313. charm/zkp_compiler/schnorr_proof.py +273 -0
  314. charm/zkp_compiler/thread_safe.py +150 -0
  315. charm/zkp_compiler/zk_demo.py +489 -0
  316. charm/zkp_compiler/zkp_factory.py +330 -0
  317. charm/zkp_compiler/zkp_generator.py +370 -0
  318. charm/zkp_compiler/zkparser.py +269 -0
  319. charm_crypto_framework-0.61.1.dist-info/METADATA +337 -0
  320. charm_crypto_framework-0.61.1.dist-info/RECORD +323 -0
  321. charm_crypto_framework-0.61.1.dist-info/WHEEL +5 -0
  322. charm_crypto_framework-0.61.1.dist-info/licenses/LICENSE.txt +165 -0
  323. charm_crypto_framework-0.61.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,61 @@
1
+ #ifndef BENCHMARK_UTIL_H
2
+ #define BENCHMARK_UTIL_H
3
+
4
+ // for multiplicative notation
5
+ #define Op_MUL(op_var_type, op_group_type, group, bench_obj) \
6
+ if(op_var_type == MULTIPLICATION && op_group_type == group) \
7
+ ((Operations *) bench_obj)->mul_ ##group += 1;
8
+
9
+ #define Op_DIV(op_var_type, op_group_type, group, bench_obj) \
10
+ if(op_var_type == DIVISION && op_group_type == group) \
11
+ ((Operations *) bench_obj)->div_ ##group += 1;
12
+
13
+ // for additive notation
14
+ #define Op_ADD(op_var_type, op_group_type, group, bench_obj) \
15
+ if(op_var_type == ADDITION && op_group_type == group) \
16
+ ((Operations *) bench_obj)->add_ ##group += 1;
17
+
18
+ #define Op_SUB(op_var_type, op_group_type, group, bench_obj) \
19
+ if(op_var_type == SUBTRACTION && op_group_type == group) \
20
+ ((Operations *) bench_obj)->sub_ ##group += 1;
21
+
22
+ // exponentiation
23
+ #define Op_EXP(op_var_type, op_group_type, group, bench_obj) \
24
+ if(op_var_type == EXPONENTIATION && op_group_type == group) \
25
+ ((Operations *) bench_obj)->exp_ ##group += 1;
26
+
27
+ #define UPDATE_BENCH(op_type, elem_type, gobj) \
28
+ if(gobj->dBench != NULL && gobj->dBench->granular_option == TRUE && elem_type != NONE_G) { \
29
+ Update_Op(MUL, op_type, elem_type, gobj->gBench) \
30
+ Update_Op(DIV, op_type, elem_type, gobj->gBench) \
31
+ Update_Op(ADD, op_type, elem_type, gobj->gBench) \
32
+ Update_Op(SUB, op_type, elem_type, gobj->gBench) \
33
+ Update_Op(EXP, op_type, elem_type, gobj->gBench) \
34
+ } \
35
+ UPDATE_BENCHMARK(op_type, gobj->dBench);
36
+
37
+ #define CLEAR_DBENCH(bench_obj, group) \
38
+ ((Operations *) bench_obj)->mul_ ##group = 0; \
39
+ ((Operations *) bench_obj)->exp_ ##group = 0; \
40
+ ((Operations *) bench_obj)->div_ ##group = 0; \
41
+ ((Operations *) bench_obj)->add_ ##group = 0; \
42
+ ((Operations *) bench_obj)->sub_ ##group = 0; \
43
+
44
+ #define GetField(count, type, group, bench_obj) \
45
+ if(type == MULTIPLICATION) count = (((Operations *) bench_obj)->mul_ ##group ); \
46
+ else if(type == DIVISION) count = (((Operations *) bench_obj)->div_ ##group ); \
47
+ else if(type == ADDITION) count = (((Operations *) bench_obj)->add_ ##group ); \
48
+ else if(type == SUBTRACTION) count = (((Operations *) bench_obj)->sub_ ##group ); \
49
+ else if(type == EXPONENTIATION) count = (((Operations *) bench_obj)->exp_ ##group );
50
+
51
+ #define ClearBenchmark(data) \
52
+ data->op_add = data->op_sub = data->op_mult = 0; \
53
+ data->op_div = data->op_exp = data->op_pair = 0; \
54
+ data->cpu_time_ms = 0.0; \
55
+ data->real_time_ms = 0.0; \
56
+ data->cpu_option = FALSE; \
57
+ data->real_option = FALSE; \
58
+ data->granular_option = FALSE;
59
+
60
+
61
+ #endif
@@ -0,0 +1,476 @@
1
+ #define BENCHMARK_MODULE
2
+ #include "benchmarkmodule.h"
3
+ #ifndef BENCHMARK_MODULE
4
+ // define new benchmark type for benchmark module
5
+ PyTypeObject BenchmarkType;
6
+ // define new benchmark error type (will be used for notifying errors)
7
+ PyObject *BenchmarkError;
8
+ #endif
9
+ double CalcUsecs(struct timeval *start, struct timeval *stop) {
10
+ double usec_per_second = 1000000;
11
+ double result = usec_per_second * (stop->tv_sec - start->tv_sec);
12
+
13
+ if(stop->tv_usec >= start->tv_usec) {
14
+ result += (stop->tv_usec - start->tv_usec);
15
+ }
16
+ else {
17
+ result -= (start->tv_usec - stop->tv_usec);
18
+ }
19
+
20
+ // if(result < 0) {
21
+ // debug("start secs => '%ld' and usecs => '%d'\n", start->tv_sec, start->tv_usec);
22
+ // debug("stop secs => '%ld' and usecs => '%d'\n", stop->tv_sec, stop->tv_usec);
23
+ // }
24
+
25
+ return result / usec_per_second;
26
+ }
27
+
28
+ int check_option(MeasureType o, Benchmark *d) {
29
+ int i;
30
+ if(d != NULL && d->bench_initialized) {
31
+ for(i = 0; i < d->num_options; i++) {
32
+ MeasureType tmp = d->options_selected[i];
33
+ if(tmp == o) { return TRUE; }
34
+ }
35
+ }
36
+ return FALSE;
37
+ }
38
+
39
+
40
+ // benchmark new
41
+ PyObject *Benchmark_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
42
+ {
43
+ Benchmark *self;
44
+ self = (Benchmark *)type->tp_alloc(type, 0);
45
+ if(self != NULL) {
46
+ self->bench_initialized = FALSE;
47
+ self->bench_inprogress = FALSE; // false until we StartBenchmark( ... )
48
+ self->op_add = self->op_sub = self->op_mult = 0;
49
+ self->op_div = self->op_exp = self->op_pair = 0;
50
+ self->cpu_time_ms = self->real_time_ms = 0.0;
51
+ self->cpu_option = self->real_option = FALSE;
52
+ debug("Creating new benchmark object.\n");
53
+ }
54
+ return (PyObject *) self;
55
+ }
56
+
57
+ // benchmark init
58
+ int Benchmark_init(Benchmark *self, PyObject *args, PyObject *kwds)
59
+ {
60
+ return 0;
61
+ }
62
+ // benchmark dealloc
63
+ void Benchmark_dealloc(Benchmark *self) {
64
+ debug("Releasing benchmark object.\n");
65
+ Py_TYPE(self)->tp_free((PyObject*)self);
66
+ }
67
+
68
+ static int PyStartBenchmark(Benchmark *data, PyObject *opList, int opListSize)
69
+ {
70
+ int i;
71
+ if(!PyList_Check(opList)) {
72
+ PyErr_SetString(BenchmarkError, "did not provide a list.");
73
+ return FALSE;
74
+ }
75
+
76
+ PyObject *tmpObj;
77
+ char *s;
78
+ if(data != NULL) {
79
+ int cnt = 0;
80
+ /* initialize */
81
+ data->cpu_option = data->real_option = data->granular_option = FALSE;
82
+ for(i = 0; i < opListSize; i++) {
83
+ PyObject *item = PyList_GetItem(opList, i);
84
+ if(PyBytes_CharmCheck(item)) {
85
+ s = NULL;
86
+ tmpObj = NULL;
87
+ PyBytes_ToString2(s, item, tmpObj);
88
+ if(strcmp(s, _CPUTIME_OPT) == 0) {
89
+ debug("enabled cputime option!\n");
90
+ data->options_selected[cnt] = CPU_TIME;
91
+ data->cpu_option = TRUE;
92
+ }
93
+ else if(strcmp(s, _REALTIME_OPT) == 0) {
94
+ debug("enabled realtime option!\n");
95
+ data->options_selected[cnt] = REAL_TIME;
96
+ data->real_option = TRUE;
97
+ }
98
+ else if(strcmp(s, _ADD_OPT) == 0) {
99
+ debug("enabled add option!\n");
100
+ data->options_selected[cnt] = ADDITION;
101
+ data->op_add = 0;
102
+ }
103
+ else if(strcmp(s, _SUB_OPT) == 0) {
104
+ debug("enabled sub option!\n");
105
+ data->options_selected[cnt] = SUBTRACTION;
106
+ data->op_sub = 0;
107
+ }
108
+ else if(strcmp(s, _MUL_OPT) == 0) {
109
+ debug("enabled mul option!\n");
110
+ data->options_selected[cnt] = MULTIPLICATION;
111
+ data->op_mult = 0;
112
+ }
113
+ else if(strcmp(s, _DIV_OPT) == 0) {
114
+ debug("enabled div option!\n");
115
+ data->options_selected[cnt] = DIVISION;
116
+ data->op_div = 0;
117
+ }
118
+ else if(strcmp(s, _EXP_OPT) == 0) {
119
+ debug("enabled exp option!\n");
120
+ data->options_selected[cnt] = EXPONENTIATION;
121
+ data->op_exp = 0;
122
+ }
123
+ else if(strcmp(s, _PAIR_OPT) == 0) {
124
+ debug("enabled pair option!\n");
125
+ data->options_selected[cnt] = PAIRINGS;
126
+ data->op_pair = 0;
127
+ }
128
+ else if(strcmp(s, _GRAN_OPT) == 0) {
129
+ debug("enabled granular option!\n");
130
+ data->options_selected[cnt] = GRANULAR;
131
+ data->granular_option = TRUE;
132
+ }
133
+ else {
134
+ debug("not a valid option.\n");
135
+ }
136
+ cnt++;
137
+ if (tmpObj!=NULL)
138
+ Py_DECREF(tmpObj);
139
+ }
140
+ }
141
+ // set size of list
142
+ data->num_options = cnt;
143
+ debug("num_options set: %d\n", data->num_options);
144
+ data->bench_initialized = TRUE;
145
+ data->bench_inprogress = TRUE;
146
+
147
+ //set timers for time-based measures (reduces the overhead of timer)
148
+ if(data->cpu_option) { data->start_clock = clock(); }
149
+ if(data->real_option) { gettimeofday(&data->start_time, NULL); }
150
+ return TRUE;
151
+ }
152
+ return FALSE;
153
+ }
154
+
155
+ static int PyEndBenchmark(Benchmark *data)
156
+ {
157
+ gettimeofday(&data->stop_time, NULL); // stop real time clock
158
+ data->stop_clock = clock(); // stop cpu time clock
159
+ int i;
160
+ if(data != NULL && data->bench_initialized) {
161
+ debug("Results....\n");
162
+ for(i = 0; i < data->num_options; i++) {
163
+ MeasureType option = data->options_selected[i];
164
+ debug("option => %d\n", option);
165
+ switch(option) {
166
+ case CPU_TIME: // compute processor time or clocks per sec
167
+ data->cpu_time_ms = ((double)(data->stop_clock - data->start_clock))/CLOCKS_PER_SEC;
168
+ debug("CPU Time:\t%f\n", data->cpu_time_ms);
169
+ break;
170
+ case REAL_TIME: debug("realtime option was set!\n");
171
+ data->real_time_ms = CalcUsecs(&data->start_time, &data->stop_time);
172
+ debug("Real Time:\t%f\n", data->real_time_ms);
173
+ break;
174
+ case ADDITION: debug("add operations:\t\t%d\n", data->op_add); break;
175
+ case SUBTRACTION: debug("sub operations:\t\t%d\n", data->op_sub); break;
176
+ case MULTIPLICATION: debug("mult operations:\t\t%d\n", data->op_mult); break;
177
+ case DIVISION: debug("div operations:\t\t%d\n", data->op_div); break;
178
+ case EXPONENTIATION: debug("exp operations:\t\t%d\n", data->op_exp); break;
179
+ case PAIRINGS: debug("pairing operations:\t\t%d\n", data->op_pair); break;
180
+ case GRANULAR: debug("granular option was set!\n"); break;
181
+ default: debug("not a valid option.\n"); break;
182
+ }
183
+ }
184
+ data->bench_inprogress = FALSE;
185
+ return TRUE;
186
+ }
187
+ return FALSE;
188
+ }
189
+
190
+ static int PyUpdateBenchmark(MeasureType option, Benchmark *data) {
191
+ int i, errcode = FALSE, foundOption = FALSE;
192
+ // make sure option is set in benchmark
193
+
194
+ if(data != NULL && data->bench_initialized) {
195
+ for(i = 0; i < data->num_options; i++) {
196
+ MeasureType tmp = data->options_selected[i];
197
+ if(tmp == option) { foundOption = TRUE; break; }
198
+ }
199
+ }
200
+
201
+ // if so, just increment the corresponding operation option counter
202
+ if(foundOption) {
203
+ switch(option) {
204
+ case ADDITION: data->op_add++; break;
205
+ case SUBTRACTION: data->op_sub++; break;
206
+ case MULTIPLICATION: data->op_mult++; break;
207
+ case DIVISION: data->op_div++; break;
208
+ case EXPONENTIATION: data->op_exp++; break;
209
+ case PAIRINGS: data->op_pair++; break;
210
+ default: debug("not a valid option.\n");
211
+ break;
212
+ }
213
+ errcode = TRUE;
214
+ }
215
+ return errcode;
216
+ }
217
+
218
+ static int PyClearBenchmark(Benchmark *data) {
219
+ if(data == NULL) { return FALSE; }
220
+
221
+ data->bench_initialized = FALSE;
222
+ data->identifier = -1;
223
+ data->op_add = data->op_sub = data->op_mult = 0;
224
+ data->op_div = data->op_exp = data->op_pair = 0;
225
+ data->cpu_time_ms = 0.0;
226
+ data->real_time_ms = 0.0;
227
+ data->cpu_option = FALSE;
228
+ data->real_option = FALSE;
229
+ data->granular_option = FALSE;
230
+ memset(data->options_selected, 0, MAX_MEASURE);
231
+ debug("Initialized benchmark object.\n");
232
+ return TRUE;
233
+ }
234
+
235
+ PyObject *Benchmark_print(Benchmark *self) {
236
+ if(self != NULL) {
237
+ PyObject *cpu = PyFloat_FromDouble(self->cpu_time_ms);
238
+ PyObject *real = PyFloat_FromDouble(self->real_time_ms);
239
+ PyObject *results = _PyUnicode_FromFormat("<--- Results --->\nCPU Time: %Sms\nReal Time: %Ss\nAdd:\t%i\nSub:\t%i\nMul:\t%i\nDiv:\t%i\nExp:\t%i\nPair:\t%i\n",
240
+ cpu, real, self->op_add, self->op_sub, self->op_mult, self->op_div, self->op_exp, self->op_pair);
241
+
242
+ PyClearBenchmark(self);
243
+ return results;
244
+ }
245
+ return _PyUnicode_FromString("Benchmark object has not been initialized properly.");
246
+ }
247
+
248
+ PyObject *GetResults(Benchmark *self) {
249
+ if(self != NULL) {
250
+ return Py_BuildValue("{sfsfsisisisisi}",
251
+ "CpuTime", self->cpu_time_ms, "RealTime", self->real_time_ms,
252
+ "Add", self->op_add, "Sub", self->op_sub, "Mul", self->op_mult,
253
+ "Div", self->op_div, "Exp", self->op_exp);
254
+ }
255
+
256
+ return _PyUnicode_FromString("Benchmark object has not been initialized properly.");
257
+ }
258
+
259
+ PyObject *GetResultsWithPair(Benchmark *self) {
260
+ if(self != NULL) {
261
+ return Py_BuildValue("{sfsfsisisisisisi}",
262
+ "CpuTime", self->cpu_time_ms, "RealTime", self->real_time_ms,
263
+ "Add", self->op_add, "Sub", self->op_sub, "Mul", self->op_mult,
264
+ "Div", self->op_div, "Exp", self->op_exp, "Pair", self->op_pair);
265
+ }
266
+
267
+ return _PyUnicode_FromString("Benchmark object has not been initialized properly.");
268
+ }
269
+
270
+
271
+ PyObject *Retrieve_result(Benchmark *self, char *option) {
272
+ PyObject *result = NULL;
273
+
274
+ if(self != NULL) {
275
+ if(strcmp(option, _CPUTIME_OPT) == 0) {
276
+ result = PyFloat_FromDouble(self->cpu_time_ms);
277
+ }
278
+ else if(strcmp(option, _REALTIME_OPT) == 0) {
279
+ result = PyFloat_FromDouble(self->real_time_ms);
280
+ }
281
+ else if(strcmp(option, _ADD_OPT) == 0) {
282
+ result = PyToLongObj(self->op_add);
283
+ }
284
+ else if(strcmp(option, _SUB_OPT) == 0) {
285
+ result = PyToLongObj(self->op_sub);
286
+ }
287
+ else if(strcmp(option, _MUL_OPT) == 0) {
288
+ result = PyToLongObj(self->op_mult);
289
+ }
290
+ else if(strcmp(option, _DIV_OPT) == 0) {
291
+ result = PyToLongObj(self->op_div);
292
+ }
293
+ else if(strcmp(option, _EXP_OPT) == 0) {
294
+ result = PyToLongObj(self->op_exp);
295
+ }
296
+ else if(strcmp(option, _PAIR_OPT) == 0) {
297
+ result = PyToLongObj(self->op_pair);
298
+ }
299
+ else {
300
+ debug("not a valid option.\n");
301
+ }
302
+ }
303
+ return result;
304
+ }
305
+
306
+ #if PY_MAJOR_VERSION >= 3
307
+ PyTypeObject BenchmarkType = {
308
+ PyVarObject_HEAD_INIT(NULL, 0)
309
+ "profile.Benchmark", /*tp_name*/
310
+ sizeof(Benchmark), /*tp_basicsize*/
311
+ 0, /*tp_itemsize*/
312
+ (destructor)Benchmark_dealloc, /*tp_dealloc*/
313
+ 0, /*tp_print*/
314
+ 0, /*tp_getattr*/
315
+ 0, /*tp_setattr*/
316
+ 0, /*tp_reserved*/
317
+ 0, /*tp_repr*/
318
+ 0, /*tp_as_number*/
319
+ 0, /*tp_as_sequence*/
320
+ 0, /*tp_as_mapping*/
321
+ 0, /*tp_hash */
322
+ 0, /*tp_call*/
323
+ 0, /*tp_str*/
324
+ 0, /*tp_getattro*/
325
+ 0, /*tp_setattro*/
326
+ 0, /*tp_as_buffer*/
327
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
328
+ "Benchmark objects", /* tp_doc */
329
+ 0, /* tp_traverse */
330
+ 0, /* tp_clear */
331
+ 0, /* tp_richcompare */
332
+ 0, /* tp_weaklistoffset */
333
+ 0, /* tp_iter */
334
+ 0, /* tp_iternext */
335
+ 0, /* tp_methods */
336
+ 0, /* tp_members */
337
+ 0, /* tp_getset */
338
+ 0, /* tp_base */
339
+ 0, /* tp_dict */
340
+ 0, /* tp_descr_get */
341
+ 0, /* tp_descr_set */
342
+ 0, /* tp_dictoffset */
343
+ (initproc)Benchmark_init, /* tp_init */
344
+ 0, /* tp_alloc */
345
+ Benchmark_new, /* tp_new */
346
+ };
347
+
348
+ #else
349
+ PyTypeObject BenchmarkType = {
350
+ PyVarObject_HEAD_INIT(NULL, 0)
351
+ "profile.Benchmark", /*tp_name*/
352
+ sizeof(Benchmark), /*tp_basicsize*/
353
+ 0, /*tp_itemsize*/
354
+ (destructor)Benchmark_dealloc, /*tp_dealloc*/
355
+ 0, /*tp_print*/
356
+ 0, /*tp_getattr*/
357
+ 0, /*tp_setattr*/
358
+ 0, /*tp_reserved*/
359
+ 0, /*tp_repr*/
360
+ 0, /*tp_as_number*/
361
+ 0, /*tp_as_sequence*/
362
+ 0, /*tp_as_mapping*/
363
+ 0, /*tp_hash */
364
+ 0, /*tp_call*/
365
+ 0, /*tp_str*/
366
+ 0, /*tp_getattro*/
367
+ 0, /*tp_setattro*/
368
+ 0, /*tp_as_buffer*/
369
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
370
+ "Benchmark objects", /* tp_doc */
371
+ 0, /* tp_traverse */
372
+ 0, /* tp_clear */
373
+ 0, /* tp_richcompare */
374
+ 0, /* tp_weaklistoffset */
375
+ 0, /* tp_iter */
376
+ 0, /* tp_iternext */
377
+ 0, /* tp_methods */
378
+ 0, /* tp_members */
379
+ 0, /* tp_getset */
380
+ 0, /* tp_base */
381
+ 0, /* tp_dict */
382
+ 0, /* tp_descr_get */
383
+ 0, /* tp_descr_set */
384
+ 0, /* tp_dictoffset */
385
+ (initproc)Benchmark_init, /* tp_init */
386
+ 0, /* tp_alloc */
387
+ Benchmark_new, /* tp_new */
388
+ };
389
+ #endif
390
+
391
+ struct module_state {
392
+ PyObject *error;
393
+ };
394
+
395
+ #if PY_MAJOR_VERSION >= 3
396
+ #define GETSTATE(m) ((struct module_state *) PyModule_GetState(m))
397
+ #else
398
+ #define GETSTATE(m) (&_state)
399
+ static struct module_state _state;
400
+ #endif
401
+
402
+ // benchmark type methods (module scope)
403
+ static PyMethodDef module_methods[] = {
404
+ {NULL}
405
+ };
406
+
407
+ #if PY_MAJOR_VERSION >= 3
408
+ static int bm_traverse(PyObject *m, visitproc visit, void *arg) {
409
+ Py_VISIT(GETSTATE(m)->error);
410
+ return 0;
411
+ }
412
+
413
+ static int bm_clear(PyObject *m) {
414
+ Py_CLEAR(GETSTATE(m)->error);
415
+ return 0;
416
+ }
417
+
418
+ static struct PyModuleDef moduledef = {
419
+ PyModuleDef_HEAD_INIT,
420
+ "benchmark",
421
+ NULL,
422
+ sizeof(struct module_state),
423
+ module_methods,
424
+ NULL,
425
+ bm_traverse,
426
+ bm_clear,
427
+ NULL
428
+ };
429
+
430
+ #define INITERROR return NULL
431
+ PyMODINIT_FUNC
432
+ PyInit_benchmark(void) {
433
+ #else
434
+ #define INITERROR return
435
+ void initbenchmark(void) {
436
+ #endif
437
+ PyObject *module;
438
+ static void *PyBenchmark_API[PyBenchmark_API_pointers];
439
+ PyObject *api_object;
440
+
441
+ if(PyType_Ready(&BenchmarkType) < 0) INITERROR;
442
+
443
+ #if PY_MAJOR_VERSION >= 3
444
+ module = PyModule_Create(&moduledef);
445
+ #else
446
+ module = Py_InitModule("benchmark", module_methods);
447
+ #endif
448
+ if(module == NULL) INITERROR;
449
+
450
+ struct module_state *st = GETSTATE(module);
451
+ st->error = PyErr_NewException("benchmark.Error", NULL, NULL);
452
+ if(st->error == NULL) {
453
+ Py_DECREF(module);
454
+ INITERROR;
455
+ }
456
+ BenchmarkError = st->error;
457
+
458
+ /* initialize the c api pointer array - this is what other modules call */
459
+ PyBenchmark_API[PyBenchmark_Start] = (void *)PyStartBenchmark;
460
+ PyBenchmark_API[PyBenchmark_End] = (void *)PyEndBenchmark;
461
+ PyBenchmark_API[PyBenchmark_Update] = (void *)PyUpdateBenchmark;
462
+ PyBenchmark_API[PyBenchmark_Clear] = (void *)PyClearBenchmark;
463
+
464
+ api_object = (PyObject *) PyCapsule_New((void *) PyBenchmark_API,BENCHMARK_MOD_NAME, NULL);
465
+ if(api_object != NULL) {
466
+ PyModule_AddObject(module, "_C_API", api_object);
467
+ }
468
+
469
+ Py_INCREF(&BenchmarkType);
470
+ PyModule_AddObject(module, "Benchmark", (PyObject *) &BenchmarkType);
471
+ // add exception handler
472
+ #if PY_MAJOR_VERSION >= 3
473
+ return module;
474
+ #endif
475
+
476
+ }
@@ -0,0 +1,162 @@
1
+ /*
2
+ * benchmarkmodule.h
3
+ */
4
+ #ifndef Py_BENCHMARKMODULE_H_
5
+ #define Py_BENCHMARKMODULE_H_
6
+ #ifdef __cplusplus
7
+ extern "C" {
8
+ #endif
9
+
10
+ #ifndef PY_SSIZE_T_CLEAN
11
+ #define PY_SSIZE_T_CLEAN
12
+ #endif
13
+
14
+ #include <Python.h>
15
+ #include <structmember.h>
16
+ #include <sys/time.h>
17
+
18
+ // set default if not passed in by compiler
19
+ //#ifndef BENCHMARK_ENABLED
20
+ //#define BENCHMARK_ENABLED 1vi bad
21
+ //#endif
22
+ //#define DEBUG 1
23
+ #define TRUE 1
24
+ #define FALSE 0
25
+
26
+ #ifdef DEBUG
27
+ #define debug(...) printf("DEBUG: "__VA_ARGS__)
28
+ #else
29
+ #define debug(...)
30
+ #endif
31
+
32
+ /* Python 3.x definitions */
33
+ #define _PyLong_Check(o1) PyLong_Check(o1)
34
+ #define ConvertToInt(o) PyLong_AsLong(o)
35
+ #define PyToLongObj(o) PyLong_FromLong(o)
36
+ /* check for both unicode and bytes objects */
37
+ #define PyBytes_CharmCheck(obj) PyUnicode_Check(obj) || PyBytes_Check(obj)
38
+ /* if unicode then add extra conversion step. two possibilities: unicode or bytes */
39
+ #define PyBytes_ToString2(a, obj, tmp_obj) \
40
+ if(PyBytes_Check(obj)) { a = PyBytes_AsString(obj); } \
41
+ else if(PyUnicode_Check(obj)) { tmp_obj = PyUnicode_AsUTF8String(obj); a = PyBytes_AsString(tmp_obj); } \
42
+ else { tmp_obj = PyObject_Str(obj); a = PyBytes_AsString(tmp_obj); }
43
+
44
+ #define _PyUnicode_FromFormat PyUnicode_FromFormat
45
+ #define _PyUnicode_FromString PyUnicode_FromString
46
+
47
+ #define BENCHMARK_MOD_NAME "charm.core.benchmark._C_API"
48
+
49
+ #ifndef BENCHMARK_MODULE
50
+ // define new benchmark type for benchmark module
51
+ extern PyTypeObject BenchmarkType;
52
+ // define new benchmark error type (will be used for notifying errors)
53
+ extern PyObject *BenchmarkError;
54
+ #else
55
+ // define new benchmark type for benchmark module
56
+ PyTypeObject BenchmarkType;
57
+ // define new benchmark error type (will be used for notifying errors)
58
+ PyObject *BenchmarkError;
59
+ #endif
60
+ // define a macro to help determine whether an object is of benchmark type
61
+ #define PyBenchmark_Check(obj) PyObject_TypeCheck(obj, &BenchmarkType)
62
+ /* header file for benchmark module */
63
+ #define MAX_MEASURE 10
64
+ enum Measure {CPU_TIME = 0, REAL_TIME, NATIVE_TIME, ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION, EXPONENTIATION, PAIRINGS, GRANULAR, NONE};
65
+ typedef enum Measure MeasureType;
66
+ #define _CPUTIME_OPT "CpuTime"
67
+ #define _REALTIME_OPT "RealTime"
68
+ #define _ADD_OPT "Add"
69
+ #define _SUB_OPT "Sub"
70
+ #define _MUL_OPT "Mul"
71
+ #define _DIV_OPT "Div"
72
+ #define _EXP_OPT "Exp"
73
+ #define _PAIR_OPT "Pair"
74
+ #define _GRAN_OPT "Granular"
75
+
76
+ typedef struct {
77
+ PyObject_HEAD
78
+ struct timeval start_time, stop_time, native_time; // track real time
79
+ clock_t start_clock, stop_clock; // track cpu time
80
+
81
+ int op_add, op_sub, op_mult, op_div;
82
+ int op_exp, op_pair;
83
+ double cpu_time_ms, real_time_ms;
84
+ int num_options; // track num options for a particular benchmark
85
+ MeasureType options_selected[MAX_MEASURE+1]; // measurement options selected
86
+ int cpu_option, real_option, granular_option;
87
+ int identifier;
88
+ int bench_initialized, bench_inprogress;
89
+ } Benchmark;
90
+
91
+ // PyMethodDef Benchmark_methods[];
92
+ PyObject *Benchmark_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
93
+ void Benchmark_dealloc(Benchmark *self);
94
+ int Benchmark_init(Benchmark *self, PyObject *args, PyObject *kwds);
95
+
96
+ PyObject *Benchmark_print(Benchmark *self);
97
+ PyObject *GetResults(Benchmark *self);
98
+ PyObject *GetResultsWithPair(Benchmark *self);
99
+ PyObject *Retrieve_result(Benchmark *self, char *option);
100
+
101
+ /* c api functions */
102
+ #define PyBenchmark_Start 0
103
+ #define PyBenchmark_End 1
104
+ #define PyBenchmark_Update 2
105
+ #define PyBenchmark_Clear 3
106
+
107
+ /* total number of C api pointers? */
108
+ #define PyBenchmark_API_pointers 4
109
+
110
+ #ifdef BENCHMARK_ENABLED
111
+ #define UPDATE_BENCHMARK(option, bench) \
112
+ if(bench != NULL && bench->bench_initialized == TRUE) { \
113
+ PyUpdateBenchmark(option, bench); }
114
+
115
+ #else
116
+ #define UPDATE_BENCHMARK(option, bench) /* ... */
117
+ #endif
118
+
119
+ #ifdef BENCHMARK_MODULE
120
+ /* This section is used when compiling benchmarkmodule.c */
121
+ static int PyStartBenchmark(Benchmark *data, PyObject *opList, int opListSize);
122
+ static int PyEndBenchmark(Benchmark *data);
123
+ static int PyUpdateBenchmark(MeasureType option, Benchmark *data);
124
+ static int PyClearBenchmark(Benchmark *data);
125
+
126
+ #else
127
+
128
+ /* This section is used in modules that use benchmarkmodule's API
129
+ * e.g. pairingmath, integermath, etc.
130
+ */
131
+ static void **PyBenchmark_API;
132
+
133
+ #define PyStartBenchmark (*(int (*)(Benchmark *data, PyObject *opList, int opListSize)) PyBenchmark_API[PyBenchmark_Start])
134
+ #define PyEndBenchmark (*(int (*)(Benchmark *data)) PyBenchmark_API[PyBenchmark_End])
135
+ #define PyUpdateBenchmark (*(int (*)(MeasureType option, Benchmark *data)) PyBenchmark_API[PyBenchmark_Update])
136
+ #define PyClearBenchmark (*(int (*)(Benchmark *data)) PyBenchmark_API[PyBenchmark_Clear])
137
+
138
+ #define ADD_BENCHMARK_OPTIONS(m) \
139
+ PyModule_AddStringConstant(m, "CpuTime", "CpuTime"); \
140
+ PyModule_AddStringConstant(m, "RealTime", "RealTime"); \
141
+ PyModule_AddStringConstant(m, "Add", "Add"); \
142
+ PyModule_AddStringConstant(m, "Sub", "Sub"); \
143
+ PyModule_AddStringConstant(m, "Mul", "Mul"); \
144
+ PyModule_AddStringConstant(m, "Div", "Div"); \
145
+ PyModule_AddStringConstant(m, "Exp", "Exp");
146
+
147
+ /* end - api helper functions */
148
+
149
+ static int import_benchmark(void)
150
+ {
151
+ // PyBenchmark_API = (void **) PyCapsule_Import(BENCHMARK_MOD_NAME, 1);
152
+ PyBenchmark_API = (void **) PyCapsule_Import(BENCHMARK_MOD_NAME, 0); // 0 = enable tracing
153
+ return (PyBenchmark_API != NULL) ? 0 : -1;
154
+ }
155
+
156
+ #endif
157
+
158
+ #ifdef __cplusplus
159
+ }
160
+ #endif
161
+
162
+ #endif /* PY_BENCHMARK_H_ */