+
    ;j+  c                      R t ^ RIt^ RIHu Ht ^ RIt^ RIt^ RI	H
t
 ^ RIt^ RIt^ RIt^ RIt^ RIt]P"                  P%                  ]P"                  P'                  ]P"                  P)                  ]4      R4      4      t]P"                  P/                  ^ ]4       ^ RIHtHt ^ RIHtHtHtHtH t H!t!H"t"H#t# ^ RI$H%t%H&t& R t' ! R R	4      t( ! R
 R4      t)Rt* ! R R4      t+R# )ap  
Tests for tools/generate_pine_mlp_presets.py (Pine MLP codegen).

Tests:
  1. Float round-trip: 7-sig-fig formatting (fmt_float9) round-trips weights within 1e-6 relative error.
  2. Sentinel replacement: rewriting the sentinel block in a minimal Pine file is idempotent.
  3. Weight init coverage: every generated block contains _w1/_b1/_w2/_b2/_w3/_b3 assignments.
N)Pathz..)save_mlp_artifactFEATURE_COLS)
fmt_float9emit_weight_initgenerate_blockSENTINEL_STARTSENTINEL_END_ASSETS_TFS_THRESHOLD_PARAMS)
PLOT_LIMITcount_plot_callsc                  f   \        \        4      R ,          R,          p V P                  4       p\        \        P
                  ! RV4      4      pRq3V9   qD'       g   \        P                  ! R V3R!W134      R\        P                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\        \        P                  ! V4      4      hR	;r4R
q3V9   qD'       g   \        P                  ! R V3R!W134      R\        P                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\        \        P                  ! V4      4      hR	;r4\        \        4      qDV8*  qw'       Eg]   \        P                  ! R"V3R#WB34      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRR\        P                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\        \        P                  ! V4      4      hR	;rG\        P                  p	Rq! W4      pR	qVJ q'       EgI   \        P                  ! R$V3R%W34      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRR\        P                  ! V	4      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p\        \        P                  ! V4      4      hR	;p	;p
;p;r\        P                  p	Rq! W4      pR	qVJ q'       EgI   \        P                  ! R$V3R%W34      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRR\        P                  ! V	4      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p\        \        P                  ! V4      4      hR	;p	;p
;p;r\!        V 4      p
\#        V
4      pV\$        8*  pV'       Eg   \        P                  ! R"V3R&V\$        34      RR\        P                  ! 4       9   g!   \        P                  ! \"        4      '       d   \        P                  ! \"        4      MRRR\        P                  ! 4       9   g!   \        P                  ! \         4      '       d   \        P                  ! \         4      MRRR\        P                  ! 4       9   g   \        P                  ! V 4      '       d   \        P                  ! V 4      MRR\        P                  ! V
4      R\        P                  ! V4      RR\        P                  ! 4       9   g!   \        P                  ! \$        4      '       d   \        P                  ! \$        4      MR/,          pRRV/,          p\        \        P                  ! V4      4      hR	;p
;ppR	# )'
strategieszstrategy_mlp_scores.pinez0\bplot(?:char)?\s*\([^\n]*?title\s*=\s*"([^"]+)"ztitle="trail_stop_price_ratio"py1py3pineassert %(py5)spy5Nztitle="trail_high_price_ratio"py0setr   exported_titleszassert %(py7)spy7z\bplotchar\s*\(\s*close\s*[,)]repy2py4py10zassert %(py12)spy12z0\bplotchar\s*\(\s*strategy\.position_size\s*[,)]r   str	pine_pathpy6py8r   zassert %(py10)sinz%(py1)s in %(py3)s<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py5)s)is)zV%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s)
} is %(py10)s)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} <= %(py8)s)r   REPO	read_textr   r   findall
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr   searchr   r   r   )r   r   r   @py_assert0@py_assert2@py_format4@py_format6@py_assert4@py_format8@py_assert1@py_assert3@py_assert6@py_assert9@py_assert8@py_format11@py_format13@py_assert5@py_assert7@py_format9s                      B/Users/jameslopez/projects/TradingBot25/tests/test_pine_codegen.py;test_pine_exports_only_normalized_trailing_stop_diagnosticsrE   $   s   T
\),FFI D"**%XZ^_`O+3t33333+333+333333t3333t33333333+3t33333+333+333333t3333t33333333|////////////3////3///////|////|/////////////////////99E6E96=EEEEEEE=EEEEEE2EEEE2EEE9EEE6EEEEEEEEEEEEE=EEEEEEEEEEE99WHW9HOWSWWSWWWWWWOWWWWWW2WWWW2WWW9WWWHWWWWWW$WWWW$WWWOWWWSWWWWWWWWW	N9N+9+z99999+z99999999999999999C9999C9999999	9999	999N999+999999z9999z99999999    c                   B   a  ] tR t^3t o RtR tR tR tR tR t	Rt
V tR# )	TestFloatFormattinguV   fmt_float9 should round-trip float64 values with ≤ 1e-6 relative error (7 sig figs).c                   \         P                  P                  ^*4      pVP                  RRR4      pV EF6  p\	        V4      p\        V4      p\        V4      R8  g   K,  \        WS,
          4      \        V4      ,          pRqvV8  q'       g   \        P                  ! RV3RWg34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      /,          p	\        P                  ! RV: R	V R
V: RV 24      R,           RV	/,          p
\        \        P                  ! V
4      4      hR;rEK9  	  R# )*   g      @i  V瞯<ư>r   rel_errr   zRound-trip failed: u    → 'u   ' → z
, rel_err=
>assert %(py5)sr   Ng      <)z%(py0)s < %(py3)s)nprandomdefault_rnguniformr   floatabsr+   r,   r.   r/   r0   r-   _format_assertmsgr1   r2   )selfrngvalsvsrtrM   r5   r:   r6   r7   s   &          rD   test_round_trip_random_weights2TestFloatFormatting.test_round_trip_random_weights6   s    ii##B'{{4c*A1AqB1v~bf+A.!%j~jjjjwjjjjjjwjjjjwjjjjjjj)<QEs&QSPVV`ah`i'jjjjjjjjj rF   c                   R p\        V4      pRq2V8H  qD'       g   \        P                  ! R
V3RW#34      RR\        P                  ! 4       9   g!   \        P
                  ! \         4      '       d   \        P                  ! \         4      MRR\        P                  ! V4      R\        P                  ! V4      R\        P                  ! V4      /,          pRRV/,          p\        \        P                  ! V4      4      hR	;p;p;rCR	# )        z0.0r   r   r   r   r   zassert %(py9)spy9N==)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)s)	r   r+   r,   r.   r/   r0   r-   r1   r2   )rX   r:   r;   r<   rA   r9   @py_format10s   &      rD   	test_zeroTestFloatFormatting.test_zero@   s    'z#'%'%'''''''''''z''''z'''#''''''%''''''''rF   c                   R p\        V4      p\        V4      q3V,
          p\        V4      p\        V4      qeV,          pRqV8  q'       Eg   \        P                  ! RV	3RWx34      RR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\
        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	R
\
        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR
R\        P                  ! V4      RR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR
\
        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR
R\        P                  ! V4      R\        P                  ! V4      /
,          p
RRV
/,          p\        \        P                  ! V4      4      hR;p;p;p;p;p;rR# )gwf>rL   r   rV   r   rU   r   r\   r   r   r[   r!   rb   r   r   py16assert %(py18)spy18NrO   z(%(py8)s
{%(py8)s = %(py0)s((%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
} - %(py5)s))
} / %(py12)s
{%(py12)s = %(py9)s(%(py10)s)
}) < %(py16)sr   rU   rV   r+   r,   r.   r/   r0   r-   r1   r2   rX   r[   r\   r;   r<   rB   @py_assert11@py_assert13@py_assert15@py_assert14@py_format17@py_format19s   &           rD   test_very_small#TestFloatFormatting.test_very_smallC   sr   qM80a<0s< 03q606)0D0D00000)000000s0000s0000000500005000000000000008000000a0000a000 0000003000030000000q0000q0006000D000000000rF   c                   R p\        V4      p\        V4      q3V,
          p\        V4      p\        V4      qeV,          pRqV8  q'       Eg   \        P                  ! RV	3RWx34      RR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR\
        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      R	R
\
        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR
R\        P                  ! V4      RR\
        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                  ! \        4      MRRR
\
        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR
R\        P                  ! V4      R\        P                  ! V4      /
,          p
RRV
/,          p\        \        P                  ! V4      4      hR;p;p;p;p;p;rR# )g)gArL   r   rV   r   rU   r   r\   r   r   r[   r!   rb   r   r   ri   rj   rk   NrO   rl   rm   rn   s   &           rD   test_very_large#TestFloatFormatting.test_very_largeH   sr   qM80a<0s< 03q606)0D0D00000)000000s0000s0000000500005000000000000008000000a0000a000 0000003000030000000q0000q0006000D000000000rF   c                P   \         P                  P                  ^4      pVP                  RR^4      pV EF  p\	        V4      p. pRqfV9   qwq'       g   RqV9   qpV'       Eg   \
        P                  ! RV3RWd34      R\
        P                  ! V4      RR\        P                  ! 4       9   g   \
        P                  ! V4      '       d   \
        P                  ! V4      MR/,          pRRV/,          qP                  V4       V'       g   \
        P                  ! RX
3RX	V34      R	\
        P                  ! V	4      R
R\        P                  ! 4       9   g   \
        P                  ! V4      '       d   \
        P                  ! V4      MR/,          pRRV/,          qP                  V4       \
        P                  ! V^4      / ,          p\
        P                  ! RV R24      R,           RV/,          p\        \
        P                  ! V4      4      hR;p;p;p;p;rEK  	  R# )z7All formatted floats must be valid Pine float literals.g      Y@.er   r   r\   %(py7)sr   r   r   %(py14)spy14zNo decimal/exponent in: ''z
>assert %(py17)spy17Ng      Yr"   z%(py3)s in %(py5)sz%(py10)s in %(py12)s)rQ   rR   rS   rT   r   r+   r,   r-   r.   r/   r0   append_format_booloprW   r1   r2   )rX   rY   rZ   r[   r\   r:   r5   r8   r4   r=   ro   r7   r9   r@   @py_format15@py_format16@py_format18s   &                rD   "test_has_decimal_point_or_exponent6TestFloatFormatting.test_has_decimal_point_or_exponentM   s%   ii##A&{{65#.A1AI3I!8IIsIaxIIII3III3IIIIII!IIII!IIIIIIIIIsaIIIsIIIIIIaIIIIaIIIIIIIIIII+DQCq)IIIIIIIIII rF    N)__name__
__module____qualname____firstlineno____doc__r^   rf   ru   rx   r   __static_attributes____classdictcell____classdict__s   @rD   rH   rH   3   s)     `k(1
1
J JrF   rH   c                   <   a  ] tR t^Xt o RR ltR tR tR tRtV t	R# )TestEmitWeightInitc                @   \         P                  P                  V4      p. p\        \	        V4      ^,
          4       F]  pVP                  R^W^,           ,          W,          34      pVP                  RRW^,           ,          4      pVP                  Wg34       K_  	  V# )   g?g)rQ   rR   rS   rangelenrT   r   )rX   archseedrY   layersiWbs   &&&     rD   _make_layersTestEmitWeightInit._make_layersY   s~    ii##D)s4y1}%ABD1Itw#78AD#taCy1AMM1&! & rF   c                
   . ROpV P                  V4      p\        W!4      pRP                  V4      p. pRqfV9   qwq'       d   RqV9   qpV'       Eg   \        P                  ! RV3RWd34      R\        P
                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P
                  ! V4      MR/,          pRRV/,          qP                  V4       V'       d   \        P                  ! RX
3RX	V34      R	\        P
                  ! V	4      R
R\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P
                  ! V4      MR/,          pRRV/,          qP                  V4       \        P                  ! V^ 4      / ,          pRRV/,          p\        \        P                  ! V4      4      hR;p;p;p;p;r. pRqfV9   qwq'       d   RqV9   qpV'       Eg   \        P                  ! RV3RWd34      R\        P
                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P
                  ! V4      MR/,          pRRV/,          qP                  V4       V'       d   \        P                  ! RV
3RW34      R	\        P
                  ! V	4      R
R\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P
                  ! V4      MR/,          pRRV/,          qP                  V4       \        P                  ! V^ 4      / ,          pRRV/,          p\        \        P                  ! V4      4      hR;p;p;p;p;r. pRqfV9   qwq'       d   RqV9   qpV'       Eg   \        P                  ! RV3RWd34      R\        P
                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P
                  ! V4      MR/,          pRRV/,          qP                  V4       V'       d   \        P                  ! RV
3RW34      R	\        P
                  ! V	4      R
R\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P
                  ! V4      MR/,          pRRV/,          qP                  V4       \        P                  ! V^ 4      / ,          pRRV/,          p\        \        P                  ! V4      4      hR;p;p;p;p;rR# )   
_w1_b1r   r   	pine_textr}   r   r   r   r~   r   assert %(py17)sr   N_w2_b2_w3_b3)r         r   r"   r   r   )r   r   joinr+   r,   r-   r.   r/   r0   r   r   r1   r2   )rX   r   r   linesr   r:   r5   r8   r4   r=   ro   r7   r9   r@   r   r   r   s   &                rD   test_produces_pine_lines+TestEmitWeightInit.test_produces_pine_linesb   s   ""4( .IIe$	8u8	!88e8y&88888u888u888888	8888	888888888ey888e888888y8888y88888888888888888u8	!88e8y&88888u888u888888	8888	888888888e888e888888y8888y88888888888888888u8	!88e8y&88888u888u888888	8888	888888888e888e888888y8888y8888888888888888rF   c                  a . R$OpV P                  V^R7      p\        W!4      pRP                  V4      p\        P                  ! RV4      pV Uu. uF,  pRV9   g   RVP                  4       9   g   K!  \        V4      NK.  	  pp\        P                  ! V UU	u. uF9  w  r\        P                  ! VP                  4       V	P                  4       .4      NK;  	  up	p4      p
\        V4      p\        V
4      qV8  q'       Eg   \        P                  ! R%V3R&W34      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                   ! \        4      MRRR	\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                   ! V4      MR	R
\        P                   ! V4      RR\        P                  ! 4       9   g!   \        P                  ! \        4      '       d   \        P                   ! \        4      MRRR\        P                  ! 4       9   g   \        P                  ! V
4      '       d   \        P                   ! V
4      MRR\        P                   ! V4      /,          p\        P"                  ! R\        V
4       R\        V4       24      R,           RV/,          p\%        \        P&                  ! V4      4      hR;p;rV
 EF  o\)        VV3R lR7      p\+        S4      R8  g   K'  VS,
          p\+        V4      p\+        S4      pVV,          pRpVV8  pV'       EgH   \        P                  ! R'V3R(VV34      RR\        P                  ! 4       9   g!   \        P                  ! \*        4      '       d   \        P                   ! \*        4      MRRR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                   ! V4      MRRR\        P                  ! 4       9   g   \        P                  ! S4      '       d   \        P                   ! S4      MRR\        P                   ! V4      RR\        P                  ! 4       9   g!   \        P                  ! \*        4      '       d   \        P                   ! \*        4      MRRR\        P                  ! 4       9   g   \        P                  ! S4      '       d   \        P                   ! S4      MRR\        P                   ! V4      R\        P                   ! V4      /,          p\        P"                  ! RS R V R!24      R",           R#V/,          p\%        \        P&                  ! V4      4      hR;p;p;p;p;ppEK  	  R# u upi u up	pi ))zJFloats emitted by emit_weight_init parse back to within 1e-9 of originals.)r   r   z)[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?r{   r|   r   r   r   floats_in_coder   r   r    all_origr!   u   Expected ≥z floats, got z
>assert %(py10)sr   Nc                 (   < \        V S,
          4      # )N)rV   )xws   &rD   <lambda><TestEmitWeightInit.test_round_trip_weights.<locals>.<lambda>   s    SQZrF   )keyrK   rL   rV   bestr   r   r   rb   py13zWeight z% not found in emitted code (closest: )z
>assert %(py15)spy151         r   >=)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}rO   )zf(%(py5)s
{%(py5)s = %(py0)s((%(py1)s - %(py2)s))
} / %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}) < %(py13)s)r   r   r   r   r*   lowerrU   rQ   concatenateravelr   r+   r,   r.   r/   r0   r-   rW   r1   r2   minrV   )rX   r   r   r   r   all_literalsr   r   r   r   r   r5   rB   r8   rC   r?   r   r;   r>   @py_assert10@py_assert12ro   @py_format14r   r   s   &                       @rD   test_round_trip_weights*TestEmitWeightInit.test_round_trip_weightsk   s.   ""4a"0 .IIe$	 zz"NPYZ,8YLqC1HqwwyHX(%(LY >>?E#
?EtqBNNAGGIqwwy12v#
  >" 	Nc(m 	Nm3 	N 	N<M<M	N" 	N 	NGMv	N 	N5M5M	Ns 	N 	NDMI	Ns 	N 	NGMv	N 	N5M5M	N> 	N 	NDMI	N> 	N 	NDMI	N" 	N 	NGMv	N 	N5M5M	Nc 	N 	NDMI	Nc 	N 	NGMv	N 	N5M5M	N( 	N 	NDMI	N( 	N 	NDMI	Nm 	N 	N 	N<M<M	N3x=/s>7J6KL	N 	N 	N 	N:M:M	N 	N A~+?@D1v~!8 Os8} Os1v O}v- O O-4 O O=N=NO- O OHNO O6N6NOs O OENYOs O OHNO O6N6NO4 O OENYO4 O OHNO O6N6NO! O OENYO! O OENYO} O OHNO O6N6NOs O OENYOs O OHNO O6N6NO1 O OENYO1 O OENYOv O OENYO O O O=N=NOaS EdV1MO O O O;N;NO O O O  Z#
s   V53V5?V:
c           
     z   . ROp\         P                  P                  ^4      p\        \	        V4      ^,
          4       Uu. uFN  pVP                  R^W^,           ,          W,          34      \         P                  ! W^,           ,          4      3NKP  	  pp\        WA4      pV EF  pRV9   g   K  VP                  R4      ^,           p^qV8*  q'       g   \        P                  ! RV	3RWx34      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MRR\        P                  ! V4      /,          p
\        P                  ! RV RVR,           24      R	,           R
V
/,          p\!        \        P"                  ! V4      4      hR;rEK  	  R# u upi )zBEach array.from() call should fit within reasonable size for Pine.zarray.from(,r   n_argsr   zarray.from() has z args (>200): :NP   NrN   r   Nr   r   r%   )z%(py0)s <= %(py3)s)rQ   rR   rS   r   r   rT   zerosr   countr+   r,   r.   r/   r0   r-   rW   r1   r2   )rX   r   rY   r   r   r   liner   r5   r:   r6   r7   s   &           rD   !test_no_array_from_over_1000_args4TestEmitWeightInit.test_no_array_from_over_1000_args   s/   ii##A&16s4y1}1EG1EA ;;r1taCy$'&:;88D1I&(1E 	 G .D$C1,!$[}[[[[v[[[[[[v[[[[v[[[[[[[(9&PTUXPY{&[[[[[[[[[ Gs   AF8r   N)    )
r   r   r   r   r   r   r   r   r   r   r   s   @rD   r   r   X   s!     9O4
\ 
\rF   r   u   //@version=6
strategy("test")
{start_marker} — placeholder
// some content inside sentinel
{end_marker} — placeholder end

// code after sentinel
float x = 1.0
c                   B   a  ] tR t^t o R tRR ltR tR tR tRt	V t
R# )	TestSentinelReplacementc                    \         P                  \        \        R 7      pVR,          pVP	                  V4       \        V4      # ))start_marker
end_markerztest_mlp.pine)MINIMAL_PINE_TEMPLATEformatr   r   
write_textr   )rX   tmp_pathcontentr   s   &&  rD   _make_pine_file'TestSentinelReplacement._make_pine_file   sA    '..'# / 
 .	W%9~rF   c                   \         P                  P                  ^c4      p\        \	        V4      ^,
          4       Uu. uFN  pVP                  R^W$^,           ,          W$,          34      \         P                  ! W$^,           ,          4      3NKP  	  pp\        VR,          4      p\        WeRRRRRRRR	R
RRRRRR//R7       V# u upi )z)Create a minimal artifact for one BTC TF.z#mlp_weights_COINBASE_BTCUSD_6H.jsonCOINBASE_BTCUSD6Hrecommended_thresholds!i_long_entry_activation_thresholdg      I@ i_long_exit_activation_thresholdg      T@-i_long_exit_activation_confirmation_thresholdg      4@i_trailing_stop_thresholdra   i_use_long_exit_confirmationg      ?i_use_long_entry_confirmationF)asset	timeframetrainingr   )	rQ   rR   rS   r   r   rT   r   r   r   )rX   r   r   rY   r   r   paths   &&&    rD   _make_preset$TestSentinelReplacement._make_preset   s    ii##B'16s4y1}1EG1EA ;;r1taCy$'&:;88D1I&(1E 	 G8CCD$.?4$<A4@$Mt93<c=u? $	 Gs   ACc                @
   ^ RI HpHpHpHp ^ RI Hp V P                  V4      pV P                  V4      pVP                  p	VP                  p
VP                  p\        V4      Vn        Wn        \        V4      Vn	         VP                  4       p\        V4      p^qV8  q'       Eg   \        P                  ! RV3RW34      RR\        P                  ! 4       9   g!   \        P                   ! \        4      '       d   \        P"                  ! \        4      MRRR\        P                  ! 4       9   g   \        P                   ! V4      '       d   \        P"                  ! V4      MRR\        P"                  ! V4      R\        P"                  ! V4      /,          pR	R
V/,          p\%        \        P&                  ! V4      4      hR;p;rVP                  V4      pVP                  VRR7       Wn        Wn        Wn	        \)        V4      P+                  4       p\,        V9   pV'       g   \        P                  ! RV3R\,        V34      RR\        P                  ! 4       9   g!   \        P                   ! \,        4      '       d   \        P"                  ! \,        4      MRRR\        P                  ! 4       9   g   \        P                   ! V4      '       d   \        P"                  ! V4      MR/,          pRRV/,          p\%        \        P&                  ! V4      4      hRp\.        V9   pV'       g   \        P                  ! RV3R\.        V34      RR\        P                  ! 4       9   g!   \        P                   ! \.        4      '       d   \        P"                  ! \.        4      MRRR\        P                  ! 4       9   g   \        P                   ! V4      '       d   \        P"                  ! V4      MR/,          pRRV/,          p\%        \        P&                  ! V4      4      hRpRpVV9   q'       g   \        P                  ! RV3RVV34      R\        P"                  ! V4      RR\        P                  ! 4       9   g   \        P                   ! V4      '       d   \        P"                  ! V4      MR/,          p\        P0                  ! R4      R,           RV/,          p\%        \        P&                  ! V4      4      hR;ppR#   Yn        Yn        Yn	        i ; i)r   )load_presetsr   rewrite_pineWEIGHTS_DIRNr   r   r   presetsr   r    zassert %(py8)sr!   Fdry_runr   r   resultzassert %(py4)sr   r   z// code after sentinelzCode after sentinel was lostrN   r   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr"   )z%(py0)s in %(py2)sr$   )tools.generate_pine_mlp_presetsr   r   r   r   generate_pine_mlp_presetsr   r   	PINE_FILEWINNERS_DIRr   r   r+   r,   r.   r/   r0   r-   r1   r2   openreadr   r   rW   )rX   r   r   r   r   WDIRcodegenart_pathr   orig_weights_dirorig_pine_fileorig_winners_dirr   r5   rA   r8   @py_format7rC   blockr   r:   @py_format3@py_format5r4   r6   r7   s   &&                        rD   +test_sentinel_markers_present_after_rewriteCTestSentinelReplacement.test_sentinel_markers_present_after_rewrite   s   	
 	
 	:$$X.((2	 #..",,".."8}("8}		4**,Gw<$1$1$$$$$<$$$$$$3$$$$3$$$$$$$w$$$$w$$$<$$$1$$$$$$$$,,W5E   6#3#1#3i%%''''''~''''''~''''~''''''''''''''''''''''''|''''''|''''|''''''''''''''''''''Q'61QQQQ'6QQQ'QQQQQQ6QQQQ6QQQQ3QQQQQQQQQ $4#1#3s    A=T	 >AT	 BT	 	Tc                |   ^ RI HpHpHp ^ RI Hp V P                  V4       V P                  V4      pVP                  pVP                  pVP                  p	\        V4      Vn        Wen        \        V4      Vn	         VP                  4       p
VP                  V
4      pVP                  VRR7       \        V4      P                  4       pVP                  V
4      pVP                  VRR7       \        V4      P                  4       pWun        Wn        Wn	        . p\        V9   pTpV'       d   \        V9   pTpV'       Eg   \        P                  ! RV3R\        V34      RR\         P"                  ! 4       9   g!   \        P$                  ! \        4      '       d   \        P&                  ! \        4      MRRR\         P"                  ! 4       9   g   \        P$                  ! V4      '       d   \        P&                  ! V4      MR/,          pR	R
V/,          pVP)                  V4       V'       d   \        P                  ! RX3R\        V34      RR\         P"                  ! 4       9   g!   \        P$                  ! \        4      '       d   \        P&                  ! \        4      MRRR\         P"                  ! 4       9   g   \        P$                  ! V4      '       d   \        P&                  ! V4      MR/,          pRRV/,          pVP)                  V4       \        P*                  ! V^ 4      / ,          pRRV/,          p\-        \        P.                  ! V4      4      hR;p;p;pp. p\0        V9   pTpV'       d   \0        V9   pTpV'       Eg   \        P                  ! RV3R\0        V34      RR\         P"                  ! 4       9   g!   \        P$                  ! \0        4      '       d   \        P&                  ! \0        4      MRRR\         P"                  ! 4       9   g   \        P$                  ! V4      '       d   \        P&                  ! V4      MR/,          pR	R
V/,          pVP)                  V4       V'       d   \        P                  ! RV3R\0        V34      RR\         P"                  ! 4       9   g!   \        P$                  ! \0        4      '       d   \        P&                  ! \0        4      MRRR\         P"                  ! 4       9   g   \        P$                  ! V4      '       d   \        P&                  ! V4      MR/,          pRRV/,          pVP)                  V4       \        P*                  ! V^ 4      / ,          pRRV/,          p\-        \        P.                  ! V4      4      hR;p;p;ppVP3                  4        Uu. uF  pRV9   g   K  VNK  	  ppVP3                  4        Uu. uF  pRV9   g   K  VNK  	  ppVV8H  q'       Eg   \        P                  ! RV3RVV34      RR\         P"                  ! 4       9   g   \        P$                  ! V4      '       d   \        P&                  ! V4      MRRR\         P"                  ! 4       9   g   \        P$                  ! V4      '       d   \        P&                  ! V4      MR/,          p\        P4                  ! R4      R,           RV/,          p\-        \        P.                  ! V4      4      hRpR#   Yun        Yn        Yn	        i ; iu upi u upi )r   )r   r   r   NFr   r   r   r   content1z%(py6)sr    r!   r   content2z%(py12)sr   zassert %(py15)sr   r   z
array.fromr   w_lines1w_lines2z(Weight literals changed between rewritesz
>assert %(py4)sr"   )z%(py2)s in %(py4)s)z%(py8)s in %(py10)src   )z%(py0)s == %(py2)s)r   r   r   r   r  r   r   r   r  r  r   r  r  r   r+   r,   r.   r/   r0   r-   r   r   r1   r2   r   
splitlinesrW   )rX   r   r   r   r   r  r   r	  r
  r  r   r  r  block2r  r:   r;   r4   r=   r  r  r?   r@   r   r   lr  r  r  s   &&                           rD   test_rewrite_is_idempotent2TestSentinelReplacement.test_rewrite_is_idempotent   s   	
 	
 	:(#((2	"..",,".."8}("8}	4**,G,,W5E   6I++-H++G4F   7I++-H#3#1#3 	I~)HHn.HHHHH~HHHHHH~HHHH~HHHHHHHHHHHHHHHHHHHHnHHHHHHnHHHHnHHHHHHHHHHHHHHHHHHHHHHHHHHHH|)HHl.HHHHH|HHHHHH|HHHH|HHHHHHHHHHHHHHHHHHHHlHHHHHHlHHHHlHHHHHHHHHHHHHHHHHHHHHHHHHHH'224J4!8IAA4J'224J4!8IAA4J8#OOOOx8OOOOOOxOOOOxOOOOOOO8OOOO8OOOO%OOOOOOOO $4#1#3 KJs%   >B
\ 
	\4\42	\9 \9\1c                    ^ RI Hp V P                  V4       VP                  pVP                  p\        V4      Vn        \        V4      Vn         VP                  4       pVP                  V4      pW2n        WBn        . pRqV9   qq'       g   RqV9   qp
V
'       Eg   \        P                  ! RV	3RW34      R\        P                  ! V4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          qP                  V4       V	'       g   \        P                  ! RX3RXV34      R	\        P                  ! V4      R
R\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          pVP                  V4       \        P                  ! V^4      / ,          pRRV/,          p\!        \        P"                  ! V4      4      hR;p
;p;p;p	;rRqV9   q'       g   \        P                  ! RV3RW34      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\!        \        P"                  ! V4      4      hR;rRqV9   q'       g   \        P                  ! RV3RW34      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\!        \        P"                  ! V4      4      hR;rRqV9   q'       g   \        P                  ! RV3RW34      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\!        \        P"                  ! V4      4      hR;rRqV9   q'       g   \        P                  ! RV3RW34      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\!        \        P"                  ! V4      4      hR;rRqV9   q'       g   \        P                  ! RV3RW34      R\        P                  ! V
4      RR\        P                  ! 4       9   g   \        P                  ! V4      '       d   \        P                  ! V4      MR/,          pRRV/,          p\!        \        P"                  ! V4      4      hR;rR#   Y2n        YBn        i ; i)r   Nz_w1 :=zarray.concatr   r   r  r}   r   r   r   r~   r   r   r   z_b1 :=r   r   z_w2 :=z_b2 :=z_w3 :=z_b3 :=r"   r   r   r$   )r   r  r   r   r  r   r   r   r+   r,   r-   r.   r/   r0   r   r   r1   r2   )rX   r   r  r	  r  r   r  r:   r5   r8   r4   r=   ro   r7   r9   r@   r   r   r   r6   s   &&                  rD   test_weight_arrays_in_block3TestSentinelReplacement.test_weight_arrays_in_block  s,   9(#"..".."8}"8}	4**,G,,W5E#3#3;x;5 ;;N;e$;;;;;x;;;x;;;;;;5;;;;5;;;;;;;;;Ne;;;N;;;;;;e;;;;e;;;;;;;;;;;;;;;; 5     x   x      5    5         5     x   x      5    5         5     x   x      5    5         5     x   x      5    5         5     x   x      5    5         $4#3s   !W? ?Xr   N))r      r   r   )r   r   r   r   r   r   r  r  r  r   r   r   s   @rD   r   r      s'     "RB$PL! !rF   r   ),r   builtinsr.   _pytest.assertion.rewrite	assertionrewriter+   jsonospathlibr   r   systempfilenumpyrQ   pytestr   abspathr   dirname__file__r(   insertstrategies.strategy_mlp_scoresr   r   r   r   r   r   r   r   r	   r
   r   tools.check_pine_plot_budgetr   r   rE   rH   r   r   r   r   rF   rD   <module>r1     s      	  	 
   	wwrww||BGGOOH$=tDE 4  J	 	 	 F
: J  JJ7\ 7\x u! u!rF   