Code Coverage for /src/SciPhp/NumPhp/OperationTrait.php

 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.24% covered (success)
95.24%
20 / 21
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
OperationTrait
95.24% covered (success)
95.24%
20 / 21
50.00% covered (danger)
50.00%
1 / 2
6
0.00% covered (danger)
0.00%
0 / 1
 sum
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
4
 trapz
92.31% covered (success)
92.31%
12 / 13
0.00% covered (danger)
0.00%
0 / 1
2.00
1 <?php
2
3 declare(strict_types=1);
4
5 namespace SciPhp\NumPhp;
6
7 use Webmozart\Assert\Assert;
8
9 trait OperationTrait
10 {
11     /**
12      * Sum all elements.
13      *
14      * @param  \SciPhp\NdArray|array|int|float $m
15      * @param  int|null $axis
16      * @param  bool     $keepdims
17      * @return int|float|\SciPhp\NdArray
18      * @link http://sciphp.org/numphp.sum Documentation
19      * @api
20      */
21     final public static function sum($m, $axis = null, bool $keepdims = false)
22     {
23         if (is_numeric($m)) {
24             return $m;
25         }
26
27         static::transform($m, true);
28
29         $func = static function(array $array) use (&$func) {
30             return isset($array[0]) && \is_array($array[0])
31                 ? array_sum(array_map($func, $array))
32                 : array_sum($array);
33         };
34
35         return $m->axis($func, $axis, $keepdims);
36     }
37
38     /**
39      * Integrate along the given axis using the composite trapezoidal rule.
40      *
41      * @param  \SciPhp\NdArray|array $m
42      * @return int|float|array
43      * @link http://sciphp.org/numphp.trapz Documentation
44      * @todo implement dx, x options parameters
45      * @api
46      */
47     final public static function trapz($m)
48     {
49         static::transform($m, true);
50
51         Assert::eq(1, $m->ndim);
52
53         // dx = 1
54         $func = static function ($value, $key) use (& $prev): float {
55             if ($key === 0) {
56                 $prev = $value;
57
58                 return 0.0;
59             }
60
61             $sum = ($value + $prev) / 2;
62
63             $prev = $value;
64
65             return floatval($sum);
66         };
67
68         return array_sum(
69             array_map(
70                 $func,
71                 $m->data,
72                 array_keys($m->data)
73             )
74         );
75     }
76 }