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