FeatureUnion::transformSamples()   A
last analyzed

Complexity

Conditions 6
Paths 7

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 11
c 1
b 0
f 0
dl 0
loc 19
rs 9.2222
cc 6
nc 7
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Phpml;
6
7
use Phpml\Exception\InvalidArgumentException;
8
9
final class FeatureUnion implements Transformer
10
{
11
    /**
12
     * @var Pipeline[]
13
     */
14
    private $pipelines = [];
15
16
    /**
17
     * @var Pipeline[]
18
     */
19
    public function __construct(array $pipelines)
20
    {
21
        if ($pipelines === []) {
22
            throw new InvalidArgumentException('At least one pipeline is required');
23
        }
24
25
        $this->pipelines = array_map(static function (Pipeline $pipeline): Pipeline {
26
            return $pipeline;
27
        }, $pipelines);
28
    }
29
30
    public function fit(array $samples, ?array $targets = null): void
31
    {
32
        $originSamples = $samples;
33
        foreach ($this->pipelines as $pipeline) {
34
            foreach ($pipeline->getTransformers() as $transformer) {
35
                $transformer->fit($samples, $targets);
36
                $transformer->transform($samples, $targets);
37
            }
38
            $samples = $originSamples;
39
        }
40
    }
41
42
    public function transform(array &$samples, ?array &$targets = null): void
43
    {
44
        $this->transformSamples($samples, $targets);
45
    }
46
47
    public function fitAndTransform(array &$samples, ?array &$targets = null): void
48
    {
49
        $this->transformSamples($samples, $targets, true);
50
    }
51
52
    private function transformSamples(array &$samples, ?array &$targets = null, bool $fit = false): void
53
    {
54
        $union = [];
55
        $originSamples = $samples;
56
        foreach ($this->pipelines as $pipeline) {
57
            foreach ($pipeline->getTransformers() as $transformer) {
58
                if ($fit) {
59
                    $transformer->fit($samples, $targets);
60
                }
61
                $transformer->transform($samples, $targets);
62
            }
63
64
            foreach ($samples as $index => $sample) {
65
                $union[$index] = array_merge($union[$index] ?? [], is_array($sample) ? $sample : [$sample]);
66
            }
67
            $samples = $originSamples;
68
        }
69
70
        $samples = $union;
71
    }
72
}
73