anchor.diff:  % egambo_tictac_ann:train(GameTypeId           , Epochs, ResErr, Rate, QosMin, QosMax, BatchSize) 
   % egambo_tictac_ann:save(<<"tic_tac_toe_443">> , <<"V0.1">>,<<"First Attempt for Learning">>). 
   % egambo_tictac_ann:stop(<<"tic_tac_toe_443">>).
  -% egambo_tictac_ann:predict(<<"tic_tac_toe_443">>, ).
  +% egambo_tictac_ann:predict(<<"tic_tac_toe_443">>,"XXO  OO   XO   X").
   
   -define(BOT_IS_BUSY, {error, bot_is_busy}).
   
  --safe([state, start, stop, resume, save, start_learning, start_playing, ann_sample, ann_samples, train, test]).
  +-safe([state, start, stop, resume, save, start_learning, start_playing, ann_sample, ann_samples, train, test, ann_norm_input, ann_norm_sample_output]).
   
   game_types(egambo_tictac) -> all;
   game_types(_) -> [].
  
positive.code: layer_default(3=Width, Height, _Run, _Gravity, _Periodic) ->
      [Width*Height|[Width*Height || _ <- lists:seq(1, Width)]];
  layer_default(Width, Height, _Run, _Gravity, _Periodic) ->
      [Width*Height|[Width*Height || _ <- lists:seq(2, Width)]].
  
  start_link(GameTypeId)  ->
      gen_server:start_link(?BOT_GID(?MODULE, GameTypeId), ?MODULE, [GameTypeId], []).
  
negative.code:             [] ->
                  L = layer_default(Width, Height, Run, Gravity, Periodic),
                  ?Info("Creating random Layers ~p", [L]),  
                  {L, ann:create_neural_network(L, ?ANN_ACTIVATION), learning, <<>>, <<>>};
              [#egTicTacAnnModel{layers=L, weights=W, version=V, info=I}] ->
                  {L, ann:create_neural_network(L, lists:flatten(W), ?ANN_ACTIVATION), playing, V, I}
          end,
          State = #state{ bid=?MODULE 
                        , tid=GameTypeId
  