o
    vi                     @  s   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZ ddlZddlmZmZ ddlmZ ed	d
G dd deZed	d
G dd deZG dd deZG dd deZdS )aJ  
Extended Conditioner classes for Cosmos Policy.

This module provides mutable (frozen=False) versions of condition dataclasses
and a modified GeneralConditioner that skips uncondition when all dropout rates are 0.

Conditions need to be mutable for Cosmos Policy since it modifies parts of the condition
objects during training.
    )annotations)ABC)	dataclassfields)AnyDictOptionalTupleN)DataTypebroadcast_condition)GeneralConditionerF)frozenc                   @  sB   e Zd ZU dZdZded< ddd	d
ZedddZdddZ	dS )BaseConditionz
    Mutable version of BaseCondition for Cosmos Policy.

    Attributes:
        _is_broadcasted: Flag indicating if parallel broadcast splitting
            has been performed. This is an internal implementation detail.
    Fbool_is_broadcastedTskip_underscorereturnDict[str, Any]c                   s    fddt  D S )zConverts the condition to a dictionary.

        Returns:
            Dictionary containing the condition's fields and values.
        c                   s,   i | ]}|j d rs|j t |j qS )_)name
startswithgetattr).0fselfr    ?/data/cameron/vidgen/cosmos-policy/cosmos_policy/conditioner.py
<dictcomp>@   s   , z)BaseCondition.to_dict.<locals>.<dictcomp>)r   r   r   r   r   to_dict:   s   zBaseCondition.to_dictc                 C  s   | j S N)r   r   r   r   r   is_broadcastedB   s   zBaseCondition.is_broadcastedprocess_grouptorch.distributed.ProcessGroupc                 C  s   | j r| S t| |S )a]  Broadcasts and splits the condition across the checkpoint parallelism group.
        For most condition, such as Text2WorldCondition, we do not need split.

        Args:
            process_group: The process group for broadcast and split

        Returns:
            A new BaseCondition instance with the broadcasted and split condition.
        )r"   r   )r   r#   r   r   r   	broadcastF   s   

zBaseCondition.broadcastN)T)r   r   r   r   r   r   )r#   r$   r   r   )
__name__
__module____qualname____doc__r   __annotations__r   propertyr"   r%   r   r   r   r   r   .   s   
 r   c                   @  s\   e Zd ZU dZdZded< ejZded< dZ	ded< dZ
ded< dd
dZedddZdS )Text2WorldConditionz9Mutable version of Text2WorldCondition for Cosmos Policy.NzOptional[torch.Tensor]crossattn_embr
   	data_typepadding_maskfpsr   c                 C  s&   | j dd}||d< t| di |S )zEdit the data type of the condition.

        Args:
            data_type: The new data type.

        Returns:
            A new Text2WorldCondition instance with the new data type.
        F)r   r/   Nr   )r   type)r   r/   kwargsr   r   r   edit_data_type^   s   	z"Text2WorldCondition.edit_data_typer   c                 C  s   | j tjkS r    )r/   r
   VIDEOr!   r   r   r   is_videok   s   zText2WorldCondition.is_video)r/   r
   r   r-   r&   )r'   r(   r)   r*   r.   r+   r
   r5   r/   r0   r1   r4   r,   r6   r   r   r   r   r-   U   s   
 
r-   c                   @  s   e Zd ZdZd	ddZdS )
r   z
    Extended GeneralConditioner for Cosmos Policy.

    Modifies get_condition_uncondition to skip uncondition generation when all dropout rates are 0,
    supporting always-conditional generation instead of CFG.
    
data_batchr   r   Tuple[Any, Any]c                 C  s|   i i }}| j  D ]\}}d||< |jdkrdnd||< q
||kr.| ||d}d}||fS | ||d}| ||d}||fS )ue  
        NOTE (user): Modified to remove the "uncondition" since we are doing always-conditional generation instead of CFG.

        Processes the provided data batch to generate two sets of outputs: conditioned and unconditioned. This method
        manipulates the dropout rates of embedders to simulate two scenarios — one where all conditions are applied
        (conditioned), and one where they are removed or reduced to the minimum (unconditioned).

        This method first sets the dropout rates to zero for the conditioned scenario to fully apply the embedders' effects.
        For the unconditioned scenario, it sets the dropout rates to 1 (or to 0 if the initial unconditional dropout rate
        is insignificant) to minimize the embedders' influences, simulating an unconditioned generation.

        Parameters:
            data_batch (Dict): The input data batch that contains all necessary information for embedding processing. The
                            data is expected to match the required format and keys expected by the embedders.

        Returns:
            Tuple[Any, Any]: A tuple containing two condition:
                - The first one contains the outputs with all embedders fully applied (conditioned outputs).
                - The second one contains the outputs with embedders minimized or not applied (unconditioned outputs).
        g        g-C6?g      ?)override_dropout_rateN)	embeddersitemsdropout_rate)r   r7   cond_dropout_ratesdropout_ratesemb_nameembedder	conditionun_conditionr   r   r   get_condition_unconditionx   s   
z,GeneralConditioner.get_condition_unconditionN)r7   r   r   r8   )r'   r(   r)   r*   rC   r   r   r   r   r   p   s    r   c                      s&   e Zd ZdZ	dd fd	d
Z  ZS )VideoConditionerzEVideoConditioner using mutable Text2WorldCondition for Cosmos Policy.Nbatchr   r9   Optional[Dict[str, float]]r   r-   c                   s   t  ||}tdi |S )Nr   )super_forwardr-   )r   rE   r9   output	__class__r   r   forward   s   zVideoConditioner.forwardr    )rE   r   r9   rF   r   r-   )r'   r(   r)   r*   rL   __classcell__r   r   rJ   r   rD      s    rD   )r*   
__future__r   abcr   dataclassesr   r   typingr   r   r   r	   torch'cosmos_policy._src.predict2.conditionerr
   r   r   Z_GeneralConditionerr   r-   rD   r   r   r   r   <module>   s   
&0