Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: ♻️ Cleanup code into seperate functions #1183

Merged
merged 2 commits into from
Feb 18, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 57 additions & 19 deletions spectrafit/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -410,44 +410,82 @@ class CIReport:
def __init__(
self,
ci: Dict[str, List[Tuple[float, float]]],
with_offset: Optional[bool] = True,
ndigits: Optional[int] = 5,
with_offset: bool = True,
ndigits: int = 5,
best_tol: float = 1.0e-2,
):
"""Initialize the Report object.

Args:
ci (Dict[str, List[Tuple[float, float]]]): The confidence intervals for
the parameters.
with_offset (bool, optional): Whether to include an offset in the report.
with_offset (bool): Whether to include an offset in the report.
Defaults to True.
ndigits (int, optional): The number of digits to round the report values to.
ndigits (int): The number of digits to round the report values to.
Defaults to 5.
best_tol (float): The tolerance for the best value.
Defaults to 1.0e-2.
"""
self.ci = ci
self.with_offset = with_offset
self.ndigits = ndigits
self.best_tol = best_tol

self.df = pd.DataFrame()

def convp(self, x: Tuple[float, float], bound_type: str) -> str:
"""Convert the confidence interval to a string."""
return "BEST" if abs(x[0]) < 1.0e-2 else f"{x[0] * 100:.2f}% - {bound_type}"
"""Convert the confidence interval to a string.

Args:
x (Tuple[float, float]): The confidence interval.
bound_type (str): The type of the bound.

Returns:
str: The confidence interval as a string.
"""
return (
"BEST" if abs(x[0]) < self.best_tol else f"{x[0] * 100:.2f}% - {bound_type}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (llm): Using self.best_tol in the convp method to determine the 'BEST' label dynamically is a significant improvement. It makes the method more adaptable to different precision requirements. However, ensure that the documentation or comments clearly explain the impact of best_tol on the 'BEST' label determination to avoid any confusion for future maintainers or users.

)

def calculate_offset(self, row: List[Tuple[float, float]]) -> float:
"""Calculate the offset for a row.

Args:
row (List[Tuple[float, float]]): The row to calculate the offset for.

Returns:
float: The offset for the row.
"""
offset = 0.0
if self.with_offset:
for cval, val in row:
if abs(cval) < (self.best_tol or 0.0):
offset = val
return offset

def create_report_row(
self, name: str, row: List[Tuple[float, float]], offset: float
) -> None:
"""Create a row for the report.

Args:
name (str): The name of the row.
row (List[Tuple[float, float]]): The row to create the report for.
offset (float): The offset for the row.
"""
for i, (cval, val) in enumerate(row):
sval = val if cval < self.best_tol else val - offset
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (llm): The condition cval < self.best_tol in the create_report_row method might not correctly handle cases where cval is negative. Consider using abs(cval) < self.best_tol to ensure that both positive and negative values of cval close to zero are treated as 'BEST'.

bound_type = "LOWER" if i < len(row) / 2 else "UPPER"
self.report.setdefault(self.convp((cval, val), bound_type), {})[name] = sval

def __call__(self) -> None:
"""Generate the Confidence report as a table."""
report: Dict[str, Dict[str, float]] = {}

self.report: Dict[str, Dict[str, float]] = {}
for name, row in self.ci.items():
offset = 0.0
if self.with_offset:
for cval, val in row:
if abs(cval) < 1.0e-2:
offset = val
for i, (cval, val) in enumerate(row):
sval = val if cval < 1.0e-2 else val - offset
bound_type = "LOWER" if i < len(row) / 2 else "UPPER"
report.setdefault(self.convp((cval, val), bound_type), {})[name] = sval
self.df = pd.DataFrame(report)
self.tabulate(df=self.df)
offset = self.calculate_offset(row)
self.create_report_row(name, row, offset)

self.tabulate(df=pd.DataFrame(self.report))

def tabulate(self, df: pd.DataFrame) -> None:
"""Print the Confidence report as a table."""
Expand Down
Loading