Esempio n. 1
0
    def test_get(self):
        with pytest.raises(BluepySnapError):
            self.test_obj.get(properties=["other2", "unknown"])

        ids = CircuitEdgeIds.from_dict({"default": [0, 1, 2, 3], "default2": [0, 1, 2, 3]})
        tested = self.test_obj.get(ids, None)
        assert tested == ids

        tested = self.test_obj.get(ids, properties=self.test_obj.property_names)
        assert len(tested) == 8
        assert len(list(tested)) == 24

        # put NaN for the undefined values : only values for default2 in dropna
        assert len(tested.dropna()) == 4

        # the index of the dataframe is indentical to the CircuitEdgeIds index
        pdt.assert_index_equal(tested.index, ids.index)
        pdt.assert_frame_equal(
            self.test_obj.get([0, 1, 2, 3], properties=self.test_obj.property_names), tested)

        # tested columns
        tested = self.test_obj.get(ids, properties=["other2", "other1", "@source_node"])
        assert tested.shape == (self.test_obj.size, 3)
        assert list(tested) == ["other2", "other1", "@source_node"]

        tested = self.test_obj.get(CircuitEdgeIds.from_dict({"default2": [0, 1, 2, 3]}),
                                          properties=["other2", "other1", "@source_node"])
        assert tested.shape == (4, 3)
        # correct ordering when setting the dataframe with the population dataframe
        assert tested.loc[("default2", 0)].tolist() == [10, 'A', 2]
        with pytest.raises(KeyError):
            tested.loc[("default", 0)]

        tested = self.test_obj.get(CircuitEdgeIds.from_dict({"default": [0, 1, 2, 3]}),
                                          properties=["other2", "other1", '@source_node'])
        assert tested.shape == (4, 3)
        assert tested.loc[("default", 0)].tolist() == [np.NaN, np.NaN, 2]
        assert tested.loc[("default", 1)].tolist() == [np.NaN, np.NaN, 0]

        tested = self.test_obj.get(ids, properties='@source_node')
        assert tested["@source_node"].tolist() == [2, 0, 0, 2, 2, 0, 0, 2]

        tested = self.test_obj.get(ids, properties='other2')
        assert tested["other2"].tolist() == [np.NaN, np.NaN, np.NaN, np.NaN, 10, 11, 12, 13]

        with pytest.raises(BluepySnapError):
            self.test_obj.get(ids, properties=["other2", "unknown"])

        with pytest.raises(BluepySnapError):
            self.test_obj.get(ids, properties="unknown")

        with pytest.deprecated_call():
            self.test_obj.get(ids)
Esempio n. 2
0
    def test_afferent_edges(self):
        # without the properties
        target = CircuitNodeIds.from_dict({"default": [0, 1]})
        assert self.test_obj.afferent_edges(target, None) == CircuitEdgeIds.from_dict(
            {"default": [0, 1, 2, 3], "default2": [0, 1, 2, 3]})

        # with a single int
        expected = CircuitEdgeIds.from_dict({"default": [1, 2, 3], "default2": [1, 2, 3]})
        assert self.test_obj.afferent_edges(1, None) == expected

        # with a CircuitNodeId
        assert self.test_obj.afferent_edges(CircuitNodeId("default", 1), None) == expected

        properties = [Synapse.AXONAL_DELAY]
        pdt.assert_frame_equal(
            self.test_obj.afferent_edges(1, properties),
            pd.DataFrame(
                [
                    [88.1862],
                    [52.1881],
                    [11.1058],
                    [88.1862],
                    [52.1881],
                    [11.1058],
                ],
                columns=properties, index=expected.index
            ),
            check_dtype=False
        )

        # with an undefined other1 field for the population default
        properties = [Synapse.SOURCE_NODE_ID, "other1"]
        expected_index = CircuitEdgeIds.from_dict({"default": [0, 1, 2, 3], "default2": [0, 1, 2, 3]})
        pdt.assert_frame_equal(
            self.test_obj.afferent_edges(CircuitNodeIds.from_dict({"default": [0, 1]}), properties=properties),
            pd.DataFrame(
                [
                    [2, np.nan],
                    [0, np.nan],
                    [0, np.nan],
                    [2, np.nan],
                    [2, "A"],
                    [0, "B"],
                    [0, "C"],
                    [2, "D"],
                ],
                columns=properties, index=expected_index.index
            ),
            check_dtype=False
        )
Esempio n. 3
0
 def _add_edge_ids(its, source, target, pop_name):
     """Generator comprehension adding the CircuitIds to the iterator."""
     return ((
         CircuitNodeId(source, source_id),
         CircuitNodeId(target, target_id),
         CircuitEdgeIds.from_dict({pop_name: edge_id}),
     ) for source_id, target_id, edge_id in its)
Esempio n. 4
0
 def test_get_all_edge_ids_types(self):
     assert self.test_obj.get(0, Synapse.PRE_GID).tolist() == [2]
     assert self.test_obj.get([0], Synapse.PRE_GID).tolist() == [2]
     assert self.test_obj.get([0, 1], Synapse.PRE_GID).tolist() == [2, 0]
     assert self.test_obj.get(CircuitEdgeId("default", 0), Synapse.PRE_GID).tolist() == [
         2]
     assert self.test_obj.get(CircuitEdgeIds.from_tuples([("default", 0)]),
                                     Synapse.PRE_GID).tolist() == [2]
     assert self.test_obj.get(CircuitEdgeId("default2", 0),
                                     Synapse.PRE_GID).tolist() == []
     assert self.test_obj.get(
         CircuitEdgeIds.from_tuples([("default", 0), ("default", 1)]),
         Synapse.PRE_GID).tolist() == [2, 0]
     assert self.test_obj.get(
         CircuitEdgeIds.from_tuples([("default", 0), ("default2", 1)]),
         Synapse.PRE_GID).tolist() == [2]
     assert self.test_obj.get(
         CircuitEdgeIds.from_tuples([("default2", 0), ("default2", 1)]),
         Synapse.PRE_GID).tolist() == []
Esempio n. 5
0
    def test_efferent_edges(self):
        target = CircuitNodeIds.from_dict({"default": [2]})
        expected = CircuitEdgeIds.from_dict({"default": [0, 3], "default2": [0, 3]})
        assert self.test_obj.efferent_edges(target, None) == expected
        assert self.test_obj.efferent_edges(2, None) == expected
        assert self.test_obj.efferent_edges(CircuitNodeId("default", 2), None) == expected

        properties = [Synapse.AXONAL_DELAY]
        pdt.assert_frame_equal(
            self.test_obj.efferent_edges(2, properties),
            pd.DataFrame(
                [
                    [99.8945],
                    [11.1058],
                    [99.8945],
                    [11.1058],
                ],
                columns=properties, index=expected.index
            ),
            check_dtype=False
        )

        # with an undefined other1 field for the population default
        properties = [Synapse.TARGET_NODE_ID, "other1"]
        expected_index = CircuitEdgeIds.from_dict(
            {"default": [0, 3], "default2": [0, 3]})

        pdt.assert_frame_equal(
            self.test_obj.efferent_edges(2, properties),
            pd.DataFrame(
                [
                    [0, np.nan],
                    [1, np.nan],
                    [0, "A"],
                    [1, "D"],
                ],
                columns=properties, index=expected_index.index
            ),
            check_dtype=False
        )
Esempio n. 6
0
    def test_pair_edges(self):

        # no connection between 0 and 2
        assert self.test_obj.pair_edges(0, 2, None) == CircuitEdgeIds.from_arrays([], [])
        actual = self.test_obj.pair_edges(0, 2, [Synapse.AXONAL_DELAY])
        assert actual.empty

        assert self.test_obj.pair_edges(2, 0, None) == CircuitEdgeIds.from_tuples([('default', 0),
                                                                                   ('default2', 0)])

        properties = [Synapse.AXONAL_DELAY]
        pdt.assert_frame_equal(
            self.test_obj.pair_edges(2, 0, properties),
            pd.DataFrame(
                [
                    [99.8945],
                    [99.8945],
                ],
                columns=properties, index=CircuitEdgeIds.from_tuples([('default', 0), ('default2', 0)]).index
            ),
            check_dtype=False
        )
Esempio n. 7
0
    def test_ids(self):
        tested = self.test_obj.ids()
        npt.assert_equal(tested, np.array([0, 1, 2, 3]))
        npt.assert_equal(tested.dtype, IDS_DTYPE)

        assert self.test_obj.ids(0) == [0]
        npt.assert_equal(self.test_obj.ids([0, 1]), np.array([0, 1]))
        npt.assert_equal(self.test_obj.ids(np.array([0, 1])), np.array([0, 1]))
        npt.assert_equal(self.test_obj.ids(CircuitEdgeId("default", 0)), [0])
        npt.assert_equal(self.test_obj.ids(CircuitEdgeId("default2", 0)), [])
        ids = CircuitEdgeIds.from_tuples([("default", 0), ("default", 1)])
        npt.assert_equal(self.test_obj.ids(ids), np.array([0, 1]))
        ids = CircuitEdgeIds.from_tuples([("default", 0), ("default2", 1)])
        npt.assert_equal(self.test_obj.ids(ids), np.array([0]))
        ids = CircuitEdgeIds.from_tuples([("default2", 0), ("default2", 1)])
        npt.assert_equal(self.test_obj.ids(ids), [])
        npt.assert_equal(self.test_obj.ids(), np.array([0, 1, 2, 3]))

        # limit too big compared to the number of ids
        npt.assert_equal(self.test_obj.ids(limit=15), [0, 1, 2, 3])
        npt.assert_equal(len(self.test_obj.ids(sample=2)), 2)
        # if sample > population.size --> sample = population.size
        npt.assert_equal(len(self.test_obj.ids(sample=25)), 4)
Esempio n. 8
0
    def test_iter_connections(self):
        ids = CircuitNodeIds.from_dict({"default": [0, 1, 2], "default2": [0, 1, 2]})
        # ordered by target
        expected = [
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0)),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0)),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1))
        ]
        for i, tested in enumerate(self.test_obj.iter_connections(source=ids, target=ids)):
            assert tested == expected[i]

        for i, tested in enumerate(self.test_obj.iter_connections(source=None, target=ids)):
            assert tested == expected[i]

        # same but ordered by source
        expected = [
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1)),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0)),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1))
        ]
        for i, tested in enumerate(self.test_obj.iter_connections(source=ids, target=None)):
            assert tested == expected[i]

        expected = [
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0), CircuitEdgeIds.from_dict({'default': [0]})),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1), CircuitEdgeIds.from_dict({'default': [1, 2]})),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1), CircuitEdgeIds.from_dict({'default': [3]})),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0), CircuitEdgeIds.from_dict({'default2': [0]})),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1), CircuitEdgeIds.from_dict({'default2': [1, 2]})),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1), CircuitEdgeIds.from_dict({'default2': [3]}))
        ]
        for i, tested in enumerate(self.test_obj.iter_connections(source=ids, target=ids,
                                                                  return_edge_ids=True)):
            assert tested == expected[i]

        expected = [
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0), 1),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1), 2),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1), 1),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 0), 1),
            (CircuitNodeId('default', 0), CircuitNodeId('default', 1), 2),
            (CircuitNodeId('default', 2), CircuitNodeId('default', 1), 1),
        ]
        for i, tested in enumerate(self.test_obj.iter_connections(source=ids, target=ids,
                                                                  return_edge_count=True)):
            assert tested == expected[i]

        with pytest.raises(BluepySnapError):
            next(self.test_obj.iter_connections(ids, ids, return_edge_ids=True,
                                                return_edge_count=True))
Esempio n. 9
0
    def test_pathway_edges(self):
        properties = [Synapse.AXONAL_DELAY]
        source = CircuitNodeIds.from_dict({"default": [0, 1]})
        target = CircuitNodeIds.from_dict({"default": [1, 2]})

        expected_index = CircuitEdgeIds.from_dict({"default": [1, 2], "default2": [1, 2]})
        pdt.assert_frame_equal(
            self.test_obj.pathway_edges(source=source, target=target, properties=properties),
            pd.DataFrame(
                [
                    [88.1862],
                    [52.1881],
                    [88.1862],
                    [52.1881],
                ],
                columns=properties, index=expected_index.index
            ),
            check_dtype=False
        )

        properties = [Synapse.SOURCE_NODE_ID, "other1"]
        expected_index = CircuitEdgeIds.from_dict({"default": [1, 2], "default2": [1, 2]})
        pdt.assert_frame_equal(
            self.test_obj.pathway_edges(source=source, target=target, properties=properties),
            pd.DataFrame(
                [
                    [0, np.nan],
                    [0, np.nan],
                    [0, "B"],
                    [0, "C"],
                ],
                columns=properties, index=expected_index.index
            ),
            check_dtype=False
        )

        # without the properties should return the CircuitEdgeIds
        assert self.test_obj.pathway_edges(source, target) == expected_index
        assert self.test_obj.pathway_edges(source, target, None) == expected_index

        # without the properties and the target
        assert self.test_obj.pathway_edges(source, None) == CircuitEdgeIds.from_dict(
            {"default": [1, 2], "default2": [1, 2]})
        # without the properties and the source
        assert self.test_obj.pathway_edges(None, source) == CircuitEdgeIds.from_dict(
            {"default": [0, 1, 2, 3], "default2": [0, 1, 2, 3]})

        # raise if both source and target are not set
        with pytest.raises(BluepySnapError):
            self.test_obj.pathway_edges(None, None, None)

        # test with simple CircuitNodeId
        properties = [Synapse.SOURCE_NODE_ID, Synapse.TARGET_NODE_ID]
        source = CircuitNodeId("default", 0)
        target = CircuitNodeId("default", 1)
        expected_index = CircuitEdgeIds.from_dict({"default": [1, 2], "default2": [1, 2]})
        pdt.assert_frame_equal(
            self.test_obj.pathway_edges(source=source, target=target, properties=properties),
            pd.DataFrame(
                [
                    [0, 1],
                    [0, 1],
                    [0, 1],
                    [0, 1],
                ],
                columns=properties, index=expected_index.index
            ),
            check_dtype=False
        )

        # use global mapping for nodes
        assert self.test_obj.pathway_edges(source={"mtype": "L6_Y"}, target={"mtype": "L2_X"}) == CircuitEdgeIds.from_tuples([("default", 0), ("default2", 0)])
Esempio n. 10
0
 def test_properties(self):
     ids = CircuitEdgeIds.from_dict({"default": [0, 1, 2, 3], "default2": [0, 1, 2, 3]})
     pdt.assert_frame_equal(self.test_obj.properties(ids, properties=["other2", "@source_node"]),
                            self.test_obj.get(ids, properties=["other2", "@source_node"]),
                            check_exact=False)
Esempio n. 11
0
    def test_ids(self):
        np.random.seed(42)
        # single edge ID --> CircuitEdgeIds return populations with the 0 id
        expected = CircuitEdgeIds.from_tuples([("default", 0), ("default2", 0)])
        tested = self.test_obj.ids(0)
        assert tested == expected
        npt.assert_equal(tested.get_ids().dtype, IDS_DTYPE)

        # single edge ID list --> CircuitEdgeIds return populations with the 0 id
        expected = CircuitEdgeIds.from_tuples([("default", 0), ("default2", 0)])
        assert self.test_obj.ids([0]) == expected

        # default3 population does not exist and is asked explicitly
        with pytest.raises(BluepySnapError):
            ids = CircuitEdgeIds.from_arrays(["default", "default3"], [0, 3])
            self.test_obj.ids(ids)

        # seq of node ID --> CircuitEdgeIds return populations with the array of ids
        expected = CircuitEdgeIds.from_arrays(["default", "default", "default2", "default2"],
                                              [0, 1, 0, 1])
        tested = self.test_obj.ids([0, 1])
        assert tested == expected
        tested = self.test_obj.ids((0, 1))
        assert tested == expected
        tested = self.test_obj.ids(np.array([0, 1]))
        assert tested == expected

        ids = [CircuitEdgeId("default", 0), CircuitEdgeId("default", 1)]
        assert self.test_obj.ids(ids) == CircuitEdgeIds.from_dict({"default": [0, 1]})

        with pytest.raises(BluepySnapError):
            ids = [CircuitEdgeId("default", 0), ("default", 1)]
            self.test_obj.ids(ids)

        # Check operations on global ids
        ids = self.test_obj.ids([0, 1, 2, 3])
        assert ids.filter_population("default").append(ids.filter_population("default2")) == ids

        expected = CircuitEdgeIds.from_arrays(["default2", "default2"], [0, 1])
        assert ids.filter_population("default2").limit(2) == expected

        tested = self.test_obj.ids(sample=2)
        expected = CircuitEdgeIds.from_arrays(["default2", "default"], [2, 3], sort_index=False)
        assert tested == expected

        tested = self.test_obj.ids(limit=5)
        expected = CircuitEdgeIds.from_dict({"default": [0, 1, 2, 3], "default2": [0]})
        assert tested == expected

        with pytest.raises(BluepySnapError) as e:
            self.test_obj.ids({'afferent_center_i': (10, 11)})
        assert "Unknown edge properties: {'afferent_center_i'}" == e.value.args[0]

        tested = self.test_obj.ids({"afferent_center_x": (1110, 1110.5)})
        expected = CircuitEdgeIds.from_dict({"default": [0], "default2": [0]})
        assert tested == expected

        tested = self.test_obj.ids({"afferent_center_x": (1111, 1112), "efferent_center_z": (2132, 2134)})
        expected = CircuitEdgeIds.from_dict({"default": [2], "default2": [2]})
        assert tested == expected

        tested = self.test_obj.ids({'$and': [{"@dynamics:param1": (0, 2)}, {"afferent_surface_x": (1211, 1211)}]})
        expected = CircuitEdgeIds.from_dict({"default": [1], "default2": [1]})
        assert tested == expected

        tested = self.test_obj.ids({'$or': [{"@dynamics:param1": (0, 2)}, {"@source_node": [0]}]})
        expected = CircuitEdgeIds.from_dict({"default": [0, 1, 2], "default2": [0, 1, 2]})
        assert tested == expected

        tested = self.test_obj.ids({"population": ["default2"], "afferent_center_x": (1113, 1114)})
        expected = CircuitEdgeIds.from_dict({"default2": [3]})
        assert tested == expected

        tested = self.test_obj.ids({"population": ["default3"], "afferent_center_x": (1113, 1114)})
        expected = CircuitEdgeIds.from_arrays([], [])
        assert tested == expected

        tested = self.test_obj.ids({"population": ["default", "default2"], "@target_node": [1]})
        expected = CircuitEdgeIds.from_dict({"default": [1, 2, 3], "default2": [1, 2, 3]})
        assert tested == expected