anchor.diff:  
   target(0, _, _) -> -100; 
   target({0,0}, _, _) -> 100; 
  -target({N,Q}, NOS, Explore) -> Q/N + Explore*math:sqrt(NOS)/(1+N).
  -
  +target({N,Q}, NOS, Explore) -> 
  +    DE = 1.0 + Explore*math:sqrt(NOS)/(1+N),
  +    (Q/N + DE) / DE.
  +% target({N,Q}, NOS, Explore) -> Q/N + Explore*math:sqrt(NOS)/(1+N).
  +
  
positive.code: -define(QL_TRAIN_OPTS, [{record_name, egTicTacQlSample}, {type, set}]).        
  -define(QL_OUTPUT_UNSAMPLED, 0.001).        % Value emitted as output for unsampled move in Export
  
  -record(egTicTacQlSample,   { sin= <<>> :: binary() % binstr key of normalized position (Board)
                              , nos=1     :: number() % number of samples (1...)
                              , qos=1     :: number() % score of sample (-1..+1)
                              , aaq=[]    :: list()   % aggregated action qualities
                              }).
  
  -define(egTicTacQlSample,   [ binstr
                              , number
                              , number
                              , list
                              ]).
  % rd(egTicTacQlSample, {sin, nos, qos, aaq}).
  
  -record(state,  { bid        :: egBotId()       % bot id (= module name)
                  , tid        :: egGameTypeId()  % game type id
  
negative.code: qlearn_max([0|Output], Max, MaxQ) -> qlearn_max(Output, Max, MaxQ);     % invalid action
  qlearn_max([{0,_}|Output], Max, MaxQ) -> qlearn_max(Output, Max, MaxQ); % unsampled action
  qlearn_max([{N,Q}|Output], _Max, MaxQ) when Q/N>MaxQ -> qlearn_max(Output, {N,Q}, Q/N); % bigger
  qlearn_max([{N,Q}|Output], {NMax,_}, MaxQ) when Q/N==MaxQ, N>NMax -> qlearn_max(Output, {N,Q}, Q/N); % more statistics
  qlearn_max([{_,_}|Output], Max, MaxQ) -> qlearn_max(Output, Max, MaxQ). % smaller or equal
  
  -spec play_bot_resp(egGameId(), egAlias(), egBotMove() ) -> ok.
  