
    )i                         d Z ddlZddlZddlmZ ddlmZ ddlZddl	Z	ddl
mZmZmZmZ  ee      j                   dz  Z G d d      Zy)	u  
SPY Optimizer — Deep Learning Inference (CPU)
Charge le modèle LSTM+Attention entraîné sur GPU pour l'inference en production.

Ce module fonctionne SUR LE SERVEUR (CPU-only). Le modèle est entraîné sur le PC (GPU)
et transféré via deploy_model.sh.

Usage:
    from deep_inference import DeepPredictor
    predictor = DeepPredictor()
    result = predictor.predict(klines_df, timestamp_ms, surge_type="FLASH_SURGE")
    # → {"probability": 0.72, "signal": "BUY", "confidence": 42.0, "threshold": 0.5}
    N)Path)Optional)SurgePredictorbuild_sequence_featuresN_SEQUENCE_FEATURESSURGE_TYPE_MAPmodelsc            
       z    e Zd ZdZddee   fdZd Z ej                         	 dddde
d	ed
efd       Zd
efdZy)DeepPredictoru   
    Inference CPU pour le modèle LSTM+Attention entraîné sur GPU.
    Thread-safe pour utilisation dans market_spy.py.
    N
models_dirc                     |rt        |      nt        | _        d | _        d| _        d| _        i | _        d| _        | j                          y )N      ?<   F)	r   
MODELS_DIRr   model	thresholdseq_lenmetadata	is_loaded_load)selfr   s     ?/home/ubuntu/crypto_trading_bot/spy_optimizer/deep_inference.py__init__zDeepPredictor.__init__&   s>    .8$z*j


    c                    | j                   dz  }| j                   dz  }| j                   dz  }|j                         rpt        |      5 }t        j                  |      | _        ddd       | j
                  j                  dd      | _        | j
                  j                  dd      | _        |j                         rj	 t        j                  j	                  t        |      d	
      | _        | j                  j                          d| _        t        d|j                           y|j                         r	 t        j                  |d	d      }t%        |j                  dt&              |j                  dd      |j                  dd      d      }|j)                  |d          |j                          || _        |j                  dd      | _        |j                  dd      | _        d| _        t        d|j                           yt        d| j                    d       y# 1 sw Y   xY w# t"        $ r}t        d|        Y d}~)d}~ww xY w# t"        $ r}t        d|        Y d}~hd}~ww xY w)u,   Charge le modèle TorchScript ou checkpoint.zsurge_predictor_gpu.ptz"surge_predictor_gpu_checkpoint.pthzsurge_predictor_gpu_meta.jsonNr   r   r   r   cpu)map_locationTu'     ✅ Deep model loaded (TorchScript): u#     ⚠️  TorchScript load failed: F)r   weights_only
n_featureshidden_size   
num_layers   r   )r   r    r"   dropoutmodel_state_dictu&     ✅ Deep model loaded (checkpoint): u"     ⚠️  Checkpoint load failed: u      ℹ️  No GPU model found in z. Deep inference disabled.)r   existsopenjsonloadr   getr   r   torchjitstrr   evalr   printname	Exceptionr   r   load_state_dict)r   ts_path	ckpt_path	meta_pathfeckptr   s           r   r   zDeepPredictor._load/   s$    //$<<OO&JJ	OO&EE	 i -A $		!-!]]..{C@DN==,,Y;DL >>A"YY^^CLu^M


!!%?~NO
 @zz)%eT&#xx6IJ $ <#xxa8	 %%d+=&>?

"
!%+s!;#xx	26!%>y~~>NOP 	00AA[\]K- -  A;A3?@@A*  @:1#>??@s>   	H'?A(H4 9CI 'H14	I=II	I:"I55I:	klines_dfzpd.DataFrametimestamp_ms
surge_typereturnc                    | j                   sddd| j                  ddS t        ||| j                        }|ddd| j                  ddS t	        j
                  |t        j                        j                  d      }t        j                  |d      }t	        j
                  |gt        j                        }t	        j                  |d	d
d      }t        | j                  t        j                  j                        r!| j                  ||      j!                         }n%| j                  ||      }	|	d   j!                         }|| j                  k\  rdnd}
t#        || j                  z
        t%        | j                  d      z  dz  }t'        |d      }t)        |      |
t)        |      t)        | j                        ddS )uo  
        Prédit si un signal de surge sera rentable.

        Args:
            klines_df: DataFrame des klines 1m pour le symbole
            timestamp_ms: timestamp en ms du moment d'analyse
            surge_type: type de surge détecté ("FLASH_SURGE", etc.)

        Returns:
            dict avec probability, signal, confidence, threshold, model_type
        r   BUYr   none)probabilitysignal
confidencer   
model_typedeep_no_data)dtype   g        g      $@g      $)nanposinfneginfr@   SKIPg{Gz?d   lstm_attention)r   r   r   r   r+   tensorfloat32	unsqueezer   r*   long
nan_to_num
isinstancer   r,   ScriptModuleitemabsmaxminfloat)r   r9   r:   r;   seqx	surge_idxsurge_tproboutputrA   rB   s               r   predictzDeepPredictor.predict_   s   $ ~~"!^^$  &it||L;"!^^,  LLEMM2<<Q?"&&z15	,,	{%**= QCUC djj%))"8"89::a)..0DZZ7+F-(--/D$..0f./#dnnd2KKcQ
S)
 !;
+t~~.*
 	
r   c                 `    | j                   | j                  | j                  | j                  dS )u1   Retourne les informations sur le modèle chargé.r   r   r   r   ra   )r   s    r   get_infozDeepPredictor.get_info   s*     ||	
 	
r   )N)UNKNOWN)__name__
__module____qualname____doc__r   r-   r   r   r+   no_gradintdictr_   rb    r   r   r   r       sr    
8C= .^` U]]_
 $	>
!>
 >
 	>

 
>
 >
@
$ 
r   r   )rg   r(   ospathlibr   typingr   numpynpr+   
deep_modelr   r   r   r   __file__parentr   r   rk   r   r   <module>rt      sJ     	      (^""X-
G
 G
r   