o
    
۾i                     @   sz   d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 e	 s%e
dddlZeeZG dd	 d	ZG d
d dZdS )a   
Configuration management for Helion kernels.

This module provides centralized configuration file management for Helion custom
operations, including naming conventions, directory resolution, and file I/O.

Config File Structure
---------------------
Each kernel has a single JSON config file: {kernel_name}.json

The file uses a simplified 2-layer hierarchical structure:
{
    "h100": {                             # GPU platform
        "default": { ... },               # Fallback configuration
        "batch_32_hidden_4096": { ... },
        "batch_64_hidden_8192": { ... }
    },
    "a100": {
        "default": { ... },
        "batch_16_hidden_2048": { ... }
    }
}

Example file: silu_mul_fp8.json

Config keys should be structured strings that encode the relevant
parameters (e.g., "batch_32_hidden_4096", "seq_512_heads_16", "fp8_batch_64", etc.).

Classes
-------
- ConfigSet: In-memory collection of configs for a kernel with lookup/query APIs.
- ConfigManager: File-level operations for config persistence.
    N)Path)Any)init_logger)
has_helionzRConfigManager requires helion to be installed. Install it with: pip install helionc                   @   s   e Zd ZdZeeeedf f ZdefddZedefddZ	d	ed
ede
jfddZdee fddZd	edee fddZdeeef fddZededeeef dd fddZdS )	ConfigSetzFIn-memory collection of Helion configs with lookup/query capabilities.zhelion.Configkernel_namec                 C   s   || _ i | _d S N)_kernel_name_configsselfr    r   V/home/ubuntu/.local/lib/python3.10/site-packages/vllm/kernels/helion/config_manager.py__init__>   s   
zConfigSet.__init__returnc                 C   s   | j S r   )r	   r   r   r   r   r   B   s   zConfigSet.kernel_nameplatform
config_keyc              	   C   s   | j |}|d u r|  }td| j d| d|pd ||}|d u r?| |}td| j d| d| d|p;d |S )NzConfig not found for kernel 'z': platform 'z"' not found. Available platforms: z(none)z': config_key 'z' not found for platform 'z'. Available config_keys: )r
   getget_platformsKeyErrorr	   get_config_keys)r   r   r   platform_dictavail_platformsconfig
avail_keysr   r   r   
get_configF   s.   



zConfigSet.get_configc                 C   s   t | j S r   )sortedr
   keysr   r   r   r   r   [   s   zConfigSet.get_platformsc                 C   s(   | j | }|d u rg S t| S r   )r
   r   lowerr   r   )r   r   r   r   r   r   r   ^   s   zConfigSet.get_config_keysc                 C   sT   i }| j  D ] \}}i ||< | D ]\}}dd l}|| || |< qq|S )Nr   )r
   itemsjsonloadsto_json)r   resultr   config_keys_dictr   r   r!   r   r   r   to_dictd   s   zConfigSet.to_dictdatac           
      C   s   | |}d}|  D ]*\}}||jvri |j|< |  D ]\}}tjdi |}	|	|j| |< |d7 }qq
|dkr@td|| |S )Nr      z!Loaded %d configs for kernel '%s'r   )r    r
   helionConfigloggerdebug)
clsr   r'   
config_setcountr   platform_datar   config_datar   r   r   r   	from_dictr   s"   


zConfigSet.from_dictN)__name__
__module____qualname____doc__dictstr_ConfigDictr   propertyr   r)   r*   r   listr   r   r   r&   classmethodr2   r   r   r   r   r   7   s    $r   c                       s  e Zd ZU dZdZded< dZedB ed< ddeeB dB dd f fdd	Z	ddeeB dB fd
dZ
edeeB dB defddZed ddZed!ddZdedefddZdefddZdedefddZdededeeejf fddZdedefddZ  ZS )"ConfigManagerzJFile-level configuration management for Helion kernels (global singleton).NzConfigManager | None	_instance_instance_base_dirbase_dirr   c                    sX   |  |}| jd ur| j|krtd| j d| d| jS t | }|| _|| _|S )Nz6ConfigManager singleton already exists with base_dir 'z*', cannot create with different base_dir '')_resolve_base_dirr>   r?   
ValueErrorsuper__new__)r-   r@   resolved_base_dirinstance	__class__r   r   rE      s   


zConfigManager.__new__c                 C   s,   t | drd S | || _td| j d S )N	_base_dirz+ConfigManager initialized with base_dir: %s)hasattrrB   rJ   r+   r,   )r   r@   r   r   r   r      s   
zConfigManager.__init__c                 C   s&   | d ur
t |  S t tjd  S )Nconfigs)r   resolve__file__parent)r@   r   r   r   rB      s   zConfigManager._resolve_base_dirc                 C   s   | j d u r	td| j S )NzbConfigManager instance has not been created. Call ConfigManager(base_dir=...) first to initialize.)r>   RuntimeErrorr-   r   r   r   get_instance   s
   
zConfigManager.get_instancec                 C   s   d| _ d| _dS )zFor testing purposes only.N)r>   r?   rQ   r   r   r   reset_instance   s   
zConfigManager.reset_instancer   c                 C   s   | j | d S )Nz.json)rJ   r   r   r   r   get_config_file_path   s   z"ConfigManager.get_config_file_pathc                 C   s   | j jddd | j S )NTparentsexist_ok)rJ   mkdirr   r   r   r   ensure_base_dir_exists   s   z$ConfigManager.ensure_base_dir_existsc              
   C   s   |  |}| st|i S z t|}t|}W d    n1 s$w   Y  t||W S  tjtfyQ } zt	
d|| t|i W  Y d }~S d }~ww )Nz!Failed to load config file %s: %s)rT   existsr   r2   openr!   loadJSONDecodeErrorOSErrorr+   error)r   r   config_pathfr'   er   r   r   load_config_set   s   

zConfigManager.load_config_setr   c                    s(   |  |  } fdd|D S )Nc                    s   i | ]	}|  |qS r   )r   ).0r   r.   r   r   r   
<dictcomp>   s    z6ConfigManager.get_platform_configs.<locals>.<dictcomp>)rc   r   )r   r   r   config_keysr   re   r   get_platform_configs   s
   

z"ConfigManager.get_platform_configsr.   c                 C   sj   |  |j}|jjddd t|d}tj| |dd W d    n1 s(w   Y  t	d| |S )NTrU   w   )indentzSaved config to: %s)
rT   r   rO   rX   r[   r!   dumpr&   r+   info)r   r.   r`   ra   r   r   r   save_config_set   s   zConfigManager.save_config_setr   )r   r=   )r   N)r3   r4   r5   r6   r>   __annotations__r?   r   r8   rE   r   staticmethodrB   r<   rR   rS   rT   rY   r   rc   r7   r)   r*   rh   rn   __classcell__r   r   rH   r   r=      s.   
  
r=   )r6   r!   pathlibr   typingr   vllm.loggerr   vllm.utils.import_utilsr   ImportErrorr)   r3   r+   r   r=   r   r   r   r   <module>   s   "S