defmodule Descisionex do
@moduledoc """
Library for dealing with descision theory algorithms.
"""
alias Descisionex.{PaymentMatrix, AnalyticHierarchy}
def analytic_hierarchy() do
raise(ArgumentError, message: "Comparison matrix must be set!")
end
def analytic_hierarchy([]) do
raise(ArgumentError, message: "Comparison matrix must be set!")
end
def analytic_hierarchy(matrix) do
%AnalyticHierarchy{comparison_matrix: matrix}
end
def payment_matrix() do
raise(ArgumentError, message: "Matrix must be set!")
end
def payment_matrix([]) do
raise(ArgumentError, message: "Matrix must be set!")
end
def payment_matrix(matrix) do
%PaymentMatrix{matrix: matrix}
end
# --- Shared setters ---
def set_criteria(%PaymentMatrix{} = data, criteria) do
data |> PaymentMatrix.set_variants(criteria)
end
def set_criteria(%AnalyticHierarchy{} = data, criteria) do
data |> AnalyticHierarchy.set_criteria(criteria)
end
def set_alternatives(%AnalyticHierarchy{} = data, alternatives) do
data |> AnalyticHierarchy.set_alternatives(alternatives)
end
def set_alternatives(%PaymentMatrix{} = data, steps) do
data |> PaymentMatrix.set_steps(steps)
end
def set_alternatives_matrix(%AnalyticHierarchy{} = data, matrix) do
data |> AnalyticHierarchy.set_alternatives_matrix(matrix)
end
def set_tagged_alternatives_matrix(%AnalyticHierarchy{} = data, matrix) do
data |> AnalyticHierarchy.set_tagged_alternatives_matrix(matrix)
end
# --- PaymentMatrix setters ---
def set_hurwitz_additional_value(%PaymentMatrix{} = data, value) do
data |> PaymentMatrix.set_hurwitz_additional_value(value)
end
def set_generalized_additional_value(%PaymentMatrix{} = data, value) do
data |> PaymentMatrix.set_generalized_additional_value(value)
end
def set_probabilities(%PaymentMatrix{} = data, probabilities) do
data |> PaymentMatrix.set_probabilities(probabilities)
end
# --- PaymentMatrix criteria ---
def calculate_wald_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_wald_criterion()
end
def calculate_maximax_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_maximax_criterion()
end
def calculate_laplace_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_laplace_criterion()
end
def calculate_savage_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_savage_criterion()
end
def calculate_hurwitz_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_hurwitz_criterion()
end
def calculate_generalized_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_generalized_criterion()
end
def calculate_bayes_criterion(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_bayes_criterion()
end
def calculate_criteria(%PaymentMatrix{} = data) do
data |> PaymentMatrix.calculate_criteria()
end
# --- AnalyticHierarchy pipeline ---
def normalize_comparison_matrix(%AnalyticHierarchy{} = data) do
data |> AnalyticHierarchy.normalize_comparison_matrix()
end
def calculate_criteria_weights(%AnalyticHierarchy{} = data) do
data |> AnalyticHierarchy.calculate_criteria_weights()
end
def calculate_consistency_ratio(%AnalyticHierarchy{} = data) do
data |> AnalyticHierarchy.calculate_consistency_ratio()
end
def calculate_alternatives_weights_by_criteria(%AnalyticHierarchy{} = data) do
data |> AnalyticHierarchy.calculate_alternatives_weights_by_criteria()
end
def calculate_alternatives_weights(%AnalyticHierarchy{} = data) do
data |> AnalyticHierarchy.calculate_alternatives_weights()
end
def calculate(%AnalyticHierarchy{} = data) do
data |> AnalyticHierarchy.calculate()
end
def rank_alternatives(%AnalyticHierarchy{} = data) do
data.alternatives_weights
|> Enum.zip(data.alternatives)
|> Enum.sort_by(fn {weight, _} -> weight end, :desc)
|> Enum.with_index(1)
|> Enum.map(fn {{weight, alternative}, rank} ->
%{rank: rank, alternative: alternative, weight: weight}
end)
end
end