Test Setup Failed
Pull Request — master (#348)
by Pol
03:52 queued 01:30
created

Distance::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Phpml\Math\Distance;
6
7
use Phpml\Exception\InvalidArgumentException;
8
use Phpml\Math\Distance as DistanceInterface;
9
10
/**
11
 * Class Distance
12
 */
13
abstract class Distance implements DistanceInterface
14
{
15
    /**
16
     * @var float|int
17
     */
18
    public $norm;
19
20
    /**
21
     * Distance constructor.
22
     */
23
    public function __construct(float $norm = 3.0)
24
    {
25
        $this->norm = $norm;
26
    }
27
28
    /**
29
     * @throws InvalidArgumentException
30
     */
31
    public function distance(array $a, array $b): float
32
    {
33
        $distance = 0;
34
35
        foreach ($this->deltas($a, $b) as $delta) {
36
            $distance += $delta ** $this->norm;
37
        }
38
39
        return $distance ** (1 / $this->norm);
40
    }
41
42
    /**
43
     * @throws InvalidArgumentException
44
     */
45
    protected function deltas(array $a, array $b): array
46
    {
47
        $count = count($a);
48
49
        if ($count !== count($b)) {
50
            throw new InvalidArgumentException('Size of given arrays does not match');
51
        }
52
53
        $deltas = [];
54
55
        for ($i = 0; $i < $count; $i++) {
56
            $deltas[] = abs($a[$i] - $b[$i]);
57
        }
58
59
        return $deltas;
60
    }
61
}
62