anchor.diff:  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
  +        Inp==32 ->   {0, 0};    % {N, sum(Q)} for legal action
           true ->      0          % illegal move (occupied)
         end
       || Inp <- TruncInput 
  
positive.code:         [#egTicTacQlSample{nos=N, aaq=OldOut}] ->
              {N, qlearn_add(OldOut, Qmax, OMove, Olen, LearningRate, Discount)}
      end,
      {SumN, SumQ, _SumQ2} = NewQmax = qlearn_max(AggregatedActionQualities),   
      TrainingRec=#egTicTacQlSample{input=list_to_binary(Input), nos=PreviousSampleCount+1, nmax=SumN, qmax=SumQ/SumN, aaq=AggregatedActionQualities},
      imem_meta:write(Table, TrainingRec),
      NewQmax.
  
negative.code:                 , winmod     :: egWinId()       % win function module
                  , players    :: integer()       % number of players 
                  , status     :: egBotStatus()   % current bot status (e.g. learning / playing)
                  , explore=1  :: number()        % rate for exploration (0..1)
                  , flatten=0  :: number()        % flat peak randomisation
                  , lrate=2    :: number()        % learning rate
                  , discount=1 :: number()        % Q-discount per move
                  , table      :: atom()          % table name for Q-A-aggregation
                  }).
  
  