| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- """
- Introspection helper functions.
- """
- import re
- __all__ = ['opt_func_info']
- def opt_func_info(func_name=None, signature=None):
- """
- Returns a dictionary containing the currently supported CPU dispatched
- features for all optimized functions.
- Parameters
- ----------
- func_name : str (optional)
- Regular expression to filter by function name.
- signature : str (optional)
- Regular expression to filter by data type.
- Returns
- -------
- dict
- A dictionary where keys are optimized function names and values are
- nested dictionaries indicating supported targets based on data types.
- Examples
- --------
- Retrieve dispatch information for functions named 'add' or 'sub' and
- data types 'float64' or 'float32':
- >>> import numpy as np
- >>> dict = np.lib.introspect.opt_func_info(
- ... func_name="add|abs", signature="float64|complex64"
- ... )
- >>> import json
- >>> print(json.dumps(dict, indent=2))
- {
- "absolute": {
- "dd": {
- "current": "SSE41",
- "available": "SSE41 baseline(SSE SSE2 SSE3)"
- },
- "Ff": {
- "current": "FMA3__AVX2",
- "available": "AVX512F FMA3__AVX2 baseline(SSE SSE2 SSE3)"
- },
- "Dd": {
- "current": "FMA3__AVX2",
- "available": "AVX512F FMA3__AVX2 baseline(SSE SSE2 SSE3)"
- }
- },
- "add": {
- "ddd": {
- "current": "FMA3__AVX2",
- "available": "FMA3__AVX2 baseline(SSE SSE2 SSE3)"
- },
- "FFF": {
- "current": "FMA3__AVX2",
- "available": "FMA3__AVX2 baseline(SSE SSE2 SSE3)"
- }
- }
- }
- """
- from numpy._core._multiarray_umath import (
- __cpu_targets_info__ as targets, dtype
- )
- if func_name is not None:
- func_pattern = re.compile(func_name)
- matching_funcs = {
- k: v for k, v in targets.items()
- if func_pattern.search(k)
- }
- else:
- matching_funcs = targets
- if signature is not None:
- sig_pattern = re.compile(signature)
- matching_sigs = {}
- for k, v in matching_funcs.items():
- matching_chars = {}
- for chars, targets in v.items():
- if any(
- sig_pattern.search(c) or sig_pattern.search(dtype(c).name)
- for c in chars
- ):
- matching_chars[chars] = targets
- if matching_chars:
- matching_sigs[k] = matching_chars
- else:
- matching_sigs = matching_funcs
- return matching_sigs
|