Packages
mmath
0.2.0-alpha6
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.2.0-alpha9
0.2.0-alpha8
0.2.0-alpha7
0.2.0-alpha6
0.2.0-alpha5
0.2.0-alpha4
0.2.0-alpha3
0.2.0-alpha2
0.2.0-alpha10
0.2.0-alpha1
0.2.0-alpha
0.1.17-alpha
0.1.16
0.1.15
0.1.14
0.1.13
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
math library for metric sequences and binary arrays.
Current section
Files
Jump to
Current section
Files
src/mmath_comb.erl
%%%-------------------------------------------------------------------
%%% @author Heinz Nikolaus Gies <heinz@licenser.net>
%%% @copyright (C) 2016, Project-FiFo UG
%%% @doc
%%% Module that provide mmath functions that combine metrics.
%%% All functions take a list of realized metrics and return a single
%%% realized metric
%%% @end
%%% Created : 29 Apr 2016 by Heinz Nikolaus Gies <heinz@licenser.net>
%%%-------------------------------------------------------------------
-module(mmath_comb).
-include("mmath.hrl").
-ifdef(TEST).
-compile(export_all).
-endif.
-export([avg/1,
sum/1
%%,
%%mul/1,
%%merge/1,
%%zip/2
]).
-define(APPNAME, mmath).
-define(LIBNAME, comb_nif).
-on_load(load_nif/0).
load_nif() ->
SoName = case code:priv_dir(?APPNAME) of
{error, bad_name} ->
case filelib:is_dir(filename:join(["..", priv])) of
true ->
filename:join(["..", priv, ?LIBNAME]);
_ ->
filename:join([priv, ?LIBNAME])
end;
Dir ->
filename:join(Dir, ?LIBNAME)
end,
erlang:load_nif(SoName, 0).
%%--------------------------------------------------------------------
%% @doc
%% Creates a new dataset with each element being the sum of the
%% elements of the passed datasets.
%% @end
%%--------------------------------------------------------------------
sum([A, B]) ->
sum(A, B);
sum([A, B, C]) ->
sum(A, B, C);
sum(Es) ->
rcomb(fun sum/2, fun sum/3, Es, []).
%%--------------------------------------------------------------------
%% @doc
%% Creates a new dataset with each element being the average (mean)
%% of the elements of the passed datasets.
%% @end
%%--------------------------------------------------------------------
avg(Es) ->
mmath_trans:divide(sum(Es), length(Es)).
%%-------------------------------------------------------------------
%% Utility functions
%%-------------------------------------------------------------------
sum(_A, _B) ->
exit(nif_library_not_loaded).
sum(_A, _B, _C) ->
exit(nif_library_not_loaded).
%%--------------------------------------------------------------------
%% @doc
%% Combines a set of datasets with a given combinator function.
%% this requires the combinator to be associative!
%%--------------------------------------------------------------------
rcomb(F2, _F3, [A], [B]) ->
F2(A, B);
rcomb(F2, F3, [], Acc) ->
rcomb(F2, F3, Acc, []);
rcomb(_, _, [A], []) ->
A;
rcomb(F2, F3, [A, B, C, D | R], Acc) ->
rcomb(F2, F3, R, [F2(F2(A, B), F2(C, D)) | Acc]);
rcomb(F2, F3, [A, B, C | R], Acc) when is_function(F3) ->
rcomb(F2, F3, R, [F3(A, B, C) | Acc]);
rcomb(F2, F3, [A, B | R], Acc) ->
rcomb(F2, F3, R, [F2(A, B) | Acc]);
rcomb(F2, F3, [A], Acc) ->
rcomb(F2, F3, [A | Acc], []).