Passed
Push — main ( d29be2...38376b )
by N.
03:16
created

HistorisktUtfall::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Klass HistorisktUtfall.
5
 * @author Niklas Dougherty
6
 */
7
8
declare(strict_types=1);
9
10
namespace Tips\Klasser\JusteradePrediktioner;
11
12
use Tips\Klasser\DBPreferenser;
13
use Tips\Klasser\Prediktioner;
14
15
/**
16
 * Klass HistorisktUtfall.
17
 * Beräkna prediktioner retroaktivt för att i bayesisk mening
18
 * uppskatta verkliga odds.
19
 */
20
class HistorisktUtfall {
21
	protected DBPreferenser $db_preferenser;
22
	/**
23
	 * @var array<int, float[]> $odds_j
24
	 */
25
	protected array $odds_j;
26
27
	/**
28
	 * @var array<int, float[]> $streck_j
29
	 */
30
	protected array $streck_j;
31
32
	/**
33
	 * Initiera.
34
	 */
35 4
	public function __construct(public Prediktioner $prediktioner) {
36 4
		$this->db_preferenser = new DBPreferenser($this->prediktioner->spel->db);
37
	}
38
39
	/**
40
	 * Beräkna historiskt utfall.
41
	 */
42
	protected function historiskt_utfall(): void {
43
		/**
44
		 * Tre kolumner för procentsatser mellan 0 och 100.
45
		 */
46
		$this->streck_j = array_fill(0, 3, array_fill(0, 101, 0));
47
		$this->odds_j = $this->streck_j;
48
		$cstreck = $this->odds_j;
49
		$codds = $cstreck;
50
51
		/**
52
		 * Prediktioner för alla omgångar.
53
		 */
54
		$oddsprediktioner = $this->prediktioner->prediktionsdata('odds');
55
		$streckprediktioner = $this->prediktioner->prediktionsdata('streck');
56
57
		/**
58
		 * Summera sannolikheter och utfall.
59
		 */
60
		foreach ($this->prediktioner->tipsdata() as $omgång => $tipsrad_012) {
61
			if (isset($oddsprediktioner[$omgång], $streckprediktioner[$omgång])) {
62
				$oddssannolikheter = odds_till_sannolikheter($oddsprediktioner[$omgång]);
63
				$strecksannolikheter = streck_till_sannolikheter($streckprediktioner[$omgång]);
64
65
				foreach ($oddssannolikheter as $index => $oddssannolikhet) {
66
					$strecksannolikhet = $strecksannolikheter[$index];
67
					$os_procent = array_map('procenttal', $oddssannolikhet);
68
					$ss_procent = array_map('procenttal', $strecksannolikhet);
69
70
					foreach (array_keys($oddssannolikhet) as $j) {
71
						$codds[$j][$os_procent[$j]]++;
72
						$cstreck[$j][$ss_procent[$j]]++;
73
					}
74
75
					$tecken_012 = intval($tipsrad_012[$index]);
76
					$this->odds_j[$tecken_012][$os_procent[$tecken_012]]++;
77
					$this->streck_j[$tecken_012][$ss_procent[$tecken_012]]++;
78
				}
79
			}
80
		}
81
82
		$this->procentuell_fördelning($codds, $cstreck);
83
	}
84
85
	/**
86
	 * Procentuell fördelning.
87
	 * @param array<int, float[]> $codds
88
	 * @param array<int, float[]> $cstreck
89
	 */
90
	private function procentuell_fördelning(array $codds, array $cstreck): void {
91
		/**
92
		 * Omvandla summering till procentuell fördelning.
93
		 */
94
		foreach ($this->odds_j as $index => $oddssannolikhet) {
95
			foreach (array_keys($oddssannolikhet) as $j) {
96
				$this->odds_j[$index][$j] /= max($codds[$index][$j], 1);
97
				$this->streck_j[$index][$j] /= max($cstreck[$index][$j], 1);
98
			}
99
		}
100
	}
101
}
102