TypeError: '<' not supported between instances of 'Cell' and 'Cell'
adnanobot opened this issue · 5 comments
Hi,
when I provide input like the following,
coordinates = [[[100, 0], [101, 0], [110, 10], [100, 1], [100, 0]]]
Then it's ok and I am getting the output, Centroid: [101.25, 1.25]
But if I just change the second coordinate,
coordinates = [[[100, 0], [105, 0], [110, 10], [100, 1], [100, 0]]]
then I get the following error:
Traceback (most recent call last): File "curve2poly.py", line 75, in <module> centroid = polylabel(x) File "C:\Users\mahmad\vision\lib\site-packages\polylabel\__init__.py", line 138, in polylabel _, __, cell = cell_queue.get() File "C:\Program Files\Python37\lib\queue.py", line 180, in get item = self._get() File "C:\Program Files\Python37\lib\queue.py", line 236, in _get return heappop(self.queue) TypeError: '<' not supported between instances of 'Cell' and 'Cell'
I am not getting what kind of input polylabel()
takes? It should work with any shape and size of polygons, right?
Update: It is working fine in ubuntu but not in windows.
That is interesting. I just tried to run that code in python3.7 (as it seems your machine is using it) and everything works great.
I have made test case for it, but I have no idea where to look, as I have no access to windows computer.
Would you mind to take a closer look?
Yes, I have found the solution by modifying the Cell class in __init__.py
.
I followed the suggestion from here: https://github.com/laurentluce/python-algorithms/issues/6.
So I have also modified the Cell class:
class Cell(object):
def __init__(self, x, y, h, polygon):
self.h = h
self.y = y
self.x = x
self.d = _point_to_polygon_distance(x, y, polygon)
self.max = self.d + self.h * sqrt(2)
def __lt__(self, other):
return self.max < other.max
Now it is working but I did not understand his explanation. Can you please explain the reason?
It seems that in some cases (where values are same) queue is trying to sort elements. and to perform sorting in needs to compare two elements which has higher/lower elements. Therefore it performs <
operator on to the Cell class - which doesn't support it.
by declaring __lt__
you tell python how <
(less-than) should behave.
Thanks a lot for checking it and providing a solution. I will add it to the code-base and create new package version soon :)
version 0.6 released. feel free to update :))
ok...got it! thanks for the explanation!