Source code for mendevi.models.linear_regression

"""Predicting absolute values using linear regression."""

import torch

from .base import Model


[docs] class EncodeLinear(Model): """Biaised linear regression to predict parameters on encoding. Examples -------- >>> import pprint >>> import cutcutcodec >>> from mendevi.models.linear_regression import EncodeLinear >>> model = EncodeLinear().fit("x264_vs_openh264.db", table="t_enc_encode") >>> media = cutcutcodec.utils.get_project_root() / "media" / "video" / "intro.webm" >>> pred = model.predict_from_video( ... media, effort="medium", encoder="libx264", quality=0.5, threads=8, mode="vbr", ... ) >>> pprint.pprint(pred) {'log_act_duration_per_frame': [-0.9902404546737671], 'log_energy_per_frame': [0.5947314500808716], 'log_rate': [6.39665412902832], 'psnr': [37.500999450683594], 'ssim': [0.8862448334693909], 'vmaf': [82.45337677001953]} >>> """ def __init__(self) -> None: """Initialise the model.""" super().__init__( "Linear prediction of video encoding energy and quality.", sources=""" A High-Level Feature Model to Predict the Encoding Energy of a Hardware Video Encoder Diwakara Reddy, Christian Herglotz, and André Kaup 2025 """, input_labels=[ "effort", "encoder", "height", "quality", "rms_sobel", "rms_time_diff", "threads", "width", "mode", ], output_labels=[ "log_act_duration_per_frame", "log_energy_per_frame", "log_rate", "psnr", "ssim", "vmaf", ], ) def _fit_vect_norm(self, values: dict[str, torch.Tensor]) -> None: """Perform a linear regression on the centered and reduced values.""" obs = torch.cat([values[lbl] for lbl in self.input_labels], dim=1) self.parameters = { response: torch.linalg.pinv(obs.mT @ obs, hermitian=True) @ obs.mT @ values[response] for response in self.output_labels } def _predict_vect_norm(self, values: dict[str, torch.Tensor]) -> dict[str, torch.Tensor]: obs = torch.cat([values[lbl] for lbl in self.input_labels], dim=1) return {name: obs @ beta for name, beta in self.parameters.items()}