mink 0.0.1__py3-none-any.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 (352) hide show
  1. mink/.mypy_cache/.gitignore +2 -0
  2. mink/.mypy_cache/3.12/@plugins_snapshot.json +1 -0
  3. mink/.mypy_cache/3.12/__future__.data.json +1 -0
  4. mink/.mypy_cache/3.12/__future__.meta.json +1 -0
  5. mink/.mypy_cache/3.12/_ast.data.json +1 -0
  6. mink/.mypy_cache/3.12/_ast.meta.json +1 -0
  7. mink/.mypy_cache/3.12/_codecs.data.json +1 -0
  8. mink/.mypy_cache/3.12/_codecs.meta.json +1 -0
  9. mink/.mypy_cache/3.12/_collections_abc.data.json +1 -0
  10. mink/.mypy_cache/3.12/_collections_abc.meta.json +1 -0
  11. mink/.mypy_cache/3.12/_ctypes.data.json +1 -0
  12. mink/.mypy_cache/3.12/_ctypes.meta.json +1 -0
  13. mink/.mypy_cache/3.12/_thread.data.json +1 -0
  14. mink/.mypy_cache/3.12/_thread.meta.json +1 -0
  15. mink/.mypy_cache/3.12/_typeshed/__init__.data.json +1 -0
  16. mink/.mypy_cache/3.12/_typeshed/__init__.meta.json +1 -0
  17. mink/.mypy_cache/3.12/_warnings.data.json +1 -0
  18. mink/.mypy_cache/3.12/_warnings.meta.json +1 -0
  19. mink/.mypy_cache/3.12/abc.data.json +1 -0
  20. mink/.mypy_cache/3.12/abc.meta.json +1 -0
  21. mink/.mypy_cache/3.12/array.data.json +1 -0
  22. mink/.mypy_cache/3.12/array.meta.json +1 -0
  23. mink/.mypy_cache/3.12/ast.data.json +1 -0
  24. mink/.mypy_cache/3.12/ast.meta.json +1 -0
  25. mink/.mypy_cache/3.12/builtins.data.json +1 -0
  26. mink/.mypy_cache/3.12/builtins.meta.json +1 -0
  27. mink/.mypy_cache/3.12/codecs.data.json +1 -0
  28. mink/.mypy_cache/3.12/codecs.meta.json +1 -0
  29. mink/.mypy_cache/3.12/collections/__init__.data.json +1 -0
  30. mink/.mypy_cache/3.12/collections/__init__.meta.json +1 -0
  31. mink/.mypy_cache/3.12/collections/abc.data.json +1 -0
  32. mink/.mypy_cache/3.12/collections/abc.meta.json +1 -0
  33. mink/.mypy_cache/3.12/contextlib.data.json +1 -0
  34. mink/.mypy_cache/3.12/contextlib.meta.json +1 -0
  35. mink/.mypy_cache/3.12/ctypes/__init__.data.json +1 -0
  36. mink/.mypy_cache/3.12/ctypes/__init__.meta.json +1 -0
  37. mink/.mypy_cache/3.12/dataclasses.data.json +1 -0
  38. mink/.mypy_cache/3.12/dataclasses.meta.json +1 -0
  39. mink/.mypy_cache/3.12/datetime.data.json +1 -0
  40. mink/.mypy_cache/3.12/datetime.meta.json +1 -0
  41. mink/.mypy_cache/3.12/email/__init__.data.json +1 -0
  42. mink/.mypy_cache/3.12/email/__init__.meta.json +1 -0
  43. mink/.mypy_cache/3.12/email/charset.data.json +1 -0
  44. mink/.mypy_cache/3.12/email/charset.meta.json +1 -0
  45. mink/.mypy_cache/3.12/email/contentmanager.data.json +1 -0
  46. mink/.mypy_cache/3.12/email/contentmanager.meta.json +1 -0
  47. mink/.mypy_cache/3.12/email/errors.data.json +1 -0
  48. mink/.mypy_cache/3.12/email/errors.meta.json +1 -0
  49. mink/.mypy_cache/3.12/email/header.data.json +1 -0
  50. mink/.mypy_cache/3.12/email/header.meta.json +1 -0
  51. mink/.mypy_cache/3.12/email/message.data.json +1 -0
  52. mink/.mypy_cache/3.12/email/message.meta.json +1 -0
  53. mink/.mypy_cache/3.12/email/policy.data.json +1 -0
  54. mink/.mypy_cache/3.12/email/policy.meta.json +1 -0
  55. mink/.mypy_cache/3.12/enum.data.json +1 -0
  56. mink/.mypy_cache/3.12/enum.meta.json +1 -0
  57. mink/.mypy_cache/3.12/genericpath.data.json +1 -0
  58. mink/.mypy_cache/3.12/genericpath.meta.json +1 -0
  59. mink/.mypy_cache/3.12/importlib/__init__.data.json +1 -0
  60. mink/.mypy_cache/3.12/importlib/__init__.meta.json +1 -0
  61. mink/.mypy_cache/3.12/importlib/abc.data.json +1 -0
  62. mink/.mypy_cache/3.12/importlib/abc.meta.json +1 -0
  63. mink/.mypy_cache/3.12/importlib/machinery.data.json +1 -0
  64. mink/.mypy_cache/3.12/importlib/machinery.meta.json +1 -0
  65. mink/.mypy_cache/3.12/importlib/metadata/__init__.data.json +1 -0
  66. mink/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +1 -0
  67. mink/.mypy_cache/3.12/importlib/metadata/_meta.data.json +1 -0
  68. mink/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +1 -0
  69. mink/.mypy_cache/3.12/importlib/readers.data.json +1 -0
  70. mink/.mypy_cache/3.12/importlib/readers.meta.json +1 -0
  71. mink/.mypy_cache/3.12/importlib/resources/__init__.data.json +1 -0
  72. mink/.mypy_cache/3.12/importlib/resources/__init__.meta.json +1 -0
  73. mink/.mypy_cache/3.12/importlib/resources/abc.data.json +1 -0
  74. mink/.mypy_cache/3.12/importlib/resources/abc.meta.json +1 -0
  75. mink/.mypy_cache/3.12/io.data.json +1 -0
  76. mink/.mypy_cache/3.12/io.meta.json +1 -0
  77. mink/.mypy_cache/3.12/logging/__init__.data.json +1 -0
  78. mink/.mypy_cache/3.12/logging/__init__.meta.json +1 -0
  79. mink/.mypy_cache/3.12/math.data.json +1 -0
  80. mink/.mypy_cache/3.12/math.meta.json +1 -0
  81. mink/.mypy_cache/3.12/mink/limits/limit.data.json +1 -0
  82. mink/.mypy_cache/3.12/mink/limits/limit.meta.json +1 -0
  83. mink/.mypy_cache/3.12/mmap.data.json +1 -0
  84. mink/.mypy_cache/3.12/mmap.meta.json +1 -0
  85. mink/.mypy_cache/3.12/numpy/__init__.data.json +1 -0
  86. mink/.mypy_cache/3.12/numpy/__init__.meta.json +1 -0
  87. mink/.mypy_cache/3.12/numpy/_pytesttester.data.json +1 -0
  88. mink/.mypy_cache/3.12/numpy/_pytesttester.meta.json +1 -0
  89. mink/.mypy_cache/3.12/numpy/_typing/__init__.data.json +1 -0
  90. mink/.mypy_cache/3.12/numpy/_typing/__init__.meta.json +1 -0
  91. mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json +1 -0
  92. mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json +1 -0
  93. mink/.mypy_cache/3.12/numpy/_typing/_array_like.data.json +1 -0
  94. mink/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json +1 -0
  95. mink/.mypy_cache/3.12/numpy/_typing/_callable.data.json +1 -0
  96. mink/.mypy_cache/3.12/numpy/_typing/_callable.meta.json +1 -0
  97. mink/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json +1 -0
  98. mink/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json +1 -0
  99. mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json +1 -0
  100. mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json +1 -0
  101. mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json +1 -0
  102. mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json +1 -0
  103. mink/.mypy_cache/3.12/numpy/_typing/_nbit.data.json +1 -0
  104. mink/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json +1 -0
  105. mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json +1 -0
  106. mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json +1 -0
  107. mink/.mypy_cache/3.12/numpy/_typing/_scalars.data.json +1 -0
  108. mink/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json +1 -0
  109. mink/.mypy_cache/3.12/numpy/_typing/_shape.data.json +1 -0
  110. mink/.mypy_cache/3.12/numpy/_typing/_shape.meta.json +1 -0
  111. mink/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json +1 -0
  112. mink/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json +1 -0
  113. mink/.mypy_cache/3.12/numpy/_utils/__init__.data.json +1 -0
  114. mink/.mypy_cache/3.12/numpy/_utils/__init__.meta.json +1 -0
  115. mink/.mypy_cache/3.12/numpy/_utils/_convertions.data.json +1 -0
  116. mink/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json +1 -0
  117. mink/.mypy_cache/3.12/numpy/core/__init__.data.json +1 -0
  118. mink/.mypy_cache/3.12/numpy/core/__init__.meta.json +1 -0
  119. mink/.mypy_cache/3.12/numpy/core/_asarray.data.json +1 -0
  120. mink/.mypy_cache/3.12/numpy/core/_asarray.meta.json +1 -0
  121. mink/.mypy_cache/3.12/numpy/core/_internal.data.json +1 -0
  122. mink/.mypy_cache/3.12/numpy/core/_internal.meta.json +1 -0
  123. mink/.mypy_cache/3.12/numpy/core/_type_aliases.data.json +1 -0
  124. mink/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json +1 -0
  125. mink/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json +1 -0
  126. mink/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json +1 -0
  127. mink/.mypy_cache/3.12/numpy/core/arrayprint.data.json +1 -0
  128. mink/.mypy_cache/3.12/numpy/core/arrayprint.meta.json +1 -0
  129. mink/.mypy_cache/3.12/numpy/core/defchararray.data.json +1 -0
  130. mink/.mypy_cache/3.12/numpy/core/defchararray.meta.json +1 -0
  131. mink/.mypy_cache/3.12/numpy/core/einsumfunc.data.json +1 -0
  132. mink/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json +1 -0
  133. mink/.mypy_cache/3.12/numpy/core/fromnumeric.data.json +1 -0
  134. mink/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json +1 -0
  135. mink/.mypy_cache/3.12/numpy/core/function_base.data.json +1 -0
  136. mink/.mypy_cache/3.12/numpy/core/function_base.meta.json +1 -0
  137. mink/.mypy_cache/3.12/numpy/core/multiarray.data.json +1 -0
  138. mink/.mypy_cache/3.12/numpy/core/multiarray.meta.json +1 -0
  139. mink/.mypy_cache/3.12/numpy/core/numeric.data.json +1 -0
  140. mink/.mypy_cache/3.12/numpy/core/numeric.meta.json +1 -0
  141. mink/.mypy_cache/3.12/numpy/core/numerictypes.data.json +1 -0
  142. mink/.mypy_cache/3.12/numpy/core/numerictypes.meta.json +1 -0
  143. mink/.mypy_cache/3.12/numpy/core/records.data.json +1 -0
  144. mink/.mypy_cache/3.12/numpy/core/records.meta.json +1 -0
  145. mink/.mypy_cache/3.12/numpy/core/shape_base.data.json +1 -0
  146. mink/.mypy_cache/3.12/numpy/core/shape_base.meta.json +1 -0
  147. mink/.mypy_cache/3.12/numpy/core/umath.data.json +1 -0
  148. mink/.mypy_cache/3.12/numpy/core/umath.meta.json +1 -0
  149. mink/.mypy_cache/3.12/numpy/ctypeslib.data.json +1 -0
  150. mink/.mypy_cache/3.12/numpy/ctypeslib.meta.json +1 -0
  151. mink/.mypy_cache/3.12/numpy/dtypes.data.json +1 -0
  152. mink/.mypy_cache/3.12/numpy/dtypes.meta.json +1 -0
  153. mink/.mypy_cache/3.12/numpy/exceptions.data.json +1 -0
  154. mink/.mypy_cache/3.12/numpy/exceptions.meta.json +1 -0
  155. mink/.mypy_cache/3.12/numpy/fft/__init__.data.json +1 -0
  156. mink/.mypy_cache/3.12/numpy/fft/__init__.meta.json +1 -0
  157. mink/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json +1 -0
  158. mink/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json +1 -0
  159. mink/.mypy_cache/3.12/numpy/fft/helper.data.json +1 -0
  160. mink/.mypy_cache/3.12/numpy/fft/helper.meta.json +1 -0
  161. mink/.mypy_cache/3.12/numpy/lib/__init__.data.json +1 -0
  162. mink/.mypy_cache/3.12/numpy/lib/__init__.meta.json +1 -0
  163. mink/.mypy_cache/3.12/numpy/lib/_version.data.json +1 -0
  164. mink/.mypy_cache/3.12/numpy/lib/_version.meta.json +1 -0
  165. mink/.mypy_cache/3.12/numpy/lib/arraypad.data.json +1 -0
  166. mink/.mypy_cache/3.12/numpy/lib/arraypad.meta.json +1 -0
  167. mink/.mypy_cache/3.12/numpy/lib/arraysetops.data.json +1 -0
  168. mink/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json +1 -0
  169. mink/.mypy_cache/3.12/numpy/lib/arrayterator.data.json +1 -0
  170. mink/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json +1 -0
  171. mink/.mypy_cache/3.12/numpy/lib/format.data.json +1 -0
  172. mink/.mypy_cache/3.12/numpy/lib/format.meta.json +1 -0
  173. mink/.mypy_cache/3.12/numpy/lib/function_base.data.json +1 -0
  174. mink/.mypy_cache/3.12/numpy/lib/function_base.meta.json +1 -0
  175. mink/.mypy_cache/3.12/numpy/lib/histograms.data.json +1 -0
  176. mink/.mypy_cache/3.12/numpy/lib/histograms.meta.json +1 -0
  177. mink/.mypy_cache/3.12/numpy/lib/index_tricks.data.json +1 -0
  178. mink/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json +1 -0
  179. mink/.mypy_cache/3.12/numpy/lib/mixins.data.json +1 -0
  180. mink/.mypy_cache/3.12/numpy/lib/mixins.meta.json +1 -0
  181. mink/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json +1 -0
  182. mink/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json +1 -0
  183. mink/.mypy_cache/3.12/numpy/lib/npyio.data.json +1 -0
  184. mink/.mypy_cache/3.12/numpy/lib/npyio.meta.json +1 -0
  185. mink/.mypy_cache/3.12/numpy/lib/polynomial.data.json +1 -0
  186. mink/.mypy_cache/3.12/numpy/lib/polynomial.meta.json +1 -0
  187. mink/.mypy_cache/3.12/numpy/lib/scimath.data.json +1 -0
  188. mink/.mypy_cache/3.12/numpy/lib/scimath.meta.json +1 -0
  189. mink/.mypy_cache/3.12/numpy/lib/shape_base.data.json +1 -0
  190. mink/.mypy_cache/3.12/numpy/lib/shape_base.meta.json +1 -0
  191. mink/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json +1 -0
  192. mink/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json +1 -0
  193. mink/.mypy_cache/3.12/numpy/lib/twodim_base.data.json +1 -0
  194. mink/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json +1 -0
  195. mink/.mypy_cache/3.12/numpy/lib/type_check.data.json +1 -0
  196. mink/.mypy_cache/3.12/numpy/lib/type_check.meta.json +1 -0
  197. mink/.mypy_cache/3.12/numpy/lib/ufunclike.data.json +1 -0
  198. mink/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json +1 -0
  199. mink/.mypy_cache/3.12/numpy/lib/utils.data.json +1 -0
  200. mink/.mypy_cache/3.12/numpy/lib/utils.meta.json +1 -0
  201. mink/.mypy_cache/3.12/numpy/linalg/__init__.data.json +1 -0
  202. mink/.mypy_cache/3.12/numpy/linalg/__init__.meta.json +1 -0
  203. mink/.mypy_cache/3.12/numpy/linalg/linalg.data.json +1 -0
  204. mink/.mypy_cache/3.12/numpy/linalg/linalg.meta.json +1 -0
  205. mink/.mypy_cache/3.12/numpy/ma/__init__.data.json +1 -0
  206. mink/.mypy_cache/3.12/numpy/ma/__init__.meta.json +1 -0
  207. mink/.mypy_cache/3.12/numpy/ma/core.data.json +1 -0
  208. mink/.mypy_cache/3.12/numpy/ma/core.meta.json +1 -0
  209. mink/.mypy_cache/3.12/numpy/ma/extras.data.json +1 -0
  210. mink/.mypy_cache/3.12/numpy/ma/extras.meta.json +1 -0
  211. mink/.mypy_cache/3.12/numpy/ma/mrecords.data.json +1 -0
  212. mink/.mypy_cache/3.12/numpy/ma/mrecords.meta.json +1 -0
  213. mink/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json +1 -0
  214. mink/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json +1 -0
  215. mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json +1 -0
  216. mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json +1 -0
  217. mink/.mypy_cache/3.12/numpy/polynomial/__init__.data.json +1 -0
  218. mink/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json +1 -0
  219. mink/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json +1 -0
  220. mink/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json +1 -0
  221. mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json +1 -0
  222. mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json +1 -0
  223. mink/.mypy_cache/3.12/numpy/polynomial/hermite.data.json +1 -0
  224. mink/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json +1 -0
  225. mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json +1 -0
  226. mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json +1 -0
  227. mink/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json +1 -0
  228. mink/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json +1 -0
  229. mink/.mypy_cache/3.12/numpy/polynomial/legendre.data.json +1 -0
  230. mink/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json +1 -0
  231. mink/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json +1 -0
  232. mink/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json +1 -0
  233. mink/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json +1 -0
  234. mink/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json +1 -0
  235. mink/.mypy_cache/3.12/numpy/random/__init__.data.json +1 -0
  236. mink/.mypy_cache/3.12/numpy/random/__init__.meta.json +1 -0
  237. mink/.mypy_cache/3.12/numpy/random/_generator.data.json +1 -0
  238. mink/.mypy_cache/3.12/numpy/random/_generator.meta.json +1 -0
  239. mink/.mypy_cache/3.12/numpy/random/_mt19937.data.json +1 -0
  240. mink/.mypy_cache/3.12/numpy/random/_mt19937.meta.json +1 -0
  241. mink/.mypy_cache/3.12/numpy/random/_pcg64.data.json +1 -0
  242. mink/.mypy_cache/3.12/numpy/random/_pcg64.meta.json +1 -0
  243. mink/.mypy_cache/3.12/numpy/random/_philox.data.json +1 -0
  244. mink/.mypy_cache/3.12/numpy/random/_philox.meta.json +1 -0
  245. mink/.mypy_cache/3.12/numpy/random/_sfc64.data.json +1 -0
  246. mink/.mypy_cache/3.12/numpy/random/_sfc64.meta.json +1 -0
  247. mink/.mypy_cache/3.12/numpy/random/bit_generator.data.json +1 -0
  248. mink/.mypy_cache/3.12/numpy/random/bit_generator.meta.json +1 -0
  249. mink/.mypy_cache/3.12/numpy/random/mtrand.data.json +1 -0
  250. mink/.mypy_cache/3.12/numpy/random/mtrand.meta.json +1 -0
  251. mink/.mypy_cache/3.12/numpy/testing/__init__.data.json +1 -0
  252. mink/.mypy_cache/3.12/numpy/testing/__init__.meta.json +1 -0
  253. mink/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json +1 -0
  254. mink/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json +1 -0
  255. mink/.mypy_cache/3.12/numpy/testing/_private/utils.data.json +1 -0
  256. mink/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json +1 -0
  257. mink/.mypy_cache/3.12/numpy/typing/__init__.data.json +1 -0
  258. mink/.mypy_cache/3.12/numpy/typing/__init__.meta.json +1 -0
  259. mink/.mypy_cache/3.12/numpy/version.data.json +1 -0
  260. mink/.mypy_cache/3.12/numpy/version.meta.json +1 -0
  261. mink/.mypy_cache/3.12/os/__init__.data.json +1 -0
  262. mink/.mypy_cache/3.12/os/__init__.meta.json +1 -0
  263. mink/.mypy_cache/3.12/os/path.data.json +1 -0
  264. mink/.mypy_cache/3.12/os/path.meta.json +1 -0
  265. mink/.mypy_cache/3.12/pathlib.data.json +1 -0
  266. mink/.mypy_cache/3.12/pathlib.meta.json +1 -0
  267. mink/.mypy_cache/3.12/posixpath.data.json +1 -0
  268. mink/.mypy_cache/3.12/posixpath.meta.json +1 -0
  269. mink/.mypy_cache/3.12/re.data.json +1 -0
  270. mink/.mypy_cache/3.12/re.meta.json +1 -0
  271. mink/.mypy_cache/3.12/sre_compile.data.json +1 -0
  272. mink/.mypy_cache/3.12/sre_compile.meta.json +1 -0
  273. mink/.mypy_cache/3.12/sre_constants.data.json +1 -0
  274. mink/.mypy_cache/3.12/sre_constants.meta.json +1 -0
  275. mink/.mypy_cache/3.12/sre_parse.data.json +1 -0
  276. mink/.mypy_cache/3.12/sre_parse.meta.json +1 -0
  277. mink/.mypy_cache/3.12/string.data.json +1 -0
  278. mink/.mypy_cache/3.12/string.meta.json +1 -0
  279. mink/.mypy_cache/3.12/subprocess.data.json +1 -0
  280. mink/.mypy_cache/3.12/subprocess.meta.json +1 -0
  281. mink/.mypy_cache/3.12/sys/__init__.data.json +1 -0
  282. mink/.mypy_cache/3.12/sys/__init__.meta.json +1 -0
  283. mink/.mypy_cache/3.12/sys/_monitoring.data.json +1 -0
  284. mink/.mypy_cache/3.12/sys/_monitoring.meta.json +1 -0
  285. mink/.mypy_cache/3.12/textwrap.data.json +1 -0
  286. mink/.mypy_cache/3.12/textwrap.meta.json +1 -0
  287. mink/.mypy_cache/3.12/threading.data.json +1 -0
  288. mink/.mypy_cache/3.12/threading.meta.json +1 -0
  289. mink/.mypy_cache/3.12/time.data.json +1 -0
  290. mink/.mypy_cache/3.12/time.meta.json +1 -0
  291. mink/.mypy_cache/3.12/types.data.json +1 -0
  292. mink/.mypy_cache/3.12/types.meta.json +1 -0
  293. mink/.mypy_cache/3.12/typing.data.json +1 -0
  294. mink/.mypy_cache/3.12/typing.meta.json +1 -0
  295. mink/.mypy_cache/3.12/typing_extensions.data.json +1 -0
  296. mink/.mypy_cache/3.12/typing_extensions.meta.json +1 -0
  297. mink/.mypy_cache/3.12/unittest/__init__.data.json +1 -0
  298. mink/.mypy_cache/3.12/unittest/__init__.meta.json +1 -0
  299. mink/.mypy_cache/3.12/unittest/_log.data.json +1 -0
  300. mink/.mypy_cache/3.12/unittest/_log.meta.json +1 -0
  301. mink/.mypy_cache/3.12/unittest/async_case.data.json +1 -0
  302. mink/.mypy_cache/3.12/unittest/async_case.meta.json +1 -0
  303. mink/.mypy_cache/3.12/unittest/case.data.json +1 -0
  304. mink/.mypy_cache/3.12/unittest/case.meta.json +1 -0
  305. mink/.mypy_cache/3.12/unittest/loader.data.json +1 -0
  306. mink/.mypy_cache/3.12/unittest/loader.meta.json +1 -0
  307. mink/.mypy_cache/3.12/unittest/main.data.json +1 -0
  308. mink/.mypy_cache/3.12/unittest/main.meta.json +1 -0
  309. mink/.mypy_cache/3.12/unittest/result.data.json +1 -0
  310. mink/.mypy_cache/3.12/unittest/result.meta.json +1 -0
  311. mink/.mypy_cache/3.12/unittest/runner.data.json +1 -0
  312. mink/.mypy_cache/3.12/unittest/runner.meta.json +1 -0
  313. mink/.mypy_cache/3.12/unittest/signals.data.json +1 -0
  314. mink/.mypy_cache/3.12/unittest/signals.meta.json +1 -0
  315. mink/.mypy_cache/3.12/unittest/suite.data.json +1 -0
  316. mink/.mypy_cache/3.12/unittest/suite.meta.json +1 -0
  317. mink/.mypy_cache/3.12/warnings.data.json +1 -0
  318. mink/.mypy_cache/3.12/warnings.meta.json +1 -0
  319. mink/.mypy_cache/3.12/zipfile.data.json +1 -0
  320. mink/.mypy_cache/3.12/zipfile.meta.json +1 -0
  321. mink/.mypy_cache/CACHEDIR.TAG +3 -0
  322. mink/__init__.py +75 -0
  323. mink/configuration.py +215 -0
  324. mink/constants.py +34 -0
  325. mink/exceptions.py +98 -0
  326. mink/lie/__init__.py +13 -0
  327. mink/lie/base.py +156 -0
  328. mink/lie/se3.py +249 -0
  329. mink/lie/so3.py +224 -0
  330. mink/lie/tests/__init__.py +0 -0
  331. mink/lie/tests/test_axioms.py +51 -0
  332. mink/lie/tests/test_operations.py +77 -0
  333. mink/lie/tests/utils.py +20 -0
  334. mink/lie/utils.py +29 -0
  335. mink/limits/__init__.py +16 -0
  336. mink/limits/collision_avoidance_limit.py +274 -0
  337. mink/limits/configuration_limit.py +126 -0
  338. mink/limits/exceptions.py +7 -0
  339. mink/limits/limit.py +41 -0
  340. mink/limits/velocity_limit.py +92 -0
  341. mink/py.typed +0 -0
  342. mink/solve_ik.py +105 -0
  343. mink/tasks/__init__.py +26 -0
  344. mink/tasks/com_task.py +82 -0
  345. mink/tasks/exceptions.py +27 -0
  346. mink/tasks/frame_task.py +114 -0
  347. mink/tasks/posture_task.py +103 -0
  348. mink/tasks/task.py +105 -0
  349. mink/utils.py +128 -0
  350. mink-0.0.1.dist-info/METADATA +71 -0
  351. mink-0.0.1.dist-info/RECORD +352 -0
  352. mink-0.0.1.dist-info/WHEEL +4 -0
mink/configuration.py ADDED
@@ -0,0 +1,215 @@
1
+ from typing import Optional
2
+
3
+ import mujoco
4
+ import numpy as np
5
+
6
+ from . import constants as consts
7
+ from . import exceptions
8
+ from .lie import SE3, SO3
9
+
10
+
11
+ class Configuration:
12
+ """A struct that provides convenient access to kinematic quantities such as frame
13
+ transforms and frame jacobians. Frames can be defined at bodies, geoms or sites.
14
+
15
+ The `update` function ensures the proper forward kinematics functions have been
16
+ called, namely:
17
+
18
+ - mujoco.mj_kinematics(model, data)
19
+ - mujoco.mj_comPos(model, data)
20
+ """
21
+
22
+ def __init__(
23
+ self,
24
+ model: mujoco.MjModel,
25
+ q: Optional[np.ndarray] = None,
26
+ ):
27
+ """Constructor.
28
+
29
+ Args:
30
+ model: An instance of MjModel.
31
+ q: Optional configuration to initialize from. If None, the configuration
32
+ is initialized to the reference configuration `qpos0`.
33
+ """
34
+ self.model = model
35
+ self.data = mujoco.MjData(model)
36
+ self.update(q=q)
37
+
38
+ def update(self, q: Optional[np.ndarray] = None) -> None:
39
+ """Run forward kinematics.
40
+
41
+ The minimal function call required to get updated frame transforms (aka forward
42
+ kinematics) is `mj_kinematics`. An extra call to `mj_comPos` is needed for
43
+ updated Jacobians.
44
+
45
+ Args:`
46
+ q: Optional configuration vector to override internal data.qpos with.
47
+ """
48
+ if q is not None:
49
+ self.data.qpos = q
50
+ mujoco.mj_kinematics(self.model, self.data)
51
+ mujoco.mj_comPos(self.model, self.data)
52
+
53
+ def update_from_keyframe(self, key_name: str) -> None:
54
+ """Update the configuration from a keyframe.
55
+
56
+ Args:
57
+ key_name: The name of the keyframe.
58
+
59
+ Raises:
60
+ ValueError: if no key named `key` was found in the model.
61
+ """
62
+ key_id = mujoco.mj_name2id(self.model, mujoco.mjtObj.mjOBJ_KEY, key_name)
63
+ if key_id == -1:
64
+ raise exceptions.InvalidKeyframe(key_name, self.model)
65
+ self.update(q=self.model.key_qpos[key_id])
66
+
67
+ def check_limits(self, tol: float = 1e-6, safety_break: bool = True) -> None:
68
+ """Check that the current configuration is within bounds.
69
+
70
+ Args:
71
+ tol: Tolerance in [rad].
72
+ safety_break: If True, stop execution and raise an exception if the current
73
+ configuration is outside limits. If False, print a warning and continue
74
+ execution.
75
+ """
76
+ for jnt in range(self.model.njnt):
77
+ jnt_type = self.model.jnt_type[jnt]
78
+ if (
79
+ jnt_type == mujoco.mjtJoint.mjJNT_FREE
80
+ or not self.model.jnt_limited[jnt]
81
+ ):
82
+ continue
83
+ padr = self.model.jnt_qposadr[jnt]
84
+ qval = self.q[padr]
85
+ qmin = self.model.jnt_range[jnt, 0]
86
+ qmax = self.model.jnt_range[jnt, 1]
87
+ if qval < qmin - tol or qval > qmax + tol:
88
+ if safety_break:
89
+ raise exceptions.NotWithinConfigurationLimits(
90
+ joint_id=jnt,
91
+ value=qval,
92
+ lower=qmin,
93
+ upper=qmax,
94
+ model=self.model,
95
+ )
96
+ else:
97
+ print(
98
+ f"Value {qval} at index {jnt} is out of limits: "
99
+ f"[{qmin}, {qmax}]"
100
+ )
101
+
102
+ def get_frame_jacobian(self, frame_name: str, frame_type: str) -> np.ndarray:
103
+ """Compute the Jacobian matrix of a frame velocity.
104
+
105
+ Denoting our frame by B and the world frame by W, the Jacobian matrix B_J_WB
106
+ is related to the body velocity B_v_WB by:
107
+
108
+ B_v_WB = B_J_WB q_dot
109
+
110
+ Args:
111
+ frame_name: Name of the frame in the MJCF.
112
+ frame_type: Type of frame. Can be a geom, a body or a site.
113
+
114
+ Returns:
115
+ Jacobian B_J_WB of the frame.
116
+ """
117
+ if frame_type not in consts.SUPPORTED_FRAMES:
118
+ raise exceptions.UnsupportedFrame(frame_type, consts.SUPPORTED_FRAMES)
119
+
120
+ frame_id = mujoco.mj_name2id(
121
+ self.model, consts.FRAME_TO_ENUM[frame_type], frame_name
122
+ )
123
+ if frame_id == -1:
124
+ raise exceptions.InvalidFrame(
125
+ frame_name=frame_name,
126
+ frame_type=frame_type,
127
+ model=self.model,
128
+ )
129
+
130
+ jac = np.empty((6, self.model.nv))
131
+ jac_func = consts.FRAME_TO_JAC_FUNC[frame_type]
132
+ jac_func(self.model, self.data, jac[:3], jac[3:], frame_id)
133
+
134
+ # MuJoCo jacobians have a frame of reference centered at the local frame but
135
+ # aligned with the world frame. To obtain a jacobian expressed in the local
136
+ # frame, aka body jacobian, we need to left-multiply by A[T_fw].
137
+ xmat = getattr(self.data, consts.FRAME_TO_XMAT_ATTR[frame_type])[frame_id]
138
+ R_wf = SO3.from_matrix(xmat.reshape(3, 3))
139
+ A_fw = SE3.from_rotation(R_wf.inverse()).adjoint()
140
+ jac = A_fw @ jac
141
+
142
+ return jac
143
+
144
+ def get_transform_frame_to_world(self, frame_name: str, frame_type: str) -> SE3:
145
+ """Get the pose of a frame in the current configuration.
146
+
147
+ Denoting our frame by B and the world frame by W, this function returns T_WB.
148
+
149
+ Args:
150
+ frame_name: Name of the frame in the MJCF.
151
+ frame_type: Type of frame. Can be a geom, a body or a site.
152
+
153
+ Returns:
154
+ The pose of the frame in the world frame.
155
+ """
156
+ if frame_type not in consts.SUPPORTED_FRAMES:
157
+ raise exceptions.UnsupportedFrame(frame_type, consts.SUPPORTED_FRAMES)
158
+
159
+ frame_id = mujoco.mj_name2id(
160
+ self.model, consts.FRAME_TO_ENUM[frame_type], frame_name
161
+ )
162
+ if frame_id == -1:
163
+ raise exceptions.InvalidFrame(
164
+ frame_name=frame_name,
165
+ frame_type=frame_type,
166
+ model=self.model,
167
+ )
168
+
169
+ xpos = getattr(self.data, consts.FRAME_TO_POS_ATTR[frame_type])[frame_id]
170
+ xmat = getattr(self.data, consts.FRAME_TO_XMAT_ATTR[frame_type])[frame_id]
171
+ return SE3.from_rotation_and_translation(
172
+ rotation=SO3.from_matrix(xmat.reshape(3, 3)),
173
+ translation=xpos,
174
+ )
175
+
176
+ def integrate(self, velocity: np.ndarray, dt: float) -> np.ndarray:
177
+ """Integrate a velocity starting from the current configuration.
178
+
179
+ Args:
180
+ velocity: The velocity.
181
+ dt: Integration duration in [s].
182
+
183
+ Returns:
184
+ The new configuration after integration.
185
+ """
186
+ q = self.data.qpos.copy()
187
+ mujoco.mj_integratePos(self.model, q, velocity, dt)
188
+ return q
189
+
190
+ def integrate_inplace(self, velocity: np.ndarray, dt: float) -> None:
191
+ """Integrate a velocity and update the current configuration inplace.
192
+
193
+ Args:
194
+ velocity: The velocity.
195
+ dt: Integration duration in [s].
196
+ """
197
+ mujoco.mj_integratePos(self.model, self.data.qpos, velocity, dt)
198
+ self.update()
199
+
200
+ # Aliases.
201
+
202
+ @property
203
+ def q(self) -> np.ndarray:
204
+ """The current configuration vector."""
205
+ return self.data.qpos.copy()
206
+
207
+ @property
208
+ def nv(self) -> int:
209
+ """The dimension of the tangent space."""
210
+ return self.model.nv
211
+
212
+ @property
213
+ def nq(self) -> int:
214
+ """The dimension of the configuration space."""
215
+ return self.model.nq
mink/constants.py ADDED
@@ -0,0 +1,34 @@
1
+ import mujoco
2
+
3
+ SUPPORTED_FRAMES = ("body", "geom", "site")
4
+
5
+ FRAME_TO_ENUM = {
6
+ "body": mujoco.mjtObj.mjOBJ_BODY,
7
+ "geom": mujoco.mjtObj.mjOBJ_GEOM,
8
+ "site": mujoco.mjtObj.mjOBJ_SITE,
9
+ }
10
+ FRAME_TO_JAC_FUNC = {
11
+ "body": mujoco.mj_jacBody,
12
+ "geom": mujoco.mj_jacGeom,
13
+ "site": mujoco.mj_jacSite,
14
+ }
15
+ FRAME_TO_POS_ATTR = {
16
+ "body": "xpos",
17
+ "geom": "geom_xpos",
18
+ "site": "site_xpos",
19
+ }
20
+ FRAME_TO_XMAT_ATTR = {
21
+ "body": "xmat",
22
+ "geom": "geom_xmat",
23
+ "site": "site_xmat",
24
+ }
25
+
26
+
27
+ def dof_width(joint_type: mujoco.mjtJoint) -> int:
28
+ """Get the dimensionality of the joint in qvel."""
29
+ return {0: 6, 1: 3, 2: 1, 3: 1}[joint_type]
30
+
31
+
32
+ def qpos_width(joint_type: mujoco.mjtJoint) -> int:
33
+ """Get the dimensionality of the joint in qpos."""
34
+ return {0: 7, 1: 4, 2: 1, 3: 1}[joint_type]
mink/exceptions.py ADDED
@@ -0,0 +1,98 @@
1
+ """Exceptions specific to mink."""
2
+
3
+ from typing import Sequence
4
+
5
+ import mujoco
6
+
7
+
8
+ class MinkError(Exception):
9
+ """Base class for Mink exceptions."""
10
+
11
+
12
+ class UnsupportedFrame(MinkError):
13
+ """Exception raised when a frame type is unsupported."""
14
+
15
+ def __init__(self, frame_type: str, supported_types: Sequence[str]):
16
+ message = (
17
+ f"{frame_type} is not supported."
18
+ f"Supported frame types are: {supported_types}"
19
+ )
20
+ super().__init__(message)
21
+
22
+
23
+ class InvalidFrame(MinkError):
24
+ """Exception raised when a frame name is not found in the robot model."""
25
+
26
+ def __init__(
27
+ self,
28
+ frame_name: str,
29
+ frame_type: str,
30
+ model: mujoco.MjModel,
31
+ ):
32
+ if frame_type == "body":
33
+ available_names_of_type_frame_type = [
34
+ model.body(i).name for i in range(model.nbody)
35
+ ]
36
+ elif frame_type == "site":
37
+ available_names_of_type_frame_type = [
38
+ model.site(i).name for i in range(model.nsite)
39
+ ]
40
+ else:
41
+ assert frame_type == "geom"
42
+ available_names_of_type_frame_type = [
43
+ model.geom(i).name for i in range(model.ngeom)
44
+ ]
45
+
46
+ message = (
47
+ f"{frame_type} '{frame_name}' does not exist in the model. "
48
+ f"Available {frame_type} names: {available_names_of_type_frame_type}"
49
+ )
50
+
51
+ super().__init__(message)
52
+
53
+
54
+ class InvalidKeyframe(MinkError):
55
+ """Exception raised when a keyframe name is not found in the robot model."""
56
+
57
+ def __init__(self, keyframe_name: str, model: mujoco.MjModel):
58
+ available_keyframes = [model.key(i).name for i in range(model.nkey)]
59
+ message = (
60
+ f"Keyframe {keyframe_name} does not exist in the model. "
61
+ f"Available keyframe names: {available_keyframes}"
62
+ )
63
+ super().__init__(message)
64
+
65
+
66
+ class InvalidMocapBody(MinkError):
67
+ """Exception raised when a body is not a mocap body."""
68
+
69
+ def __init__(self, mocap_name: str, model: mujoco.MjModel):
70
+ available_mocap_names = [
71
+ model.body(i).name
72
+ for i in range(model.nbody)
73
+ if model.body(i).mocapid[0] != -1
74
+ ]
75
+ message = (
76
+ f"Body '{mocap_name}' is not a mocap body. "
77
+ f"Available mocap bodies: {available_mocap_names}"
78
+ )
79
+ super().__init__(message)
80
+
81
+
82
+ class NotWithinConfigurationLimits(MinkError):
83
+ """Exception raised when a configuration violates its limits."""
84
+
85
+ def __init__(
86
+ self,
87
+ joint_id: int,
88
+ value: float,
89
+ lower: float,
90
+ upper: float,
91
+ model: mujoco.MjModel,
92
+ ):
93
+ joint_name = model.joint(joint_id).name
94
+ message = (
95
+ f"Joint {joint_id} ({joint_name}) violates configuration limits "
96
+ f"{lower} <= {value} <= {upper}"
97
+ )
98
+ super().__init__(message)
mink/lie/__init__.py ADDED
@@ -0,0 +1,13 @@
1
+ from .base import MatrixLieGroup
2
+ from .se3 import SE3
3
+ from .so3 import SO3
4
+ from .utils import get_epsilon, mat2quat, skew
5
+
6
+ __all__ = (
7
+ "SE3",
8
+ "SO3",
9
+ "MatrixLieGroup",
10
+ "get_epsilon",
11
+ "mat2quat",
12
+ "skew",
13
+ )
mink/lie/base.py ADDED
@@ -0,0 +1,156 @@
1
+ import abc
2
+ from typing import Union, overload
3
+
4
+ import numpy as np
5
+ from typing_extensions import Self
6
+
7
+
8
+ class MatrixLieGroup(abc.ABC):
9
+ """Interface definition for matrix Lie groups.
10
+
11
+ Attributes:
12
+ matrix_dim: Dimension of square matrix output.
13
+ parameters_dim:: Dimension of underlying parameters.
14
+ tangent_dim:: Dimension of tangent space.
15
+ space_dim: Dimension of coordinates that can be transformed.
16
+ """
17
+
18
+ matrix_dim: int
19
+ parameters_dim: int
20
+ tangent_dim: int
21
+ space_dim: int
22
+
23
+ @overload
24
+ def __matmul__(self, other: Self) -> Self: ...
25
+
26
+ @overload
27
+ def __matmul__(self, other: np.ndarray) -> np.ndarray: ...
28
+
29
+ def __matmul__(self, other: Union[Self, np.ndarray]) -> Union[Self, np.ndarray]:
30
+ """Overload of the @ operator."""
31
+ if isinstance(other, np.ndarray):
32
+ return self.apply(target=other)
33
+ assert isinstance(other, MatrixLieGroup)
34
+ return self.multiply(other=other)
35
+
36
+ # Factory.
37
+
38
+ @classmethod
39
+ @abc.abstractmethod
40
+ def identity(cls) -> Self:
41
+ """Returns identity element."""
42
+ raise NotImplementedError
43
+
44
+ @classmethod
45
+ @abc.abstractmethod
46
+ def from_matrix(cls, matrix: np.ndarray) -> Self:
47
+ """Get group member from matrix representation."""
48
+ raise NotImplementedError
49
+
50
+ @classmethod
51
+ @abc.abstractmethod
52
+ def sample_uniform(cls) -> Self:
53
+ """Draw a uniform sample from the group."""
54
+ raise NotImplementedError
55
+
56
+ # Accessors.
57
+
58
+ @abc.abstractmethod
59
+ def as_matrix(self) -> np.ndarray:
60
+ """Get transformation as a matrix."""
61
+ raise NotImplementedError
62
+
63
+ @abc.abstractmethod
64
+ def parameters(self) -> np.ndarray:
65
+ """Get underlying representation."""
66
+ raise NotImplementedError
67
+
68
+ # Operations.
69
+
70
+ @abc.abstractmethod
71
+ def apply(self, target: np.ndarray) -> np.ndarray:
72
+ """Applies group action to a point."""
73
+ raise NotImplementedError
74
+
75
+ @abc.abstractmethod
76
+ def multiply(self, other: Self) -> Self:
77
+ """Composes this transformation with another."""
78
+ raise NotImplementedError
79
+
80
+ @classmethod
81
+ @abc.abstractmethod
82
+ def exp(cls, tangent: np.ndarray) -> Self:
83
+ """Computes `expm(wedge(tangent))`."""
84
+ raise NotImplementedError
85
+
86
+ @abc.abstractmethod
87
+ def log(self) -> np.ndarray:
88
+ """Computes `vee(logm(transformation matrix))`."""
89
+ raise NotImplementedError
90
+
91
+ @abc.abstractmethod
92
+ def adjoint(self) -> np.ndarray:
93
+ """Computes the adjoint."""
94
+ raise NotImplementedError
95
+
96
+ @abc.abstractmethod
97
+ def inverse(self) -> Self:
98
+ """Computes the inverse of the transform."""
99
+ raise NotImplementedError
100
+
101
+ @abc.abstractmethod
102
+ def normalize(self) -> Self:
103
+ """Normalize/projects values and returns."""
104
+ raise NotImplementedError
105
+
106
+ # Plus and minus operators.
107
+
108
+ # Eqn. 25.
109
+ def rplus(self, other: np.ndarray) -> Self:
110
+ return self @ self.exp(other)
111
+
112
+ # Eqn. 26.
113
+ def rminus(self, other: Self) -> np.ndarray:
114
+ return (other.inverse() @ self).log()
115
+
116
+ # Eqn. 27.
117
+ def lplus(self, other: np.ndarray) -> Self:
118
+ return self.exp(other) @ self
119
+
120
+ # Eqn. 28.
121
+ def lminus(self, other: Self) -> np.ndarray:
122
+ return (self @ other.inverse()).log()
123
+
124
+ def plus(self, other: np.ndarray) -> Self:
125
+ """Alias for rplus."""
126
+ return self.rplus(other)
127
+
128
+ def minus(self, other: Self) -> np.ndarray:
129
+ """Alias for rminus."""
130
+ return self.rminus(other)
131
+
132
+ # Jacobians.
133
+
134
+ @classmethod
135
+ @abc.abstractmethod
136
+ def ljac(cls, other: np.ndarray) -> np.ndarray:
137
+ raise NotImplementedError
138
+
139
+ @classmethod
140
+ @abc.abstractmethod
141
+ def ljacinv(cls, other: np.ndarray) -> np.ndarray:
142
+ # NOTE: Can just be np.linalg.inv(cls.ljac(other)).
143
+ raise NotImplementedError
144
+
145
+ # Eqn. 67.
146
+ @classmethod
147
+ def rjac(cls, other: np.ndarray) -> np.ndarray:
148
+ return cls.ljac(-other)
149
+
150
+ @classmethod
151
+ def rjacinv(cls, other: np.ndarray) -> np.ndarray:
152
+ return cls.ljacinv(-other)
153
+
154
+ # Eqn. 79.
155
+ def jlog(self) -> np.ndarray:
156
+ return self.rjacinv(self.log())