-module(gleam_synapses@net). -compile(no_auto_import). -export([new/1, new_with_seed/2, new_custom/3, predict/2, par_predict/2, errors/4, fit/4, par_fit/4, to_json/1, from_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:neuron())). seed_init(Maybe_seed, Layers) -> Gen = begin _pipe = Layers, _pipe@1 = gleam_zlists:of_list(_pipe), gleam_synapses@model@net_elems@network@network:generator(_pipe@1) end, 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:neuron())), list(float()) ) -> nil. fail_if_input_not_match(Net, Input_values) -> Num_of_input_vals = gleam@list:length(Input_values), {ok, First_neuron@1} = case begin _pipe = Net, _pipe@1 = gleam_zlists:head(_pipe), gleam@result:then(_pipe@1, fun gleam_zlists:head/1) end of {ok, First_neuron} -> {ok, First_neuron}; _try -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => _try, module => <<"gleam_synapses/net"/utf8>>, function => <<"fail_if_input_not_match"/utf8>>, line => 29}) end, Input_layer_size = gleam_zlists:count(erlang:element(3, First_neuron@1)) - 1, Is_equal = Num_of_input_vals =:= Input_layer_size, true = case Is_equal of true -> true; _try@1 -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => _try@1, module => <<"gleam_synapses/net"/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:neuron())), list(float()) ) -> nil. fail_if_expected_not_match(Net, Expected_output) -> Num_of_expected_vals = gleam@list:length(Expected_output), {ok, Output_layer_size@1} = case begin _pipe = Net, _pipe@1 = gleam_zlists:reverse(_pipe), _pipe@2 = gleam_zlists:head(_pipe@1), gleam@result:map(_pipe@2, fun gleam_zlists:count/1) end of {ok, Output_layer_size} -> {ok, Output_layer_size}; _try -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => _try, module => <<"gleam_synapses/net"/utf8>>, function => <<"fail_if_expected_not_match"/utf8>>, line => 42}) end, Is_equal = Num_of_expected_vals =:= Output_layer_size@1, true = case Is_equal of true -> true; _try@1 -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => _try@1, module => <<"gleam_synapses/net"/utf8>>, function => <<"fail_if_expected_not_match"/utf8>>, line => 49}) end, nil. -spec new(list(integer())) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())). new(Layers) -> _pipe = seed_init(none, Layers), gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe). -spec new_with_seed(list(integer()), integer()) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())). new_with_seed(Layers, Seed) -> _pipe = seed_init({some, Seed}, Layers), gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe). -spec new_custom( list(integer()), fun((integer()) -> gleam_synapses@model@net_elems@activation@activation:activation()), fun((integer()) -> float()) ) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())). new_custom(Layers, Activation_f, Weight_init_f) -> _pipe = Layers, _pipe@1 = gleam_zlists:of_list(_pipe), _pipe@2 = gleam_synapses@model@net_elems@network@network:init( _pipe@1, Activation_f, Weight_init_f ), gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe@2). -spec predict( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())), list(float()) ) -> list(float()). predict(Net, Input_values) -> fail_if_input_not_match(Net, Input_values), Input = gleam_zlists:of_list(Input_values), _pipe = gleam_synapses@model@net_elems@network@network:output( Net, Input, false ), gleam_zlists:to_list(_pipe). -spec par_predict( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())), list(float()) ) -> list(float()). par_predict(Net, Input_values) -> fail_if_input_not_match(Net, Input_values), Input = gleam_zlists:of_list(Input_values), _pipe = gleam_synapses@model@net_elems@network@network:output( Net, Input, true ), gleam_zlists:to_list(_pipe). -spec errors( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())), list(float()), list(float()), boolean() ) -> list(float()). errors(Net, Input_values, Expected_output, In_parallel) -> fail_if_input_not_match(Net, Input_values), fail_if_expected_not_match(Net, Expected_output), Input = gleam_zlists:of_list(Input_values), Expected = gleam_zlists:of_list(Expected_output), _pipe = gleam_synapses@model@net_elems@network@network:errors( Net, Input, Expected, In_parallel ), gleam_zlists:to_list(_pipe). -spec fit( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())), float(), list(float()), list(float()) ) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())). fit(Net, Learning_rate, Input_values, Expected_output) -> fail_if_input_not_match(Net, Input_values), fail_if_expected_not_match(Net, Expected_output), Input = gleam_zlists:of_list(Input_values), Expected = gleam_zlists:of_list(Expected_output), _pipe = gleam_synapses@model@net_elems@network@network:fit( Net, Learning_rate, Input, Expected, false ), gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe). -spec par_fit( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())), float(), list(float()), list(float()) ) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())). par_fit(Net, Learning_rate, Input_values, Expected_output) -> fail_if_input_not_match(Net, Input_values), fail_if_expected_not_match(Net, Expected_output), Input = gleam_zlists:of_list(Input_values), Expected = gleam_zlists:of_list(Expected_output), _pipe = gleam_synapses@model@net_elems@network@network:fit( Net, Learning_rate, Input, Expected, true ), gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe). -spec to_json( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())) ) -> binary(). to_json(Net) -> gleam_synapses@model@net_elems@network@network_serialized:to_json(Net). -spec from_json(binary()) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())). from_json(Json) -> _pipe = Json, _pipe@1 = gleam_synapses@model@net_elems@network@network_serialized:of_json( _pipe ), gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe@1). -spec to_svg( gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())) ) -> binary(). to_svg(Net) -> gleam_synapses@model@draw:network_svg(Net).