-module(gleam_synapses@neural_network). -compile(no_auto_import). -export([init/1, init_with_seed/2, customized_init/3, prediction/2, errors/4, fit/4, to_json/1, of_json/1, to_svg/1]). -spec seed_init(gleam@option:option(integer()), list(integer())) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). seed_init(Maybe_seed, Layers) -> Gen = gleam_synapses@model@net_elems@network:generator( gleam_zlists:of_list(Layers) ), case Maybe_seed of {some, I} -> minigen:run_with_seed(Gen, I); none -> minigen:run(Gen) end. -spec fail_if_input_not_match( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())), list(float()) ) -> nil. fail_if_input_not_match(Network, Input_values) -> Num_of_input_vals = gleam@list:length(Input_values), {ok, First_neuron} = gleam@result:then( gleam_zlists:head(Network), fun gleam_zlists:head/1 ), Input_layer_size = gleam_zlists:count(erlang:element(3, First_neuron)) - 1, Is_equal = Num_of_input_vals =:= Input_layer_size, {} = case Is_equal of true -> {}; Gleam@Assert -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => Gleam@Assert, module => <<"gleam_synapses/neural_network"/utf8>>, function => <<"fail_if_input_not_match"/utf8>>, line => 36}) end, nil. -spec fail_if_expected_not_match( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())), list(float()) ) -> nil. fail_if_expected_not_match(Network, Expected_output) -> Num_of_expected_vals = gleam@list:length(Expected_output), {ok, Output_layer_size} = gleam@result:map( gleam_zlists:head(gleam_zlists:reverse(Network)), fun gleam_zlists:count/1 ), Is_equal = Num_of_expected_vals =:= Output_layer_size, {} = case Is_equal of true -> {}; Gleam@Assert -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => Gleam@Assert, module => <<"gleam_synapses/neural_network"/utf8>>, function => <<"fail_if_expected_not_match"/utf8>>, line => 52}) end, nil. -spec init(list(integer())) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). init(Layers) -> seed_init(none, Layers). -spec init_with_seed(integer(), list(integer())) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). init_with_seed(Seed, Layers) -> seed_init({some, Seed}, Layers). -spec customized_init( list(integer()), fun((integer()) -> gleam_synapses@model@net_elems@activation:activation()), fun((integer()) -> float()) ) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). customized_init(Layers, Activation_f, Weight_init_f) -> gleam_synapses@model@net_elems@network:init( gleam_zlists:of_list(Layers), Activation_f, Weight_init_f ). -spec prediction( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())), list(float()) ) -> list(float()). prediction(Network, Input_values) -> fail_if_input_not_match(Network, Input_values), Input = gleam_zlists:of_list(Input_values), gleam_zlists:to_list( gleam_synapses@model@net_elems@network:output(Network, Input) ). -spec errors( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())), float(), list(float()), list(float()) ) -> list(float()). errors(Network, Learning_rate, Input_values, Expected_output) -> fail_if_input_not_match(Network, Input_values), fail_if_expected_not_match(Network, Expected_output), Input = gleam_zlists:of_list(Input_values), Expected = gleam_zlists:of_list(Expected_output), gleam_zlists:to_list( gleam_synapses@model@net_elems@network:errors( Network, Learning_rate, Input, Expected ) ). -spec fit( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())), float(), list(float()), list(float()) ) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). fit(Network, Learning_rate, Input_values, Expected_output) -> fail_if_input_not_match(Network, Input_values), fail_if_expected_not_match(Network, Expected_output), Input = gleam_zlists:of_list(Input_values), Expected = gleam_zlists:of_list(Expected_output), gleam_synapses@model@net_elems@network:fit( Network, Learning_rate, Input, Expected ). -spec to_json( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())) ) -> binary(). to_json(Network) -> gleam_synapses@model@net_elems@network:to_json(Network). -spec of_json(binary()) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). of_json(Json) -> gleam_synapses@model@net_elems@network:of_json(Json). -spec to_svg( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())) ) -> binary(). to_svg(Network) -> gleam_synapses@model@draw:network_svg(Network).