
    ;j+                        d Z ddlZddlmc mZ ddlZddlZddl	m
Z
 ddlZddlZddlZddlZddlZej"                  j%                  ej"                  j'                  ej"                  j)                  e      d            Zej"                  j/                  de       ddlmZmZ ddlmZmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z& d Z' G d	 d
      Z( G d d      Z)dZ* G d d      Z+y)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            	      D   t        t              dz  dz  } | j                         }t        t	        j
                  d|            }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}t        t              }||k  }|s+t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}t        j                  }	d}
 |	|
|      }d }||u }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
x}x}}t        j                  }	d}
 |	|
|      }d }||u }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
x}x}}t!        |       }
t#        |
      }|t$        k  }|st        j                  d|fd|t$        f      dt        j                         v st        j                  t"              rt        j                  t"              nddt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |
      t        j                  |      d t        j                         v st        j                  t$              rt        j                  t$              nd d!z  }d"d#|iz  }t        t        j                  |            d x}
x}}y )$N
strategieszstrategy_mlp_scores.pinez0\bplot(?:char)?\s*\([^\n]*?title\s*=\s*"([^"]+)"ztitle="trail_stop_price_ratio"inz%(py1)s in %(py3)spinepy1py3assert %(py5)spy5ztitle="trail_high_price_ratio"<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py5)ssetr   exported_titles)py0r   r   r   zassert %(py7)spy7z\bplotchar\s*\(\s*close\s*[,)])is)zV%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s)
} is %(py10)sre)r   py2py4r   r    py10zassert %(py12)spy12z0\bplotchar\s*\(\s*strategy\.position_size\s*[,)])zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} <= %(py8)sr   str	pine_pathr   )r   r   r#   r$   py6py8zassert %(py10)sr%   )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_diagnosticsrH   $   s   T
\),FFI D"**%XZ^_`O+3+t3333+t333+333333t333t3333333+3+t3333+t333+333333t333t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E2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99WHW9H$OWSWWOSWWWWWOSWWWWWWW2WWW2WWW9WWWHWWWWWW$WWW$WWWOWWWSWWWWWWWW	N9N+9+z9999+z999999999999999C999C999999	999	999N999+999999z999z9999999    c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestFloatFormattinguV   fmt_float9 should round-trip float64 values with ≤ 1e-6 relative error (7 sig figs).c                    t         j                  j                  d      }|j                  ddd      }|D ]
  }t	        |      }t        |      }t        |      dkD  s)t        ||z
        t        |      z  }d}||k  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }	t        j                  d|d| d|d|       dz   d|	iz  }
t        t        j                  |
            d x}} y )N*   g      g      @i  V瞯<ư><)z%(py0)s < %(py3)srel_errr   r   zRound-trip failed: u    → 'u   ' → z
, rel_err=
>assert %(py5)sr   )nprandomdefault_rnguniformr   floatabsr.   r/   r1   r2   r3   r0   _format_assertmsgr4   r5   )selfrngvalsvsrtrR   r8   r=   r9   r:   s              rG   test_round_trip_random_weightsz2TestFloatFormatting.test_round_trip_random_weights6   s    ii##B'{{4c*A1AqB1v~b1f+A.!%jw~jjjwjjjjjjwjjjwjjjjjj)<QEs&QSPVV`ah`i'jjjjjjjj rI   c                    d}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	N        z0.0==)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   )r   r#   r$   r    zassert %(py9)spy9)	r   r.   r/   r1   r2   r3   r0   r4   r5   )r\   r=   r>   r?   rD   r<   @py_format10s          rG   	test_zerozTestFloatFormatting.test_zero@   s    'z#'%'%''''%''''''z'''z'''#''''''%'''''''rI   c                    d}t        |      }t        |      }||z
  }t        |      }t        |      }||z  }d}||k  }	|	s2t        j                  d|	fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	
z  }
d
d|
iz  }t        t        j                  |            d x}x}x}x}x}x}	}y )Ngwf>rO   rP   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)srZ   rY   r`   r_   
r   r   r#   r$   r   r*   rg   r%   r&   py16assert %(py18)spy18r   rY   rZ   r.   r/   r1   r2   r3   r0   r4   r5   r\   r_   r`   r>   r?   rE   @py_assert11@py_assert13@py_assert15@py_assert14@py_format17@py_format19s               rG   test_very_smallz#TestFloatFormatting.test_very_smallC   s[   qM808a<0s< 03q60 6)0D0)D0000)D000000s000s000000500050000000000008000000a000a000 00000030003000000q000q0006000D00000000rI   c                    d}t        |      }t        |      }||z
  }t        |      }t        |      }||z  }d}||k  }	|	s2t        j                  d|	fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	
z  }
d
d|
iz  }t        t        j                  |            d x}x}x}x}x}x}	}y )Ng)gArO   rP   rk   rZ   rY   r`   r_   rl   rn   ro   rp   rq   s               rG   test_very_largez#TestFloatFormatting.test_very_largeH   s[   qM808a<0s< 03q60 6)0D0)D0000)D000000s000s000000500050000000000008000000a000a000 00000030003000000q000q0006000D00000000rI   c                    t         j                  j                  d      }|j                  ddd      }|D ]  }t	        |      }g }d}||v }|}|sd}	|	|v }
|
}|srt        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }|j                  |       |st        j                  d
fd	|f      t        j                  |	      d	t        j                         v st        j                  |      rt        j                  |      nd	dz  }dd|iz  }|j                  |       t        j                  |d      i z  }t        j                  d| d      dz   d|iz  }t        t        j                  |            dx}x}x}x}x}	}
 y)z7All formatted floats must be valid Pine float literals.   g      Yg      Y@   .er   z%(py3)s in %(py5)sr`   r   r   %(py7)sr    z%(py10)s in %(py12)sr%   r&   %(py14)spy14   zNo decimal/exponent in: ''z
>assert %(py17)spy17N)rU   rV   rW   rX   r   r.   r/   r0   r1   r2   r3   append_format_boolopr[   r4   r5   )r\   r]   r^   r_   r`   r=   r8   r;   r7   r@   rr   r:   r<   rC   @py_format15@py_format16@py_format18s                    rG   "test_has_decimal_point_or_exponentz6TestFloatFormatting.test_has_decimal_point_or_exponentM   s   ii##A&{{65#.A1AI3I3!8IsIsaxIIII3!III3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IaIIIIIIIIII+DQCq)IIIIIIIII rI   N)	__name__
__module____qualname____doc__rb   ri   rx   rz   r    rI   rG   rK   rK   3   s     `k(1
1
JrI   rK   c                   &    e Zd ZddZd Zd Zd Zy)TestEmitWeightInitc                    t         j                  j                  |      }g }t        t	        |      dz
        D ]L  }|j                  dd||dz      ||   f      }|j                  dd||dz            }|j                  ||f       N |S )Nr   gg?)rU   rV   rW   rangelenrX   r   )r\   archseedr]   layersiWbs           rG   _make_layerszTestEmitWeightInit._make_layersY   s    ii##D)s4y1}%ABD1ItAw#78AD#tAaCy1AMM1a&! & rI   c                 J	   g d}| j                  |      }t        ||      }dj                  |      }g }d}||v }|}|rd}	|	|v }
|
}|sXt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }|j                  |       |rt        j                  d
fd	|f      t        j
                  |	      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	}
g }d}||v }|}|rd}	|	|v }
|
}|sXt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }|j                  |       |rt        j                  d|
fd|	|f      t        j
                  |	      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	}
g }d}||v }|}|rd}	|	|v }
|
}|sXt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }|j                  |       |rt        j                  d|
fd|	|f      t        j
                  |	      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	}
y )N)         r   
_w1_b1r   r   	pine_textr   r   r    r   r   r   r   r   assert %(py17)sr   _w2_b2_w3_b3)r   r   joinr.   r/   r0   r1   r2   r3   r   r   r4   r5   )r\   r   r   linesr   r=   r8   r;   r7   r@   rr   r:   r<   rC   r   r   r   s                    rG   test_produces_pine_linesz+TestEmitWeightInit.test_produces_pine_linesb   s   ""4( .IIe$	8u8u	!8e8ey&88888u	888u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8y888888888888888u8u	!8e8ey&88888u	888u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8y888888888888888u8u	!8e8ey&88888u	888u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8y88888888888888rI   c                 
   g d}| j                  |d      }t        ||      }dj                  |      }t        j                  d|      }|D cg c]$  }d|v sd|j                         v st        |      & }}t        j                  |D 	cg c]8  \  }}	t        j                  |j                         |	j                         g      : c}	}      }
t        |      }t        |
      }||k\  }|st        j                  d|fd	||f      d
t        j                         v st        j                  t              rt        j                   t              nd
dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      d
t        j                         v st        j                  t              rt        j                   t              nd
dt        j                         v st        j                  |
      rt        j                   |
      ndt        j                   |      dz  }t        j"                  dt        |
       dt        |             dz   d|iz  }t%        t        j&                  |            dx}x}}|
D ]J  t)        |fd      }t+              dkD  s#|z
  }t+        |      }t+              }||z  }d}||k  }|st        j                  d|fd||f      dt        j                         v st        j                  t*              rt        j                   t*              nddt        j                         v st        j                  |      rt        j                   |      nddt        j                         v st        j                        rt        j                         ndt        j                   |      dt        j                         v st        j                  t*              rt        j                   t*              nddt        j                         v st        j                        rt        j                         ndt        j                   |      t        j                   |      dz  }t        j"                  d d| d      d z   d!|iz  }t%        t        j&                  |            dx}x}x}x}x}}M yc c}w c c}	}w )"zJFloats emitted by emit_weight_init parse back to within 1e-9 of originals.1         r   r   )r   r   z)[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?r~   r   >=)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   floats_in_codeall_orig)r   r   r   r   r)   r*   u   Expected ≥z floats, got z
>assert %(py10)sr%   Nc                      t        | z
        S )N)rZ   )xws    rG   <lambda>z<TestEmitWeightInit.test_round_trip_weights.<locals>.<lambda>   s    SQZrI   )keyrN   rO   rP   )zf(%(py5)s
{%(py5)s = %(py0)s((%(py1)s - %(py2)s))
} / %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}) < %(py13)srZ   bestr   )r   r   r#   r   r)   r    rg   py13zWeight z% not found in emitted code (closest: )z
>assert %(py15)spy15)r   r   r   r"   r-   lowerrY   rU   concatenateravelr   r.   r/   r1   r2   r3   r0   r[   r4   r5   minrZ   )r\   r   r   r   r   all_literalsr   r   r   r   r   r8   rE   r;   rF   rB   r   r>   rA   @py_assert10@py_assert12rr   @py_format14r   r   s                           @rG   test_round_trip_weightsz*TestEmitWeightInit.test_round_trip_weightsk   s   ""4a"0 .IIe$	 zz"NPYZ,8YLqC1HqwwyHX%(LY >>?E#
?Etq!BNNAGGIqwwy12v#
  >" 	Nc(m 	N"m3 	N 	N<M<M	N"m 	N 	NGMv	N 	N5M5M  	N 	NDMI  	N 	NGMv	N 	N5M5M " 	N 	NDMI " 	N 	NDMI # 	N 	NGMv	N 	N5M5M '* 	N 	NDMI '* 	N 	NGMv	N 	N5M5M +3 	N 	NDMI +3 	N 	NDMI '4 	N 	N<M<Ml3x=/s>7J6KL	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 OENY  O OHNO O6N6N   O OENY   O OHNO O6N6N #$ O OENY #$ O OENY % O OHNO O6N6N (+ O OENY (+ O OHNO O6N6N ,- O OENY ,- O OENY (. O OENY 15 O O=N=NgaS EdV1MO O O;N;NO O O  Z#
s   S7,S7=S<
c           
         g d}t         j                  j                  d      }t        t	        |      dz
        D cg c];  }|j                  dd||dz      ||   f      t        j                  ||dz            f= }}t        ||      }|D ]  }d|v s|j                  d      dz   }d}||k  }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }
t        j                  d| d|dd        dz   d|
iz  }t!        t        j"                  |            dx}	} yc c}w )zBEach array.from() call should fit within reasonable size for Pine.r   r   r   r   zarray.from(,r}   r   )z%(py0)s <= %(py3)sn_argsrS   zarray.from() has z args (>200): NP   rT   r   )rU   rV   rW   r   r   rX   zerosr   countr.   r/   r1   r2   r3   r0   r[   r4   r5   )r\   r   r]   r   r   r   liner   r8   r=   r9   r:   s               rG   !test_no_array_from_over_1000_argsz4TestEmitWeightInit.test_no_array_from_over_1000_args   s/   ii##A&16s4y1}1EG1EA ;;r1tAaCy$q'&:;88D1I&(1E 	 G .D$C1,!$[v}[[[v[[[[[[v[[[v[[[[[[(9&PTUXVXPY{&[[[[[[[ Gs   A E1N)r   )r   r   r   r   r   r   r   r   rI   rG   r   r   X   s    9O4
\rI   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                   ,    e Zd Zd ZddZd Zd Zd Zy)TestSentinelReplacementc                     t         j                  t        t              }|dz  }|j	                  |       t        |      S )N)start_marker
end_markerztest_mlp.pine)MINIMAL_PINE_TEMPLATEformatr	   r
   
write_textr'   )r\   tmp_pathcontentr(   s       rG   _make_pine_filez'TestSentinelReplacement._make_pine_file   sA    '..'# / 
 .	W%9~rI   c                 R   t         j                  j                  d      }t        t	        |      dz
        D cg c];  }|j                  dd||dz      ||   f      t        j                  ||dz            f= }}t        |dz        }t        ||ddddd	d
ddddi       |S c c}w )z)Create a minimal artifact for one BTC TF.c   r   r   z#mlp_weights_COINBASE_BTCUSD_6H.jsonCOINBASE_BTCUSD6Hrecommended_thresholdsg      I@g      T@g      4@rd   g      ?F)!i_long_entry_activation_threshold i_long_exit_activation_threshold-i_long_exit_activation_confirmation_thresholdi_trailing_stop_thresholdi_use_long_exit_confirmationi_use_long_entry_confirmation)asset	timeframetraining)	rU   rV   rW   r   r   rX   r   r'   r   )r\   r   r   r]   r   r   paths          rG   _make_presetz$TestSentinelReplacement._make_preset   s    ii##B'16s4y1}1EG1EA ;;r1tAaCy$q'&:;88D1I&(1E 	 G8CCD$.?4$<CGBFOS;>>A?D? $	 Gs   A B$c                 
	   ddl m}m}m}m} dd l m} | j                  |      }| j                  |      }|j                  }	|j                  }
|j                  }t        |      |_        ||_        t        |      |_	        	 |j                         }t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                   t              rt        j"                  t              nddt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }d	d
|iz  }t%        t        j&                  |            d x}x}}|j                  |      }|j                  |d       |	|_        |
|_        ||_	        t)        |      j+                         }t,        |v }|st        j                  d|fdt,        |f      dt        j                         v st        j                   t,              rt        j"                  t,              nddt        j                         v st        j                   |      rt        j"                  |      nddz  }dd|iz  }t%        t        j&                  |            d }t.        |v }|st        j                  d|fdt.        |f      dt        j                         v st        j                   t.              rt        j"                  t.              nddt        j                         v st        j                   |      rt        j"                  |      nddz  }dd|iz  }t%        t        j&                  |            d }d}||v }|st        j                  d|fd||f      t        j"                  |      dt        j                         v st        j                   |      rt        j"                  |      nddz  }t        j0                  d      dz   d|iz  }t%        t        j&                  |            d x}}y # |	|_        |
|_        ||_	        w xY w)Nr   )load_presetsr   rewrite_pineWEIGHTS_DIRr   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   presets)r   r   r   r)   zassert %(py8)sr*   Fdry_runr   )z%(py0)s in %(py2)sr	   resultr   r#   zassert %(py4)sr$   r
   z// code after sentinelr   r   zCode after sentinel was lostrT   r   )tools.generate_pine_mlp_presetsr   r   r   r   generate_pine_mlp_presetsr   r   	PINE_FILEWINNERS_DIRr'   r   r.   r/   r1   r2   r3   r0   r4   r5   openreadr	   r
   r[   )r\   r   r   r   r   WDIRcodegenart_pathr(   orig_weights_dirorig_pine_fileorig_winners_dirr   r8   rD   r;   @py_format7rF   blockr   r=   @py_format3@py_format5r7   r9   r:   s                             rG   +test_sentinel_markers_present_after_rewritezCTestSentinelReplacement.test_sentinel_markers_present_after_rewrite   s   	
 	
 	:$$X.((2	 #..",,".."8}("8}		4**,Gw<$1$<1$$$$<1$$$$$$3$$$3$$$$$$w$$$w$$$<$$$1$$$$$$$,,W5E   6#3G#1G#3Gi%%'''''~''''''~'''~''''''''''''''''''''|''''''|'''|'''''''''''''''''Q'61QQQ'6QQQ'QQQQQQ6QQQ6QQQQ3QQQQQQQ $4G#1G#3Gs   EQ+ +Rc                    ddl m}m}m} dd l m} | j                  |       | j                  |      }|j                  }|j                  }|j                  }	t        |      |_        ||_        t        |      |_	        	 |j                         }
|j                  |
      }|j                  |d       t        |      j                         }|j                  |
      }|j                  |d       t        |      j                         }||_        ||_        |	|_	        g }t        |v }|}|r
t        |v }|}|st        j                  d|fdt        |f      dt!        j"                         v st        j$                  t              rt        j&                  t              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndd	z  }d
d|iz  }|j)                  |       |rt        j                  dfdt        |f      dt!        j"                         v st        j$                  t              rt        j&                  t              nddt!        j"                         v st        j$                  |      rt        j&                  |      nddz  }dd|iz  }|j)                  |       t        j*                  |d      i z  }dd|iz  }t-        t        j.                  |            d x}x}x}}g }t0        |v }|}|r
t0        |v }|}|st        j                  d|fdt0        |f      dt!        j"                         v st        j$                  t0              rt        j&                  t0              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndd	z  }d
d|iz  }|j)                  |       |rt        j                  d|fdt0        |f      dt!        j"                         v st        j$                  t0              rt        j&                  t0              nddt!        j"                         v st        j$                  |      rt        j&                  |      nddz  }dd|iz  }|j)                  |       t        j*                  |d      i z  }dd|iz  }t-        t        j.                  |            d x}x}x}}|j3                         D cg c]	  }d|v s| }}|j3                         D cg c]	  }d|v s| }}||k(  }|st        j                  d|fd||f      dt!        j"                         v st        j$                  |      rt        j&                  |      nddt!        j"                         v st        j$                  |      rt        j&                  |      nddz  }t        j4                  d      dz   d|iz  }t-        t        j.                  |            d }y # ||_        ||_        |	|_	        w xY wc c}w c c}w )Nr   )r   r   r   Fr   r   )z%(py2)s in %(py4)sr	   content1)r#   r$   z%(py6)sr)   )z%(py8)s in %(py10)scontent2)r*   r%   z%(py12)sr&   zassert %(py15)sr   r
   z
array.fromre   )z%(py0)s == %(py2)sw_lines1w_lines2r   z(Weight literals changed between rewritesz
>assert %(py4)sr$   )r   r   r   r   r   r   r   r   r   r   r'   r   r   r	   r.   r/   r1   r2   r3   r0   r   r   r4   r5   r
   
splitlinesr[   )r\   r   r   r   r   r   r(   r  r  r  r   r  r  block2r  r=   r>   r7   r@   r  r  rB   rC   r   r   lr  r  r  s                                rG   test_rewrite_is_idempotentz2TestSentinelReplacement.test_rewrite_is_idempotent   s   	
 	
 	:(#((2	"..",,".."8}("8}	4**,G,,W5E   6I++-H++G4F   7I++-H#3G#1G#3G 	I~)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HnHHHHHHn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|)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HlHHHHHHl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'224J4!8IA4J'224J4!8IA4J8#OOOx8OOOOOOxOOOxOOOOOO8OOO8OOOO%OOOOOOO $4G#1G#3G KJs%   ?B
X" 
	X<X<,	Y6Y"X9c                 
   dd l m} | j                  |       |j                  }|j                  }t        |      |_        t        |      |_        	 |j                         }|j                  |      }||_        ||_        g }d}||v }	|	}
|	sd}||v }|}
|
sXt        j                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }|j                  |       |	st        j                  dfd
|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t!        t        j"                  |            d x}
x}x}x}	x}}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            d x}
}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            d x}
}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            d x}
}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            d x}
}d}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            d x}
}y # ||_        ||_        w xY w)Nr   z_w1 :=zarray.concatr   r   r  r   r   r    r   r   r   r   r   r   r   z_b1 :=r   r   r   r   z_w2 :=z_b2 :=z_w3 :=z_b3 :=)r   r   r   r   r   r'   r   r   r.   r/   r0   r1   r2   r3   r   r   r4   r5   )r\   r   r   r  r  r   r  r=   r8   r;   r7   r@   rr   r:   r<   rC   r   r   r   r9   s                       rG   test_weight_arrays_in_blockz3TestSentinelReplacement.test_weight_arrays_in_block  s   9(#"..".."8}"8}	4**,G,,W5E#3G#3G;x;x5 ;N;Ne$;;;;;x5;;;x;;;;;;5;;;5;;;;;;;Ne;;;N;;;;;;e;;;e;;;;;;;;;;;;;; x5    x5   x      5   5        x5    x5   x      5   5        x5    x5   x      5   5        x5    x5   x      5   5        x5    x5   x      5   5        $4G#3Gs   !T5 5UN))r      r   r   )r   r   r   r   r   r	  r  r  r   rI   rG   r   r      s    "RB$PL!rI   r   ),r   builtinsr1   _pytest.assertion.rewrite	assertionrewriter.   jsonospathlibr   r"   systempfilenumpyrU   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   rH   rK   r   r   r   r   rI   rG   <module>r'     s      	  	 
   	wwrww||BGGOOH$=tDE 4  J	 	 	 F
: J  JJ7\ 7\x u! u!rI   