Exemple #1
0
    def mapping(self, node, operator, eps):
        assert util.contains_superclass(operator.__class__, 'MapperOperator')

        self._request(node, eps)
        X = self._materialize_X(node)

        return operator.mapping(X, self.prng)
Exemple #2
0
    def materialize(self, X, prng, node):
        if self._dgraph.root.id == node.id:
            return X, None

        paths = [
            path for path in nx.all_simple_paths(self._dgraph.graph,
                                                 self._dgraph.root.id, node.id)
        ]

        assert len(paths) == 1

        path = paths[0]

        for i in range(len(path)):
            node = self._dgraph.id_node_map[path[i]]

            if util.contains_superclass(node.operator.__class__,
                                        'SplitByPartition'):
                id_node_map = self._dgraph.id_node_map

                Xs = node.operator.transform(X)
                X = Xs[node.idx]
            else:
                X = node.operator.transform(X)

        return X, path
Exemple #3
0
    def select(self, node, operator, eps):
        assert util.contains_superclass(operator.__class__,
                                        'SelectionOperator')

        self._request(node, eps)
        X = self._materialize_X(node)

        return operator.select(X, self.prng)
Exemple #4
0
    def measure(self, node, operator, eps):
        assert util.contains_superclass(operator.__class__,
                                        'MeasurementOperator')

        self._request(node, eps)
        X = self._materialize_X(node)

        return operator.measure(X, self.prng)
Exemple #5
0
    def partition(self, operator, prng, node):
        assert util.contains_superclass(operator.__class__, 'SplitByPartition')

        mapping = operator.mapping

        return [
            self._dgraph.insert_subset(operator, idx, node)
            for idx in sorted(set(mapping))
        ]
Exemple #6
0
    def measure(self, node, operator, eps):
        assert util.contains_superclass(operator.__class__,
                                        'MeasurementOperator')

        assert operator.eps <= eps, "operator budget cannot exceed measurement budget"

        self._request(node, eps)
        X = self._materialize_X(node)

        return operator.measure(X, self.prng)
Exemple #7
0
    def transform(self, operator, after=None):
        assert util.contains_superclass(operator.__class__,
                                        'TransformationOperator')

        prev_data_node = after.data_node if after is not None else None

        data_node = self._data_manager.transform(operator, prev_data_node)
        node = self._tgraph.insert_transformation(data_node, operator, after)

        return node
Exemple #8
0
    def partition(self, operator, after):
        assert util.contains_superclass(operator.__class__, 'SplitByPartition')

        data_nodes = self._data_manager.partition(operator, self.prng,
                                                  after.data_node)
        meta_node = self._tgraph.insert_transformation(after.data_node,
                                                       operator, after)

        child_nodes = []
        for data_node in data_nodes:
            child_node = self._tgraph.insert_transformation(
                data_node, transformation.Null(), meta_node)
            child_nodes.append(child_node)

        return child_nodes
Exemple #9
0
    def _request(self, node, budget, child=None):
        parent = self._tgraph.parent(node)

        if node == self._tgraph.root:
            assert parent is None

            if node.budget_consumed + budget > self._budget:
                raise BudgetExceededError()
            else:
                node.budget_consumed += budget

        elif util.contains_superclass(node.operator.__class__,
                                      'SplitByPartition'):
            assert parent is not None
            assert child is not None

            budget_delta = max(
                0, child.budget_consumed + budget - node.budget_consumed)
            self._request(parent, budget_delta, node)

            node.budget_consumed += budget_delta
        else:
            self._request(parent, node.operator.stability * budget, node)
            node.budget_consumed += budget
Exemple #10
0
    def transform(self, operator, node):
        assert util.contains_superclass(operator.__class__,
                                        'TransformationOperator')

        return self._dgraph.insert(operator, node)