| """ | |
| 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': | |
| >>> 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 | |