anchor.diff:      % ?Info("ql train_move Board ~p and Move ~p for temporary X", [_Board, _Move]),
       % ?Info("ql train_move immediate reward ~p ", [Score]),
       % Do not record this pre-final board state. Decision will be taken by a one step look ahead, not from the Q-Table
  -    {1, Score, Score*Score}; % (Qmax of final move, +1 for a win or 0 for a tie)
  +    {1, Score}; % (Qmax of final move, +1 for a win or 0 for a tie)
   train_move([Board, _Players, Move, _, MTE], Table, Width, Height, false, Periodic, LearningRate, Discount, Qmax) ->
       % ?Info("ql train_move Board ~p and Move ~p for temporary X", [Board, Move]),
       % ?Info("ql train_move target position qmax ~p ", [Qmax]),
  
positive.code: empty_action_qualities(Input, Olen) ->
      {TruncInput,_} = lists:split(Olen,Input),
      [ if 
          Inp==32 ->   {0, 0, 0}; % {N, sum(Q), sum(Q^2)} for legal action
          true ->      0          % illegal move (occupied)
        end
      || Inp <- TruncInput 
  
negative.code:         [#egTicTacQlSample{nos=Nos, aaq=Aaq}] ->    {Nos,Aaq}
      end,
      % ?Info("play_bot_impl ActionQuality ~p",[ActionQuality]),    
      NormIdx = pick(NOS, AccActionQuality, 1, Explore, Flatten),      % 0-based index for predicted move
      NewIdx = egambo_tictac_sym:unmap_move(Width, Height, NormIdx, Sym),    
      % ?Info("play_bot_impl NormIdx, NewIdx (output picked) ~p ~p", [NormIdx, NewIdx]),
      {ok, Idx, NewBoard} = egambo_tictac:put(Gravity, Board, Width, NewIdx, hd(NAliases)),
  