flatsurf / flatsurf

Translation Surfaces in C++/Python
GNU General Public License v3.0
10 stars 4 forks source link

Run through cylinders of circumference at most L #247

Open videlec opened 3 years ago

videlec commented 3 years ago

As requested by D. Aulicino it would be desirable to iterate through the (finite) list of cylinders of circumference less than L.

An algorithm could be as follows

  1. for each possible conical angle, run through saddle connections of length at most L starting from this point
  2. for each saddle connection, run the flow decomposition until it is guaranteed that what remains must have height > L
  3. collect cylinders and take care of duplicates
saraedum commented 3 years ago

Is the number of saddle connections that you need to consider finite here? I mean, is there some way to know that a direction can not lead to any such cylinders a priori?

videlec commented 3 years ago

Yes! The circumference of the cylinder is the sum of the length of the saddle connections on one of its boundaries.

saraedum commented 3 years ago

Ok. Then this should be easy to do unless I am missing something.

What exactly counts as a duplicate cylinder?

videlec commented 3 years ago

Let us assume that we have a cylinder C in direction (x,y). Proceeding in the way described above, each saddle connection in direction (x,y) will see the cylinder C. Hence each cylinder will appear as many times as there are saddle connection of length at most L in that direction.

saraedum commented 3 years ago

So, two cylinders are the same if the saddle connections on their right side are the same as a set (or have one connection in common, which is the same it seems.)

saraedum commented 3 years ago

It sounds to me that all of this can be done with sage-flatsurf already. Unless L gets very big, then we might want to split the search space with flatsurvey.

videlec commented 3 years ago

How do we tell sage-flatsurf do run the flow decomposition in direction (x,y) until we are sure that length L cylinders are discarded?

saraedum commented 3 years ago

We could just run it for short increments until all the components are big.

saraedum commented 3 years ago

Actually, you can already tell libflatsurf to stop the search once a predicate is satisfied. The default is "all components are cylinder or minimal". (Though that is not terribly convenient to call from Python yet.)

videlec commented 3 years ago

Let me start something close to https://github.com/flatsurf/sage-flatsurf/pull/76 where we document this.

saraedum commented 3 years ago

If you don't mind, I'll try to create a sample notebook and build a PR from that. I think that this "predicate" is not obvious to do.

saraedum commented 3 years ago

Any particular surface that I should use for the example?

videlec commented 3 years ago

Some L-shaped surfaces would be perfectly fine.

davidaulicino commented 3 years ago

Thank you! There are perhaps three related mathematical issues to keep in mind with this. Perhaps they are accounted for, but I don't know enough about the code. 1) In H(2,2) you can have two pairs of collections of saddle connections that define two cylinders that are parallel. So first, from these collections, can it detect that there are indeed two cylinders. 2) It's rare, but also in H(2,2) you can have a 3 collections of parallel saddle connections. Two collections bounding a cylinder and a third that's just parallel to the other two and has nothing to do with a cylinder. 3) Finally, there is the "Wollmilchsau" that decomposes into two parallel cylinders with the same length in every direction. Perhaps I misunderstand and all of these are accounted for, but these are three phenomena to make sure are incorporated.

saraedum commented 3 years ago

Yes, I think it's all accounted for. We iterate over all saddle connections and decompose the surface for their direction. But we ignore a saddle connection if we had already considered its direction before.