
     Ti                        S r SSKJr  SSKJrJr  SSKJrJr  SSK	r
SSK	Jr  \\\\\   4      r " S S5      r " S	 S
\5      rg)z,Convenience methods for constructing the IR.    )annotations)MappingSequence)AnyOptionalN)_conveniencec                  (   \ rS rSrSrSSS jjrSS jr\SS j5       r\SS j5       r	\SS j5       r
 SS	S	SSSSSSS
.                       SS jjjr SSSS	S	SSSSSS.	                         SS jjjrSSS jjrSrg)Tape   u  Tape class.

A tape is a recorder that collects nodes and initializers that are created so
that they can be used for creating a graph.

Example::

    >>> import onnx_ir as ir

    >>> tape = ir.tape.Tape()
    >>> a = tape.initializer(ir.tensor([1.0, 2.0, 3.0], name="a"))
    >>> b: ir.Value = ir.val("b", dtype=ir.DataType.FLOAT, shape=(3,))
    >>> c: ir.Value = ir.val("c", dtype=ir.DataType.FLOAT, shape=(3,))
    >>> x = tape.op("Add", [a, b])
    >>> y = tape.op("Elu", [x, c], attributes={"alpha": 2.0})
    >>> y.shape = ir.Shape((3,))
    >>> y.dtype = ir.DataType.FLOAT
    >>> model = ir.Model(
    ...     ir.Graph(
    ...         inputs=[b, c],
    ...         outputs=[y],
    ...         nodes=tape.nodes,
    ...         initializers=tape.initializers,
    ...         opset_imports={"": 20},
    ...         name="main_graph",
    ...     ),
    ...     ir_version=10,
    ... )
    >>> print(model)  # doctest: +NORMALIZE_WHITESPACE
    <
        ir_version=10,
        opset_imports={'': 20},
        producer_name=None,
        producer_version=None,
        domain=None,
        model_version=None,
    >
    graph(
        name=main_graph,
        inputs=(
            %"b"<FLOAT,[3]>,
            %"c"<FLOAT,[3]>
        ),
        outputs=(
            %"val_1"<FLOAT,[3]>
        ),
        initializers=(
            %"a"<FLOAT,[3]>{Tensor<FLOAT,[3]>(array([1., 2., 3.], dtype=float32), name='a')}
        ),
    ) {
        0 |  # node_Add_0
             %"val_0"<?,?> ⬅️ ::Add(%"a"{[1.0, 2.0, 3.0]}, %"b")
        1 |  # node_Elu_1
             %"val_1"<FLOAT,[3]> ⬅️ ::Elu(%"val_0", %"c") {alpha=2.0}
        return %"val_1"<FLOAT,[3]>
    }

Attributes:
    graph_like: The graph to append the new nodes and initializers to. When
        it is None, the nodes and initializers are creating without owned by a graph.
        Initializers will not be added to functions because it is not supported by ONNX.
Nc                J    / U l         / U l        [        5       U l        Xl        g N)_nodes_initializersset_used_opsets
graph_like)selfr   s     L/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnx_ir/_tape.py__init__Tape.__init__T   s     %'-/(+$    c                <    SU R                    SU R                   S3$ )NzTape(nodes=z, initializers=))r   r   r   s    r   __repr__Tape.__repr__Z   s"    T[[M9K9K8LANNr   c                ,    [        U R                  5      $ r   )tupler   r   s    r   nodes
Tape.nodes]   s    T[[!!r   c                ,    [        U R                  5      $ r   )r   r   r   s    r   initializersTape.initializersa   s    T''((r   c                    U R                   $ r   )r   r   s    r   used_opsetsTape.used_opsetse   s       r    )domainoverloadversiongraphname
doc_stringmetadata_propsoutputc               b   Uc  SnO[         R                  " U5      nUc
  [        SS9nO
[        U/S9n[        R                  " UUU4SU0UDUUU=(       d    U R
                  UU	U
S.D6nU R                  R                  U5        U R                  R                  XF45        UR                  S   $ )N    num_outputsoutputs
attributesr)   r*   r+   r,   r-   r.   r   )r   convert_attributesdictirNoder   r   appendr   addr6   )r   op_typeinputsr7   r(   r)   r*   r+   r,   r-   r.   r/   attrsoutput_kwargsnodes                  r   opTape.opi   s     ')E 33J?E> Q/M &2Mww
 	

 
 *4??!)
 	4 v/0||Ar   )	r4   r6   r(   r)   r*   r+   r,   r-   r.   c       	           Uc  Uc  [        S5      eUb  Ub  [        S5      eUc
  [        US9nO	[        US9nUc  SnO[        R                  " U5      n[        R
                  " UUU4SU0UDUUU	=(       d    U R                  U
UUS.D6nU R                  R                  U5        U R                  R                  Xh45        UR                  $ )Nz/Either num_outputs or outputs must be provided.z?Both num_outputs and outputs cannot be provided simultaneously.r3   r5   r1   r7   r8   )
ValueErrorr:   r   r9   r;   r<   r   r   r=   r   r>   r6   )r   r?   r@   r7   r4   r6   r(   r)   r*   r+   r,   r-   r.   rB   rA   rC   s                   r   op_multi_outTape.op_multi_out   s      7?NOO"w':^__? [9M 1M')E 33J?Eww
 	

 
 *4??!)
 	4 v/0||r   c                   U=(       d    UR                   nUc  [        S5      e[        R                  " S UR                  R
                   5       5      n[        R                  " X#[        R                  " UR                  5      US9nU R                  R                  U5        [        U R                  [        R                  5      (       a  U R                  R                  U5        U$ )Nz&Name must be provided for initializer.c              3  h   #    U  H(  n[        U[        5      (       a  UOUR                  v   M*     g 7fr   )
isinstanceintvalue).0ds     r   	<genexpr>#Tape.initializer.<locals>.<genexpr>   s'     [IZAz!S11!qww>IZs   02)r,   shapetypeconst_value)r,   rG   r;   ShaperS   dimsValue
TensorTypedtyper   r=   rL   r   Graphregister_initializer)r   tensorr,   rS   rN   s        r   initializerTape.initializer   s    "v{{<EFF[IZIZ[[v||)DRX
 	!!%(doorxx00OO007r   )r   r   r   r   r   )r   zir.Graph | ir.Function | NonereturnNone)r`   str)r`   zSequence[ir.Node])r`   Sequence[ir.Value])r`   
UsedOpsets)r?   rb   r@   Sequence[ir.Value | None]r7   4Mapping[str, _convenience.SupportedAttrTypes] | Noner(   rb   r)   rb   r*   
int | Noner+   ir.Graph | Noner,   
str | Noner-   ri   r.   dict[str, str] | Noner/   zir.Value | Noner`   ir.Value)r?   rb   r@   re   r7   rf   r4   rg   r6   zSequence[ir.Value] | Noner(   rb   r)   rb   r*   rg   r+   rh   r,   ri   r-   ri   r.   rj   r`   rc   )r]   zir.TensorProtocolr,   ri   r`   rk   )__name__
__module____qualname____firstlineno____doc__r   r   propertyr   r"   r%   rD   rH   r^   __static_attributes__r1   r   r   r
   r
      s   =~%O " " ) ) ! ! LP	( "!%!%04"&(( *( I	( ( ( ( ( ( ( .(  ( 
(\ LP	- #'-1"!%!%04-- *- I	-  - +- - - - - - - .- 
-^ r   r
   c                  :   ^  \ rS rSrSrSS jrSU 4S jjrSrU =r$ )Builder   zUAn extension of the tape that provides a more convenient API for constructing the IR.c                   ^ ^ UU 4S j$ )Nc                 (   > TR                  TX5      $ r   )
_make_node)argskwargsr?   r   s     r   <lambda>%Builder.__getattr__.<locals>.<lambda>   s    tw'Mr   r1   )r   r?   s   ``r   __getattr__Builder.__getattr__   s	    MMr   c           	       > UR                  SS5      nUR                  SS 5      nUR                  SS5      n[        U[        5      (       a  [        U5      nO[        U[        5      (       d   eUnUS:X  a0  [
        TU ]  XX4US9n[        U[        5      (       a
  US   Ul        U$ [
        TU ]!  UUUUUUS9n	[        U[        5      (       a  [        X5       H  u  pXl        M     U	$ )	N_domainr'   _version_outputsr2   )r@   r7   r(   r*   r   )r@   r7   r(   r*   r4   )
poprL   r   lenrM   superrD   r,   rH   zip)r   r?   r@   rz   r(   r*   r6   r4   rN   valuesr,   	__class__s              r   rx   Builder._make_node   s    Ir***Z.**Z+gx((g,Kgs++++!K!GJ6RY  E '8,,$QZ
L%# & 
 gx(("63!
  4r   r1   )r?   rb   r`   r   )r?   rb   r@   rc   rz   zdict[str, Any])	rl   rm   rn   ro   rp   r}   rx   rr   __classcell__)r   s   @r   rt   rt      s    _N r   rt   )rp   
__future__r   collections.abcr   r   typingr   r   onnx_irr;   r   r   r   rb   rM   rd   r
   rt   r1   r   r   <module>r      sP    3 " -
    sHSM)*+
y yx"d "r   