§
    2�Åj)  ã                  óÜ   — d Z ddlmZ ddlZddlZ ej        ¦   «         5  ddlZddlmZmZm	Z	 ddd¦  «         n# 1 swxY w Y   dZ
dZdd„Zd	„ Zd
„ Zd„ Zd„ Zedk    r e¦   «          dS dS )a3  Atheris fuzz harness for onnx.shape_inference.

Two input paths are exercised per iteration, selected by a fuzzer-controlled
toggle byte read from the *tail* of the input (so the head remains a valid
candidate for the raw-bytes path):

* Raw bytes  -> onnx.load_model_from_string  -> infer_shapes
  Catches protobuf parser bugs and bugs reachable only through crafted
  serialized models the structured builder will not produce.

* Structured -> helper.make_model from FuzzedDataProvider -> infer_shapes
  Constructs ModelProto objects whose graphs include subgraph-bearing
  ops (If / Loop / Scan) so the recursive visitor inside shape_inference
  is reached on most iterations rather than only when the parser happens
  to accept a random byte string.

Both strict_mode values and both check_type values are sampled.
é    )ÚannotationsN)ÚTensorProtoÚhelperÚshape_inference)ÚReluÚSigmoidÚTanhÚAbsÚNegÚExpÚLogÚSqrtÚIdentityÚFloorÚCeil)ÚIfÚLoopÚScanTc                óx   — t          j        | t          j        g |g¦  «        }t          j        dg | g|¬¦  «        S )NÚConstant©Úvalue)r   Úmake_tensorr   ÚBOOLÚ	make_node)Únamer   Útensors      úOC:\Projects\Historical\venv\Lib\site-packages\onnx/fuzz/fuzz_shape_inference.pyÚ_const_boolr   7   s9   € ÝÔ ¥kÔ&6¸¸U¸GÑDÔD€FÝÔ˜J¨¨T¨F¸&ÐAÑAÔAÐAó    c           
     óÂ  — g }d|› �}t          j        |t          j        dgdg¦  «        }|                     t          j        dg |g|¬¦  «        ¦  «         ||k     �r´|                      ¦   «         �rŸt          |                      dt          t          ¦  «        dz
  ¦  «                 }d|› �}t          | |dz   |¦  «        }|dk    rjd	|› �}	|                     t          |	¦  «        ¦  «         t          | |dz   |¦  «        }
|                     t          j        d|	g|g||
¬
¦  «        ¦  «         nÝ|dk    r©d|› �}t          j        |t          j        g dg¦  «        }|                     t          j        dg |g|¬¦  «        ¦  «         d	|› �}	|                     t          |	¦  «        ¦  «         |                     t          j        d||	g|g|¬¦  «        ¦  «         n.|                     t          j        d|g|g|d¬¦  «        ¦  «         |}n•|}|                      dd¦  «        }t          |¦  «        D ]m}t          |                      dt          t          ¦  «        dz
  ¦  «                 }d|› d|› �}|                     t          j        ||g|g¦  «        ¦  «         |}Œnt          j        |d|› �g t          j        |t          j        d¦  «        g¬¦  «        S )a)  Build a self-contained subgraph.

    Self-contained means the subgraph produces its own starting tensor via
    a Constant node, so the branch does not depend on outer-scope captures
    we did not declare. With probability the branch nests one of
    If/Loop/Scan, which is what drives the recursion inside shape_inference.
    Loop and Scan body subgraphs are deliberately not signature-conformant;
    the recursive visitor descends before signature checks run, so the
    recursion path is still exercised even when inference ultimately fails.
    Ús_é   g        r   r   r   Úsub_r   Úc_)Úthen_branchÚelse_branchr   ÚM_)Úbodyr   )r)   Únum_scan_inputsé   Úv_Ú_Úbranch_N)ÚinputsÚoutputs)r   r   r   ÚFLOATÚappendr   ÚConsumeBoolÚ_SUBGRAPH_OPSÚConsumeIntInRangeÚlenÚ_build_branchr   ÚINT64ÚrangeÚ_UNARYÚ
make_graphÚmake_tensor_value_info)ÚfdpÚdepthÚ	max_depthÚnodesÚstartÚstart_tensorÚsub_opÚoutr)   ÚcondÚ	else_bodyÚtripÚtrip_tÚlastÚn_opsÚiÚopÚnxts                     r   r7   r7   <   s"  € ð €EØ�ˆLˆL€EÝÔ% e­[Ô->ÀÀÀcÀUÑKÔK€LØ	‡L‚L•Ô! *¨b°5°'ÀÐNÑNÔNÑOÔOÐOàˆyÒÑ˜SŸ_š_Ñ.Ô.ÑÝ˜s×4Ò4°Q½½MÑ8JÔ8JÈQÑ8NÑOÔOÔPˆØ�UˆnˆnˆÝ˜S %¨!¡)¨YÑ7Ô7ˆØ�TŠ>ˆ>Ø˜�<�<ˆDØ�LŠL� TÑ*Ô*Ñ+Ô+Ð+Ý% c¨5°1©9°iÑ@Ô@ˆIØ�LŠLÝÔ ØØ�FØ�EØ $Ø )ðñ ô ñô ð ð ð �vÒÐØ˜�<�<ˆDÝÔ'¨­kÔ.?ÀÀaÀSÑIÔIˆFØ�LŠL�Ô)¨*°b¸4¸&ÈÐOÑOÔOÑPÔPÐPØ˜�<�<ˆDØ�LŠL� TÑ*Ô*Ñ+Ô+Ð+Ø�LŠLÝÔ ØØ˜4�LØ�EØð	ñ ô ñô ð ð ð �LŠLÝÔ ØØ�GØ�EØØ$%ðñ ô ñô ð ð ˆˆàˆØ×%Ò% a¨Ñ+Ô+ˆÝ�u‘”ð 	ð 	ˆAÝ˜×-Ò-¨aµµV±´¸q±ÑAÔAÔBˆBØ"�uÐ"Ð"˜qÐ"Ð"ˆCØ�LŠL�Ô)¨"¨t¨f°s°eÑ<Ô<Ñ=Ô=Ð=ØˆDˆDåÔØØ�%ÐÐØÝÔ.¨tµ[Ô5FÈÑMÔMÐNð	ñ ô ð r    c                óÒ   — |                       dd¦  «        }t          | d|¬¦  «        }|                       dd¦  «        }t          j        |t          j        d|¦  «        g¬¦  «        S )Nr   éP   )r>   r?   é   é   Ú )Úopset_imports)r5   r7   r   Ú
make_modelÚmake_opsetid)r=   r?   ÚgraphÚopsets       r   Ú_build_modelrX   ‡   sr   € ð ×%Ò% a¨Ñ,Ô,€IÝ˜# Q°)Ð<Ñ<Ô<€EØ×!Ò! ! RÑ(Ô(€EÝÔØÝÔ*¨2¨uÑ5Ô5Ð6ðñ ô ð r    c                ó‚  — t          | ¦  «        dk     rd S | d         }t          |dz  ¦  «        }t          |dz  ¦  «        }t          |dz  ¦  «        }	 |r,t          j        | d d…         ¦  «        }t	          |¦  «        }nt          j        | ¦  «        }t          j        |||¬¦  «         d S # t          $ r Y d S w xY w)Né   éÿÿÿÿr#   r+   )Ú
check_typeÚstrict_mode)
r6   ÚboolÚatherisÚFuzzedDataProviderrX   ÚonnxÚload_model_from_stringr   Úinfer_shapesÚ	Exception)ÚdataÚtogglesÚstrictr\   Úuse_structuredr=   Úmodels          r   ÚTestOneInputrj   ”   së   € õ ˆ4�y„y�1‚}€}ØˆØ�2Œh€GÝ�'˜D‘.Ñ!Ô!€FÝ�g ‘nÑ%Ô%€JÝ˜' D™.Ñ)Ô)€NðØð 	6ÝÔ,¨T°#°2°#¬YÑ7Ô7ˆCÝ  Ñ%Ô%ˆEˆEåÔ/°Ñ5Ô5ˆEÝÔ$ØØ!Øð	
ñ 	
ô 	
ð 	
ð 	
ð 	
øõ
 ð ð ð ð 	ˆˆð	øøøs   ÁAB0 Â0
B>Â=B>c                 óž   — t          j        ¦   «          t          j        t          j        t
          d¬¦  «         t          j        ¦   «          d S )NT)Úenable_python_coverage)r_   Úinstrument_allÚSetupÚsysÚargvrj   ÚFuzz© r    r   Úmainrs   ¶   s9   € ÝÔÑÔÐÝ„M•#”(�LÀÐFÑFÔFÐFÝ„L�N„N€N€N€Nr    Ú__main__)T)Ú__doc__Ú
__future__r   ro   r_   Úinstrument_importsra   r   r   r   r:   r4   r   r7   rX   rj   rs   Ú__name__rr   r    r   ú<module>ry      sM  ððð ð& #Ð "Ð "Ð "Ð "Ð "à 
€
€
€
à €€€à€WÔÑ!Ô!ð :ð :Ø€K€K€KØ9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð
€ð" '€ðBð Bð Bð Bð
Hð Hð HðV
ð 
ð 
ðð ð ðDð ð ð ˆzÒÐØ€D�F„F€F€F€Fð Ðs    ;»?Á?