Source code for mendevi.models.qbp

"""Predict the encoding energy based on the quality given to the encoder."""

import torch

from .base import Model


[docs] class QBP(Model): """Quality based prediction of enegy model.""" def __init__( self, title: str = "Quality Based Prediction of energy model", sources: str = ( "Modeling The HEVC Encoding Energy Using The Encoder Processing Time\n" "Geetha Ramasubbu, André Kaup, Christian Herglotz\n" "2022" ), **kwargs: dict, ) -> None: """Quality based prediction of enegy model. Parameters ---------- title, sources, **kwargs Transmitted to :py:class:`mendevi.models.base.Model`. """ kwargs = kwargs.copy() kwargs["input_labels"] = kwargs.get("input_labels", ["quality"]) kwargs["output_labels"] = kwargs.get("output_labels", ["quality"]) super().__init__( title=title, sources=sources, **kwargs, ) assert "quality" in self.input_labels, self.input_labels assert self.output_labels == ["energy"], self.output_labels def _fit_vect(self, values: dict[str, torch.Tensor]) -> object: """Fit the model E = P*T with T = k*q**3 - l*q**2 - u*q + T0.""" quality = values["quality"] klutp = torch.asarray( [8.826, -198.556, 359.969, 181.532, 451.230], # loss 4.5805e+10 dtype=quality.dtype, device=quality.device, requires_grad=True, ) optim = torch.optim.Adam([klutp], lr=1e-1) for _ in range(1000): pred_duration = klutp[0]*quality**3 - klutp[1]*quality**2 - klutp[2]*quality + klutp[3] pred_energy = klutp[4] * pred_duration loss = ((values["energy"] - pred_energy)**2).mean() optim.zero_grad() loss.backward() optim.step() return klutp.tolist() def _predict_vect( self, values: dict[str, torch.Tensor], parameters: object, ) -> dict[str, torch.Tensor]: """PRediction.""" quality = values["quality"] pred_duration = ( parameters[0]*quality**3 - parameters[1]*quality**2 - parameters[2]*quality + parameters[3] ) pred_energy = parameters[4] * pred_duration return {"energy": pred_energy}