Skip to content

Commit d8395c1

Browse files
authored
Merge pull request #2 from PySATL/feature/result-store
Summary: Make Result Store be more abstract
2 parents b6a29ef + c85d849 commit d8395c1

18 files changed

+233
-357
lines changed

stattest/experiment/configuration/configuration.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from stattest.experiment.generator import AbstractRVSGenerator
22
from stattest.experiment.hypothesis import AbstractHypothesis
33
from stattest.persistence import ICriticalValueStore, IRvsStore
4+
from stattest.persistence.models import IResultStore
45
from stattest.test import AbstractTestStatistic
56

67

@@ -33,17 +34,12 @@ def execute(
3334
) -> TestWorkerResult:
3435
pass
3536

36-
def save_result(self, result: TestWorkerResult):
37+
def build_id(self, test: AbstractTestStatistic, data: [[float]], code, size: int) -> str:
3738
pass
3839

3940

4041
class ReportConfiguration:
41-
def __init__(
42-
self,
43-
report_builder: ReportBuilder,
44-
data_reader,
45-
listeners: [StepListener] = None,
46-
):
42+
def __init__(self, report_builder: ReportBuilder, listeners: [StepListener] = None):
4743
"""
4844
Report configuration provides configuration for report.
4945
@@ -53,7 +49,6 @@ def __init__(
5349
listeners = []
5450
self.report_builder = report_builder
5551
self.listeners = listeners
56-
self.data_reader = data_reader
5752

5853

5954
class AlternativeConfiguration:
@@ -83,6 +78,8 @@ def __init__(
8378

8479

8580
class TestConfiguration:
81+
__test__ = False
82+
8683
def __init__(
8784
self,
8885
tests: [AbstractTestStatistic],
@@ -109,10 +106,12 @@ def __init__(
109106
test_configuration: TestConfiguration,
110107
report_configuration: ReportConfiguration,
111108
rvs_store: IRvsStore,
109+
result_store: IResultStore,
112110
critical_value_store: ICriticalValueStore,
113111
):
114112
self.alternative_configuration = alternative_configuration
115113
self.test_configuration = test_configuration
116114
self.report_configuration = report_configuration
117115
self.rvs_store = rvs_store
116+
self.result_store = result_store
118117
self.critical_value_store = critical_value_store

stattest/experiment/experiment.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ def execute(self):
1616
"""
1717

1818
rvs_store = self.__configuration.rvs_store
19+
result_store = self.__configuration.result_store
1920

2021
# Generate data for alternatives
2122
data_generation_step(self.__configuration.alternative_configuration, rvs_store)
2223

2324
# Test hypothesis
24-
execute_test_step(self.__configuration.test_configuration, rvs_store)
25+
execute_test_step(self.__configuration.test_configuration, rvs_store, result_store)
2526

2627
# Generate reports
27-
execute_report_step(self.__configuration.report_configuration)
28+
execute_report_step(self.__configuration.report_configuration, result_store)

stattest/experiment/report/model.py

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from matplotlib import pyplot as plt
22

3-
from stattest.experiment import ReportBuilder
3+
from stattest.experiment.configuration.configuration import ReportBuilder
44
from stattest.experiment.test.worker import PowerWorkerResult
5-
from stattest.persistence.models import IBenchmarkResultStore
5+
from stattest.persistence.models import IResultStore
66

77

88
"""
@@ -95,9 +95,9 @@ def build(self):
9595
pass
9696

9797

98-
class PowerResultReader:
99-
def __init__(self, power_result_store, batch_size=100):
100-
self.power_result_store = power_result_store
98+
class ResultReader:
99+
def __init__(self, result_store: IResultStore, batch_size=100):
100+
self.result_store = result_store
101101
self.batch_size = batch_size
102102
self.offset = 0
103103
self.items = []
@@ -109,33 +109,7 @@ def __iter__(self):
109109
def __next__(self):
110110
self.i += 1
111111
if self.i >= len(self.items):
112-
self.items = self.power_result_store.get_powers(
113-
offset=self.offset, limit=self.batch_size
114-
)
115-
self.i = 0
116-
self.offset += self.batch_size
117-
if len(self.items) == 0:
118-
raise StopIteration
119-
return self.items[self.i]
120-
121-
122-
class BenchmarkResultReader:
123-
def __init__(self, benchmark_result_store: IBenchmarkResultStore, batch_size=100):
124-
self.benchmark_result_store = benchmark_result_store
125-
self.batch_size = batch_size
126-
self.offset = 0
127-
self.items = []
128-
self.i = 0
129-
130-
def __iter__(self):
131-
return self
132-
133-
def __next__(self):
134-
self.i += 1
135-
if self.i >= len(self.items):
136-
self.items = self.benchmark_result_store.get_benchmarks(
137-
offset=self.offset, limit=self.batch_size
138-
)
112+
self.items = self.result_store.get_results(offset=self.offset, limit=self.batch_size)
139113
self.i = 0
140114
self.offset += self.batch_size
141115
if len(self.items) == 0:

stattest/experiment/report/report_step.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
def execute_report_step(configuration):
2-
data_reader = configuration.data_reader
1+
from stattest.experiment.report.model import ResultReader
2+
from stattest.persistence.models import IResultStore
3+
4+
5+
def execute_report_step(configuration, result_store: IResultStore):
6+
data_reader = ResultReader(result_store)
37
# Execute before all listeners
48
for listener in configuration.listeners:
59
listener.before()

stattest/experiment/test/test_step.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from stattest.experiment.configuration.configuration import TestConfiguration, TestWorker
1010
from stattest.persistence import IRvsStore
11+
from stattest.persistence.models import IResultStore
1112
from stattest.test import AbstractTestStatistic
1213

1314

@@ -18,9 +19,11 @@ def execute_tests(
1819
worker: TestWorker,
1920
tests: [AbstractTestStatistic],
2021
rvs_store: IRvsStore,
22+
result_store: IResultStore,
2123
thread_count: int = 0,
2224
):
2325
rvs_store.init()
26+
result_store.init()
2427
worker.init()
2528

2629
stat = rvs_store.get_rvs_stat()
@@ -29,12 +32,17 @@ def execute_tests(
2932
for code, size, _ in stat:
3033
data = rvs_store.get_rvs(code, size)
3134
for test in tests:
32-
result = worker.execute(test, data, code, size)
33-
worker.save_result(result)
35+
result_id = worker.build_id(test, data, code, size)
36+
result = result_store.get_result(result_id)
37+
if result is None:
38+
result = worker.execute(test, data, code, size)
39+
result_store.insert_result(result_id, result)
3440
pbar.update(1)
3541

3642

37-
def execute_test_step(configuration: TestConfiguration, rvs_store: IRvsStore):
43+
def execute_test_step(
44+
configuration: TestConfiguration, rvs_store: IRvsStore, result_store: IResultStore
45+
):
3846
threads_count = configuration.threads
3947
worker = configuration.worker
4048
tests = configuration.tests
@@ -58,10 +66,16 @@ def execute_test_step(configuration: TestConfiguration, rvs_store: IRvsStore):
5866
with multiprocessing.Pool(threads_count) as pool:
5967
pool.starmap(
6068
execute_tests,
61-
zip(repeat(worker), tests_chunks, repeat(rvs_store), threads_counts),
69+
zip(
70+
repeat(worker),
71+
tests_chunks,
72+
repeat(rvs_store),
73+
repeat(result_store),
74+
threads_counts,
75+
),
6276
)
6377
else:
64-
execute_tests(worker, tests, rvs_store)
78+
execute_tests(worker, tests, rvs_store, result_store)
6579

6680
# Execute after all listeners
6781
for listener in configuration.listeners:

stattest/experiment/test/worker.py

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from stattest.experiment.configuration.configuration import TestWorker, TestWorkerResult
44
from stattest.experiment.hypothesis import AbstractHypothesis
55
from stattest.experiment.test.power_calculation import calculate_test_power
6-
from stattest.persistence.models import ICriticalValueStore, IPowerResultStore
6+
from stattest.persistence.models import ICriticalValueStore
77
from stattest.test import AbstractTestStatistic
88

99

@@ -16,50 +16,38 @@ def __init__(self, test_code, alternative_code, size, alpha, power):
1616
self.alternative_code = alternative_code
1717

1818

19+
class BenchmarkWorkerResult(TestWorkerResult):
20+
def __init__(self, size: int, test_code: str, benchmark: [float]):
21+
self.size = size
22+
self.benchmark = benchmark
23+
self.test_code = test_code
24+
25+
1926
class PowerCalculationWorker(TestWorker):
2027
def __init__(
2128
self,
2229
alpha,
2330
monte_carlo_count,
24-
worker_result_store: IPowerResultStore,
25-
critical_value_store: ICriticalValueStore,
31+
cv_store: ICriticalValueStore,
2632
hypothesis: AbstractHypothesis,
2733
):
2834
self.alpha = alpha
2935
self.monte_carlo_count = monte_carlo_count
30-
self.worker_result_store = worker_result_store
31-
self.critical_value_store = critical_value_store
36+
self.cv_store = cv_store
3237
self.hypothesis = hypothesis
3338

3439
@override
3540
def init(self):
36-
self.critical_value_store.init()
37-
self.worker_result_store.init()
41+
self.cv_store.init()
42+
43+
def build_id(self, test: AbstractTestStatistic, data: [[float]], code: str, size: int) -> str:
44+
return "_".join([self.alpha, size, test.code(), code])
3845

3946
@override
4047
def execute(
4148
self, test: AbstractTestStatistic, data: [[float]], code: str, size: int
4249
) -> PowerWorkerResult:
43-
# 1. Check power result
44-
power = self.worker_result_store.get_power(self.alpha, size, test.code(), code)
45-
if power is not None:
46-
return PowerWorkerResult(test.code(), code, size, self.alpha, power)
47-
48-
# 2. Calculate power
4950
power = calculate_test_power(
50-
test,
51-
data,
52-
self.hypothesis,
53-
self.alpha,
54-
self.critical_value_store,
55-
self.monte_carlo_count,
51+
test, data, self.hypothesis, self.alpha, self.cv_store, self.monte_carlo_count
5652
)
57-
58-
# 3. Save result
59-
self.worker_result_store.insert_power(self.alpha, size, test.code(), code, power)
60-
6153
return PowerWorkerResult(test.code(), code, size, self.alpha, power)
62-
63-
@override
64-
def save_result(self, result: PowerWorkerResult):
65-
pass

stattest/persistence/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from stattest.persistence.models import ICriticalValueStore, IPowerResultStore, IRvsStore, IStore
1+
from stattest.persistence.models import ICriticalValueStore, IRvsStore, IStore
22

33

4-
__all__ = ["ICriticalValueStore", "IPowerResultStore", "IRvsStore", "IStore"]
4+
__all__ = ["ICriticalValueStore", "IRvsStore", "IStore"]
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
from stattest.persistence.db_store.base import ModelBase, SessionType
2-
from stattest.persistence.db_store.benchmark_result_store import BenchmarkResultDbStore
32
from stattest.persistence.db_store.critical_value_store import CriticalValueDbStore
43
from stattest.persistence.db_store.db_init import get_request_or_thread_id, init_db
5-
from stattest.persistence.db_store.rvs_store import RvsDbLiteStore
4+
from stattest.persistence.db_store.result_store import ResultDbStore
5+
from stattest.persistence.db_store.rvs_store import RvsDbStore
66

77

88
__all__ = [
9-
"RvsDbLiteStore",
9+
"RvsDbStore",
1010
"get_request_or_thread_id",
1111
"init_db",
1212
"CriticalValueDbStore",
13-
"BenchmarkResultDbStore",
1413
"ModelBase",
1514
"SessionType",
15+
"ResultDbStore",
1616
]

stattest/persistence/db_store/benchmark_result_store.py

Lines changed: 0 additions & 83 deletions
This file was deleted.

0 commit comments

Comments
 (0)