Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TypeError: '<' not supported between instances of 'Cell' and 'Cell' #5

Closed
adnanobot opened this issue Jul 24, 2019 · 5 comments
Closed

Comments

@adnanobot
Copy link

adnanobot commented Jul 24, 2019

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.

@adnanobot adnanobot changed the title Input coordinate type TypeError: '<' not supported between instances of 'Cell' and 'Cell' Jul 25, 2019
@Twista
Copy link
Owner

Twista commented Jul 25, 2019

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?

Twista added a commit that referenced this issue Jul 25, 2019
@adnanobot
Copy link
Author

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?

@Twista
Copy link
Owner

Twista commented Jul 26, 2019

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 :)

@Twista
Copy link
Owner

Twista commented Jul 26, 2019

version 0.6 released. feel free to update :))

@adnanobot
Copy link
Author

ok...got it! thanks for the explanation!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants