78 lines
1.6 KiB
Python
78 lines
1.6 KiB
Python
import numpy as np
|
|
|
|
|
|
EPS = np.finfo(float).eps
|
|
|
|
|
|
def get_arrays_tol(*arrays):
|
|
"""
|
|
Get a relative tolerance for a set of arrays.
|
|
|
|
Parameters
|
|
----------
|
|
*arrays: tuple
|
|
Set of `numpy.ndarray` to get the tolerance for.
|
|
|
|
Returns
|
|
-------
|
|
float
|
|
Relative tolerance for the set of arrays.
|
|
|
|
Raises
|
|
------
|
|
ValueError
|
|
If no array is provided.
|
|
"""
|
|
if len(arrays) == 0:
|
|
raise ValueError("At least one array must be provided.")
|
|
size = max(array.size for array in arrays)
|
|
weight = max(
|
|
np.max(np.abs(array[np.isfinite(array)]), initial=1.0)
|
|
for array in arrays
|
|
)
|
|
return 10.0 * EPS * max(size, 1.0) * weight
|
|
|
|
|
|
def exact_1d_array(x, message):
|
|
"""
|
|
Preprocess a 1-dimensional array.
|
|
|
|
Parameters
|
|
----------
|
|
x : array_like
|
|
Array to be preprocessed.
|
|
message : str
|
|
Error message if `x` cannot be interpreter as a 1-dimensional array.
|
|
|
|
Returns
|
|
-------
|
|
`numpy.ndarray`
|
|
Preprocessed array.
|
|
"""
|
|
x = np.atleast_1d(np.squeeze(x)).astype(float)
|
|
if x.ndim != 1:
|
|
raise ValueError(message)
|
|
return x
|
|
|
|
|
|
def exact_2d_array(x, message):
|
|
"""
|
|
Preprocess a 2-dimensional array.
|
|
|
|
Parameters
|
|
----------
|
|
x : array_like
|
|
Array to be preprocessed.
|
|
message : str
|
|
Error message if `x` cannot be interpreter as a 2-dimensional array.
|
|
|
|
Returns
|
|
-------
|
|
`numpy.ndarray`
|
|
Preprocessed array.
|
|
"""
|
|
x = np.atleast_2d(x).astype(float)
|
|
if x.ndim != 2:
|
|
raise ValueError(message)
|
|
return x
|