Skip to content

Commit ab6f58b

Browse files
committed
feat: make PdfPowerReportBuilder
1 parent 26ec771 commit ab6f58b

File tree

1 file changed

+83
-2
lines changed

1 file changed

+83
-2
lines changed

stattest/experiment/report/model.py

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Any
22

3+
from fpdf import FPDF
34
from matplotlib import pyplot as plt
45

56
from stattest.experiment.configuration import TestWorkerResult
@@ -93,12 +94,92 @@ def __build_path(result: PowerWorkerResult):
9394
class PdfPowerReportBuilder(ReportBuilder):
9495
def __init__(self):
9596
self.data = {}
97+
self.sizes = set()
98+
self.tests = set()
99+
self.font = "helvetica"
100+
self.border = 1
101+
self.align = "C"
102+
self.col_width = 30
103+
self.header_font_size = 12
104+
self.entry_font_size = 10
105+
self.output_filename = "power_report.pdf"
96106

97107
def process(self, result: TestWorkerResult):
98-
pass
108+
if not isinstance(result, PowerWorkerResult):
109+
raise TypeError(f"Type {type(result)} is not an instance of PowerWorkerResult")
110+
111+
key = PdfPowerReportBuilder.__build_path(result)
112+
self.sizes.add(result.size)
113+
self.tests.add(result.test_code)
114+
115+
if key not in self.data:
116+
self.data[key] = {}
117+
118+
if result.test_code not in self.data[key]:
119+
self.data[key][result.test_code] = {}
120+
121+
self.data[key][result.test_code][result.size] = result.power
99122

100123
def build(self):
101-
pass
124+
pdf = FPDF(orientation="L")
125+
pdf.set_auto_page_break(auto=True, margin=15)
126+
pdf.add_page()
127+
pdf.set_font(self.font, size=self.entry_font_size)
128+
129+
sorted_sizes = sorted(self.sizes)
130+
sorted_tests = sorted(self.tests)
131+
table_width = (len(sorted_sizes) + 1) * self.col_width
132+
margin_x = (pdf.w - table_width) / 2
133+
134+
for key, results in self.data.items():
135+
pdf.set_font(self.font, "B", self.header_font_size)
136+
pdf.cell(0, self.entry_font_size, f"{key}", ln=True, align="C")
137+
pdf.ln(5)
138+
139+
pdf.set_x(margin_x)
140+
pdf.set_font(self.font, "B", self.entry_font_size)
141+
pdf.cell(
142+
self.col_width, self.entry_font_size, "Test", border=self.border, align=self.align
143+
)
144+
for size in sorted_sizes:
145+
pdf.cell(
146+
self.col_width,
147+
self.entry_font_size,
148+
str(size),
149+
border=self.border,
150+
align=self.align,
151+
)
152+
pdf.ln()
153+
154+
pdf.set_font(self.font, size=self.entry_font_size)
155+
for test in sorted_tests:
156+
test_name = test.split("_")[0]
157+
pdf.set_x(margin_x)
158+
pdf.cell(
159+
self.col_width,
160+
self.entry_font_size,
161+
test_name,
162+
border=self.border,
163+
align=self.align,
164+
)
165+
for size in sorted_sizes:
166+
power = results.get(test, {}).get(size, "N/A")
167+
pdf.cell(
168+
self.col_width,
169+
self.entry_font_size,
170+
f"{power:.3f}" if isinstance(power, float) else str(power),
171+
border=self.border,
172+
align=self.align,
173+
)
174+
pdf.ln()
175+
pdf.ln(self.entry_font_size)
176+
177+
pdf.output(self.output_filename)
178+
print(f"PDF report saved as: {self.output_filename}")
179+
180+
@staticmethod
181+
def __build_path(result: PowerWorkerResult):
182+
return f"Alternative: {result.alternative_code} alpha: {result.alpha}"
102183

103184

104185
class ResultReader:

0 commit comments

Comments
 (0)