cy-root ![Build wheels](https://github.com/inspiros/cy-root/actions/workflows/build_wheels.yml/badge.svg) ![PyPI](https://img.shields.io/pypi/v/cy-root) ![GitHub](https://img.shields.io/github/license/inspiros/cy-root)
========
<p align="center">
<img src="https://www.austintexas.gov/sites/default/files/images/dsd/Community_Trees/tree-root-distruibution-1.jpg" width="300"/>
<br/>
<i><font size="1">(Not this root)</font></i>
<br/>
</p>
A simple root-finding package written in Cython.
Many of the implemented methods can't be found in common Python libraries.
## News:
- Vector root-finding methods can now _(try to)_ solve systems of equations with number of inputs different from number
of outputs.
## Requirements
- Python 3.6+
- dynamic-default-args
- numpy
- scipy
- sympy
#### For compilation:
- Cython (if you want to build from `.pyx` files)
- A C/C++ compiler
## Installation
[cy-root](https://pypi.org/project/cy-root/) is now available on PyPI.
```bash
pip install cy-root
```
Alternatively, you can build from source.
Make sure you have all the dependencies installed, then clone this repo and run:
```bash
git clone git://github.com/inspiros/cy-root.git
cd cy-root
pip install .
```
## Supported algorithms
**Note:**
For more information about the listed algorithms, please check the functions' docstrings or use Google until I update
the references.
### Scalar root:
- **Bracketing methods:** (methods that require lower and upper bounds)
- [x] Bisect
- [x] Hybisect _(bisection with interval analysis)_
- [x] Regula Falsi
- [x] Illinois
- [x] Pegasus
- [x] Anderson–Björck
- [x] Dekker
- [x] Brent _(with Inverse Quadratic Interpolation and Hyperbolic Interpolation)_
- [x] Chandrupatla
- [x] Ridders
- [x] TOMS748
- [x] Wu
- [x] ITP
- **Newton-like methods:** (methods that require derivative and/or higher order derivatives)
- [x] Newton
- [x] Chebyshev
- [x] Halley
- [x] Super-Halley
- [x] Tangent Hyperbolas _(similar to Halley)_
- [x] Householder
- **Quasi-Newton methods:** (methods that approximate derivative, use interpolation, or successive iteration)
- [x] Secant
- [x] Sidi
- [x] Steffensen
- [x] Inverse Quadratic Interpolation
- [x] Hyperbolic Interpolation
- [x] Muller _(for complex root)_
### Vector root:
- **Bracketing methods:** (methods that require n-dimensional bracket)
- [x] Vrahatis _(generalized bisection using n-polygon)_
- **Newton-like methods:** (methods that require Jacobian and/or Hessian)
- [x] Generalized Newton
- [x] Generalized Chebyshev
- [x] Generalized Halley
- [x] Generalized Super-Halley
- [x] Generalized Tangent Hyperbolas _(similar to Generalized Halley)_
- **Quasi-Newton methods:** (methods that approximate Jacobian, use interpolation, or successive iteration)
- [x] Wolfe-Bittner
- [x] Robinson
- [x] Barnes
- [x] Traub-Steffensen
- [x] Broyden _(Good and Bad)_
- [x] Klement
#### Derivative Approximation:
Methods that can be combined with any Newton-like root-finding methods to discard the need of analytical derivatives.
- [x] Finite Difference _(for both scalar and vector functions, up to arbitrary order)_
## Usage
### Examples:
#### Example 1:
Use `find_scalar_root` or `find_vector_root` and pass method name as the first argument.
This example shows the use of `find_scalar_root` function with `itp` method.
```python
from cyroot import find_scalar_root
f = lambda x: x ** 2 - 612
result = find_scalar_root(method='itp', f=f, a=-10, b=50)
print(result)
```
Output:
```
RootResults(root=24.73863375370596, f_root=-1.1368683772161603e-13, iters=8, f_calls=10, bracket=(24.73863369031373, 24.738633753846678), f_bracket=(-3.1364744472739403e-06, 6.962181942071766e-09), precision=6.353294779160024e-08, error=1.1368683772161603e-13, converged=True, optimal=True)
```
The names and pointers to all implemented methods are stored in two dictionaries `SCALAR_ROOT_FINDING_METHODS` and
`VECTOR_ROOT_FINDING_METHODS`.
```python
from cyroot import SCALAR_ROOT_FINDING_METHODS, VECTOR_ROOT_FINDING_METHODS
print('scalar root methods:', SCALAR_ROOT_FINDING_METHODS.keys())
print('vector root methods:', VECTOR_ROOT_FINDING_METHODS.keys())
```
#### Example 2:
Alternatively, import the function directly.
You can also see the full list of input arguments of by using `help()` on them.
This example shows the use of `muller` method for finding complex root:
```python
from cyroot import muller
# This function has no real root
f = lambda x: x ** 4 + 4 * x ** 2 + 5
# But Muller's method can be used to find complex root
result = muller(f, x0=0, x1=10, x2=20)
print(result)
```
Output:
```
RootResults(root=(0.34356074972251255+1.4553466902253551j), f_root=(-8.881784197001252e-16-1.7763568394002505e-15j), iters=43, f_calls=43, precision=3.177770418807502e-08, error=1.9860273225978185e-15, converged=True, optimal=True)
```
#### Example 3:
Considering the parabola $f(x)=x^2-612$ in **Example 1** with initial bounds $(a,b)$ where $a=-b$, many bracketing
methods will fail to find a root as the values evaluated at initial bracket are identical.
In this example, we use the `hybisect` method which repeatedly bisects the search regions until the Bolzano criterion
holds, thus can find multiple roots:
```python
import math
from cyroot import hybisect
f = lambda x: x ** 2 - 612
# interval arithmetic function of f
interval_f = lambda x_l, x_h: ((min(abs(x_l), abs(x_h))
if math.copysign(1, x_l) * math.copysign(1, x_h) > 0
else 0) ** 2 - 612,
max(abs(x_l), abs(x_h)) ** 2 - 612)
result = hybisect(f, interval_f, -50, 50)
print(result)
```
Output:
```
RootResults(root=[-24.738633753707973, 24.738633753707973], f_root=[9.936229616869241e-11, 9.936229616869241e-11], split_iters=1, iters=[43, 43], f_calls=(92, 3), bracket=[(-24.738633753710815, -24.73863375370513), (24.73863375370513, 24.738633753710815)], f_bracket=[(nan, nan), (nan, nan)], precision=[5.6843418860808015e-12, 5.6843418860808015e-12], error=[9.936229616869241e-11, 9.936229616869241e-11], converged=[True, True], optimal=[True, True])
```
#### Example 4:
This example shows the use of the `halley` method with functions returning first and second order derivatives of `f`:
```python
from cyroot import halley
f = lambda x: x ** 3 - 5 * x ** 2 + 2 * x - 1
# first order derivative
df = lambda x: 3 * x ** 2 - 10 * x + 2
# second order derivative
d2f = lambda x: 6 * x - 10
result = halley(f, df, d2f, x0=1.5)
print(result)
```
Output:
```
RootResults(root=4.613470267581537, f_root=-3.623767952376511e-13, df_root=(19.7176210537612, 17.68082160548922), iters=11, f_calls=(12, 12, 12), precision=4.9625634836147965e-05, error=3.623767952376511e-13, converged=True, optimal=True)
```
The `householder` method supports an arbitrary number of higher order derivatives:
```python
from cyroot import householder
f = lambda x: x ** 3 - 5 * x ** 2 + 2 * x - 1
df = lambda x: 3 * x ** 2 - 10 * x + 2
d2f = lambda x: 6 * x - 10
d3f = lambda x: 6
result = householder(f, dfs=[df, d2f, d3f], x0=1.5)
print(result) # same result
```
#### Example 5:
Similarly, to find roots of systems of equations with Newton-like methods, you have to define functions returning
**Jacobian** (and **Hessian**) of `F`.
This example shows the use of `generalized_super_halley` method:
```python
import numpy as np
from cyroot import generalized_super_halley
# all functions for vector root methods must take a numpy array
# as argument, and return an array-like object
F = lambda x: np.array([x[0] ** 2 + 2 * x[0] * np.sin(x[1]) - x[1],
4 * x[0] * x[1] ** 2 - x[1] ** 3 - 1])
# Jacobian
J = lambda x: np.array([
[2 * x[0] + 2 * np.sin(x[1]), 2 * x[0] * np.cos(x[1]) - 1],
[4 * x[1] ** 2, 8 * x[0] * x[1] - 3 * x[1] ** 2]
])
# Hessian
H = lambda x: np.array([
[[2, 2 * np.cos(x[1])],
[2 * np.cos(x[1]), -2 * x[0] * np.sin(x[1])]],
[[0, 8 * x[1]],
[8 * x[1], 8 * x[0] - 6 * x[1]]]
])
result = generalized_super_halley(F, J, H, x0=np.array([2., 2.]))
print(result)
```
Output: _(a bit messy)_
```
RootResults(root=array([0.48298601, 1.08951589]), f_root=array([-4.35123049e-11, -6.55444587e-11]), df_root=(array([[ 2.73877785, -0.55283751],
[ 4.74817951, 0.6486328 ]]), array([[[ 2. , 0.92582907],
[ 0.92582907, -0.85624041]],
[[ 0. , 8.71612713],
[ 8.71612713, -2.6732073 ]]])), iters=3, f_calls=(4, 4, 4), precision=0.0005808146393164461, error=6.554445874940029e-11, converged=True, optimal=True)
```
#### Example 6:
For vector bracketing root methods or vector root methods with multiple initial guesses, the input should be a 2D
`np.ndarray`.
This example shows the use of `vrahatis` method (a generalized bisection) with the example function in the original
paper:
```python
import numpy as np
from cyroot import vrahatis
F = lambda x: np.array([x[0] ** 2 - 4 * x[1],
-2 * x[0] + x[1] ** 2 + 4 * x[1]])
# If the initial points do not form an admissible n-polygon,
# an exception will be raised.
x0s = np.array([[-2., -0.25],
[0.5, 0.25],
[2, -0.25],
[0.6, 0.25]])
result = vrahatis(F, x0s=x0s)
print(result)
```
Output:
```
RootResults(root=array([4.80212874e-11, 0.00000000e+00]), f_root=array([ 2.30604404e-21, -9.60425747e-11]), iters=34, f_calls=140, bracket=array([[ 2.29193750e-10, 2.91038305e-11],
[-6.54727619e-12, 2.91038305e-11],
[ 4.80212874e-11, 0.00000000e+00],
[-6.98492260e-11, 0.00000000e+00]]), f_bracket=array([[-1.16415322e-10, -3.41972179e-10],
[-1.16415322e-10, 1.29509874e-10],
[ 2.30604404e-21, -9.60425747e-11],
[ 4.87891437e-21, 1.39698452e-10]]), precision=2.9904297647806717e-10, error=9.604257471622717e-11, converged=True, optimal=True)
```
#### Example 7:
This example shows the use of `finite_difference` to approximate derivatives when analytical solutions are not
available:
```python
import math
from cyroot import finite_difference
f = lambda x: (math.sin(x) + 1) ** x
x = 3 * math.pi / 2
d3f_x = finite_difference(f, x,
h=1e-4, # step
order=1, # order
kind='forward') # type: forward, backward, or central
# 7.611804179666343e-36
```
Similarly, `generalized_finite_difference` can compute vector derivative of arbitrary order
(`order=1` for **Jacobian**, `order=2` for **Hessian**), and `h` can be a number or a `np.ndarray` containing different
step sizes for each dimension:
```python
import numpy as np
from cyroot import generalized_finite_difference
F = lambda x: np.array([x[0] ** 3 - 3 * x[0] * x[1] + 5 * x[1] - 7,
x[0] ** 2 + x[0] * x[1] ** 2 - 4 * x[1] ** 2 + 3.5])
x = np.array([2., 3.])
# Derivatives of F will have shape (m, *([n] * order))
# where n is number of inputs, m is number of outputs
J_x = generalized_finite_difference(F, x, h=1e-4, order=1) # Jacobian
# array([[ 2.99985, -1.00015],
# [ 13.0003 , -11.9997 ]])
H_x = generalized_finite_difference(F, x, h=1e-3, order=2) # Hessian
# array([[[12. , -3. ],
# [-3. , 0. ]],
# [[ 2. , 6.001],
# [ 6.001, -3.998]]])
K_x = generalized_finite_difference(F, x, h=1e-2, order=3) # Kardashian, maybe
# array([[[[ 6.00000000e+00, 2.32830644e-10],
# [ 2.32830644e-10, 2.32830644e-10]],
# [[ 2.32830644e-10, 2.32830644e-10],
# [ 2.32830644e-10, 1.11758709e-08]]],
# [[[ 0.00000000e+00, -3.72529030e-09],
# [-3.72529030e-09, 1.99999999e+00]],
# [[-3.72529030e-09, 1.99999999e+00],
# [ 1.99999999e+00, -1.67638063e-08]]]])
```
Conveniently, you can use the `FiniteDifference` and `GeneralizedFiniteDifference` classes to wrap our function and
pass them to any Newton-like methods.
This is actually the default behavior when derivative functions of all Newton-like methods or the initial Jacobian
guess of some vector quasi-Newton methods are not provided.
```python
from cyroot import GeneralizedFiniteDifference, generalized_halley
J = GeneralizedFiniteDifference(F, h=1e-4, order=1)
H = GeneralizedFiniteDifference(F, h=1e-3, order=2)
result = generalized_halley(F, J=J, H=H, x0=x)
print(result)
```
Output:
```
RootResults(root=array([2.16665878, 2.11415683]), f_root=array([-5.47455414e-11, 1.05089271e-11]), df_root=(array([[ 7.74141032, -1.49997634],
[ 8.80307666, -7.75212506]]), array([[[ 1.30059527e+01, -3.00000000e+00],
[-3.00000000e+00, -4.54747351e-13]],
[[ 2.00000000e+00, 4.22931366e+00],
[ 4.22931366e+00, -3.66668244e+00]]])), iters=4, f_calls=(5, 211, 211), precision=1.0327220168881081e-07, error=5.474554143347632e-11, converged=True, optimal=True)
```
#### Output format:
The returned `result` is a namedtuple whose elements depend on the type of the method:
- Common:
- `root`: the solved root.
- `f_root`: value evaluated at root.
- `iters`: number of iterations.
- `f_calls`: number of function calls.
- `precision`: width of final bracket (for bracketing methods), or absolute difference of root with the last
estimation, or the span of the set of final estimations.
- `error`: absolute value of `f_root`.
- `converged`: `True` if the stopping criterion is met, `False` if the procedure terminated prematurely.
- `optimal`: `True` only if the error tolerance is satisfied `abs(f_root) <= etol`.
- Exclusive to bracketing methods:
- `bracket`: final bracket.
- `f_bracket`: value evaluated at final bracket.
- Exclusive to Newton-like methods:
- `df_root`: derivative or tuple of derivatives (of increasing orders) evaluated at root.
**Notes**:
- `converged` can be `True` even if the solution is not optimal, which means the routine stopped because the
precision tolerance is satisfied.
- For `scipy.optimize.root` users, the stopping condition arguments `etol`, `ertol`, `ptol`, `prtol` are equivalent to
`f_tol`, `f_rtol`, `x_tol`, `x_rtol`, respectively (but not identical).
#### Configurations:
The default values for stop condition arguments (i.e. `etol`, `ertol`, `ptol`, `prtol`, `max_iter`) are globally set to
the values defined in [`_defaults.py`](cyroot/_defaults.py), and can be modified dynamically as follows:
```python
import cyroot
cyroot.set_default_stop_condition_args(
etol=1e-7,
ptol=0, # disable precision tolerance
max_iter=100)
help(cyroot.illinois) # run to check the updated docstring
```
For more examples, please check the [`examples`](examples) folder.
## Contributing
If you want to contribute, please contact me. \
If you want an algorithm to be implemented, also drop me the paper (I will read if I have time).
## License
The code is released under the MIT license. See [`LICENSE.txt`](LICENSE.txt) for details.
Raw data
{
"_id": null,
"home_page": "https://github.com/inspiros/cy-root",
"name": "cy-root",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "root-finding",
"author": "Hoang-Nhat Tran (inspiros)",
"author_email": "hnhat.tran@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c2/7d/b11789d1967dc2c488c9e22f1ffd38019d5aa174c32630c950305be86072/cy-root-1.0.2.tar.gz",
"platform": null,
"description": "cy-root ![Build wheels](https://github.com/inspiros/cy-root/actions/workflows/build_wheels.yml/badge.svg) ![PyPI](https://img.shields.io/pypi/v/cy-root) ![GitHub](https://img.shields.io/github/license/inspiros/cy-root)\n========\n\n<p align=\"center\">\n <img src=\"https://www.austintexas.gov/sites/default/files/images/dsd/Community_Trees/tree-root-distruibution-1.jpg\" width=\"300\"/>\n <br/>\n <i><font size=\"1\">(Not this root)</font></i>\n <br/>\n</p>\n\nA simple root-finding package written in Cython.\nMany of the implemented methods can't be found in common Python libraries.\n\n## News:\n\n- Vector root-finding methods can now _(try to)_ solve systems of equations with number of inputs different from number\n of outputs.\n\n## Requirements\n\n- Python 3.6+\n- dynamic-default-args\n- numpy\n- scipy\n- sympy\n\n#### For compilation:\n\n- Cython (if you want to build from `.pyx` files)\n- A C/C++ compiler\n\n## Installation\n\n[cy-root](https://pypi.org/project/cy-root/) is now available on PyPI.\n\n```bash\npip install cy-root\n```\n\nAlternatively, you can build from source.\nMake sure you have all the dependencies installed, then clone this repo and run:\n\n```bash\ngit clone git://github.com/inspiros/cy-root.git\ncd cy-root\npip install .\n```\n\n## Supported algorithms\n\n**Note:**\nFor more information about the listed algorithms, please check the functions' docstrings or use Google until I update\nthe references.\n\n### Scalar root:\n\n- **Bracketing methods:** (methods that require lower and upper bounds)\n - [x] Bisect\n - [x] Hybisect _(bisection with interval analysis)_\n - [x] Regula Falsi\n - [x] Illinois\n - [x] Pegasus\n - [x] Anderson\u2013Bj\u00f6rck\n - [x] Dekker\n - [x] Brent _(with Inverse Quadratic Interpolation and Hyperbolic Interpolation)_\n - [x] Chandrupatla\n - [x] Ridders\n - [x] TOMS748\n - [x] Wu\n - [x] ITP\n- **Newton-like methods:** (methods that require derivative and/or higher order derivatives)\n - [x] Newton\n - [x] Chebyshev\n - [x] Halley\n - [x] Super-Halley\n - [x] Tangent Hyperbolas _(similar to Halley)_\n - [x] Householder\n- **Quasi-Newton methods:** (methods that approximate derivative, use interpolation, or successive iteration)\n - [x] Secant\n - [x] Sidi\n - [x] Steffensen\n - [x] Inverse Quadratic Interpolation\n - [x] Hyperbolic Interpolation\n - [x] Muller _(for complex root)_\n\n### Vector root:\n\n- **Bracketing methods:** (methods that require n-dimensional bracket)\n - [x] Vrahatis _(generalized bisection using n-polygon)_\n- **Newton-like methods:** (methods that require Jacobian and/or Hessian)\n - [x] Generalized Newton\n - [x] Generalized Chebyshev\n - [x] Generalized Halley\n - [x] Generalized Super-Halley\n - [x] Generalized Tangent Hyperbolas _(similar to Generalized Halley)_\n- **Quasi-Newton methods:** (methods that approximate Jacobian, use interpolation, or successive iteration)\n - [x] Wolfe-Bittner\n - [x] Robinson\n - [x] Barnes\n - [x] Traub-Steffensen\n - [x] Broyden _(Good and Bad)_\n - [x] Klement\n\n#### Derivative Approximation:\n\nMethods that can be combined with any Newton-like root-finding methods to discard the need of analytical derivatives.\n\n- [x] Finite Difference _(for both scalar and vector functions, up to arbitrary order)_\n\n## Usage\n\n### Examples:\n\n#### Example 1:\n\nUse `find_scalar_root` or `find_vector_root` and pass method name as the first argument.\nThis example shows the use of `find_scalar_root` function with `itp` method.\n\n```python\nfrom cyroot import find_scalar_root\n\nf = lambda x: x ** 2 - 612\nresult = find_scalar_root(method='itp', f=f, a=-10, b=50)\nprint(result)\n```\n\nOutput:\n\n```\nRootResults(root=24.73863375370596, f_root=-1.1368683772161603e-13, iters=8, f_calls=10, bracket=(24.73863369031373, 24.738633753846678), f_bracket=(-3.1364744472739403e-06, 6.962181942071766e-09), precision=6.353294779160024e-08, error=1.1368683772161603e-13, converged=True, optimal=True)\n```\n\nThe names and pointers to all implemented methods are stored in two dictionaries `SCALAR_ROOT_FINDING_METHODS` and\n`VECTOR_ROOT_FINDING_METHODS`.\n\n```python\nfrom cyroot import SCALAR_ROOT_FINDING_METHODS, VECTOR_ROOT_FINDING_METHODS\n\nprint('scalar root methods:', SCALAR_ROOT_FINDING_METHODS.keys())\nprint('vector root methods:', VECTOR_ROOT_FINDING_METHODS.keys())\n```\n\n#### Example 2:\n\nAlternatively, import the function directly.\nYou can also see the full list of input arguments of by using `help()` on them.\n\nThis example shows the use of `muller` method for finding complex root:\n\n```python\nfrom cyroot import muller\n\n# This function has no real root\nf = lambda x: x ** 4 + 4 * x ** 2 + 5\n# But Muller's method can be used to find complex root\nresult = muller(f, x0=0, x1=10, x2=20)\nprint(result)\n```\n\nOutput:\n\n```\nRootResults(root=(0.34356074972251255+1.4553466902253551j), f_root=(-8.881784197001252e-16-1.7763568394002505e-15j), iters=43, f_calls=43, precision=3.177770418807502e-08, error=1.9860273225978185e-15, converged=True, optimal=True)\n```\n\n#### Example 3:\n\nConsidering the parabola $f(x)=x^2-612$ in **Example 1** with initial bounds $(a,b)$ where $a=-b$, many bracketing\nmethods will fail to find a root as the values evaluated at initial bracket are identical.\n\nIn this example, we use the `hybisect` method which repeatedly bisects the search regions until the Bolzano criterion\nholds, thus can find multiple roots:\n\n```python\nimport math\n\nfrom cyroot import hybisect\n\nf = lambda x: x ** 2 - 612\n# interval arithmetic function of f\ninterval_f = lambda x_l, x_h: ((min(abs(x_l), abs(x_h))\n if math.copysign(1, x_l) * math.copysign(1, x_h) > 0\n else 0) ** 2 - 612,\n max(abs(x_l), abs(x_h)) ** 2 - 612)\n\nresult = hybisect(f, interval_f, -50, 50)\nprint(result)\n```\n\nOutput:\n\n```\nRootResults(root=[-24.738633753707973, 24.738633753707973], f_root=[9.936229616869241e-11, 9.936229616869241e-11], split_iters=1, iters=[43, 43], f_calls=(92, 3), bracket=[(-24.738633753710815, -24.73863375370513), (24.73863375370513, 24.738633753710815)], f_bracket=[(nan, nan), (nan, nan)], precision=[5.6843418860808015e-12, 5.6843418860808015e-12], error=[9.936229616869241e-11, 9.936229616869241e-11], converged=[True, True], optimal=[True, True])\n```\n\n#### Example 4:\n\nThis example shows the use of the `halley` method with functions returning first and second order derivatives of `f`:\n\n```python\nfrom cyroot import halley\n\nf = lambda x: x ** 3 - 5 * x ** 2 + 2 * x - 1\n# first order derivative\ndf = lambda x: 3 * x ** 2 - 10 * x + 2\n# second order derivative\nd2f = lambda x: 6 * x - 10\n\nresult = halley(f, df, d2f, x0=1.5)\nprint(result)\n```\n\nOutput:\n\n```\nRootResults(root=4.613470267581537, f_root=-3.623767952376511e-13, df_root=(19.7176210537612, 17.68082160548922), iters=11, f_calls=(12, 12, 12), precision=4.9625634836147965e-05, error=3.623767952376511e-13, converged=True, optimal=True)\n```\n\nThe `householder` method supports an arbitrary number of higher order derivatives:\n\n```python\nfrom cyroot import householder\n\nf = lambda x: x ** 3 - 5 * x ** 2 + 2 * x - 1\ndf = lambda x: 3 * x ** 2 - 10 * x + 2\nd2f = lambda x: 6 * x - 10\nd3f = lambda x: 6\n\nresult = householder(f, dfs=[df, d2f, d3f], x0=1.5)\nprint(result) # same result\n```\n\n#### Example 5:\n\nSimilarly, to find roots of systems of equations with Newton-like methods, you have to define functions returning\n**Jacobian** (and **Hessian**) of `F`.\n\nThis example shows the use of `generalized_super_halley` method:\n\n```python\nimport numpy as np\n\nfrom cyroot import generalized_super_halley\n\n# all functions for vector root methods must take a numpy array\n# as argument, and return an array-like object\nF = lambda x: np.array([x[0] ** 2 + 2 * x[0] * np.sin(x[1]) - x[1],\n 4 * x[0] * x[1] ** 2 - x[1] ** 3 - 1])\n# Jacobian\nJ = lambda x: np.array([\n [2 * x[0] + 2 * np.sin(x[1]), 2 * x[0] * np.cos(x[1]) - 1],\n [4 * x[1] ** 2, 8 * x[0] * x[1] - 3 * x[1] ** 2]\n])\n# Hessian\nH = lambda x: np.array([\n [[2, 2 * np.cos(x[1])],\n [2 * np.cos(x[1]), -2 * x[0] * np.sin(x[1])]],\n [[0, 8 * x[1]],\n [8 * x[1], 8 * x[0] - 6 * x[1]]]\n])\n\nresult = generalized_super_halley(F, J, H, x0=np.array([2., 2.]))\nprint(result)\n```\n\nOutput: _(a bit messy)_\n\n```\nRootResults(root=array([0.48298601, 1.08951589]), f_root=array([-4.35123049e-11, -6.55444587e-11]), df_root=(array([[ 2.73877785, -0.55283751],\n [ 4.74817951, 0.6486328 ]]), array([[[ 2. , 0.92582907],\n [ 0.92582907, -0.85624041]],\n\n [[ 0. , 8.71612713],\n [ 8.71612713, -2.6732073 ]]])), iters=3, f_calls=(4, 4, 4), precision=0.0005808146393164461, error=6.554445874940029e-11, converged=True, optimal=True)\n```\n\n#### Example 6:\n\nFor vector bracketing root methods or vector root methods with multiple initial guesses, the input should be a 2D\n`np.ndarray`.\n\nThis example shows the use of `vrahatis` method (a generalized bisection) with the example function in the original\npaper:\n\n```python\nimport numpy as np\n\nfrom cyroot import vrahatis\n\nF = lambda x: np.array([x[0] ** 2 - 4 * x[1],\n -2 * x[0] + x[1] ** 2 + 4 * x[1]])\n\n# If the initial points do not form an admissible n-polygon,\n# an exception will be raised.\nx0s = np.array([[-2., -0.25],\n [0.5, 0.25],\n [2, -0.25],\n [0.6, 0.25]])\n\nresult = vrahatis(F, x0s=x0s)\nprint(result)\n```\n\nOutput:\n\n```\nRootResults(root=array([4.80212874e-11, 0.00000000e+00]), f_root=array([ 2.30604404e-21, -9.60425747e-11]), iters=34, f_calls=140, bracket=array([[ 2.29193750e-10, 2.91038305e-11],\n [-6.54727619e-12, 2.91038305e-11],\n [ 4.80212874e-11, 0.00000000e+00],\n [-6.98492260e-11, 0.00000000e+00]]), f_bracket=array([[-1.16415322e-10, -3.41972179e-10],\n [-1.16415322e-10, 1.29509874e-10],\n [ 2.30604404e-21, -9.60425747e-11],\n [ 4.87891437e-21, 1.39698452e-10]]), precision=2.9904297647806717e-10, error=9.604257471622717e-11, converged=True, optimal=True)\n```\n\n#### Example 7:\n\nThis example shows the use of `finite_difference` to approximate derivatives when analytical solutions are not\navailable:\n\n```python\nimport math\n\nfrom cyroot import finite_difference\n\nf = lambda x: (math.sin(x) + 1) ** x\nx = 3 * math.pi / 2\nd3f_x = finite_difference(f, x,\n h=1e-4, # step\n order=1, # order\n kind='forward') # type: forward, backward, or central\n# 7.611804179666343e-36\n```\n\nSimilarly, `generalized_finite_difference` can compute vector derivative of arbitrary order\n(`order=1` for **Jacobian**, `order=2` for **Hessian**), and `h` can be a number or a `np.ndarray` containing different\nstep sizes for each dimension:\n\n```python\nimport numpy as np\n\nfrom cyroot import generalized_finite_difference\n\nF = lambda x: np.array([x[0] ** 3 - 3 * x[0] * x[1] + 5 * x[1] - 7,\n x[0] ** 2 + x[0] * x[1] ** 2 - 4 * x[1] ** 2 + 3.5])\nx = np.array([2., 3.])\n\n# Derivatives of F will have shape (m, *([n] * order))\n# where n is number of inputs, m is number of outputs\nJ_x = generalized_finite_difference(F, x, h=1e-4, order=1) # Jacobian\n# array([[ 2.99985, -1.00015],\n# [ 13.0003 , -11.9997 ]])\nH_x = generalized_finite_difference(F, x, h=1e-3, order=2) # Hessian\n# array([[[12. , -3. ],\n# [-3. , 0. ]],\n# [[ 2. , 6.001],\n# [ 6.001, -3.998]]])\nK_x = generalized_finite_difference(F, x, h=1e-2, order=3) # Kardashian, maybe\n# array([[[[ 6.00000000e+00, 2.32830644e-10],\n# [ 2.32830644e-10, 2.32830644e-10]],\n# [[ 2.32830644e-10, 2.32830644e-10],\n# [ 2.32830644e-10, 1.11758709e-08]]],\n# [[[ 0.00000000e+00, -3.72529030e-09],\n# [-3.72529030e-09, 1.99999999e+00]],\n# [[-3.72529030e-09, 1.99999999e+00],\n# [ 1.99999999e+00, -1.67638063e-08]]]])\n```\n\nConveniently, you can use the `FiniteDifference` and `GeneralizedFiniteDifference` classes to wrap our function and\npass them to any Newton-like methods.\n\nThis is actually the default behavior when derivative functions of all Newton-like methods or the initial Jacobian\nguess of some vector quasi-Newton methods are not provided.\n\n```python\nfrom cyroot import GeneralizedFiniteDifference, generalized_halley\n\nJ = GeneralizedFiniteDifference(F, h=1e-4, order=1)\nH = GeneralizedFiniteDifference(F, h=1e-3, order=2)\n\nresult = generalized_halley(F, J=J, H=H, x0=x)\nprint(result)\n```\n\nOutput:\n\n```\nRootResults(root=array([2.16665878, 2.11415683]), f_root=array([-5.47455414e-11, 1.05089271e-11]), df_root=(array([[ 7.74141032, -1.49997634],\n [ 8.80307666, -7.75212506]]), array([[[ 1.30059527e+01, -3.00000000e+00],\n [-3.00000000e+00, -4.54747351e-13]],\n\n [[ 2.00000000e+00, 4.22931366e+00],\n [ 4.22931366e+00, -3.66668244e+00]]])), iters=4, f_calls=(5, 211, 211), precision=1.0327220168881081e-07, error=5.474554143347632e-11, converged=True, optimal=True)\n```\n\n#### Output format:\n\nThe returned `result` is a namedtuple whose elements depend on the type of the method:\n\n- Common:\n - `root`: the solved root.\n - `f_root`: value evaluated at root.\n - `iters`: number of iterations.\n - `f_calls`: number of function calls.\n - `precision`: width of final bracket (for bracketing methods), or absolute difference of root with the last\n estimation, or the span of the set of final estimations.\n - `error`: absolute value of `f_root`.\n - `converged`: `True` if the stopping criterion is met, `False` if the procedure terminated prematurely.\n - `optimal`: `True` only if the error tolerance is satisfied `abs(f_root) <= etol`.\n- Exclusive to bracketing methods:\n - `bracket`: final bracket.\n - `f_bracket`: value evaluated at final bracket.\n- Exclusive to Newton-like methods:\n - `df_root`: derivative or tuple of derivatives (of increasing orders) evaluated at root.\n\n**Notes**:\n\n- `converged` can be `True` even if the solution is not optimal, which means the routine stopped because the\n precision tolerance is satisfied.\n- For `scipy.optimize.root` users, the stopping condition arguments `etol`, `ertol`, `ptol`, `prtol` are equivalent to\n `f_tol`, `f_rtol`, `x_tol`, `x_rtol`, respectively (but not identical).\n\n#### Configurations:\n\nThe default values for stop condition arguments (i.e. `etol`, `ertol`, `ptol`, `prtol`, `max_iter`) are globally set to\nthe values defined in [`_defaults.py`](cyroot/_defaults.py), and can be modified dynamically as follows:\n\n```python\nimport cyroot\n\ncyroot.set_default_stop_condition_args(\n etol=1e-7,\n ptol=0, # disable precision tolerance\n max_iter=100)\n\nhelp(cyroot.illinois) # run to check the updated docstring\n```\n\nFor more examples, please check the [`examples`](examples) folder.\n\n## Contributing\n\nIf you want to contribute, please contact me. \\\nIf you want an algorithm to be implemented, also drop me the paper (I will read if I have time).\n\n## License\n\nThe code is released under the MIT license. See [`LICENSE.txt`](LICENSE.txt) for details.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Cython implementations of multiple root-finding methods.",
"version": "1.0.2",
"split_keywords": [
"root-finding"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "dad3a676bf8b4ea5c397e052cbdb01ea6667d256f9c3fd0cea6f8d5df15df633",
"md5": "71b6a04d62afef01dcca9d55f479e9c0",
"sha256": "af5f0a1628600db196065a0069782fe1a6b3fce3fe73b1209c17ee86981d553b"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "71b6a04d62afef01dcca9d55f479e9c0",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 4181807,
"upload_time": "2023-04-20T20:29:01",
"upload_time_iso_8601": "2023-04-20T20:29:01.790865Z",
"url": "https://files.pythonhosted.org/packages/da/d3/a676bf8b4ea5c397e052cbdb01ea6667d256f9c3fd0cea6f8d5df15df633/cy_root-1.0.2-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0e9abc6e28d5d262192b73c7fc18fd589917935d0721fa417f570f353b1dc2c8",
"md5": "7b07ed852445434f2fac6af3c93473fb",
"sha256": "4c51f9bb069a9928af491b8e0f72473b86907daf460ffed273f715e203ded7fd"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "7b07ed852445434f2fac6af3c93473fb",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 11842778,
"upload_time": "2023-04-20T20:29:03",
"upload_time_iso_8601": "2023-04-20T20:29:03.746182Z",
"url": "https://files.pythonhosted.org/packages/0e/9a/bc6e28d5d262192b73c7fc18fd589917935d0721fa417f570f353b1dc2c8/cy_root-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "48083b64783f27adf2f8f8a942cd4db0f96c11dd8092ff58752d83d158e43b99",
"md5": "3c477af6088443e3baa5d028d7b2f671",
"sha256": "d042b3540ba834d7b04a3bc633f25ef05459adf5b5c59c919242a4260930e21e"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "3c477af6088443e3baa5d028d7b2f671",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 3655616,
"upload_time": "2023-04-20T20:29:05",
"upload_time_iso_8601": "2023-04-20T20:29:05.943101Z",
"url": "https://files.pythonhosted.org/packages/48/08/3b64783f27adf2f8f8a942cd4db0f96c11dd8092ff58752d83d158e43b99/cy_root-1.0.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "61c5d343461a82907466be3b26b3f3ca1a251a6eea84b1310d29550f65746be1",
"md5": "60ab10802d697502c97b6364f34d0a61",
"sha256": "bfe9294adf55b1292310ccf01133a5d4115c9dd0ce149e4787a8fb99d79d7086"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "60ab10802d697502c97b6364f34d0a61",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 4156117,
"upload_time": "2023-04-20T20:29:07",
"upload_time_iso_8601": "2023-04-20T20:29:07.555460Z",
"url": "https://files.pythonhosted.org/packages/61/c5/d343461a82907466be3b26b3f3ca1a251a6eea84b1310d29550f65746be1/cy_root-1.0.2-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ed92646fd7140c28cfd708c7a551961e0ab6d5462a5b76b7d5fb89f9c19f4cf4",
"md5": "849704fbdcae22e3c4b9c17819981f36",
"sha256": "95b97a953385f74020ae7bdf4ed449ab9dcf815c220817f14d88359e4bf0ef77"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "849704fbdcae22e3c4b9c17819981f36",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 12400498,
"upload_time": "2023-04-20T20:29:09",
"upload_time_iso_8601": "2023-04-20T20:29:09.598105Z",
"url": "https://files.pythonhosted.org/packages/ed/92/646fd7140c28cfd708c7a551961e0ab6d5462a5b76b7d5fb89f9c19f4cf4/cy_root-1.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "da25f48a3dfb015ef9c8d4a7abb9ff1e627883944076c7e32cdd28c14d624584",
"md5": "d887ce2fb1cc1ec5024c92ff1835e0f1",
"sha256": "06e44bd791bf7993e5616b5766cdc84c7bfa338885d6b4dc455b3dcf6540e69c"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "d887ce2fb1cc1ec5024c92ff1835e0f1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 3647818,
"upload_time": "2023-04-20T20:29:12",
"upload_time_iso_8601": "2023-04-20T20:29:12.508740Z",
"url": "https://files.pythonhosted.org/packages/da/25/f48a3dfb015ef9c8d4a7abb9ff1e627883944076c7e32cdd28c14d624584/cy_root-1.0.2-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "69964c6a0781427416218f018f3d34f653ac050af8dc395f432a6fd2529f8e18",
"md5": "c8635c6982990c23e69a07e81df4c564",
"sha256": "22c86ce1b60ce6ca9b13053fa4f20b2fc1877a8ee00290fc12daf5351721bc5b"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp36-cp36m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "c8635c6982990c23e69a07e81df4c564",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 4109275,
"upload_time": "2023-04-20T20:29:14",
"upload_time_iso_8601": "2023-04-20T20:29:14.528425Z",
"url": "https://files.pythonhosted.org/packages/69/96/4c6a0781427416218f018f3d34f653ac050af8dc395f432a6fd2529f8e18/cy_root-1.0.2-cp36-cp36m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ffa65a147143f747b2bbc13ceadd3ee9dbc3aa0bb84758a0a419d8906128c283",
"md5": "09f473096e9c7c09b98c0bb65a70a701",
"sha256": "65e56a8caf1ea11077a53382f4ae4b9a68632899cecf5e59d21db0f74c42b94e"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "09f473096e9c7c09b98c0bb65a70a701",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 11243425,
"upload_time": "2023-04-20T20:29:17",
"upload_time_iso_8601": "2023-04-20T20:29:17.622887Z",
"url": "https://files.pythonhosted.org/packages/ff/a6/5a147143f747b2bbc13ceadd3ee9dbc3aa0bb84758a0a419d8906128c283/cy_root-1.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "eb1aa096a5046fcd6945da922629b9784f69488e25b6a90153c6cfb9c2bca843",
"md5": "1ed3547b28f42f29cdec0de9ea009330",
"sha256": "10d6435742ddef801aed64f7a553825c20305e5821894d31ee883aa77236a785"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp36-cp36m-win_amd64.whl",
"has_sig": false,
"md5_digest": "1ed3547b28f42f29cdec0de9ea009330",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 3770663,
"upload_time": "2023-04-20T20:29:20",
"upload_time_iso_8601": "2023-04-20T20:29:20.457124Z",
"url": "https://files.pythonhosted.org/packages/eb/1a/a096a5046fcd6945da922629b9784f69488e25b6a90153c6cfb9c2bca843/cy_root-1.0.2-cp36-cp36m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d1f3757cd8e74e2d12303cdbf5f4234da9d52a48d1bed29e01674a1e871f07fd",
"md5": "65cabf241874e32f7d22cc1851d2181b",
"sha256": "d4c5a0ac2fa15fc60300dc9b6a03b57dd2bd02daef74047726bfec0bdf791850"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp37-cp37m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "65cabf241874e32f7d22cc1851d2181b",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 4130346,
"upload_time": "2023-04-20T20:29:23",
"upload_time_iso_8601": "2023-04-20T20:29:23.290673Z",
"url": "https://files.pythonhosted.org/packages/d1/f3/757cd8e74e2d12303cdbf5f4234da9d52a48d1bed29e01674a1e871f07fd/cy_root-1.0.2-cp37-cp37m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cca34ef0b2bad8bd96ec5b2266feb1d8a1f26f883bbdc156e255d6357ab05be5",
"md5": "74b1e39e344a6918f53f4972691d92e3",
"sha256": "ab35d9c9df29df7df84f9e5a46773b6127e9f4074c0f71d12c54a3b83b284ca8"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "74b1e39e344a6918f53f4972691d92e3",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 11239187,
"upload_time": "2023-04-20T20:29:25",
"upload_time_iso_8601": "2023-04-20T20:29:25.301017Z",
"url": "https://files.pythonhosted.org/packages/cc/a3/4ef0b2bad8bd96ec5b2266feb1d8a1f26f883bbdc156e255d6357ab05be5/cy_root-1.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "07fc269bbe82fa1bcb7b8317b7758d3228b07d64c4b3281a1c67931ea49e6104",
"md5": "74dfc96e2ec5bfb14e334a64d34abe80",
"sha256": "266ce0ab962a579061574334ea08b4225a2aeb3cd18a80e18c502c2f6c8e2865"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "74dfc96e2ec5bfb14e334a64d34abe80",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 3651212,
"upload_time": "2023-04-20T20:29:27",
"upload_time_iso_8601": "2023-04-20T20:29:27.101928Z",
"url": "https://files.pythonhosted.org/packages/07/fc/269bbe82fa1bcb7b8317b7758d3228b07d64c4b3281a1c67931ea49e6104/cy_root-1.0.2-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "257d7b27d914e5be7f5679a91a0ed4a7132cb733a2903158d6b8326e923d2cf6",
"md5": "b3408c693404b9c14db96bdc899c5289",
"sha256": "8fa3a139d0a746da9b6c266c3c5b3d0e835dee8e0fc5a58923bbe2e09f861e04"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp38-cp38-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "b3408c693404b9c14db96bdc899c5289",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 4143373,
"upload_time": "2023-04-20T20:29:28",
"upload_time_iso_8601": "2023-04-20T20:29:28.979131Z",
"url": "https://files.pythonhosted.org/packages/25/7d/7b27d914e5be7f5679a91a0ed4a7132cb733a2903158d6b8326e923d2cf6/cy_root-1.0.2-cp38-cp38-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a4b459ff2e78c10a19d93b1376e3479cabb7da51962092ac476e2a62f980a268",
"md5": "0bd7ffc2bb7445b603372a1ccd91db08",
"sha256": "7228986c9b773abe669cae51dfc6dd5d74dd868292edfb5f331086ad9d4b75c3"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0bd7ffc2bb7445b603372a1ccd91db08",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 12164921,
"upload_time": "2023-04-20T20:29:30",
"upload_time_iso_8601": "2023-04-20T20:29:30.979396Z",
"url": "https://files.pythonhosted.org/packages/a4/b4/59ff2e78c10a19d93b1376e3479cabb7da51962092ac476e2a62f980a268/cy_root-1.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4cd19245b1e95803fd60d7695718aad9f53d6313736639f4df4ebae929e15b2b",
"md5": "7019542ddbd1de311513deaf1cd67c4b",
"sha256": "30e6601844207c7279da10edc8e0c54012d01a56bbc306fdb188be6b524f5456"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "7019542ddbd1de311513deaf1cd67c4b",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 3702240,
"upload_time": "2023-04-20T20:29:33",
"upload_time_iso_8601": "2023-04-20T20:29:33.556541Z",
"url": "https://files.pythonhosted.org/packages/4c/d1/9245b1e95803fd60d7695718aad9f53d6313736639f4df4ebae929e15b2b/cy_root-1.0.2-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cf3da6223664dd0de4ec613eb1390f5256947089e04dbf26c46483a730169305",
"md5": "f4bd6567f589ead6a9f5567f45828c8a",
"sha256": "ad77ae33ad6aa4b79a62263c6b9e82f4a90376acea7a64f3b161a0d5157c5ac7"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "f4bd6567f589ead6a9f5567f45828c8a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 4202845,
"upload_time": "2023-04-20T20:29:35",
"upload_time_iso_8601": "2023-04-20T20:29:35.705319Z",
"url": "https://files.pythonhosted.org/packages/cf/3d/a6223664dd0de4ec613eb1390f5256947089e04dbf26c46483a730169305/cy_root-1.0.2-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f453a9d8cd2e09ae936f2762ad31bca3a996b1436dbcb341496eaa6a04762712",
"md5": "c1eb4eac7a1ef96e4f3ea5dee63e19a6",
"sha256": "6f39e5130cad72563f1c01c649f24ea2ae9c6e3178cb3d4c75b6d7ef0657458d"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c1eb4eac7a1ef96e4f3ea5dee63e19a6",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 12052152,
"upload_time": "2023-04-20T20:29:37",
"upload_time_iso_8601": "2023-04-20T20:29:37.658701Z",
"url": "https://files.pythonhosted.org/packages/f4/53/a9d8cd2e09ae936f2762ad31bca3a996b1436dbcb341496eaa6a04762712/cy_root-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "937a010ebaa5fba75549c9655dc79ff86ba93cdfbcc12bc4ce8856ac16e11a19",
"md5": "36c0c24513ab6646ce18776dc95c5d49",
"sha256": "fdbd369d40f5e3a7fb7cbca4ca7c46984d6bdc0194eefdd1a347f5818aef5bd9"
},
"downloads": -1,
"filename": "cy_root-1.0.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "36c0c24513ab6646ce18776dc95c5d49",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 3686898,
"upload_time": "2023-04-20T20:29:39",
"upload_time_iso_8601": "2023-04-20T20:29:39.507522Z",
"url": "https://files.pythonhosted.org/packages/93/7a/010ebaa5fba75549c9655dc79ff86ba93cdfbcc12bc4ce8856ac16e11a19/cy_root-1.0.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c27db11789d1967dc2c488c9e22f1ffd38019d5aa174c32630c950305be86072",
"md5": "57d3101ef7b11274cdca9a93a7d7fe41",
"sha256": "36e00b5b70a5107dc30b3fb927c8d4dbb9f03429e6e2975b5213366180d5b650"
},
"downloads": -1,
"filename": "cy-root-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "57d3101ef7b11274cdca9a93a7d7fe41",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 2192502,
"upload_time": "2023-04-20T20:29:41",
"upload_time_iso_8601": "2023-04-20T20:29:41.661572Z",
"url": "https://files.pythonhosted.org/packages/c2/7d/b11789d1967dc2c488c9e22f1ffd38019d5aa174c32630c950305be86072/cy-root-1.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-04-20 20:29:41",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "inspiros",
"github_project": "cy-root",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "cy-root"
}