<div style="text-align: center;">
<img src="https://raw.githubusercontent.com/datasig-ac-uk/RoughPy/main/branding/logo/logo_square_white.jpg" title="RoughPy Logo">
</div><br>
# RoughPy
RoughPy is a package for working with streaming data as rough paths, and working with algebraic objects such as free tensors, shuffle tensors, and elements of the free Lie algebra.
This library is currently in an alpha stage, and as such many features are still incomplete or not fully implemented. Please bear this in mind when looking at the source code.
Please refer to the [documentation](https://roughpy.org) and to
the [examples folder](https://github.com/datasig-ac-uk/roughpy/tree/main/examples/) for details on how to use RoughPy. If you want
to implement more complex functions built on top of RoughPy, you may also want
to check out the [roughpy/tensor_functions.py](https://github.com/datasig-ac-uk/roughpy/tree/main/roughpy/tensor_functions.py) file
to see how the "LOG"
function is implemented for free tensor objects.
## Installation
RoughPy can be installed from PyPI using `pip` on Windows, Linux, and MacOS (Intel based Mac only, sorry not Apple Silicon support yet). Simply run
```
pip install roughpy
```
to get the latest version.
Alternatively, the wheel files can be downloaded from the [Releases](https://github.com/datasig-ac-uk/RoughPy/releases) page.
### Installing from source
RoughPy can be installed from source, although this is not the recommended way to install.
The build system requires [vcpkg](https://github.com/Microsoft/vcpkg) in order to obtain the necessary dependencies (except for MKL on x86 platforms, which is installed via pip).
You will need to make sure that vcpkg is available on your system before attempting to build RoughPy.
The following commands should be sufficient to set up the environment for building RoughPy:
```bash
git clone https://github.com/Microsoft/vcpkg.git tools/vcpkg
tools/vcpkg/bootstrap-vcpkg.sh
export CMAKE_TOOLCHAIN_FILE=$(pwd)/tools/vcpkg/scripts/buildsystems/vcpkg.cmake
```
With this environment variable set, most of the dependencies will be installed automatically during the build process.
You should now be able to pip install either using the PyPI source distribution (using the `--no-binary :roughpy:`
flag), or directly from GitHub (recommended):
```bash
pip install git+https://github.com/datasig-ac-uk/RoughPy.git
```
It will take some time to build.
## Intervals in RoughPy
RoughPy is very careful in how it works with intervals.
One design goal is that it should be able to handle jumps in the underlying signal that occur at particular times, including the beginning or end of the interval, and still guarantee that if you combine the signature over adjacent interval, you always get the signature over the entire interval.
This implies that there has to be a decision about whether data at the exact beginning or exact end of the interval is included.
The convention in RoughPy are that we use clopen intervals, and that data at beginning of the interval is seen, and data at the end of the interval is seen in the next interval.
A second design goal is that the code should be efficient, and so the internal representation of a stream involves caching the signature over dyadic intervals of different resolutions.
Recovering the signature over any interval using the cache has logarithmic complexity (using at most 2n tensor multiplications, when n is the internal resolution of the stream).
Resolution refers to the length of the finest granularity at which we will store information about the underlying data.
Any event occurs within one of these finest granularity intervals, multiple events occur within the same interval resolve to a more complex log-signature which correctly reflects the time sequence of the events within this grain of time.
However, no query of the stream is allowed to see finer resolution than the internal resolution of the stream, it is only allowed to access the information over intervals that are a union of these finest resolution granular intervals.
For this reason, a query over any interval is replaced by a query is replaced by a query over an interval whose endpoints have been shifted to be consistent with the granular resolution, obtained by rounding these points to the contained end-point of the unique clopen granular interval containing this point.
In particular, if both the left-hand and right-hand ends of the interval are contained in the clopen granular interval, we round the interval to the empty interval.
Specifying a resolution of 32 or 64 equates to using integer arithmetic.
## Support
If you have a specific problem, the best way to record this is to open an issue on GitHub. We welcome any feedback or bug reports.
## Contributing
In the future, we will welcome pull requests to implement new features, fix bugs, add documentation or examples, or add tests to the project.
However, at present, we do not have robust CI pipelines set up to rigorously test incoming changes, and therefor will not be accepting pull requests made from outside the current team.
## Contributors
The full list of contributors is listed in `THANKS` alongside this readme. The people mentioned in this document constitute `The RoughPy Developers`.
## License
RoughPy is licensed under a BSD-3-Clause license. This was chosen specifically to match the license of NumPy.
# Changelog
Unreleased
- Added VSCode `.devcontainer` settings for containerised developer environment for debugging tests. See `.devcontainer/README.md` for instructions (@alexallmont #148)
Version 0.1.2
- Documentation is now in sync with the main branch (@philipparubin PR #85)
- Fixed a fault when constructing with larger than expected array (Issue #70, @inakleinbottle PR #72)
- Updated README to remove old information, users should now read roughpy.org (Issue #74, @inakleinbottle PR #71, #78)
- Fixed degree argument on basis size function (Issue #75, @inakleinbottle PR #79)
- Fixed unknown keyword arguments not flagged (Issue #77, @inakleinbottle PR #81)
- Fixed partition intermediates unchecked by Python constructor (Issue #80, @inakleinbottle PR #82)
- Fixed path constructors now accept Lies (Issue #83, @inakleinbottle PR #87)
Version 0.1.1:
- Fixed type promotions in scalar arithmetic - left hand types are now promoted when appropriate.
- Added "tensor_functions" module for implementing additional functions on tensors. Currently only Log is implemented.
- Fixed a few bugs in the build system
Version 0.1.0:
- Added framework for integrating device support and redesigned scalars module to accommodate the changes.
- Made changes to type deduction in constructors to avoid exceptions when providing lists of python ints/floats.
- Changed the implementation of __array__ for algebra types. A copy is always made, and the size of the array is always
equal to the dimension of the chosen width/depth composition.
- Changed the behaviour when no resolution is given. RoughPy now uses a heuristic to compute a suitable resolution for computing signatures if none is given.
Version 0.0.8:
- Disabled linking to BLAS/LAPACK to reduce compile times whilst under development.
- Greatly expanded the serialization support internally.
- Many classes can now be pickled/unpickled for transport across process boundaries.
(Note that this is not yet a safe means of storing and transmitting stream data.)
- Overlay triplets are now forced for all builds. This should improve reproducibility.
- Restructured the algebra module to improve build times.
- Added CMake detection of headers to help builds with non-compliant compilers.
- Fixed an error in the construction of `PyLieKey` in `PyLieKeyIterator`. [#40](https://github.com/datasig-ac-uk/RoughPy/issues/40)
Version 0.0.7:
- Overhaul the (internal) ScalarType API:
. the overloads of convert_copy have been removed in favour of the variant that takes two ScalarPointers;
. the single versions of add(_inplace) and friends have been replaced with more flexible add_into;
batch compute methods and friends;
. replaced single value uminus with uminus into with similar signature to to add_into and friends;
. removed single value copy method;
- Added constructor for ScalarPointer from type_id and pointer.
- Implementations of ScalarType methods that are essentially the same for all types are implemented
in a common implementation layer.
- Added threading support in platform
- add_into and friends have threading support if available and enabled.
- Added default implementation of type_id_of so that non-specialized types
look for a ScalarType object.
- Greatly simplified the design of ScalarMatrix - it now only supports full,
dense matrices.
- Redesigned the interface between the Scalar linear algebra and
MKL/BLAS+LAPACK.
- Added function to query ring characteristics of a ScalarType - currently
unused.
- Added KeyScalarStream for constructing streams from array-like data more easily.
- Implemented the `from_type_details` function for scalar types. This fixes a bug when constructing objects using the dlpack protocol.
- Overhaul constructor for `LieIncrementStream`s from increment data to reduce
number of copies (if possible) and to handle non-contiguous or oddly shaped
data correctly.
- Change implementation of `LieIncrementStream` to allow adding the parameter
channel during construction.
- Change implementation of `TickStream` to allow adding parameter channel
during construction.
Version 0.0.6:
- Externally sourced streams (sound-file streams) now support setting channel
types/schema in factory function.
- Added option for customising file name macro in exception throws.
- Made some improvements to the internal interface of ScalarType to allow more
efficient implementations of vectorised operations.
- Added fast "is_zero" method to Python algebra objects.
Version 0.0.5:
- Added free functions for performing free-tensor, shuffle, half-shuffle
multiplication between pairs of tensors (of either kind).
- Added free function for applying the adjoint of left free tensor
multiplication to arbitrary tensors.
- Improved exception usage, messages now include filename, lineno, and
function name to help locate c++ exceptions passed through to Python.
- Basis objects in Python are now iterable.
- Added `split_n` and `to_index` methods to Tensor key.
Version 0.0.4:
- Overhauled the RPY_CHECK macro so it now gives much better contextual
information.
- Readme updated to reflect PyPI installation with wheels.
- Antipode is now implemented in libalgebra_lite, and exposed to Python for
Free tensors.
- Streams now carry a support interval, outside of which the signature will be
return trivial.
- Build requirements fixed for non x86 platforms.
- Expanded coverage of pytype stub file.
Version 0.0.3:
- Added datetime interval support.
- Integrated schema reparametrisation into stream signature methods.
- Fixed bug in names of scalar types, names now display correctly.
- Fixed bfloat16 given wrong scalar type code.
- Added half precision float and bfloat16 to py module
- Added real partition class and Python interface.
- Implemented simplify method on Streams.
- Added polynomial coefficients
- started an examples folder
Version 0.0.2-alpha:
- Added datetime and timedelta object support to tick data parsing.
- Expanded build system to include more versions of Python.
- Stabilised compilation on all three platforms.
- Fixed numerous bugs in the build system.
Version 0.0.1-alpha:
- First alpha release.
Raw data
{
"_id": null,
"home_page": null,
"name": "RoughPy",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "data, streams, rough-paths, signatures",
"author": null,
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/1f/44/6b0850782166b59b6ebb1fe04659055aa6cbd91d4c25ce73a67ad3fe030a/roughpy-0.2.0.tar.gz",
"platform": null,
"description": "<div style=\"text-align: center;\">\n <img src=\"https://raw.githubusercontent.com/datasig-ac-uk/RoughPy/main/branding/logo/logo_square_white.jpg\" title=\"RoughPy Logo\">\n</div><br>\n\n# RoughPy\nRoughPy is a package for working with streaming data as rough paths, and working with algebraic objects such as free tensors, shuffle tensors, and elements of the free Lie algebra.\n\nThis library is currently in an alpha stage, and as such many features are still incomplete or not fully implemented. Please bear this in mind when looking at the source code.\n\nPlease refer to the [documentation](https://roughpy.org) and to\nthe [examples folder](https://github.com/datasig-ac-uk/roughpy/tree/main/examples/) for details on how to use RoughPy. If you want\nto implement more complex functions built on top of RoughPy, you may also want\nto check out the [roughpy/tensor_functions.py](https://github.com/datasig-ac-uk/roughpy/tree/main/roughpy/tensor_functions.py) file\nto see how the \"LOG\"\nfunction is implemented for free tensor objects.\n\n## Installation\nRoughPy can be installed from PyPI using `pip` on Windows, Linux, and MacOS (Intel based Mac only, sorry not Apple Silicon support yet). Simply run\n```\npip install roughpy\n```\nto get the latest version.\n\nAlternatively, the wheel files can be downloaded from the [Releases](https://github.com/datasig-ac-uk/RoughPy/releases) page.\n\n### Installing from source\nRoughPy can be installed from source, although this is not the recommended way to install.\nThe build system requires [vcpkg](https://github.com/Microsoft/vcpkg) in order to obtain the necessary dependencies (except for MKL on x86 platforms, which is installed via pip).\nYou will need to make sure that vcpkg is available on your system before attempting to build RoughPy.\nThe following commands should be sufficient to set up the environment for building RoughPy:\n```bash\ngit clone https://github.com/Microsoft/vcpkg.git tools/vcpkg\ntools/vcpkg/bootstrap-vcpkg.sh\nexport CMAKE_TOOLCHAIN_FILE=$(pwd)/tools/vcpkg/scripts/buildsystems/vcpkg.cmake\n```\nWith this environment variable set, most of the dependencies will be installed automatically during the build process.\n\nYou should now be able to pip install either using the PyPI source distribution (using the `--no-binary :roughpy:` \nflag), or directly from GitHub (recommended):\n```bash\npip install git+https://github.com/datasig-ac-uk/RoughPy.git\n```\nIt will take some time to build.\n\n## Intervals in RoughPy\nRoughPy is very careful in how it works with intervals.\nOne design goal is that it should be able to handle jumps in the underlying signal that occur at particular times, including the beginning or end of the interval, and still guarantee that if you combine the signature over adjacent interval, you always get the signature over the entire interval.\nThis implies that there has to be a decision about whether data at the exact beginning or exact end of the interval is included.\nThe convention in RoughPy are that we use clopen intervals, and that data at beginning of the interval is seen, and data at the end of the interval is seen in the next interval.\nA second design goal is that the code should be efficient, and so the internal representation of a stream involves caching the signature over dyadic intervals of different resolutions.\nRecovering the signature over any interval using the cache has logarithmic complexity (using at most 2n tensor multiplications, when n is the internal resolution of the stream).\nResolution refers to the length of the finest granularity at which we will store information about the underlying data.\nAny event occurs within one of these finest granularity intervals, multiple events occur within the same interval resolve to a more complex log-signature which correctly reflects the time sequence of the events within this grain of time.\nHowever, no query of the stream is allowed to see finer resolution than the internal resolution of the stream, it is only allowed to access the information over intervals that are a union of these finest resolution granular intervals.\nFor this reason, a query over any interval is replaced by a query is replaced by a query over an interval whose endpoints have been shifted to be consistent with the granular resolution, obtained by rounding these points to the contained end-point of the unique clopen granular interval containing this point.\nIn particular, if both the left-hand and right-hand ends of the interval are contained in the clopen granular interval, we round the interval to the empty interval. \nSpecifying a resolution of 32 or 64 equates to using integer arithmetic.\n\n\n\n\n## Support\nIf you have a specific problem, the best way to record this is to open an issue on GitHub. We welcome any feedback or bug reports.\n\n## Contributing \nIn the future, we will welcome pull requests to implement new features, fix bugs, add documentation or examples, or add tests to the project.\nHowever, at present, we do not have robust CI pipelines set up to rigorously test incoming changes, and therefor will not be accepting pull requests made from outside the current team.\n\n\n## Contributors\nThe full list of contributors is listed in `THANKS` alongside this readme. The people mentioned in this document constitute `The RoughPy Developers`.\n\n## License\nRoughPy is licensed under a BSD-3-Clause license. This was chosen specifically to match the license of NumPy.\n# Changelog\n\nUnreleased\n - Added VSCode `.devcontainer` settings for containerised developer environment for debugging tests. See `.devcontainer/README.md` for instructions (@alexallmont #148)\n\nVersion 0.1.2\n - Documentation is now in sync with the main branch (@philipparubin PR #85)\n - Fixed a fault when constructing with larger than expected array (Issue #70, @inakleinbottle PR #72)\n - Updated README to remove old information, users should now read roughpy.org (Issue #74, @inakleinbottle PR #71, #78)\n - Fixed degree argument on basis size function (Issue #75, @inakleinbottle PR #79)\n - Fixed unknown keyword arguments not flagged (Issue #77, @inakleinbottle PR #81)\n - Fixed partition intermediates unchecked by Python constructor (Issue #80, @inakleinbottle PR #82)\n - Fixed path constructors now accept Lies (Issue #83, @inakleinbottle PR #87)\n\nVersion 0.1.1:\n - Fixed type promotions in scalar arithmetic - left hand types are now promoted when appropriate.\n - Added \"tensor_functions\" module for implementing additional functions on tensors. Currently only Log is implemented.\n - Fixed a few bugs in the build system\n\nVersion 0.1.0:\n - Added framework for integrating device support and redesigned scalars module to accommodate the changes.\n - Made changes to type deduction in constructors to avoid exceptions when providing lists of python ints/floats.\n - Changed the implementation of __array__ for algebra types. A copy is always made, and the size of the array is always\n equal to the dimension of the chosen width/depth composition.\n - Changed the behaviour when no resolution is given. RoughPy now uses a heuristic to compute a suitable resolution for computing signatures if none is given.\n\n\nVersion 0.0.8:\n - Disabled linking to BLAS/LAPACK to reduce compile times whilst under development.\n - Greatly expanded the serialization support internally.\n - Many classes can now be pickled/unpickled for transport across process boundaries.\n (Note that this is not yet a safe means of storing and transmitting stream data.)\n - Overlay triplets are now forced for all builds. This should improve reproducibility.\n - Restructured the algebra module to improve build times.\n - Added CMake detection of headers to help builds with non-compliant compilers.\n - Fixed an error in the construction of `PyLieKey` in `PyLieKeyIterator`. [#40](https://github.com/datasig-ac-uk/RoughPy/issues/40)\n\n\nVersion 0.0.7:\n - Overhaul the (internal) ScalarType API:\n . the overloads of convert_copy have been removed in favour of the variant that takes two ScalarPointers;\n . the single versions of add(_inplace) and friends have been replaced with more flexible add_into;\n batch compute methods and friends;\n . replaced single value uminus with uminus into with similar signature to to add_into and friends;\n . removed single value copy method;\n - Added constructor for ScalarPointer from type_id and pointer.\n - Implementations of ScalarType methods that are essentially the same for all types are implemented\n in a common implementation layer.\n - Added threading support in platform\n - add_into and friends have threading support if available and enabled.\n - Added default implementation of type_id_of so that non-specialized types\n look for a ScalarType object.\n - Greatly simplified the design of ScalarMatrix - it now only supports full,\n dense matrices.\n - Redesigned the interface between the Scalar linear algebra and\n MKL/BLAS+LAPACK.\n - Added function to query ring characteristics of a ScalarType - currently\n unused.\n - Added KeyScalarStream for constructing streams from array-like data more easily.\n - Implemented the `from_type_details` function for scalar types. This fixes a bug when constructing objects using the dlpack protocol.\n - Overhaul constructor for `LieIncrementStream`s from increment data to reduce\n number of copies (if possible) and to handle non-contiguous or oddly shaped\n data correctly.\n - Change implementation of `LieIncrementStream` to allow adding the parameter\n channel during construction.\n - Change implementation of `TickStream` to allow adding parameter channel\n during construction.\n\n\n\n\nVersion 0.0.6:\n - Externally sourced streams (sound-file streams) now support setting channel\n types/schema in factory function.\n - Added option for customising file name macro in exception throws.\n - Made some improvements to the internal interface of ScalarType to allow more\n efficient implementations of vectorised operations.\n - Added fast \"is_zero\" method to Python algebra objects.\n\nVersion 0.0.5:\n - Added free functions for performing free-tensor, shuffle, half-shuffle\n multiplication between pairs of tensors (of either kind).\n - Added free function for applying the adjoint of left free tensor\n multiplication to arbitrary tensors.\n - Improved exception usage, messages now include filename, lineno, and\n function name to help locate c++ exceptions passed through to Python.\n - Basis objects in Python are now iterable.\n - Added `split_n` and `to_index` methods to Tensor key.\n\nVersion 0.0.4:\n - Overhauled the RPY_CHECK macro so it now gives much better contextual\n information.\n - Readme updated to reflect PyPI installation with wheels.\n - Antipode is now implemented in libalgebra_lite, and exposed to Python for\n Free tensors.\n - Streams now carry a support interval, outside of which the signature will be\n return trivial.\n - Build requirements fixed for non x86 platforms.\n - Expanded coverage of pytype stub file.\n\nVersion 0.0.3:\n - Added datetime interval support.\n - Integrated schema reparametrisation into stream signature methods.\n - Fixed bug in names of scalar types, names now display correctly.\n - Fixed bfloat16 given wrong scalar type code.\n - Added half precision float and bfloat16 to py module\n - Added real partition class and Python interface.\n - Implemented simplify method on Streams.\n - Added polynomial coefficients\n - started an examples folder\n\nVersion 0.0.2-alpha:\n - Added datetime and timedelta object support to tick data parsing.\n - Expanded build system to include more versions of Python.\n - Stabilised compilation on all three platforms.\n - Fixed numerous bugs in the build system.\n\nVersion 0.0.1-alpha:\n - First alpha release.\n",
"bugtrack_url": null,
"license": "BSD-3-Clause",
"summary": null,
"version": "0.2.0",
"project_urls": null,
"split_keywords": [
"data",
" streams",
" rough-paths",
" signatures"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "4b74e4224e81053f0205d47f2ceebc7e43e02db4c85d56b1dda3208fafc9a7af",
"md5": "bb28dfd996b79fe6a0fdd0ca1fd4fe29",
"sha256": "631852825d24dde86035184ab01d796b1c830849cb6bc3197d51338eeb778cb4"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "bb28dfd996b79fe6a0fdd0ca1fd4fe29",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 3362136,
"upload_time": "2024-12-19T16:03:15",
"upload_time_iso_8601": "2024-12-19T16:03:15.749372Z",
"url": "https://files.pythonhosted.org/packages/4b/74/e4224e81053f0205d47f2ceebc7e43e02db4c85d56b1dda3208fafc9a7af/roughpy-0.2.0-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4b310f621e40a8422f978a6a727489f6b2e426eb5616298784ce0f9912f9740d",
"md5": "41c91d4d4a83e5d0450fe832399ddc7a",
"sha256": "8c12e38bdd089e7fb0ce3da61709f051d51848db7b3f0fa204e39a4b2fdbe2cb"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp310-cp310-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "41c91d4d4a83e5d0450fe832399ddc7a",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 3817276,
"upload_time": "2024-12-19T16:03:18",
"upload_time_iso_8601": "2024-12-19T16:03:18.785144Z",
"url": "https://files.pythonhosted.org/packages/4b/31/0f621e40a8422f978a6a727489f6b2e426eb5616298784ce0f9912f9740d/roughpy-0.2.0-cp310-cp310-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b97cc1b6211835e6854e54d76c2974b3aa4650dc3c64a4adc37c2648a07e268f",
"md5": "972e9da4da1d9642e130d0ea6dbffb28",
"sha256": "e963c635e1a3d4d43ebb158f2efd3db9215543ab9bd83d4080f4b4c39c23268c"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "972e9da4da1d9642e130d0ea6dbffb28",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 4929722,
"upload_time": "2024-12-19T16:03:21",
"upload_time_iso_8601": "2024-12-19T16:03:21.870484Z",
"url": "https://files.pythonhosted.org/packages/b9/7c/c1b6211835e6854e54d76c2974b3aa4650dc3c64a4adc37c2648a07e268f/roughpy-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c84aa823cbc3f33732f59747525610fc98448aeb999d6f40aac174fa2fdb142f",
"md5": "c22d4cdc405f0ea3c5686aad2d145949",
"sha256": "13a89b347107ae34cfce708f6e115ee415d598b06e8b9e10aeeb87d45a120a12"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "c22d4cdc405f0ea3c5686aad2d145949",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 3312104,
"upload_time": "2024-12-19T16:03:23",
"upload_time_iso_8601": "2024-12-19T16:03:23.778380Z",
"url": "https://files.pythonhosted.org/packages/c8/4a/a823cbc3f33732f59747525610fc98448aeb999d6f40aac174fa2fdb142f/roughpy-0.2.0-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "73469da216802a2003313515f9f1bc42e266ad56d6752c89265f170af7f6c29c",
"md5": "ca4aa5a933e514960944db08e2256f80",
"sha256": "9bdd622c413513ed4cfa86233e98ad9a295bb258cd06381b429bce00b408e890"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "ca4aa5a933e514960944db08e2256f80",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 3363955,
"upload_time": "2024-12-19T16:03:26",
"upload_time_iso_8601": "2024-12-19T16:03:26.894480Z",
"url": "https://files.pythonhosted.org/packages/73/46/9da216802a2003313515f9f1bc42e266ad56d6752c89265f170af7f6c29c/roughpy-0.2.0-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e0b53572fb75639ac27692c15e1f965b6ceaaae214619988de2eb0c5a4c673f4",
"md5": "cd1770dc30afc15fb056e82be13af34d",
"sha256": "739c8c8eff0b162483ec3cadce77190c573882e1abf88c3f791e38902c82b1ef"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp311-cp311-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "cd1770dc30afc15fb056e82be13af34d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 3821791,
"upload_time": "2024-12-19T16:03:30",
"upload_time_iso_8601": "2024-12-19T16:03:30.456747Z",
"url": "https://files.pythonhosted.org/packages/e0/b5/3572fb75639ac27692c15e1f965b6ceaaae214619988de2eb0c5a4c673f4/roughpy-0.2.0-cp311-cp311-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "321e111485c739fc0296713c9588ddf6b9c6f6942852b4f4657926463f1aaa0c",
"md5": "23145ca8bdc9c2a1a5ef52e2a5034761",
"sha256": "84b2b723b069dc9b0eb15dd71c71024accee0df8997bd30a129320bbafe95848"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "23145ca8bdc9c2a1a5ef52e2a5034761",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 4938828,
"upload_time": "2024-12-19T16:03:33",
"upload_time_iso_8601": "2024-12-19T16:03:33.370788Z",
"url": "https://files.pythonhosted.org/packages/32/1e/111485c739fc0296713c9588ddf6b9c6f6942852b4f4657926463f1aaa0c/roughpy-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e885426c55c47b91acea5bc2b107bc3e28ffe95d162bde781cc11f876074b9f0",
"md5": "616ef7c72b7db4e63c736d16e18e7bc7",
"sha256": "5f5ce9d6670d9c7dc6ad64db352927549ea3b35ad9ce18d6239b1b6b82a5d06c"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "616ef7c72b7db4e63c736d16e18e7bc7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 3313114,
"upload_time": "2024-12-19T16:03:36",
"upload_time_iso_8601": "2024-12-19T16:03:36.338421Z",
"url": "https://files.pythonhosted.org/packages/e8/85/426c55c47b91acea5bc2b107bc3e28ffe95d162bde781cc11f876074b9f0/roughpy-0.2.0-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4b74cea9abfcbbef5f5cb92837f0bc0dd73e425c5155a0d01ad259177c1f37fb",
"md5": "0a385345fe3bcd00592d66bd74060aa6",
"sha256": "6bee92241e25ad22eec2b941f6d897a7816d13a0498d78ca9f383bac3d691469"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "0a385345fe3bcd00592d66bd74060aa6",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 3367886,
"upload_time": "2024-12-19T16:03:38",
"upload_time_iso_8601": "2024-12-19T16:03:38.018053Z",
"url": "https://files.pythonhosted.org/packages/4b/74/cea9abfcbbef5f5cb92837f0bc0dd73e425c5155a0d01ad259177c1f37fb/roughpy-0.2.0-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c47c0b951ce466ed065ef3c9d32f48a992889436fd655b44857446bb3bdc4251",
"md5": "c8b49b35d44d05a0c65af2813a6c6988",
"sha256": "2c93baad7fbc7a222e2a4ef31f891a858af8fba7f6c1dd636eefb4d9dc8b6943"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp312-cp312-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "c8b49b35d44d05a0c65af2813a6c6988",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 3829825,
"upload_time": "2024-12-19T16:03:39",
"upload_time_iso_8601": "2024-12-19T16:03:39.685740Z",
"url": "https://files.pythonhosted.org/packages/c4/7c/0b951ce466ed065ef3c9d32f48a992889436fd655b44857446bb3bdc4251/roughpy-0.2.0-cp312-cp312-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1f220ad380f851b0d1e05b50301b76390abd5b2d8acef57967472f285077e2d3",
"md5": "c85ae3d79e1c2b271967bccce36e67a5",
"sha256": "7660af24f8216b451a79f91034fac7970c94bcbbfab11fe8e90acdafca4162b0"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c85ae3d79e1c2b271967bccce36e67a5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 4925723,
"upload_time": "2024-12-19T16:03:41",
"upload_time_iso_8601": "2024-12-19T16:03:41.586320Z",
"url": "https://files.pythonhosted.org/packages/1f/22/0ad380f851b0d1e05b50301b76390abd5b2d8acef57967472f285077e2d3/roughpy-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8fdcddee07c72be4dc62b562e13cf84365eecd136608d73f8d0fd24cc4ba24e2",
"md5": "57089ead02d45eaf85b6c07e0bc5ea3b",
"sha256": "88e8a2f458f3315db05fb23222e6cc2076ffb105bb02deb468a898632f740093"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "57089ead02d45eaf85b6c07e0bc5ea3b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 3316001,
"upload_time": "2024-12-19T16:03:44",
"upload_time_iso_8601": "2024-12-19T16:03:44.575240Z",
"url": "https://files.pythonhosted.org/packages/8f/dc/ddee07c72be4dc62b562e13cf84365eecd136608d73f8d0fd24cc4ba24e2/roughpy-0.2.0-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d42ccfd9a786e69b27fbeb036ac6550c65c7caa94ba1422a5ee0f8905e79d0f7",
"md5": "207336799921be02b0065146772277f0",
"sha256": "5133d7f647dbd8c502cbeb6be45ad42473c384d01b8b0dc2d17a2ad0a5efb2d4"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "207336799921be02b0065146772277f0",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 3367997,
"upload_time": "2024-12-19T16:03:46",
"upload_time_iso_8601": "2024-12-19T16:03:46.984249Z",
"url": "https://files.pythonhosted.org/packages/d4/2c/cfd9a786e69b27fbeb036ac6550c65c7caa94ba1422a5ee0f8905e79d0f7/roughpy-0.2.0-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "38b9cfe247c1c78850020f5a4e6f4336d23945336d5de98cfd759e05f1e4de44",
"md5": "a0980fa1e39ed930c4b3062b4b3467c2",
"sha256": "1baa61020d270a53560c8bb1c1d362b158a0caecb2f2e4a6e4282dde53db46cb"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp313-cp313-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "a0980fa1e39ed930c4b3062b4b3467c2",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 3829867,
"upload_time": "2024-12-19T16:03:48",
"upload_time_iso_8601": "2024-12-19T16:03:48.840274Z",
"url": "https://files.pythonhosted.org/packages/38/b9/cfe247c1c78850020f5a4e6f4336d23945336d5de98cfd759e05f1e4de44/roughpy-0.2.0-cp313-cp313-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "291f8096d2a1c7f23e3eec860ad192dd9fc887f65fa1bb023ea582f40f39118a",
"md5": "aa6b1b6d544ef34c902d2a09c4f6f955",
"sha256": "3b60c2a2073a1ecd59cd4d35342f84540ba314c5290ff15210a9e0da2691ca43"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "aa6b1b6d544ef34c902d2a09c4f6f955",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 4926363,
"upload_time": "2024-12-19T16:03:51",
"upload_time_iso_8601": "2024-12-19T16:03:51.979896Z",
"url": "https://files.pythonhosted.org/packages/29/1f/8096d2a1c7f23e3eec860ad192dd9fc887f65fa1bb023ea582f40f39118a/roughpy-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bc889e96cf6252b37d9d82cbe12469e4fbd63c0f2c0ed23a9ef96cfab74b57d2",
"md5": "d3621fb1480b0d985d4aab65f993b3a2",
"sha256": "67e2612b6a88ab92a2e29eedf3ca9acaa683233597a8c93ad5ff5398b9ca7e57"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "d3621fb1480b0d985d4aab65f993b3a2",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 3315928,
"upload_time": "2024-12-19T16:03:53",
"upload_time_iso_8601": "2024-12-19T16:03:53.655624Z",
"url": "https://files.pythonhosted.org/packages/bc/88/9e96cf6252b37d9d82cbe12469e4fbd63c0f2c0ed23a9ef96cfab74b57d2/roughpy-0.2.0-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "502befbf54a4981636f5b956ea1a79aa67d57e292e9105db6fc8a868d2caf882",
"md5": "f38ad778aeac958f0f919f49cc20d2c3",
"sha256": "1d0c3e912028b41cfde0c19edc484324f7fdc96bff343e8115ae0f45d42a96c4"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f38ad778aeac958f0f919f49cc20d2c3",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 3362128,
"upload_time": "2024-12-19T16:03:55",
"upload_time_iso_8601": "2024-12-19T16:03:55.791923Z",
"url": "https://files.pythonhosted.org/packages/50/2b/efbf54a4981636f5b956ea1a79aa67d57e292e9105db6fc8a868d2caf882/roughpy-0.2.0-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fab7ba05456439c9a833bc4c36559766fc37a4d95a6e828f5c053ca2b6656d45",
"md5": "fb644d7937883c6b392e605f6469c1f7",
"sha256": "bb3e008d0d360dd0d291ad204a121fcdb6d73da84fe1d059020aa28776861ca8"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp39-cp39-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "fb644d7937883c6b392e605f6469c1f7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 3817129,
"upload_time": "2024-12-19T16:03:58",
"upload_time_iso_8601": "2024-12-19T16:03:58.972649Z",
"url": "https://files.pythonhosted.org/packages/fa/b7/ba05456439c9a833bc4c36559766fc37a4d95a6e828f5c053ca2b6656d45/roughpy-0.2.0-cp39-cp39-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "11e1535e7d97b84f3f28794b08e565d57a290fee1960205be98358a441a4b0f7",
"md5": "be9881f7c124b317c6c7113d31643701",
"sha256": "edaaff9bfa23a352698b90daac7c881423a68ae071aab5fd0b9539cb28a5a29e"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "be9881f7c124b317c6c7113d31643701",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 4931263,
"upload_time": "2024-12-19T16:04:00",
"upload_time_iso_8601": "2024-12-19T16:04:00.899387Z",
"url": "https://files.pythonhosted.org/packages/11/e1/535e7d97b84f3f28794b08e565d57a290fee1960205be98358a441a4b0f7/roughpy-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c02f88324b9f95400abfb0dda818f482728bdaea4845b126cfb8f9b33ad0c13d",
"md5": "1a15296fc1fbeca0a663d25d969fefea",
"sha256": "201aa9538e02054f1d6bfa2dbb69734a777b56640c848d298e65f16449eb9b48"
},
"downloads": -1,
"filename": "roughpy-0.2.0-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "1a15296fc1fbeca0a663d25d969fefea",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 3289709,
"upload_time": "2024-12-19T16:04:02",
"upload_time_iso_8601": "2024-12-19T16:04:02.790048Z",
"url": "https://files.pythonhosted.org/packages/c0/2f/88324b9f95400abfb0dda818f482728bdaea4845b126cfb8f9b33ad0c13d/roughpy-0.2.0-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1f446b0850782166b59b6ebb1fe04659055aa6cbd91d4c25ce73a67ad3fe030a",
"md5": "8ca8076756938b1d9f94417c44fe7996",
"sha256": "00603938ea24d0f3eae5f5e8de2ae8400f93b8354995190b953b23dc4d135176"
},
"downloads": -1,
"filename": "roughpy-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "8ca8076756938b1d9f94417c44fe7996",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 1131904,
"upload_time": "2024-12-19T16:04:05",
"upload_time_iso_8601": "2024-12-19T16:04:05.570961Z",
"url": "https://files.pythonhosted.org/packages/1f/44/6b0850782166b59b6ebb1fe04659055aa6cbd91d4c25ce73a67ad3fe030a/roughpy-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-19 16:04:05",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "roughpy"
}