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.
- mink/.mypy_cache/.gitignore +2 -0
- mink/.mypy_cache/3.12/@plugins_snapshot.json +1 -0
- mink/.mypy_cache/3.12/__future__.data.json +1 -0
- mink/.mypy_cache/3.12/__future__.meta.json +1 -0
- mink/.mypy_cache/3.12/_ast.data.json +1 -0
- mink/.mypy_cache/3.12/_ast.meta.json +1 -0
- mink/.mypy_cache/3.12/_codecs.data.json +1 -0
- mink/.mypy_cache/3.12/_codecs.meta.json +1 -0
- mink/.mypy_cache/3.12/_collections_abc.data.json +1 -0
- mink/.mypy_cache/3.12/_collections_abc.meta.json +1 -0
- mink/.mypy_cache/3.12/_ctypes.data.json +1 -0
- mink/.mypy_cache/3.12/_ctypes.meta.json +1 -0
- mink/.mypy_cache/3.12/_thread.data.json +1 -0
- mink/.mypy_cache/3.12/_thread.meta.json +1 -0
- mink/.mypy_cache/3.12/_typeshed/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/_typeshed/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/_warnings.data.json +1 -0
- mink/.mypy_cache/3.12/_warnings.meta.json +1 -0
- mink/.mypy_cache/3.12/abc.data.json +1 -0
- mink/.mypy_cache/3.12/abc.meta.json +1 -0
- mink/.mypy_cache/3.12/array.data.json +1 -0
- mink/.mypy_cache/3.12/array.meta.json +1 -0
- mink/.mypy_cache/3.12/ast.data.json +1 -0
- mink/.mypy_cache/3.12/ast.meta.json +1 -0
- mink/.mypy_cache/3.12/builtins.data.json +1 -0
- mink/.mypy_cache/3.12/builtins.meta.json +1 -0
- mink/.mypy_cache/3.12/codecs.data.json +1 -0
- mink/.mypy_cache/3.12/codecs.meta.json +1 -0
- mink/.mypy_cache/3.12/collections/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/collections/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/collections/abc.data.json +1 -0
- mink/.mypy_cache/3.12/collections/abc.meta.json +1 -0
- mink/.mypy_cache/3.12/contextlib.data.json +1 -0
- mink/.mypy_cache/3.12/contextlib.meta.json +1 -0
- mink/.mypy_cache/3.12/ctypes/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/ctypes/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/dataclasses.data.json +1 -0
- mink/.mypy_cache/3.12/dataclasses.meta.json +1 -0
- mink/.mypy_cache/3.12/datetime.data.json +1 -0
- mink/.mypy_cache/3.12/datetime.meta.json +1 -0
- mink/.mypy_cache/3.12/email/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/email/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/email/charset.data.json +1 -0
- mink/.mypy_cache/3.12/email/charset.meta.json +1 -0
- mink/.mypy_cache/3.12/email/contentmanager.data.json +1 -0
- mink/.mypy_cache/3.12/email/contentmanager.meta.json +1 -0
- mink/.mypy_cache/3.12/email/errors.data.json +1 -0
- mink/.mypy_cache/3.12/email/errors.meta.json +1 -0
- mink/.mypy_cache/3.12/email/header.data.json +1 -0
- mink/.mypy_cache/3.12/email/header.meta.json +1 -0
- mink/.mypy_cache/3.12/email/message.data.json +1 -0
- mink/.mypy_cache/3.12/email/message.meta.json +1 -0
- mink/.mypy_cache/3.12/email/policy.data.json +1 -0
- mink/.mypy_cache/3.12/email/policy.meta.json +1 -0
- mink/.mypy_cache/3.12/enum.data.json +1 -0
- mink/.mypy_cache/3.12/enum.meta.json +1 -0
- mink/.mypy_cache/3.12/genericpath.data.json +1 -0
- mink/.mypy_cache/3.12/genericpath.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/abc.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/abc.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/machinery.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/machinery.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/metadata/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/metadata/_meta.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/readers.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/readers.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/resources/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/resources/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/importlib/resources/abc.data.json +1 -0
- mink/.mypy_cache/3.12/importlib/resources/abc.meta.json +1 -0
- mink/.mypy_cache/3.12/io.data.json +1 -0
- mink/.mypy_cache/3.12/io.meta.json +1 -0
- mink/.mypy_cache/3.12/logging/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/logging/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/math.data.json +1 -0
- mink/.mypy_cache/3.12/math.meta.json +1 -0
- mink/.mypy_cache/3.12/mink/limits/limit.data.json +1 -0
- mink/.mypy_cache/3.12/mink/limits/limit.meta.json +1 -0
- mink/.mypy_cache/3.12/mmap.data.json +1 -0
- mink/.mypy_cache/3.12/mmap.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_pytesttester.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_pytesttester.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_array_like.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_callable.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_callable.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_nbit.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_scalars.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_shape.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_shape.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_utils/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_utils/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/_utils/_convertions.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_asarray.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_asarray.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_internal.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_internal.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_type_aliases.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/arrayprint.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/arrayprint.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/defchararray.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/defchararray.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/einsumfunc.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/fromnumeric.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/function_base.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/function_base.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/multiarray.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/multiarray.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/numeric.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/numeric.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/numerictypes.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/numerictypes.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/records.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/records.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/shape_base.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/shape_base.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/umath.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/core/umath.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/ctypeslib.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/ctypeslib.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/dtypes.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/dtypes.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/exceptions.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/exceptions.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/fft/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/fft/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/fft/helper.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/fft/helper.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/_version.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/_version.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/arraypad.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/arraypad.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/arraysetops.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/arrayterator.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/format.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/format.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/function_base.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/function_base.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/histograms.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/histograms.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/index_tricks.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/mixins.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/mixins.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/npyio.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/npyio.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/polynomial.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/polynomial.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/scimath.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/scimath.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/shape_base.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/shape_base.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/twodim_base.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/type_check.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/type_check.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/ufunclike.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/utils.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/lib/utils.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/linalg/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/linalg/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/linalg/linalg.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/linalg/linalg.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/core.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/core.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/extras.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/extras.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/mrecords.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/ma/mrecords.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/hermite.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/legendre.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_generator.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_generator.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_mt19937.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_mt19937.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_pcg64.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_pcg64.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_philox.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_philox.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_sfc64.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/_sfc64.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/bit_generator.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/bit_generator.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/mtrand.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/random/mtrand.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/testing/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/testing/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/testing/_private/utils.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/typing/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/typing/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/numpy/version.data.json +1 -0
- mink/.mypy_cache/3.12/numpy/version.meta.json +1 -0
- mink/.mypy_cache/3.12/os/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/os/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/os/path.data.json +1 -0
- mink/.mypy_cache/3.12/os/path.meta.json +1 -0
- mink/.mypy_cache/3.12/pathlib.data.json +1 -0
- mink/.mypy_cache/3.12/pathlib.meta.json +1 -0
- mink/.mypy_cache/3.12/posixpath.data.json +1 -0
- mink/.mypy_cache/3.12/posixpath.meta.json +1 -0
- mink/.mypy_cache/3.12/re.data.json +1 -0
- mink/.mypy_cache/3.12/re.meta.json +1 -0
- mink/.mypy_cache/3.12/sre_compile.data.json +1 -0
- mink/.mypy_cache/3.12/sre_compile.meta.json +1 -0
- mink/.mypy_cache/3.12/sre_constants.data.json +1 -0
- mink/.mypy_cache/3.12/sre_constants.meta.json +1 -0
- mink/.mypy_cache/3.12/sre_parse.data.json +1 -0
- mink/.mypy_cache/3.12/sre_parse.meta.json +1 -0
- mink/.mypy_cache/3.12/string.data.json +1 -0
- mink/.mypy_cache/3.12/string.meta.json +1 -0
- mink/.mypy_cache/3.12/subprocess.data.json +1 -0
- mink/.mypy_cache/3.12/subprocess.meta.json +1 -0
- mink/.mypy_cache/3.12/sys/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/sys/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/sys/_monitoring.data.json +1 -0
- mink/.mypy_cache/3.12/sys/_monitoring.meta.json +1 -0
- mink/.mypy_cache/3.12/textwrap.data.json +1 -0
- mink/.mypy_cache/3.12/textwrap.meta.json +1 -0
- mink/.mypy_cache/3.12/threading.data.json +1 -0
- mink/.mypy_cache/3.12/threading.meta.json +1 -0
- mink/.mypy_cache/3.12/time.data.json +1 -0
- mink/.mypy_cache/3.12/time.meta.json +1 -0
- mink/.mypy_cache/3.12/types.data.json +1 -0
- mink/.mypy_cache/3.12/types.meta.json +1 -0
- mink/.mypy_cache/3.12/typing.data.json +1 -0
- mink/.mypy_cache/3.12/typing.meta.json +1 -0
- mink/.mypy_cache/3.12/typing_extensions.data.json +1 -0
- mink/.mypy_cache/3.12/typing_extensions.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/__init__.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/__init__.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/_log.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/_log.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/async_case.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/async_case.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/case.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/case.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/loader.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/loader.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/main.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/main.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/result.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/result.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/runner.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/runner.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/signals.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/signals.meta.json +1 -0
- mink/.mypy_cache/3.12/unittest/suite.data.json +1 -0
- mink/.mypy_cache/3.12/unittest/suite.meta.json +1 -0
- mink/.mypy_cache/3.12/warnings.data.json +1 -0
- mink/.mypy_cache/3.12/warnings.meta.json +1 -0
- mink/.mypy_cache/3.12/zipfile.data.json +1 -0
- mink/.mypy_cache/3.12/zipfile.meta.json +1 -0
- mink/.mypy_cache/CACHEDIR.TAG +3 -0
- mink/__init__.py +75 -0
- mink/configuration.py +215 -0
- mink/constants.py +34 -0
- mink/exceptions.py +98 -0
- mink/lie/__init__.py +13 -0
- mink/lie/base.py +156 -0
- mink/lie/se3.py +249 -0
- mink/lie/so3.py +224 -0
- mink/lie/tests/__init__.py +0 -0
- mink/lie/tests/test_axioms.py +51 -0
- mink/lie/tests/test_operations.py +77 -0
- mink/lie/tests/utils.py +20 -0
- mink/lie/utils.py +29 -0
- mink/limits/__init__.py +16 -0
- mink/limits/collision_avoidance_limit.py +274 -0
- mink/limits/configuration_limit.py +126 -0
- mink/limits/exceptions.py +7 -0
- mink/limits/limit.py +41 -0
- mink/limits/velocity_limit.py +92 -0
- mink/py.typed +0 -0
- mink/solve_ik.py +105 -0
- mink/tasks/__init__.py +26 -0
- mink/tasks/com_task.py +82 -0
- mink/tasks/exceptions.py +27 -0
- mink/tasks/frame_task.py +114 -0
- mink/tasks/posture_task.py +103 -0
- mink/tasks/task.py +105 -0
- mink/utils.py +128 -0
- mink-0.0.1.dist-info/METADATA +71 -0
- mink-0.0.1.dist-info/RECORD +352 -0
- 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
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())
|