def test_one_edge(self):
     self.graph = Graph(self.nodes, self.edges[0:1])
     self.graph.nodes()[2].update_x(self.graph)
     self.graph.nodes()[2].update_x(self.graph)
     self.graph.nodes()[2].update_x(self.graph)
     problem = MultiAgentProblem(self.graph, 120)
     problem.solve()
     self.assertAlmostEqual(self.graph.nodes()[0].x[0], 1.5, 3)
     self.assertAlmostEqual(self.graph.nodes()[1].x[0], 1.5, 3)
     self.assertAlmostEqual(self.graph.nodes()[2].x[0], 3.0, 3)
class MultiAgentAdmmTest(unittest.TestCase):
    def setUp(self):
        super(MultiAgentAdmmTest, self).setUp()
        f1 = Problem(lambda x: (x[0] - 1) ** 2, lambda x: 2 * (x - 1))
        f2 = Problem(lambda x: (x[0] - 2) ** 2, lambda x: 2 * (x - 2))
        f3 = Problem(lambda x: (x[0] - 3) ** 2, lambda x: 2 * (x - 3))
        self.nodes = [Node(f, numpy.zeros(1)) for f in [f1, f2, f3]]
        self.edges = [Edge(self.nodes[l], self.nodes[r], [0], [0]) for l, r in zip([0, 0, 1], [1, 2, 2])]

    def test_full_graph(self):
        self.graph = Graph(self.nodes, self.edges)
        self.assertEqual(len(self.graph.edges()), 3)
        self.assertEqual(len(self.graph.nodes()), 3)
        self.assertListEqual([len(self.graph.edges(node)) for node in self.graph.nodes()], [2, 2, 2])
        self.assertAlmostEqual(AcceleratedGradient().solve(self.nodes[0].f, numpy.ones(1) * 10), 1.0, 3)
        self.assertAlmostEqual(AcceleratedGradient().solve(self.nodes[1].f, numpy.ones(1) * 10), 2.0, 3)
        self.assertAlmostEqual(AcceleratedGradient().solve(self.nodes[2].f, numpy.ones(1) * 10), 3.0, 3)

        problem = MultiAgentProblem(self.graph, 100)
        problem.solve()
        for node in problem.graph.nodes():
            self.assertAlmostEqual(node.x, 2.0 * numpy.ones(1), 3)

    def test_stripped_one(self):
        self.graph = Graph(self.nodes, self.edges[:-1])
        problem = MultiAgentProblem(self.graph, 120)
        problem.solve()
        for node in problem.graph.nodes():
            self.assertAlmostEqual(node.x, 2.0 * numpy.ones(1), 4)

    def test_one_edge(self):
        self.graph = Graph(self.nodes, self.edges[0:1])
        self.graph.nodes()[2].update_x(self.graph)
        self.graph.nodes()[2].update_x(self.graph)
        self.graph.nodes()[2].update_x(self.graph)
        problem = MultiAgentProblem(self.graph, 120)
        problem.solve()
        self.assertAlmostEqual(self.graph.nodes()[0].x[0], 1.5, 3)
        self.assertAlmostEqual(self.graph.nodes()[1].x[0], 1.5, 3)
        self.assertAlmostEqual(self.graph.nodes()[2].x[0], 3.0, 3)
    def test_full_graph(self):
        self.graph = Graph(self.nodes, self.edges)
        self.assertEqual(len(self.graph.edges()), 3)
        self.assertEqual(len(self.graph.nodes()), 3)
        self.assertListEqual([len(self.graph.edges(node)) for node in self.graph.nodes()], [2, 2, 2])
        self.assertAlmostEqual(AcceleratedGradient().solve(self.nodes[0].f, numpy.ones(1) * 10), 1.0, 3)
        self.assertAlmostEqual(AcceleratedGradient().solve(self.nodes[1].f, numpy.ones(1) * 10), 2.0, 3)
        self.assertAlmostEqual(AcceleratedGradient().solve(self.nodes[2].f, numpy.ones(1) * 10), 3.0, 3)

        problem = MultiAgentProblem(self.graph, 100)
        problem.solve()
        for node in problem.graph.nodes():
            self.assertAlmostEqual(node.x, 2.0 * numpy.ones(1), 3)
 def test_stripped_one(self):
     self.graph = Graph(self.nodes, self.edges[:-1])
     problem = MultiAgentProblem(self.graph, 120)
     problem.solve()
     for node in problem.graph.nodes():
         self.assertAlmostEqual(node.x, 2.0 * numpy.ones(1), 4)