
    ˣi%                        U d Z ddlmZ ddlmZmZ ddlmZmZ ddlm	Z	m
Z
 dhZded<   h d	Zded
<   h dZded<    ed       G d d             ZdddZdd	 	 	 	 	 ddZy)u  
Brain selection — port verbatim of V15 APEX_PREDATOR_V15._choose_brain (riga 1098-1215).

Decides whether a given symbol/tech/bias combination should route to:
  - Brain TF (trend following)
  - Brain MR (mean reversion)
  - or skip (None)

Pure function (no I/O, no state). Lives in brain/ because the decision is
trading-policy semantics, not market analysis. analysis.regime.determine_regime
produces the regime label that is INPUT to this router.

V15 calibration constants (MR_EXCLUDED, TF_ALLOWED_SYMBOLS, INDICI_FUTURES)
are inlined here — they are routing policy, not market data. If more consumers
emerge they can be promoted to core/config_futures.py.

DA RIVALIDARE IN CALIBRAZIONE V16:
  - night_tf_block window (20:00-04:00 UTC) is V15-empirical
  - thresholds 35/65 (TRENDING_SOFT MR widened) vs 32/68 (RANGING strict MR)
  - pullback band 42-58 (TF entries on indices and forex)
    )annotations)	dataclassfield)datetimetimezone)AnyOptionalMYMzset[str]MR_EXCLUDED>
   6A6B6C6E6JMCLMESMGCMNQr
   TF_ALLOWED_SYMBOLS>   YMr   r   r
   INDICI_FUTUREST)frozenc                  B    e Zd ZU dZded<   ded<    ee      Zded<   y)	BrainSelectionResultu  
    Outcome of choose_brain.

    chosen != None  ⇒ reject_reason is None (accept)
    chosen is None  ⇒ reject_reason valued  (reject)

    details always carries a base snapshot (rsi, rsi_prev, regime,
    allowed_direction, trend_maturity, h1_struct, is_index) plus
    branch-specific flags. Designed for jq aggregation on brain_log.jsonl —
    flags are spread top-level by orchestrator._log_skip.
    zOptional[str]chosenreject_reason)default_factoryzdict[str, Any]detailsN)__name__
__module____qualname____doc____annotations__r   dictr        +/home/work/apex_v16/brain/brain_selector.pyr   r   8   s$    
   #D9G^9r&   r   Nc                    | | n"t        j                  t        j                        }|j                  }|dk\  xs |dk  S )a  
    True during V15-empirical illiquid window (20:00-04:00 UTC).
    Trend-Following may sit hours in loss in thin markets;
    Mean-Reversion handled OK by RSI-extremes even when illiquid.

    Caller can pass now_utc for testability; default = real clock.
          )r   nowr   utchour)now_utcr+   hs      r'   _is_night_tf_blockr0   N   s9     ('hll8<<.HCA7a!er&   )r.   c                R   ||j                   nd}t        |j                        }t        |j                        }||kD  }|j                  }| t
        v }	|j                  }
t        |j                        }||||
||||	dd'fd}d(fd}|dk(  r |d      S |
dk(  r |d      S |
d	k(  rO|	r |d
      S | t        v r
 |dd      S |dv r|dk  r |d      S |dv r|dkD  r |d      S  |d|dk  |dkD        S |
dv r|dk\  r|
dk(  }t        |      }| t        v r4|	rd|v }d|v }|dv r|rd|cxk  rdk  rn n|r
|s |d      S |dv r|rd|cxk  rdk  rn n|s
|s |d      S | t        vr&|dv r|r|dk  r |d      S |dv r|r|dkD  r |d      S  |d|||d|cxk  xr dk  nc || t        v |dk  |dkD  	      S |s<|dv rd|cxk  rdk  rn n|r
|s |d      S |dv rd|cxk  rdk  rn n|s
|s |d      S | t        vr"|dv r|dk  r |d      S |dv r|d kD  r |d      S  |d!|d|cxk  xr dk  nc || t        v |dk  |d kD  "      S | t        vr"|dv r|dk  r |d      S |dv r|dkD  r |d      S  |d#| t        v |dk  |dkD  $      S |
dv r |d%      S  |d&      S ))u7  
    Routes (symbol, tech, bias) to BrainSelectionResult with
    chosen ∈ {"TF", "MR", None}.

    Port verbatim of V15 _choose_brain. The shape of the matrix is
    intentionally preserved — this is calibrated logic, not architecture.
    Refactoring it semantically would invalidate V15 calibration.
    BOTH)rsirsi_prevrsi_bouncingregimeallowed_directiontrend_maturity	h1_structis_indexc                ,    i |}t        | d |      S N)r   r   r   r   )brainextradbases      r'   _acceptzchoose_brain.<locals>._accept   s!    tu#5aPPr&   c                ,    i |}t        d | |      S r<   r=   )reasonr?   r@   rA   s      r'   _rejectzchoose_brain.<locals>._reject   s!    tu#4vqQQr&   NONE	BIAS_NONEBREAKOUTREGIME_BREAKOUTRANGINGRANGING_INDEX_BLOCKEDMR_EXCLUDED_SYMBOLT)mr_excluded)BUYr2       MR)SELLr2   D   RANGING_RSI_NOT_EXTREME)rsi_below_32rsi_above_68)TRENDINGTRENDING_SOFT   rW   BULLISHBEARISH*   :   TFINDICES_NO_PRO_TREND_SETUP)is_softtrend_is_bulltrend_is_bearin_pullback_42_58night_tf_blockrM   rT   rU   #   A   TRENDING_NO_TF_NO_MR)r_   rb   rc   rM   rsi_below_35rsi_above_65NON_WHITELIST_NO_MR_EXTREME)rM   rT   rU   MATURITY_TOO_LOWREGIME_UNHANDLED)r>   strr?   r   returnr   )rD   rl   r?   r   rm   r   )r7   floatr3   r4   market_structurer   r6   intr8   r   r0   r   )symboltechbiasr.   allowedr3   r4   r5   r9   r:   r6   r8   rB   rE   r_   night_blockr`   ra   rA   s                     @r'   choose_brainrv   _   s    )-(8d$$fGTXXCT]]#H>L%%I.(HF,,-N $$(	DQR &{## ()) 233[ /TBBo%#(4= &&384= %((
 	
 ..>Q3F_,(1'' )Y 6 )Y 6 .%cR$'"4=(//%cR('"4=( ,/1mb&t},"22}r&t},0#"/"/')SB#.!';!6"%("%(
 
  .cR$'"4=(//cR('"4=( [(o-#("4=(..38"4=(&#%??*#{2!Bh!Bh  $/)cBht}$**sRxt}$);.((	
 	
 ..)**%&&r&   )N)r.   Optional[datetime]rm   bool)rq   rl   r.   rw   rm   r   )r"   
__future__r   dataclassesr   r   r   r   typingr   r	   r   r#   r   r   r   r0   rv   r%   r&   r'   <module>r|      s   , # ( '   
X 	  H 	 7 6 $: : :*
, #'i'i'
  i' i'r&   