
    7#j>?                        d dl 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
d dlmZ d dlmZ  G d dej                         Zdd ej$                  dej&                  dej(                  dej*                  dej,                  d	ej.                  d
iZdej2                  dej4                  fdZ G d d      Zd Zd Zd Zd Z d Z!e"dk(  r e!        yy)    N)mutual_info_scorec                   :     e Zd Z	 	 d fd	Zd ZddZddZ xZS )TelepathicMemoryc           
         t         |           || _        d| _        || _        || _        t        j                  d|      | _        t        j                  t        j                  dd|      dz        | _        t        j                  t        |      D cg c]  }t        j                  ||d       c}      | _        t        j                  t        j"                  d            | _        | j'                  ||      | _        y c c}w )N@         g{Gz?T)batch_first皙?)super__init__d_modelnum_squarescollapse_thresholdtempnn	Embeddingpiece_embed	Parametertorchrandn	pos_embed
ModuleListrangeMultiheadAttentionattn_blockstensorgamma_compute_xi_anchor	xi_anchor)	selfr   nhead
num_layersr   r   anchor_hash_	__class__s	           I/home/per/Documents/telepathic chess enhancer python/chess_memory_live.pyr   zTelepathicMemory.__init__   s    "4	 <<G4ekk!R&AD&HI ==:&*
 !!'5dC*
 
 \\%,,s"34
 00gF*
s   Dc                 @   t        j                  |j                               j                         }t	        j
                  |      }t        t        |t        |      dz              D ]"  }t        |d|z  d|z  dz    d      }|dz  ||<   $ ||j                         z  S )N      g     o@)hashlibmd5encode	hexdigestr   zerosr   minlenintnorm)r!   r$   r   r,   vecibyte_vals          r'   r   z#TelepathicMemory._compute_xi_anchor)   s    kk+,,./99;kk'"s7CHaK01 	&A3qs1Q3q5>2.H%CF	& SXXZ    c                    |j                   d   }|j                  |d      }| j                  |      | j                  z   }g }g }	t	        |      D ]j  }
| j
                  D ]&  } ||||      \  }}
||z
  }|| j                  |z  z   }| j                  j                  |j                        j                  ddd      }t        j                  ||z
  d      }t        j                  || j                  z
  | j                  z        }|r-|j                  d      |z  d|j                  d      z
  |z  z   }n2t        j                   |      j                  d      }||z  d|z
  |z  z   }|	j#                  |j%                                ) |j#                  |s|j'                         j)                         n|       m |r8|||	D cg c])  }t        j*                  |      r|j-                         n|+ c}fS |S c c}w )z
        board_tensor: (batch, 8, 8) piece indices (0 = empty,
                       1-6: black pieces P,N,B,R,Q,K; 7-12: white pieces in same order)
        r   r	   dim      ?)shapeviewr   r   r   r   r   r    todevicer   r3   sigmoidr   r   	unsqueeze	bernoulliappendmeandetachclone	is_tensoritem)r!   board_tensorstepsreturn_historysoft_collapsebatchtokensxhistorycollapse_probsr%   attnattn_outgradxi
divergencepmasks                     r'   forwardzTelepathicMemory.forward1   s   
 ""1%""5"-V$t~~5u 	KA(( 0"1am!!|

T)) ^^&&qxx055aB?"ZZBB7
MM:0G0G#G499"TU B",akk"o0E/JJA !??1-77;Dr	S4Z1$44A%%affh/%0& NN]188:++-J)	K, g~^!EOOA,>A E^^^  _s   .G9c           	      d   | j                  ||dd      \  }}}t        |      dk  ryt        j                  |d      j	                  d      }|j
                  \  }}}|dz  }|d d d |d d f   j                  |d	      j                         j                         j                         }	|d d |d d d f   j                  |d	      j                         j                         j                         }
|	dkD  j                  t              }|
dkD  j                  t              }t        t        |d d	 j                         |d d	 j                               D cg c]  \  }}| |  c}}t        |dd  j                         |dd  j                               D cg c]  \  }}| |  c}}      }t        |d d	 j                         |dd  j                               }t        |d d	 j                         |dd  j                               }t        d|||z   z
        }|S c c}}w c c}}w )
NTFrK   rL   rM   r)   g        r   r:   r	   r9   )rZ   r1   r   stacksqueezer=   reshaperF   cpunumpyastyper2   r   zipflattenmax)r!   rJ   rK   r%   rQ   HNDhalfXYXdYdrP   yI_wholeI_XI_Yphis                      r'   compute_phizTelepathicMemory.compute_phiW   s   \tchi7Aw<!KKQ'//2ggq!Ava$kN""5"-446::<BBDakN""5"-446::<BBD!e^^C !e^^C ##&r#2w'8"Sb'//:K#LM41as1#YM#&r!"v~~'7AB9I#JK41as1#YK
  3B 12ab6>>3CD3B 12ab6>>3CD#w#),-
 NKs   H&
H,)r               ?333333?zpi_anchor:e_anchor)
   FF)   )__name__
__module____qualname__r   r   rZ   rs   __classcell__)r&   s   @r'   r   r      s    78?SG0 $Lr7   r   r	   r)   ru   rt         boardreturnc                 b   t        j                  ddt         j                        }t        j                  D ]f  }| j                  |      }|d}n8t        |j                     }|j                  t        j                  k(  r|dz   }n|}t        |d      \  }}||||f<   h |j                  d      S )N   )dtyper   r   )r   r/   longchessSQUARESpiece_atPIECE_TO_IDX
piece_typecolorWHITEdivmodrB   )r   r   squarepieceidxbaserowcols           r'   board_to_tensorr   t   s    [[AUZZ0F-- v&=C 0 01D{{ekk)Qh&!$SsCx Ar7   c                   B    e Zd Zd
dZd Zd Zd ZddZd ZddZ	d	 Z
y)GNUChessControllerc                    t        j                         | _        d| _        	 t	        j
                  |dgdt        j                  t        j                  t        j                        | _        | j                  d       | j                  d       | j                  d       | j                  d       y # t        $ r  t        d	| d
       d| _        d | _        Y y w xY w)NFz--uciT)universal_newlinesstdinstdoutstderruciuciokisreadyreadyokz
Warning: 'z4' engine executable not found. Running in mock mode.)r   Boardr   use_mock
subprocessPopenPIPEengine_write_read_untilFileNotFoundErrorprint)r!   engine_paths     r'   r   zGNUChessController.__init__   s    [[]
	$**g&#' oo!!DK KKW%KK	"Y'  	J{m+_`a DMDK	s   BB2 2&CCc                     | j                   ry | j                  j                  j                  |dz          | j                  j                  j	                          y )N
)r   r   r   writeflush)r!   cmds     r'   r   zGNUChessController._write   s>    ==d
+!r7   c                     | j                   ry| j                  j                  j                         j	                         S )N )r   r   r   readlinestripr!   s    r'   
_read_linezGNUChessController._read_line   s.    =={{!!**,2244r7   c                 J    | j                   ry 	 | j                         }||v ry N)r   r   )r!   keywordlines      r'   r   zGNUChessController._read_until   s*    ==??$D$ r7   Nc                     |;| j                  d       | j                  j                  t        j                         y | j                  d|        | j                  j                  |       y )Nzposition startposposition fen )r   r   set_fenr   STARTING_FEN)r!   fens     r'   set_positionzGNUChessController.set_position   sQ    ;KK+,JJu112KK-u-.JJs#r7   c                     | j                  d| j                  j                          d|        | j                  j                  t        j
                  j                  |             y )Nr   z moves )r   r   r   pushr   Movefrom_uci)r!   uci_moves     r'   	make_movezGNUChessController.make_move   sF    mDJJNN$4#5WXJGH



++H56r7   c                    | j                   ry| j                  dt        |dz                d}	 | j                         }|j	                  d      ra|j                         }d|v ra|j                  d      }|dz   t        |      k  r?||dz      }||dz      }	 t        |      }|d	k(  r	|dkD  rdnd
}n|j	                  d      r	 |S # t        $ r Y w xY w)Nrx   zgo movetime i  r   infoscorer)   r	   mateibestmove)	r   r   r2   r   
startswithsplitindexr1   
ValueError)r!   thinking_timer   r   partsr   
score_type	score_vals           r'   get_evaluationz!GNUChessController.get_evaluation   s    ==l3}T'9#:";<=??$Dv&

e#++g.CQwU+%*3q5\
$)#a%L	!$'	NE)V305	u ,#   * ! !s   C 	CCc                 t    | j                   ry | j                  d       | j                  j                          y )Nquit)r   r   r   	terminater   s    r'   closezGNUChessController.close   s(    ==Fr7   )gnuchessr   )rv   )rz   r{   r|   r   r   r   r   r   r   r   r    r7   r'   r   r      s*    *"5
$70 r7   r   c                     t        j                          5 } | j                  d   }| j                  |      }t        j                  |      }t        j                  |t
        j                        }t        d       t        d       t        j                  d|d      }t        j                  d       |\  }}}}|d   |z   |d   |z   ||d}	|	cd d d        S # 1 sw Y   y xY w)	Nr	   z!
=== SELECT CHESSBOARD REGION ===z[A window will open. Click and drag a box around your chessboard, then press ENTER or SPACE.zSelect Chessboard RegionFtopleft)r   r   widthheight)mssmonitorsgrabnparraycv2cvtColorCOLOR_BGRA2BGRr   	selectROIdestroyWindow)
sctmonitor
screenshotimgroirP   rn   whregions
             r'   select_board_regionr      s    	 c,,q/XXg&
hhz"ll3 2 2323klmm6UC45
1a 5>A%FOa'	
 %  s   B7CCc                     t        j                          5 }|j                  |       }t        j                  |      }t	        j
                  |t        j                        }|cd d d        S # 1 sw Y   y xY wr   )r   r   r   r   r   r   r   )r   r   r   r   s       r'   capture_regionr      sW    	 cXXf%
hhz"ll3 2 23	  s   AA++A4c                  r   g dg dfD ]H  } 	 t        j                  | t         j                        }|j                  d      j	                         c S  	 dd l}|j                         }|j                          |j                         }|j                          |S # t
        $ r Y w xY w# t
        $ r Y yw xY w)N)xclipz
-selection	clipboard-o)xselz-br   )r   zutf-8r   r   )r   check_outputDEVNULLdecoder   	ExceptiontkinterTkwithdrawclipboard_getdestroy)r   outtkroottexts        r'   get_clipboard_textr     s    :<PQ 	))#j6H6HIC::g&,,..uuw!!#  		  s%   ABAB* 	B'&B'*	B65B6c                 N    	 t        j                  |        y# t        $ r Y yw xY w)NTF)r   r   r   )fen_strs    r'   is_valid_fenr	    s(    G s    	$$c                     t        d       t               } t               }|d   dk(  s|d   dk(  rt        d       y t        |      }t	        dddd	d
      }|j                          t        j                  j                  |j                         d      }t        j                          t        j                  ddd      \  }\  }}|j                  j                  j                  d       g }g }	g }
g }d }t        d       t        d       t        d       t        d       	 	 t!        j"                  d       t        |      }|j$                  |j$                  k7  r2t'        j(                  ||j$                  d   |j$                  d   f      }t+        j,                  t'        j.                  ||            }|dkD  rt        d|d       |j1                         }t3               }|j5                         }t7        |      r6|}||k(  r|}t        d|        | j9                  |       | j;                  d      }t        d| d        t=        | j>                        }|jA                          |jC                  |d!dd"      \  }}}|jD                  jG                  ddd#      }t        jH                  ||z
  d#$      j-                         }dd|z   z  }d%d&t        jJ                  t        jL                  |d'z              z  z   }||z
  dz  }|jO                          |jQ                          |jS                  |d!(      }|jU                  |jW                                |	jU                  |jW                                |
jU                  |jW                                |jU                  |       t        d)|d#   d*d+|	d#   d*d,       t        d-|
d#   d.d/|d#   d.       |jY                          |j[                  |d0d1d2       |j[                  |	d3d4d5d67       |j]                  d8       |j_                  d9       |ja                  d:;       |jc                  dd<d
=       |jY                          |j[                  |
d>d?d2       |j[                  |d@dAd62       |j]                  dB       |je                  dC       |j_                  dD       |ja                  d:;       |jc                  dd<d
=       t        jf                          t        jh                          t        jj                  d%       nt        dE       t        dF       -# tl        $ r t        dG       Y nw xY w	 | jo                          t        jp                          t        jr                          y # | jo                          t        jp                          t        jr                          w xY w)HNzStarting GNU Chess engine...r   r   r   z#Error: No region selected. Exiting.r   rt   ru   rv   rw   )r   r"   r#   r   r   g{Gzt?)lrr)   r	   )r   r   )figsizez+Telepathic Chess Memory Alignment Dashboardz-
Live Loop active! Play chess on your screen.uT   👉 COPY THE FEN string to your clipboard (Ctrl+C) when you make or receive a move.zeThe system will detect visual updates, read your clipboard, score the position, and train the memory.z&Press Ctrl+C in this terminal to exit.Tr<   g       @z 
[Visual Change Detected] Diff: z.2fu   📖 Loaded FEN: g?)r   u   ♟️ Engine Evaluation: z cprx   r\   r9   r:   r   g?g     b@)rK   u   📊 Coherence: z.3fz
 (Target: )u   📈 Loss: z.4fu    | Integrated Info Φ: zMemory Coherencez#00ffd0)labelr   	linewidthzTarget (Chess Metric)z#ff5555z--g      ?)r  r   	linestyler  z,Stationary Memory Coherence vs. Chess Metric	Coherencez
upper left)loc:)r  alphazAlignment Lossz#ffaa00u   Integrated Information Φz#00ff00zOptimization MetricszMove IterationsValuesuJ   ⚠️ Visual change detected, but clipboard does not contain a valid FEN.uD   👉 Please copy the latest FEN to clipboard to sync the game state.z
Exiting live loop...):r   r   r   r   r   trainr   optimAdam
parameterspltionsubplotscanvasmanagerset_window_titletimesleepr=   r   resizer   rE   absdiffcopyr  r   r	  r   r   r   r   	zero_gradrZ   r    r>   r3   rA   r   backwardsteprs   rD   rI   clearplot	set_title
set_ylabellegendgrid
set_xlabeltight_layoutdrawpauseKeyboardInterruptr   ioffshow)r   r   
prev_frame
telepathic	optimizerfigax1ax2
coherencestarget_coherenceslossesphislast_fen
curr_framediff	clip_textclip_candidater   r   rJ   final_stater%   rV   divergence_final	coherencetarget_coherencelossrr   s                               r'   mainrI    s9   	
()!F !"Fg!vh/1434  'J ""A!58sDJ   !6!6!8U CI GGIll1a8OC#sJJ''(UVJFDH	
:;	
`a	
qr	
23eJJsO (/J :#3#33 ZZ
Z5E5Ea5H*JZJZ[\J]4^_
773;;z:>?D cz9$sDE'__.
 /0	!*!2/(Ch "H-cU34 '',"111DE6ugSAB $36<<#@L '') )3(:(:<rbfvz(:({%KA#--221a<B',zz+2B'K'P'P'R$ #s-='= >I (+S5==eV[mA\3]-]']$ &(88Q>DMMO NN$ %00R0HC %%inn&67%,,-=-B-B-DEMM$))+.KK$,Z^C,@
K\]_K`adJeefghKr
3'77NtTVxX[n]^ IIKHHZ/A^_H`HH.6MU^jnz}H~MM"PQNN;/JJ<J0HHTSH<IIKHHV+;9XYHZHHT)DIadHeMM"89NN#45NN8,JJ<J0HHTSH<$$&HHJIIcNfg`a{ ~  (&'('

 	

s%   $P.U U)&V& (U))V& &:W __main__)#r   r   r   torch.nnr   ra   r   r   r   r+   r   sklearn.metricsr   matplotlib.pyplotpyplotr  Moduler   PAWNKNIGHTBISHOPROOKQUEENKINGr   r   Tensorr   r   r   r   r  r	  rI  rz   r   r7   r'   <module>rW     s         
 
   - 
Yryy Y~ 	!	JJ5<<ELL!	JJ5;;5::q5;; 5<< &Q  Q l*&JX zF r7   