anchor.diff:  
   -record(state, {
       id :: list(),
  -    network :: pid(), 
  +    network :: binary(), 
       games = #{} :: map()
   }).
   
  
positive.code:             %% We use our own initialization of the weights so we have some flexibility.
              [rand:uniform() * 0.5 - 0.25 || _ <- lists:seq(1, N)];
          [#{cvalue := CVal }] ->
              lists:flatten(imem_json:decode(CVal, [return_maps]))
      end.
  
  -spec save(list(), pid()) -> ok.
  save(Id, NN) ->
      Weights = ann:get_weights(NN),
      imem_dal_skvh:write(system, ?NETWORK_CHANNEL, Id, imem_json:encode(Weights)),
      ok.
  
  -spec init_network([integer()], [float()]) -> pid() | {error, binary()}.
  init_network([42 | Rest] = Layers, Weights) ->
      case lists:last(Rest) of
          1 -> ann:create_neural_network(Layers, Weights, relu);
          _ -> {error, <<"Output layer must contain only one neuron">>}
      end;
  init_network(_, _) -> {error, <<"Input layer must contain 42 neuros">>}.
  
negative.code:             {reply, suggest_moves_impl(Board, NN), State}
      end;
  handle_call({evaluate_position, Pos}, _From, #state{network = NN} = State) ->
      [Result] = annlink:predict(NN, Pos),
      {reply, Result, State};
  handle_call(save, _From, #state{id = Id, network = NN} = State) ->
      %% TODO: It should be automatic but it depends on the state of the network...
  