+
    ;>j                     $   R t ^ RItRtRtRtR tR tRR ltRR lt]	R	8X  dm   ]! R
RRR.4      w  t
tt]
R
8  d   ]R8  g   Q ]
]]34       h]! RRR^RR/RRRRRR/R4      w  w  tttw  ttt]! R]R R]R R]R R]R R2	4       ]! R4       R# R# )z\Minimal Glicko-2 (Glickman). Per-encounter update: each call = one game / one rating period.Ng47e@g     p@gư>c                     R \         P                  ! R RV ,          V ,          \         P                  \         P                  ,          ,          ,           4      ,          # )      ?g      @)mathsqrtpi)phis   &/tmp/glicko2.py_gr	   	   s5    3sSDGGdgg4E!FFGGG    c                 x    R R \         P                  ! \        V4      ) W,
          ,          4      ,           ,          # )r   )r   expr	   )mumu_jphi_js   &&&r   _Er      s(    #"U)ry!9::;;r
   c                @  aaaa a! V \         ,
          \        ,          pV\        ,          o V'       gE   \        P                  ! S S ,          W",          ,           4      pV \	        \        V,          R4      V3# V UUU	u. uF+  w  rxq\         ,
          \        ,          V\        ,          V	3NK-  	  p
ppp	RpRpV
 FW  w  rp	\        V4      p\        W]V4      pWV,          V,          RV,
          ,          ,          pWV	V,
          ,          ,          pKY  	  RV,          o!S!V,          o\        P                  ! W",          4      oVVV VV!3R lpSpSS,          S S ,          S!,           8  d4   \        P                  ! SS,          S S ,          ,
          S!,
          4      pM8^pV! SVS,          ,
          4      ^ 8  d   V^,          pK&  SVS,          ,
          pV! V4      V! V4      pp\        VV,
          4      \        8  dP   VVV,
          V,          VV,
          ,          ,           pV! V4      pVV,          ^ 8:  d   TTppM	VR,          pTTppKj  \        P                  ! VR,          4      p\        P                  ! S S ,          VV,          ,           4      pR\        P                  ! RWf,          ,          RS!,          ,           4      ,          pVVV,          V,          ,           p\        V,          \         ,           p\	        \        V,          R4      pVVV3# u up	ppi )znopponents: list of (opp_rating, opp_rd, score) with score in {0,0.5,1}.
Returns (new_rating, new_rd, new_vol).g     u@g        r   c                   < \         P                  ! V 4      pVSS,          SS,          ,
          S,
          V,
          ,          pR SS,          S,           V,           ^,          ,          pW#,          V S,
          SS,          ,          ,
          # )       @)r   r   )	xexnumdenadeltar   tauvs	   &   r   fupdate.<locals>.f*   sg    XXa[EEMC#I-1B67S3Y]R'A--yAEcCi000r
   r   )BASESCALEr   r   minr	   r   logabsEPSr   )"ratingrdvol	opponentsr   r   phi_starrdsopsv_inv	delta_sumr   r   ger   ABkfAfBCfCnew_volnew_phinew_mu
new_ratingnew_rdr   r   r   r   s"   &&&&f                         @@@@r   updater=      sr    4-5	 B
u*C99S3Y23s58+U3S88?H
Iy)1XE	1-yC
IEIQuIrQcAg&&!a%[ 		 
 	eA	ME 	A1 1 	
Au}sSy1}$HHUU]S3Y.23AGnq FACKqT1Q4B
a!e*s
Q"R((qT7a<rrArcB222hhq3wGyysWw%667HDIIcX%89C!GCDDG'G#i//F$&J%(Fvw&&] Js   =1Lc           	         \        V R,          V R,          V R,          VR,          VR,          V3.V4      p\        VR,          VR,          VR,          V R,          V R,          RV,
          3.V4      pWV3# )zu, w are dicts with rating/rd/vol. user_score=1 recalled, 0 failed.
Word moves opposite; lower tau_word keeps fixed-difficulty words stable.r$   r%   r&   r   )r=   )uw
user_scoretau_usertau_wordnunws   &&&&&  r   update_matchrF   L   sr     
(QtWah!H+qw
1S0TV^	_B	(QtWah!H+qwjHX1Y0Z\d	eB6Mr
   __main__  ^  gQ?r   r$   i  r%   r&   i  i,  zuser 1700 -> z.0fz (rd z)   word 1800 -> )zglicko2 sanity OK)      ?)rK   g333333?)rH   rI   r   )__doc__r   r   r   r#   r	   r   r=   rF   __name__r)   r*   r   ururduvwrwrdwvprint r
   r   <module>rV      s    b 
H<8'v zT3'7&89GAq!t8C*!Q*#/	4sE40	4sE40#$7 MRb=BR 
M"Ss3i/@CcRUYVW
XY	
 r
   