# Experimental implementations¶

## Helpers¶

`mlprodict.testing.experimental_c.code_optimisation`

()

code_optimisation() -> str

Returns a string giving some insights about optimisations.

## Implementation of ONNX operators¶

Experimental implementations for algorithm.

### Einsum¶

`mlprodict.testing.einsum`

(*equation*, *inputs*, *optimize* = False, *runtime* = ‘batch_dot’, *cache* = True, *opset* = None, *decompose* = True, *strategy* = None, *verbose* = None)

Proposes a new implementation of numpy.einsum. It does not allow expresion using … and expects a right member.

`mlprodict.testing.einsum.einsum_fct.CachedEinsum`

(*self*, *equation*, *runtime* = ‘batch_dot’, *opset* = None, *optimize* = False, *dtype* = <class ‘numpy.float64’>, *decompose* = True, *strategy* = None, *verbose* = None, *key* = None)

Stores all the necessary information to cache the preprocessing of a an einsum equation.

`mlprodict.testing.einsum.optimize_decompose_einsum_equation`

(*equation*, *dtype*, *optimize* = False, *runtime* = ‘batch_dot’, *cache* = True, *opset* = None, *decompose* = True, *strategy* = None, *verbose* = None)

Proposes a new implementation of numpy.einsum. It does not allow expresion using … and expects a right member.

`mlprodict.testing.einsum.einsum_impl.analyse_einsum_equation`

(*equation*)

Analyses an einsum equation.

`mlprodict.testing.einsum.einsum_impl.apply_sequence`

`mlprodict.testing.einsum.decompose_einsum_equation`

(*equation*, *shapes*, *strategy* = ‘simple’, *clean* = False, *verbose* = False)

Decomposes an equation used in numpy.einsum knowing the input shapes. It returns a sequence of operations to do to compute the results.

`mlprodict.testing.experimental_c.custom_einsum_float`

(*equation*, *x*, *y*, *nthread* = 0)

custom_einsum_float(equation: str, x: numpy.ndarray[numpy.float32], y: numpy.ndarray[numpy.float32], nthread: int = 0) -> numpy.ndarray[numpy.float32]

Custom C++ implementation of operator

einsumwith float. The function only works with contiguous arrays. It does not any explicit transposes. It does not support diagonal operator (repetition of the same letter). See python’s version`custom_einsum`

.

`mlprodict.testing.experimental_c.custom_einsum_double`

(*equation*, *x*, *y*, *nthread* = 0)

custom_einsum_double(equation: str, x: numpy.ndarray[numpy.float64], y: numpy.ndarray[numpy.float64], nthread: int = 0) -> numpy.ndarray[numpy.float64]

Custom C++ implementation of operator

einsumwith double. The function only works with contiguous arrays. It does not any explicit transposes. It does not support diagonal operator (repetition of the same letter). See python’s version`custom_einsum`

.

`mlprodict.testing.einsum.einsum_benchmark`

(*equation* = ‘abc,cd->abd’, *shape* = 30, *perm* = False, *runtime* = ‘python’, *use_tqdm* = False, *number* = 5, *repeat* = 5, *opset* = 15)

Investigates whether or not the decomposing einsum is faster.

`mlprodict.testing.einsum.numpy_diagonal`

(*m*, *axis*, *axes*)

Extracts diagonal coefficients from an array.

`mlprodict.testing.einsum.numpy_extended_dot`

(*m1*, *m2*, *axes*, *left*, *right*, *verbose* = False)

Extended version of a matrix multiplication (numpy.dot) with two matrices

m1,m2of the same dimensions. Loops overleftaxes form1andrightaxes form2, summation is done overaxes. Other axes must be empty. This multiplication combines matrix multiplication (dot) and broadcasted multiplication term by term.

`mlprodict.testing.einsum.numpy_extended_dot_python`

(*m1*, *m2*, *axes*, *left*, *right*, *verbose* = False)

Implementation of

`numpy_extended_dot`

in pure python. This implementation is not efficient but shows how to implement this operation without numpy.einsum.

`mlprodict.testing.einsum.numpy_extended_dot_matrix`

(*m1*, *m2*, *axes*, *left*, *right*, *verbose* = False)

Implementation of

`numpy_extended_dot`

using dot product, multiplication, transpose and reduction but not a custom python implementation like`numpy_extended_dot_python`

.

`mlprodict.testing.einsum.einsum_impl_ext.numpy_extended_dot_ouput_shape`

(*m1*, *m2*, *axes*, *left*, *right*)

Computes the output shape of results produced by function

`numpy_extended_dot`

or`numpy_extended_dot_python`

.

### Pad¶

`mlprodict.testing.experimental.custom_pad`

(*arr*, *paddings*, *constant* = 0, *verbose* = False)

Implements function pad in python, only the constant version.

### ReduceSum¶

`mlprodict.testing.experimental_c.custom_reducesum_rk_double`

(*x*, *nthread* = 0)

custom_reducesum_rk_double(x: numpy.ndarray[numpy.float64], nthread: int = 0) -> numpy.ndarray[numpy.float64]

Custom C++ implementation of operator

ReduceSumwith double when the reduced matrix has two dimensions and the reduced axis is the first one.xis the reduced matrix.nthreadspecifies the number of threads used to distribute. Negative means OMP default values.

`mlprodict.testing.experimental_c.custom_reducesum_rk_float`

(*x*, *nthread* = 0)

custom_reducesum_rk_float(x: numpy.ndarray[numpy.float32], nthread: int = 0) -> numpy.ndarray[numpy.float32]

Custom C++ implementation of operator

ReduceSumwith float when the reduced matrix has two dimensions and the reduced axis is the first one.xis the reduced matrix.nthreadspecifies the number of threads used to distribute. Negative means OMP default values.