Source code for sourced.ml.core.models.quant
from typing import Dict
from modelforge import merge_strings, Model, register_model, split_strings
import numpy
from sourced.ml.core.models.license import DEFAULT_LICENSE
[docs]@register_model
class QuantizationLevels(Model):
"""
This model contains quantization levels for multiple schemes (feature types).
Every feature "class" (type, possible distinct value) corresponds to the numpy array
with integer level borders. The size of each numpy array is (the number of levels + 1).
"""
[docs] DESCRIPTION = "Model that contains quantization levels for multiple schemes (feature types)."
[docs] LICENSE = DEFAULT_LICENSE
[docs] def construct(self, levels: Dict[str, Dict[str, numpy.ndarray]]):
self._levels = levels
return self
@property
[docs] def levels(self) -> Dict[str, Dict[str, numpy.ndarray]]:
return self._levels
def __len__(self):
return len(self.levels)
def _load_tree(self, tree):
self._levels = {}
for key, vals in tree["schemes"].items():
classes = split_strings(vals["classes"])
levels = vals["levels"]
self.levels[key] = dict(zip(classes, numpy.split(levels, len(classes))))
def _generate_tree(self):
tree = {"schemes": {}}
for key, vals in self.levels.items():
tree["schemes"][key] = scheme = {}
npartitions = len(next(iter(vals.values())))
classes = [None for _ in range(len(vals))]
scheme["levels"] = levels = numpy.zeros(len(vals) * npartitions, dtype=numpy.int32)
for i, pair in enumerate(vals.items()):
classes[i], levels[i * npartitions:(i + 1) * npartitions] = pair
scheme["classes"] = merge_strings(classes)
return tree
[docs] def dump(self):
return """Schemes: %s""" % (
sorted((v[0], "%d@%d" % (len(v[1]), len(next(iter(v[1].values()))) - 1))
for v in self.levels.items()))
[docs] def apply_quantization(self, extractors):
for extractor in extractors:
try:
extractor.quantize
except AttributeError:
continue
extractor.uast_to_bag.levels = self._levels[extractor.NAME]