Source code for monitizer.monitors.abstraction.AbstractionVector
# This file is part of Monitizer, but was adapted from https://github.com/VeriXAI/Outside-the-Box/tree/master
#
# SPDX-FileCopyrightText: 2020 Anna Lukina
#
# SPDX-License-Identifier: LicenseRef-arxiv
from copy import deepcopy
[docs]
class AbstractionVector(object):
def __init__(self, abstraction, n_classes):
self._abstractions = [deepcopy(abstraction) for i in range(n_classes)]
def __str__(self):
return str(self._abstractions[0])
[docs]
def abstractions(self):
return self._abstractions
[docs]
def long_str(self):
string = str(self)
for i, abstraction in enumerate(self._abstractions):
string += "\n class", i, "-> " + abstraction.long_str()
return string
[docs]
def short_str(self):
return self._abstractions[0].short_str()
[docs]
def initialize(self, n_watched_neurons):
for abstraction in self._abstractions:
abstraction.initialize(n_watched_neurons)
[docs]
def add(self, class_id, vector):
self._abstractions[class_id].add(vector)
[docs]
def finalize(self):
for abstraction in self._abstractions:
if not abstraction.isempty():
abstraction.finalize()
[docs]
def isknown(self, class_id, vector, skip_confidence=False, novelty_mode=False):
return self._abstractions[class_id].isknown(vector, skip_confidence=skip_confidence or novelty_mode,
novelty_mode=novelty_mode)
[docs]
def clear(self):
for abstraction in self._abstractions:
abstraction.clear()
[docs]
def add_finalized(self, class_id, vector):
self._abstractions[class_id].add_finalized(vector)
[docs]
def default_options(self):
return self._abstractions[0].default_options()
[docs]
def coarsen_options(self, options):
return self._abstractions[0].coarsen_options(options)
[docs]
def refine_options(self, options):
return self._abstractions[0].refine_options(options)
[docs]
def propose(self, vector):
# proposal is only based on mean
class_proposed = -1
min_distance = float("inf")
for class_index, abstraction in enumerate(self._abstractions):
if abstraction.isempty():
continue
distance = abstraction.closest_mean_dist(vector)
if distance < min_distance:
min_distance = distance
class_proposed = class_index
assert class_proposed >= 0, "Did not find any nonempty abstraction."
return class_proposed
[docs]
def update_clustering(self, class_index, clusters):
#print(clusters)
self._abstractions[class_index].update_clustering(clusters)
[docs]
def add_clustered(self, class_index, values, clusters):
self._abstractions[class_index].add_clustered(values, clusters)