cy-root


Namecy-root JSON
Version 1.0.2 PyPI version JSON
download
home_pagehttps://github.com/inspiros/cy-root
SummaryCython implementations of multiple root-finding methods.
upload_time2023-04-20 20:29:41
maintainer
docs_urlNone
authorHoang-Nhat Tran (inspiros)
requires_python>=3.6
licenseMIT
keywords root-finding
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            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"
}
        
Elapsed time: 0.08680s