
    #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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j,                  dej.                  fdZ G d d      Zdej,                  dej4                  f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_game.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 )Nr   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.forward.   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_phiP   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  D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   m   s    [[AUZZ0F-- v&=C 0 01D{{ekk)Qh&!$SsCx Ar7   c                   J    e Zd ZddZd Zd Zd ZddZd Zd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   go movetime   r   infoscorer)   r	   mate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                    | j                   rYdd l}| j                  j                  syd|j	                  t        | j                  j                              j                         fS | j                  dt        |dz                d }d}	 | j                         }|j                  d      ra|j                         }d|v r|j                  d      }|dz   t        |      k  rf||d	z      }||dz      }		 t        |	      }|d
k(  r	|dkD  rdnd}n;|j                  d      r*|j                         }t        |      d	kD  r|d	   nd }	 ||fS # t        $ r Y w xY w)Nr   )rx   Nrx   r   r   r   r   r)   r	   r   r   r   )r   randomr   legal_moveschoicelistr   r   r2   r   r   r   r   r1   r   )
r!   r   r   	best_mover   r   r   r   r   r   s
             r'   get_evaluation_and_best_movez/GNUChessController.get_evaluation_and_best_move   sO   ==::))v}}T$***@*@%ABFFHHHl3}T'9#:";<=	??$Dv&

e#++g.CQwU+%*3q5\
$)#a%L	!$'	NE)V305	u ,

(+E
QE!HD	i'   * ! !s   3E	 		EE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   )g?)rv   )rz   r{   r|   r   r   r   r   r   r   r   r   r    r7   r'   r   r      s/    *"5
$70 > r7   r   player_colorc                 f   |t         j                  k(  }| j                  |d      }|j                  d      }|st	        ddd      nt	        dd      }|sd	nd
}t        d|        t        d       t        ||      D ]  \  }}t        | d| d|         t        d       t        | d       y )N   ·)flippedempty_squarer   r   r   r9   r	   	   z    a b c d e f g hz    h g f e d c b az  +-----------------+z | )r   BLACKunicoder   r   r   rc   )	r   r   r   unicode_strlinesranksfiles_headerrankr   s	            r'   print_boardr      s    u{{*G--d-CKd#E#*E!QOaE07(=RL	B|n
	
!"%' +
dc$s4&)*+	
!"	\N"
r7   c                  	  
 t        d       t               } t        j                         }t	        d      j                         j                         }|dk(  rt        j                  nt        j                  }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 
fd}t        d       t        d       t        d       	 |j+                         sXt-        ||       |j.                  |k(  rt	        d      j                         }|j                         dk(  rn|j                         dk(  rt1        |j2                        dk\  r|j5                          |j5                          | j7                  |j9                                t1              dkD  r@j5                          j5                          j5                          j5                          t        d       nt        d       ,	 	 |j;                  |      }||j@                  v r1|jC                  |       | j7                  |j9                                nt        d       	 t        d       | jE                  d      } |||       nt        d        | jG                  d      \  }}	|	rt        jH                  jK                  |	      }|jC                  |       | j7                  |j9                                t        d!|jM                  |              t        d        |||       nn|j+                         sX|j+                         r3t-        ||       t        d"       t        d#|jO                                 | jS                          t        jT                          t        jV                          y # t<        $ r |j?                  |      }Y w xY w# t<        $ r t        d       Y w xY w# tP        $ r t        d$       Y w xY w# | jS                          t        jT                          t        jV                          w xY w)%NzStarting GNU Chess engine...z&Choose your color (W/B) [default: W]: br   rt   ru   rv   rw   )r   r"   r#   r   r   g{Gzt?)lrr)   r	   )r   r   )figsizez+Telepathic Chess Memory Alignment Dashboardc                    j                          t        |       }j                  |ddd      \  }}}j                  j	                  ddd      }t        j                  ||z
  d      j                         }dd|z   z  }dd	t        j                  t        j                  |d
z              z  z   }||z
  dz  }	|	j                          j                          j                  |d      }
j                  |j                                j                  |j                                j                  |	j                                j                  |
       j                          j!                  ddd       j!                  dddd       j#                  d       j%                  d       j'                  d       j)                  ddd       j                          j!                  ddd       j!                  ddd       j#                  d        j+                  d!       j%                  d"       j'                  d       j)                  ddd       t-        j.                          t-        j0                          t-        j2                  d       t5        d#|j                         d$d%|j                         d$d&       t5        d'|	j                         d(d)|
d(       y )*Nrx   Tr\   r	   r9   r:   r<   r   g?g     b@r)   )rK   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:rw   )r   alphazAlignment Lossz#ffaa00u   Integrated Information Φz#00ff00zOptimization Metricsz
Game MovesValuesu   📊 Coherence: z.3fz
 (Target: )u   📈 Loss: z.4fu    | Integrated Info Φ: )	zero_gradr   rZ   r    r>   r   r3   rE   rA   r   backwardsteprs   rD   rI   clearplot	set_title
set_ylabellegendgrid
set_xlabelplttight_layoutdrawpauser   )board_state
eval_scorerJ   final_stater%   rV   divergence_final	coherencetarget_coherencelossrr   ax1ax2
coherenceslosses	optimizerphistarget_coherences
telepathics              r'   optimize_memoryzmain.<locals>.optimize_memory!  s   &{3&..|2VZjn.oQ!!&&q!R0 ::kB&6B?DDF3!112	 u}}U\\*uBT5U'V!VV,,2$$\$< 	)..*+  !1!6!6!89diik"C 			#5YRST"*A^bnqrDE{#

|
$C0		/yAN8	UXY,-|$x 

|
$C0
		# !1# 6jAQAVAVAXY\@]]^_`DIIK,,CC9MNr7   z
Game Started!zWCommands: Enter standard algebraic notation (e.g. e4, Nf3) or UCI notation (e.g. e2e4).z+Use 'undo' to step back, or 'quit' to exit.zYour move: r   undor   zUndid the last move pair.z&Cannot undo (not enough moves played).u   ❌ Illegal move. Try again.uE   ❌ Invalid move format. Use SAN (e.g., e4, Nf3) or UCI (e.g., e2e4).z(Computing stationary memory alignment...g333333?)r   zGNU Chess thinking...u   🤖 GNU Chess played: z
Game Over!zResult: z
Exiting game...),r   r   r   r   inputr   lowerr   r   r   trainr   optimAdam
parametersr
  ionsubplotscanvasmanagerset_window_titleis_game_overr   turnr1   
move_stackpopr   r   	parse_sanr   	parse_ucir   r   r   r   r   r   sanresultKeyboardInterruptr   ioffshow)r   r   color_inputr   figr  move_strmover   r   r  r  r  r  r  r  r  r  s             @@@@@@@@r'   mainr9    s   	
()!FKKME @AGGIOOQK"-"45;;%++L ""A!58sDJ   !6!6!8U CI GGIll1a8OC#sJJ''(UVJFD1O 1Of 

	
cd	
78I$$&|, zz\) /557>>#v->>#v-5++,1				++EIIK8z?Q.&NN,-113"JJL HHJ9:FG9$x8 u000

4(++EIIK8<=  9 @A--C-@u- -.#)#F#FUX#F#Y y ::..y9DJJt$''		43EIIdO3DEF DE#E51y $$&| |,.!HU\\^,-.
 	

Y & 9$x89 " ab<  #!"# 	

sp   D,Q; P? A
Q  #CQ; AQ; ?QQ  QQ   Q84Q; 7Q88Q; ;RR RR :S__main__)r   r   r   torch.nnr   ra   npr+   matplotlib.pyplotpyplotr
  sklearn.metricsr   Moduler   PAWNKNIGHTBISHOPROOKQUEENKINGr   r   Tensorr   r   Colorr   r9  rz   r   r7   r'   <module>rI     s           -
Uryy Uv 	!	JJ5<<ELL!	JJ5;;5::q5;; 5<< &p  p ju{{ %++ $Zx zF r7   