From 805f4da6b0bbf2ac386bf3f7435c1e1765db9a7d Mon Sep 17 00:00:00 2001 From: Fabio Zadrozny Date: Wed, 22 Apr 2020 11:07:28 -0300 Subject: [PATCH 1/4] Profiling grandalf: creating graph is slow due to Poset creating temporary objects for __eq__. --- grandalf/utils/poset.py | 39 +++++++++++++++---------------- tests/test_poset.py | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 tests/test_poset.py diff --git a/grandalf/utils/poset.py b/grandalf/utils/poset.py index 31f69df..6f6779b 100644 --- a/grandalf/utils/poset.py +++ b/grandalf/utils/poset.py @@ -15,6 +15,7 @@ class Poset(object): def __init__(self, L): self.o = OrderedDict() + self._unordered = set() for obj in L: self.add(obj) @@ -32,12 +33,14 @@ def add(self, obj): if obj in self: return self.get(obj) else: + self._unordered.add(obj) self.o[obj] = obj return obj def remove(self, obj): - if obj in self: + if obj in self._unordered: obj = self.get(obj) + self._unordered.discard(obj) del self.o[obj] return obj return None @@ -59,19 +62,15 @@ def __iter__(self): yield obj def __cmp__(self, other): - s1 = set(other.o.values()) - s2 = set(self.o.values()) + s1 = other._unordered + s2 = self._unordered return cmp(s1, s2) def __eq__(self, other): - s1 = set(other.o.values()) - s2 = set(self.o.values()) - return s1 == s2 + return self._unordered == other._unordered def __ne__(self, other): - s1 = set(other.o.values()) - s2 = set(self.o.values()) - return s1 != s2 + return not self == other def copy(self): return Poset(self.o.values()) @@ -97,8 +96,8 @@ def update(self, other): self.o.update(other.o) def __and__(self, other): - s1 = set(self.o.values()) - s2 = set(other.o.values()) + s1 = self._unordered + s2 = other._unordered return Poset(s1.intersection(s2)) def intersection(self, *args): @@ -108,8 +107,8 @@ def intersection(self, *args): return p def __xor__(self, other): - s1 = set(self.o.values()) - s2 = set(other.o.values()) + s1 = self._unordered + s2 = other._unordered return Poset(s1.symmetric_difference(s2)) def symmetric_difference(self, *args): @@ -119,8 +118,8 @@ def symmetric_difference(self, *args): return p def __sub__(self, other): - s1 = set(self.o.values()) - s2 = set(other.o.values()) + s1 = self._unordered + s2 = other._unordered return Poset(s1.difference(s2)) def difference(self, *args): @@ -133,16 +132,16 @@ def __contains__(self, obj): return obj in self.o def contains__cmp__(self, obj): - return obj in self.o.values() + return obj in self._unordered def issubset(self, other): - s1 = set(self.o.values()) - s2 = set(other.o.values()) + s1 = self._unordered + s2 = other._unordered return s1.issubset(s2) def issuperset(self, other): - s1 = set(self.o.values()) - s2 = set(other.o.values()) + s1 = self._unordered + s2 = other._unordered return s1.issuperset(s2) __le__ = issubset diff --git a/tests/test_poset.py b/tests/test_poset.py new file mode 100644 index 0000000..4eff69f --- /dev/null +++ b/tests/test_poset.py @@ -0,0 +1,51 @@ +from grandalf.utils.poset import Poset + + +def test_poset(): + import pytest + poset = Poset(()) + poset.add(3) + poset.add(1) + poset.add(2) + + assert list(iter(poset)) == [3, 1, 2] + + poset.remove(1) + assert list(iter(poset)) == [3, 2] + assert str(poset) == '0.| 3\n1.| 2'.replace('\r\n', '\n').replace('\r', '\n') + + poset.add(4) + assert list(iter(poset)) == [3, 2, 4] + + assert poset.index(2) == 1 + + assert poset.get(2) == 2 + assert poset.get(5) is None + + assert poset[0] == 3 + assert poset[1] == 2 + + with pytest.raises(IndexError): + poset[22] + + assert len(poset) == 3 + + cp = poset.copy() + assert cp == poset + assert list(iter(cp)) == [3, 2, 4] + + cp.remove(3) + assert cp != poset + cp.add(3) + + # A bit weird: equality doesn't depend on order (eq considers it unsorted). + assert cp == poset + assert not cp != poset + + cp.add(17) + cp.add(9) + assert list(iter(cp)) == [2, 4, 3, 17, 9] + assert list(iter(poset)) == [3, 2, 4] + + poset.update(cp) + assert list(iter(poset)) == [3, 2, 4, 17, 9] From 04457f50c36c5f47f1f49993499078f828295b85 Mon Sep 17 00:00:00 2001 From: Fabio Zadrozny Date: Wed, 22 Apr 2020 11:07:53 -0300 Subject: [PATCH 2/4] Fix ValueError (TODO: Must create test-case for this case and check better solution). --- grandalf/routing.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/grandalf/routing.py b/grandalf/routing.py index 1dee467..18011d2 100644 --- a/grandalf/routing.py +++ b/grandalf/routing.py @@ -28,8 +28,16 @@ def setpath(self, pts): # tail and head. def route_with_lines(e, pts): assert hasattr(e, "view") - tail_pos = intersectR(e.v[0].view, topt=pts[1]) - head_pos = intersectR(e.v[1].view, topt=pts[-2]) + try: + tail_pos = intersectR(e.v[0].view, topt=pts[1]) + except ValueError: + # TODO: Create a test case to reproduce it and submit upstream. + tail_pos = pts[1] + try: + head_pos = intersectR(e.v[1].view, topt=pts[-2]) + except ValueError: + # TODO: Create a test case to reproduce it and submit upstream. + head_pos = pts[-2] pts[0] = tail_pos pts[-1] = head_pos e.view.head_angle = getangle(pts[-2], pts[-1]) From 21e319f4ceb5d2c08c2026cc9e19f404bc5db65b Mon Sep 17 00:00:00 2001 From: Fabio Zadrozny Date: Sun, 26 Apr 2020 12:20:43 -0300 Subject: [PATCH 3/4] org.eclipse.core.resources.prefs --- .settings/org.eclipse.core.resources.prefs | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .settings/org.eclipse.core.resources.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..d3ec543 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//grandalf/graphs.py=utf-8 +encoding//grandalf/layouts.py=utf-8 From 13ecd8a93333735a34fb10ac497e69c11c9316cb Mon Sep 17 00:00:00 2001 From: Fabio Zadrozny Date: Sat, 10 Aug 2024 07:13:31 -0300 Subject: [PATCH 4/4] Update pydevproject to use python interpreter version. --- .pydevproject | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.pydevproject b/.pydevproject index a946dfc..7cbcdf7 100644 --- a/.pydevproject +++ b/.pydevproject @@ -1,8 +1,14 @@ - -/${PROJECT_DIR_NAME} - -python 2.7 -Default + + + + /${PROJECT_DIR_NAME} + + + + python interpreter + + Default +