1<?php
2
3namespace Rubix\ML
4{
5    /**
6     * Compute the argmin of the given values.
7     *
8     * @param (int|float)[] $values
9     * @return mixed
10     */
11    function argmin(array $values)
12    {
13        return array_search(min($values), $values);
14    }
15
16    /**
17     * Compute the argmax of the given values.
18     *
19     * @param (int|float)[] $values
20     * @return mixed
21     */
22    function argmax(array $values)
23    {
24        return array_search(max($values), $values);
25    }
26
27    /**
28     * Compute the log of the sum of exponential values.
29     *
30     * @param (int|float)[] $values
31     * @return float
32     */
33    function logsumexp(array $values) : float
34    {
35        return log(array_sum(array_map('exp', $values)));
36    }
37
38    /**
39     * Compute n choose k.
40     *
41     * @param int $n
42     * @param int $k
43     * @return int
44     */
45    function comb(int $n, int $k) : int
46    {
47        return $k === 0 ? 1 : (int) (($n * comb($n - 1, $k - 1)) / $k);
48    }
49
50    /**
51     * Transpose a 2-dimensional array i.e. columns become rows and rows become columns.
52     *
53     * @param array[] $table
54     * @return array[]
55     */
56    function array_transpose(array $table) : array
57    {
58        switch (count($table)) {
59            case 0:
60                return $table;
61
62            case 1:
63                $columns = [];
64
65                foreach (current($table) ?: [] as $row) {
66                    $columns[] = [$row];
67                }
68
69                return $columns;
70
71            default:
72                return array_map(null, ...$table);
73        }
74    }
75
76    /**
77     * Emit a deprecation warning with a message.
78     *
79     * @param string $message
80     */
81    function warn_deprecated(string $message) : void
82    {
83        trigger_error($message, E_USER_DEPRECATED);
84    }
85}
86