Ë
    Bp±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 }|s™t        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 }|s™t        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  }|�sŒt        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                      úh/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tests/test_pine_codegen.pyÚ;test_pine_exports_only_normalized_trailing_stop_diagnosticsrH   $   sÝ  € Ü”T“
˜\Ñ)Ð,FÑF€IØ×ÑÓ €DÜœ"Ÿ*™*Ð%XÐZ^Ó_Ó`€Oà+Ð3Ð+¨tÐ3×3×3Õ3Ð+¨t×3×3Ó3Ð+×3×3×3×3×3Ð3¨t×3×3Ó3¨t×3×3×3×3×3×3Ó3Ø+Ð3Ð+¨tÐ3×3×3Õ3Ð+¨t×3×3Ó3Ð+×3×3×3×3×3Ð3¨t×3×3Ó3¨t×3×3×3×3×3×3Ó3ÜŒ|ÓÐ/Ð Ñ/×/×/Ö/Ð ×/×/×/×/×/Ñ/Œ3×/×/Ó/Œ3×/×/×/×/×/Ò/Œ|×/×/Ó/Œ|×/×/Ô/Ð×/×/×/×/×/Ð/ ×/×/Ó/ ×/×/×/×/×/×/Ó/Ü�9‰9ÐEÐ6ÐE‰9Ð6¸Ó=ÐEÀÐEÐ=ÀÐE×E×EÖEÐ=À×E×E×E×E×EÑEŒ2×E×EÓEŒ2×E×EÔEˆ9×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Ü�9‰9ÐWÐHÐW‰9ÐHÈ$ÓOÐWÐSWÐWÐOÐSWÐW×W×WÖWÐOÐSW×W×W×W×W×WÑWŒ2×W×WÓWŒ2×W×WÔWˆ9×W×WÒWÐH×W×W×W×W×WÐWÈ$×W×WÓWÈ$×W×WÔWÐO×W×WÒWÐSW×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Ò9œC×9×9Ó9œC×9×9×9×9×9Ò9 	×9×9Ó9 	×9×9Ô9˜N×9×9Ò9Ð+×9×9×9×9×9Ð9¬z×9×9Ó9¬z×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  }|s»t        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ç   € Ü�i‰i×#Ñ# BÓ'ˆØ�{‰{˜4  cÓ*ˆÜˆAÜ˜1“ˆAÜ�q“ˆBÜ�1‹v˜‹~Ü˜b 1™f›+¬¨A«Ñ.�Ø!%Ðj�w ‘~×j×jÕj�w ×j×j×j×j×jÑj�w×j×jÓj�w×j×jÔj ×j×j×jÐ)<¸Q¸EÀÈÀsÈ&ÐQSÐPVÐV`ÐahÐ`iÐ'j×j×j×j×j×j×jÐjñ rI   c                 óÒ  — d}t        |«      }d}||k(  }|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                  |«      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 )Ng¯çwfñ‘€>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[  € ØˆÜ�q‹MˆÜ˜“8Ð0�8˜a‘<Ð0Œs�<Ó Ð0¤3 q£6Ð0Ð  6Ñ)Ð0¨DÐ0Ð)¨DÑ0×0×0Ö0Ð)¨D×0×0×0×0×0Ñ0Œs×0×0Ó0Œs×0×0×0×0×0Ò0”5×0×0Ó0”5×0×0×0×0×0Ò0˜×0×0Ó0˜×0×0Ô0�8×0×0×0×0×0Ð0˜a×0×0Ó0˜a×0×0Ô0Ð ×0×0×0×0×0Ð0¤3×0×0Ó0¤3×0×0×0×0×0Ò0 q×0×0Ó0 q×0×0Ô0 6×0×0Ò0¨D×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[  € ØˆÜ�q‹MˆÜ˜“8Ð0�8˜a‘<Ð0Œs�<Ó Ð0¤3 q£6Ð0Ð  6Ñ)Ð0¨DÐ0Ð)¨DÑ0×0×0Ö0Ð)¨D×0×0×0×0×0Ñ0Œs×0×0Ó0Œs×0×0×0×0×0Ò0”5×0×0Ó0”5×0×0×0×0×0Ò0˜×0×0Ó0˜×0×0Ô0�8×0×0×0×0×0Ð0˜a×0×0Ó0˜a×0×0Ô0Ð ×0×0×0×0×0Ð0¤3×0×0Ó0¤3×0×0×0×0×0Ò0 q×0×0Ó0 q×0×0Ô0 6×0×0Ò0¨D×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                  |«       |sŒt        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      YÀg      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  € ä�i‰i×#Ñ# AÓ&ˆØ�{‰{˜6 5¨#Ó.ˆÜˆAÜ˜1“ˆAÙI�3ÐI�3˜!�8ÔI˜sÐI˜s a˜x×I×I×IÐI�3˜!×I×IÓI�3×I×I×I×I×IÐI˜!×I×IÓI˜!×I×I×I×I×I×I×I˜s a×I×IÓI˜s×I×I×I×I×IÐI a×I×IÓI a×I×I×I×I×I×I×I×I×IÒIÐ+DÀQÀCÀqÐ)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‡   éÿÿÿÿgš™™™™™¹¿gš™™™™™¹?)rU   rV   rW   ÚrangeÚlenrX   rŠ   )r\   ÚarchÚseedr]   ÚlayersÚiÚWÚbs           rG   Ú_make_layerszTestEmitWeightInit._make_layersY   s†   € Ü�i‰i×#Ñ# DÓ)ˆØˆÜ”s˜4“y 1‘}Ö%ˆAØ—‘˜B  D¨¨1©¡I¨t°A©wÐ#7Ó8ˆAØ—‘˜D # t¨A¨a©C¡yÓ1ˆAØ�M‰M˜1˜a˜&Õ!ð &ð ˆ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                  |«       |rŒt        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                  |«       |rŒt        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                  |«       |rŒt        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Ó(ˆÜ  ¨Ó.ˆØ—I‘I˜eÓ$ˆ	Ù8ˆuÐ8ˆu˜	Ð!Ô8 eÐ8 e¨yÐ&8×8×8×8Ð8ˆu˜	×8×8Ó8ˆu×8×8×8×8×8Ð8˜	×8×8Ó8˜	×8×8×8×8×8×8×8 e¨y×8×8Ó8 e×8×8×8×8×8Ð8¨y×8×8Ó8¨y×8×8×8×8×8×8×8×8×8×8×8×8×8Ô8Ù8ˆuÐ8ˆu˜	Ð!Ô8 eÐ8 e¨yÐ&8×8×8×8Ð8ˆu˜	×8×8Ó8ˆu×8×8×8×8×8Ð8˜	×8×8Ó8˜	×8×8×8×8×8×8×8 e¨y×8×8Ó8 e×8×8×8×8×8Ð8¨y×8×8Ó8¨y×8×8×8×8×8×8×8×8×8×8×8×8×8Ô8Ù8ˆuÐ8ˆu˜	Ð!Ô8 eÐ8 e¨yÐ&8×8×8×8Ð8ˆu˜	×8×8Ó8ˆu×8×8×8×8×8Ð8˜	×8×8Ó8˜	×8×8×8×8×8×8×8 e¨y×8×8Ó8 e×8×8×8×8×8Ð8¨y×8×8Ó8¨y×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\  }|�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                  |«      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  }|�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                  |«      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Ã  ø€ âˆØ×"Ñ" 4¨aÐ"Ó0ˆÜ  ¨Ó.ˆØ—I‘I˜eÓ$ˆ	ô —z‘zÐ"NÐPYÓZˆÙ,8ÓY©L q¸CÀ1¹HÈÈqÏwÉwËyÒHXœ% �(¨LˆÐYô —>‘>Ù?Eô#
Ù?E±t°q¸!ŒB�N‰N˜AŸG™G›I q§w¡w£yÐ1Õ2¸vò#
ó ˆô �>Ó"ð 	N¤c¨(£mð 	NÐ" mÑ3÷ 	Nð 	Nß<MÑ<Mó	NÐ" m÷ 	Nò 	NßGMÁv÷	Nò 	Nß5MÑ5Mô ÷ 	Nñ 	NßDMÁIô ÷ 	Nó 	NßGMÁv÷	Nò 	Nß5MÑ5Mð "÷ 	Nñ 	NßDMÁIð "÷ 	Nò 	NßDMÁIð #÷ 	Nñ 	NßGMÁv÷	Nò 	Nß5MÑ5Mô '*÷ 	Nñ 	NßDMÁIô '*÷ 	Nó 	NßGMÁv÷	Nò 	Nß5MÑ5Mð +3÷ 	Nñ 	NßDMÁIð +3÷ 	Nò 	NßDMÁIð '4÷ 	Nõ 	Nß<MÑ<Mˆlœ3˜x›=˜/¨´s¸>Ó7JÐ6KÐL÷	N÷ 	Nö 	Nß:MÑ:M÷	N÷ 	Nô ˆAÜ�~Ó+?Ô@ˆDÜ�1‹v˜‹~Ø !™8ð O”s˜8“}ð O¤s¨1£vð O�} vÑ-ð O°ð OÐ-°Ñ4÷ Oð Oß=NÑ=NóOÐ-°÷ Oò OßHNÉ÷Oò Oß6NÑ6Nô ÷ Oñ OßENÁYô ÷ Oó OßHNÉ÷Oò Oß6NÑ6Nð  ÷ Oñ OßENÁYð  ÷ Oó OßHNÉ÷Oò Oß6NÑ6Nð #$÷ Oñ OßENÁYð #$÷ Oò OßENÁYð %÷ Oñ OßHNÉ÷Oò Oß6NÑ6Nô (+÷ Oñ OßENÁYô (+÷ Oó OßHNÉ÷Oò Oß6NÑ6Nð ,-÷ Oñ OßENÁYð ,-÷ Oò OßENÁYð (.÷ Oð OßENÁYð 15÷ Oõ Oß=NÑ=N�g˜a˜SÐ EÀdÀVÈ1Ð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  }	|	s¸t        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): NéP   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/  € âˆÜ�i‰i×#Ñ# AÓ&ˆä16´s¸4³yÀ1±}Ô1EóGÙ1E¨Að —;‘;˜r 1 t¨A¨a©C¡y°$°q±'Ð&:Ó;Ü—8‘8˜D  1¡™IÓ&ò(Ø1Eð 	ð Gä  ¨Ó.ˆÛˆDØ Ò$ØŸ™ C›¨1Ñ,�Ø!$Ð[�v ‘}×[×[Õ[�v ×[×[×[×[×[Ñ[�v×[×[Ó[�v×[×[Ô[ ×[×[×[Ð(9¸&¸ÀÐPTÐUXÐVXÐPYÈ{Ð&[×[×[×[×[×[×[ñ ùò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É   € ä�i‰i×#Ñ# BÓ'ˆä16´s¸4³yÀ1±}Ô1EóGÙ1E¨Að —;‘;˜r 1 t¨A¨a©C¡y°$°q±'Ð&:Ó;Ü—8‘8˜D  1¡™IÓ&ò(Ø1Eð 	ð Gä�8ÐCÑCÓDˆÜ˜$ Ð.?È4Ø$<ØCGØBFØOSØ;>Ø>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\  }|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                   |«      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 }|sÒt        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 }|sÒt        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 }|s¯t        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Ó5ˆEØ× Ñ  °Ð Ô6à#3ˆGÔØ#1ˆGÔØ#3ˆGÔä�i“×%Ñ%Ó'ˆÜ Ð'×'×'Õ'Œ~ ×'×'×'×'×'Ñ'Œ~×'×'Ó'Œ~×'×'×'×'×'Ò' ×'×'Ó' ×'×'×'×'×'×'Ñ'Ü Ð'×'×'Õ'Œ| ×'×'×'×'×'Ñ'Œ|×'×'Ó'Œ|×'×'×'×'×'Ò' ×'×'Ó' ×'×'×'×'×'×'Ñ'Ø'ÐQÐ'¨6Ð1×Q×QÕQÐ'¨6×Q×QÓQÐ'×Q×Q×Q×Q×QÐQ¨6×Q×QÓQ¨6×Q×Q×QÑQÐ3Q×Q×Q×Q×Q×Q×Qøð $4ˆGÔØ#1ˆGÔØ#3ˆGÕú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 }|}|�sÊt        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)                  |«       |rÅt        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 }|}|�sÊt        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)                  |«       |rÅt        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(  }|sÜt        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Ó5ˆEà× Ñ  °Ð Ô6Ü˜I“×+Ñ+Ó-ˆHà×+Ñ+¨GÓ4ˆFØ× Ñ  °Ð Ô7Ü˜I“×+Ñ+Ó-ˆHà#3ˆGÔØ#1ˆGÔØ#3ˆGÔñ 	IŒ~ Ð)ÔH¬nÀÐ.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¬nÀ×H×H×H×H×HÑH¬n×H×HÓH¬n×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¬lÀÐ.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¬lÀ×H×H×H×H×HÑH¬l×H×HÓH¬l×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˜!¸ÈÒ8I’AÐ4ˆÐJØ'×2Ñ2Ô4ÓJÑ4˜!¸ÈÒ8I’AÐ4ˆÐJØ˜8Ñ#×O×OÕOˆx˜8×O×O×O×O×OÑOˆx×O×OÓOˆx×O×O×O×O×OÒO˜8×O×OÓO˜8×O×O×OÑOÐ%O×O×O×O×O×OÕOøð $4ˆGÔØ#1ˆGÔØ#3ˆGÕüò 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                  |«       |	sŒt        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 }|s™t        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 }|s™t        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 }|s™t        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 }|s™t        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 }|s™t        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Ó5ˆEà#3ˆGÔØ#3ˆGÔá;ˆxÐ;ˆx˜5Ð Ô; NÐ; N°eÐ$;×;×;×;Ð;ˆx˜5×;×;Ó;ˆx×;×;×;×;×;Ð;˜5×;×;Ó;˜5×;×;×;×;×;×;×; N°e×;×;Ó; N×;×;×;×;×;Ð;°e×;×;Ó;°e×;×;×;×;×;×;×;×;×;×;×;×;×;Ô;ØÐ ˆx˜5Ð × × Õ ˆx˜5× × Ó ˆx× × × × × Ð ˜5× × Ó ˜5× × × × × × Ó ØÐ ˆx˜5Ð × × Õ ˆx˜5× × Ó ˆx× × × × × Ð ˜5× × Ó ˜5× × × × × × Ó ØÐ ˆx˜5Ð × × Õ ˆx˜5× × Ó ˆx× × × × × Ð ˜5× × Ó ˜5× × × × × × Ó ØÐ ˆx˜5Ð × × Õ ˆx˜5× × Ó ˆx× × × × × Ð ˜5× × Ó ˜5× × × × × × Ó ØÐ ˆx˜5Ð × × Õ ˆx˜5× × Ó ˆx× × × × × Ð ˜5× × Ó ˜5× × × × × × Ô øð $4ˆGÔØ#3ˆGÕú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³   ðñ÷ „ ƒÛ 	Ý Û 	Û 
Û ã Û à	‡w�w‡��r—w‘w—|‘| B§G¡G§O¡O°HÓ$=¸tÓDÓE€Ø ‡�‡���4Ô ç J÷	÷ 	ó 	÷ Fò
:÷ Jñ  J÷J7\ñ 7\ðxÐ ÷u!ò u!rI   