Skip to content

Commit

Permalink
Added clear, clear_edges functions to PyGraph and PyDiGraph objects (#…
Browse files Browse the repository at this point in the history
…993)

* First pass at testing infrastructure + graph.rs file changes

* Fixed clear, clear_edges for graph.rs and digraph.rs, added tests, added documentation

* fix for docstring for clear_edges in digraph

* docstring fix for graph.rs

* Minor fixes for codestyle for python lint

* Added new tests to show reuse after using clear, clear_edges, updated docs

* Adding fix for build error with prev commit

* fixes from black codestyle format

* fixed flake8 F841 - variable assigned to but never used errors

* retry at fix for F841 error, used noqa

* fixes for black

* fixes for CICD, F841 local variable unused error

* flake8 fixes
  • Loading branch information
abhamra authored Oct 6, 2023
1 parent 651409f commit c5b41fc
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
features:
- |
Added a new function, :func:`clear` that clears all nodes and edges
from a :class:`rustworkx.PyGraph` or :class:`rustworkx.PyDiGraph`
- |
Added a new function, :func:`clear_edges` that clears all edges for
:class:`rustworkx.PyGraph` or :class:`rustworkx.PyDiGraph` without
modifying nodes
14 changes: 14 additions & 0 deletions src/digraph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,20 @@ impl PyDiGraph {
}
false
}

/// Clear all nodes and edges
#[pyo3(text_signature = "(self)")]
pub fn clear(&mut self) {
self.graph.clear();
self.node_removed = true;
}

/// Clears all edges, leaves nodes intact
#[pyo3(text_signature = "(self)")]
pub fn clear_edges(&mut self) {
self.graph.clear_edges();
}

/// Return the number of nodes in the graph
#[pyo3(text_signature = "(self)")]
pub fn num_nodes(&self) -> usize {
Expand Down
13 changes: 13 additions & 0 deletions src/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,19 @@ impl PyGraph {
false
}

/// Clears all nodes and edges
#[pyo3(text_signature = "(self)")]
pub fn clear(&mut self) {
self.graph.clear();
self.node_removed = true;
}

/// Clears all edges, leaves nodes intact
#[pyo3(text_signature = "(self)")]
pub fn clear_edges(&mut self) {
self.graph.clear_edges();
}

/// Return the number of nodes in the graph
#[pyo3(text_signature = "(self)")]
pub fn num_nodes(&self) -> usize {
Expand Down
66 changes: 66 additions & 0 deletions tests/rustworkx_tests/digraph/test_clear.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

import unittest

import rustworkx


class TestClear(unittest.TestCase):
def test_clear(self):
dag = rustworkx.PyDAG()
node_a = dag.add_node("a")
dag.add_child(node_a, "b", {"a": 1})
dag.add_child(node_a, "c", {"a": 2})
dag.clear()
self.assertEqual(dag.num_nodes(), 0)
self.assertEqual(dag.num_edges(), 0)
self.assertEqual(dag.nodes(), [])
self.assertEqual(dag.edges(), [])

def test_clear_reuse(self):
dag = rustworkx.PyDAG()
node_a = dag.add_node("a")
dag.add_child(node_a, "b", {"a": 1})
dag.add_child(node_a, "c", {"a": 2})
dag.clear()
node_a = dag.add_node("a")
dag.add_child(node_a, "b", {"a": 1})
dag.add_child(node_a, "c", {"a": 2})
self.assertEqual(dag.num_nodes(), 3)
self.assertEqual(dag.num_edges(), 2)
self.assertEqual(dag.nodes(), ["a", "b", "c"])
self.assertEqual(dag.edges(), [{"a": 1}, {"a": 2}])

def test_clear_edges(self):
dag = rustworkx.PyDAG()
node_a = dag.add_node("a")
dag.add_child(node_a, "b", {"a": 1})
dag.add_child(node_a, "c", {"a": 2})
dag.clear_edges()
self.assertEqual(dag.num_nodes(), 3)
self.assertEqual(dag.num_edges(), 0)
self.assertEqual(dag.nodes(), ["a", "b", "c"])
self.assertEqual(dag.edges(), [])

def test_clear_edges_reuse(self):
dag = rustworkx.PyDAG()
node_a = dag.add_node("a")
node_b = dag.add_child(node_a, "b", {"a": 1})
node_c = dag.add_child(node_a, "c", {"a": 2})
dag.clear_edges()
dag.add_edge(node_a, node_b, {"a": 1})
dag.add_edge(node_a, node_c, {"a": 2})
self.assertEqual(dag.num_nodes(), 3)
self.assertEqual(dag.num_edges(), 2)
self.assertEqual(dag.nodes(), ["a", "b", "c"])
self.assertEqual(dag.edges(), [{"a": 1}, {"a": 2}])
76 changes: 76 additions & 0 deletions tests/rustworkx_tests/graph/test_clear.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Licensed under the Apache License, Version 3.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

import unittest

import rustworkx


class TestClear(unittest.TestCase):
def test_clear(self):
graph = rustworkx.PyGraph()
node_a = graph.add_node("a")
node_b = graph.add_node("b")
graph.add_edge(node_a, node_b, {"a": 1})
node_c = graph.add_node("c")
graph.add_edge(node_a, node_c, {"a": 2})
graph.clear()
self.assertEqual(graph.num_nodes(), 0)
self.assertEqual(graph.num_edges(), 0)
self.assertEqual(graph.nodes(), [])
self.assertEqual(graph.edges(), [])

def test_clear_reuse(self):
graph = rustworkx.PyGraph()
node_a = graph.add_node("a")
node_b = graph.add_node("b")
graph.add_edge(node_a, node_b, {"a": 1})
node_c = graph.add_node("c")
graph.add_edge(node_a, node_c, {"a": 2})
graph.clear()
node_a = graph.add_node("a")
node_b = graph.add_node("b")
graph.add_edge(node_a, node_b, {"a": 1})
node_c = graph.add_node("c")
graph.add_edge(node_a, node_c, {"a": 2})
self.assertEqual(graph.num_nodes(), 3)
self.assertEqual(graph.num_edges(), 2)
self.assertEqual(graph.nodes(), ["a", "b", "c"])
self.assertEqual(graph.edges(), [{"a": 1}, {"a": 2}])

def test_clear_edges(self):
graph = rustworkx.PyGraph()
node_a = graph.add_node("a")
node_b = graph.add_node("b")
graph.add_edge(node_a, node_b, {"e1", 1})
node_c = graph.add_node("c")
graph.add_edge(node_a, node_c, {"e2", 2})
graph.clear_edges()
self.assertEqual(graph.num_edges(), 0)
self.assertEqual(graph.edges(), [])
self.assertEqual(graph.num_nodes(), 3)
self.assertEqual(graph.nodes(), ["a", "b", "c"])

def test_clear_edges_reuse(self):
graph = rustworkx.PyGraph()
node_a = graph.add_node("a")
node_b = graph.add_node("b")
graph.add_edge(node_a, node_b, {"e1", 1})
node_c = graph.add_node("c")
graph.add_edge(node_a, node_c, {"e2", 2})
graph.clear_edges()
graph.add_edge(node_a, node_b, {"e1", 1})
graph.add_edge(node_a, node_c, {"e2", 2})
self.assertEqual(graph.num_nodes(), 3)
self.assertEqual(graph.num_edges(), 2)
self.assertEqual(graph.nodes(), ["a", "b", "c"])
self.assertEqual(graph.edges(), [{"e1", 1}, {"e2", 2}])

0 comments on commit c5b41fc

Please sign in to comment.