anchor.diff:  -define(BATCH_SIZE, 512).
   -define(EPOCHS, 1).
   -define(SCALE, null).
  +-define(TIMEOUT, 60000).
   
   -spec start_link(binary(), inet:socket_address() | inet:hostname(), inet:port_number()) -> {ok, pid()} | {error, term()}.
   start_link(NetworkId, Address, Port) ->
  
positive.code: 
  -spec train(binary(), pos_integer(), pos_integer()) -> ok | {error, binary()}.
  train(NetworkId, Epochs, BatchSize) ->
      gen_server:call(?NETWORK_GID(NetworkId), {train, [Epochs, BatchSize]}).
  
  -spec get_weights(binary()) -> ok | {error, binary()}.
  get_weights(NetworkId) ->
      gen_server:call(?NETWORK_GID(NetworkId), {get_weights, []}).
  
  -spec set_weights(binary(), [float()]) -> ok | {error, binary()}.
  set_weights(NetworkId, Weights) ->
      gen_server:call(?NETWORK_GID(NetworkId), {set_weights, [Weights]}).
  
  -spec predict(binary(), [number()]) -> list() | {error, binary()} .
  predict(NetworkId, [N|_]=Input) when is_number(N) ->
  
negative.code: 
  -spec add_data_chunk(binary(), list(), list(), list()) -> ok | {error, binary()}.
  add_data_chunk(NetworkId, Inputs, Labels, Scale) ->
      gen_server:call(?NETWORK_GID(NetworkId), {add_data_chunk, [Inputs, Labels, Scale]}, ?TIMEOUT).
  
  -spec set_learning_rate(binary(), float()) -> ok | {error, binary()}.
  set_learning_rate(NetworkId, LearningRate) ->
      gen_server:call(?NETWORK_GID(NetworkId), {set_learning_rate, [LearningRate]}, ?TIMEOUT).
  
  -spec train(binary()) -> ok | {error, binary()}.
  train(NetworkId) -> train(NetworkId, ?EPOCHS).
  