def _sanitize_constexpr_value(value): if value is None: return "NONE" if isinstance(value, bool): return str(int(value)) if isinstance(value, int): return str(value) if isinstance(value, float): if value.is_integer(): return str(int(value)) return str(value) # for lists, tuples, sets - recursively join each if isinstance(value, (list, tuple, set)): items = sorted(value, key=str) if isinstance(value, set) else value sanitized_items = [_sanitize_constexpr_value(item) for item in items] joined = "_".join(sanitized_items) return joined if joined else "NONE" if isinstance(value, str): cleaned_value = "".join(ch if ch.isalnum() else "_" for ch in value).strip("_") return cleaned_value.upper() if cleaned_value else "NONE" cleaned_value = "".join(ch if ch.isalnum() else "_" for ch in str(value)).strip("_") return cleaned_value.upper() if cleaned_value else "NONE" def make_kernel_repr(base_name, config_keys, name_key=None): # When name_key is set, the base name is taken from the matching constexpr # kwarg at call time (falling back to base_name if missing/empty). Lets a # single shared kernel produce caller-specific names in compiled artifacts. def _repr(specialization): constants = specialization.constants name = base_name if name_key is not None: override = constants.get(name_key, None) if override: cleaned = "".join( ch if ch.isalnum() or ch == "_" else "_" for ch in str(override) ) if cleaned: name = cleaned name_parts = [] for key in config_keys: value = constants.get(key, None) symbol = _sanitize_constexpr_value(value) name_parts.append(f"{key}_{symbol}") if not name_parts: return name suffix = "_".join(name_parts) return f"{name}_{suffix}" return _repr