classMetricsDict(DefaultDict):r""" A `MetricsDict` for better support for `AverageMeters`. """defvalue(self)->RoundDict[str,float]:returnRoundDict({key:metric.value()forkey,metricinself.all_items()})defbatch(self)->RoundDict[str,float]:returnRoundDict({key:metric.batch()forkey,metricinself.all_items()})defaverage(self)->RoundDict[str,float]:returnRoundDict({key:metric.average()forkey,metricinself.all_items()})@propertydefval(self)->RoundDict[str,float]:returnself.value()@propertydefbat(self)->RoundDict[str,float]:returnself.batch()@propertydefavg(self)->RoundDict[str,float]:returnself.average()defreset(self)->Self:formetricinself.all_values():metric.reset()returnselfdef__format__(self,format_spec:str)->str:return"\t".join(f"{key}: {metric.__format__(format_spec)}"forkey,metricinself.all_items())
classMultiTaskDict(NestedDict):r""" A `MultiTaskDict` for better multi-task support. """return_average=Falsedef__init__(self,*args,return_average:bool=False,**kwargs)->None:super().__init__(*args,**kwargs)self.setattr("return_average",return_average)defvalue(self)->RoundDict[str,float]:output=RoundDict()forkey,metricsinself.all_items():value=metrics.value()ifall(isnan(v)forvinvalue.values()):continueoutput[key]=valueifself.getattr("return_average",False):output["average"]=self.compute_average(output)returnoutputdefbatch(self)->RoundDict[str,float]:output=RoundDict()forkey,metricsinself.all_items():value=metrics.batch()ifall(isnan(v)forvinvalue.values()):continueoutput[key]=valueifself.getattr("return_average",False):output["average"]=self.compute_average(output)returnoutputdefaverage(self)->RoundDict[str,float]:output=RoundDict()forkey,metricsinself.all_items():value=metrics.average()ifall(isnan(v)forvinvalue.values()):continueoutput[key]=valueifself.getattr("return_average",False):output["average"]=self.compute_average(output)returnoutputdefcompute_average(self,output:RoundDict[str,float])->RoundDict[str,float]:average=DefaultDict(default_factory=list)forkey,metricinoutput.all_items():average[key.rsplit(".",1)[-1]].append(metric)returnRoundDict({key:sum(values)/len(values)forkey,valuesinaverage.items()})@propertydefval(self)->RoundDict[str,float]:returnself.value()@propertydefbat(self)->RoundDict[str,float]:returnself.batch()@propertydefavg(self)->RoundDict[str,float]:returnself.average()defreset(self)->Self:formetricinself.all_values():metric.reset()returnselfdef__format__(self,format_spec:str)->str:return"\n".join(f"{key}: {metric.__format__(format_spec)}"forkey,metricinself.all_items())