Packages
mmath
0.2.3
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,
min/1,
max/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
%%--------------------------------------------------------------------
-spec sum([binary()]) -> binary().
sum([A, B]) ->
sum(A, B);
sum([A, B, C]) ->
sum(A, B, C);
sum(Es) when is_list(Es) ->
rcomb(fun sum/2, fun sum/3, Es).
%%--------------------------------------------------------------------
%% @doc
%% Creates a new dataset with each element being the min of the
%% elements of the passed datasets.
%% @end
%%--------------------------------------------------------------------
-spec min([binary()]) -> binary().
min([A, B]) ->
min_(A, B);
min([A, B, C]) ->
min_(A, B, C);
min(Es) when is_list(Es) ->
rcomb(fun min_/2, fun min_/3, Es).
%%--------------------------------------------------------------------
%% @doc
%% Creates a new dataset with each element being the max of the
%% elements of the passed datasets.
%% @end
%%--------------------------------------------------------------------
-spec max([binary()]) -> binary().
max([A, B]) ->
max_(A, B);
max([A, B, C]) ->
max_(A, B, C);
max(Es) when is_list(Es) ->
rcomb(fun max_/2, fun max_/3, Es).
%%--------------------------------------------------------------------
%% @doc
%% Creates a new dataset with each element being the average (mean)
%% of the elements of the passed datasets.
%% @end
%%--------------------------------------------------------------------
-spec avg([binary()]) -> binary().
avg(Es) when is_list(Es), length(Es) > 0 ->
mmath_trans:divide(sum(Es), length(Es)).
%%-------------------------------------------------------------------
%% Utility functions
%%-------------------------------------------------------------------
sum(_A, _B) ->
erlang:nif_error(nif_library_not_loaded).
sum(_A, _B, _C) ->
erlang:nif_error(nif_library_not_loaded).
min_(_A, _B) ->
erlang:nif_error(nif_library_not_loaded).
min_(_A, _B, _C) ->
erlang:nif_error(nif_library_not_loaded).
max_(_A, _B) ->
erlang:nif_error(nif_library_not_loaded).
max_(_A, _B, _C) ->
erlang:nif_error(nif_library_not_loaded).
%%--------------------------------------------------------------------
%% @doc
%% Combines a set of datasets with a given combinator function.
%% this requires the combinator to be associative!
%%--------------------------------------------------------------------
-type comb_fun2() :: fun((binary(), binary()) -> binary()).
-type comb_fun3() :: fun((binary(), binary(), binary()) -> binary()).
-spec rcomb(comb_fun2(), comb_fun3(), L :: [binary()]) ->
binary().
rcomb(F2, F3, [A, B, C | R]) when is_function(F3) ->
rcomb(F2, F3, [F3(A, B, C) | R]);
rcomb(F2, F3, [A, B | R]) ->
rcomb(F2, F3, [F2(A, B) | R]);
rcomb(_, _, [E]) ->
E.