Valentin, On Mon, Aug 28, 2017 at 3:58 PM, Val <delepl...@gmail.com> wrote:
> @Jakob sorry what I wrote was confusing, I meant : vertices have strong > identity (same pointer), and triangles are just keys for the map so they > need to be very stable. A triangle pointer wouldn't solve the case. When I > encounter 3 vertex pointers A, B, C, then I need a "key" to determine if > triangle ABC (or CAB, etc.) is already in the map. > > @Axel indeed I had not taken into account that the GC may "change the > pointers, while preserving ==" so basically yes ordering pointers looks > unreliable. > > @Kulti checking equality of triangles by checking combinations of vertex > equality would be interesting but it would make the program really super > slow: instead of a O(1) map lookup, each existence check would cost O(n) to > traverse all the existing triangles, which is too slow because we have 1M+ > triangles. This is because we can't use Triangle as a map key when equality > is computed by a func instead of ==. > > @Egon those are nice workarounds, thanks. X,Y,Z are weak, they change all > the time. > > I will try to minimize code clutter, minimize memory and cpu overhead, > maximize safety and readability. So I think the best tradeoff so far is to > add a field Vertex.ID, because I have the chance to do it, though it does > clutter a little a fundamental data structure of the whole program. > not sure if that would help but, in the context of a Delaunay triangulation, we had to implement a few things that sound like related to your issue: - https://godoc.org/go-hep.org/x/hep/fastjet/internal/predicates - https://godoc.org/go-hep.org/x/hep/fastjet/internal/delaunay hth, -s Thank you all for insights! > > On Monday, August 28, 2017 at 3:20:39 PM UTC+2, Axel Wagner wrote: >> >> FTR, I don't think ordering by pointer (no matter whether using unsafe or >> not) is reliable and safe. The GC is free to move data around at any point, >> including during your sort. >> I don't think there are a lot of ways around that. You could basically >> build your own allocator and add a way for it to return a reliable id. e.g. >> it allocates a []Vertex and the id is the index of the vertex in that >> slice. You can calculate it using unsafe by (roughly. No guarantees here. >> Unsafe is subtle) >> >> func ID(v *Vertex) int { >> i := int(uintptr(unsafe.Pointer(v))) - int(uintptr(unsafe.Pointer(&Ve >> rtex[0]))) >> if i < 0 || i > len(pool) { >> panic("not pool-allocated") >> } >> return i >> } >> >> (not that you need to take care to do both conversions in the same >> expression, to satisfy the unsafe.Pointer >> <https://godoc.org/unsafe#Pointer> rules). >> >> Apart from that, Egon gave a couple of good suggestions :) >> >> On Mon, Aug 28, 2017 at 3:02 PM, Jakob Borg <ja...@kastelo.net> wrote: >> >>> In that case, maybe use *Triangle pointers instead of Triangle values, >>> and let that address be the identity for map purposes? Then the Vertex >>> order etc doesn't matter any more. >>> >>> //jb >>> >>> > On 28 Aug 2017, at 14:03, Val <dele...@gmail.com> wrote: >>> > >>> > That's actually a clever idea, I had not thought of that when >>> dismissing the vertex struct inspection. Thanks! >>> > >>> > But it turns out that X,Y,Z will change often during my program >>> execution: vertices move, but their identity (and the triangles identity) >>> must be strongly preserved. >>> > >>> > On Monday, August 28, 2017 at 1:42:35 PM UTC+2, Jakob Borg wrote: >>> > On 28 Aug 2017, at 13:13, Val <dele...@gmail.com> wrote: >>> > > >>> > > To achieve this, I consider normalizing the triplet so that all keys >>> of the map verify >>> > > A < B < C >>> > > for some arbitrary definition of < . This ensures that I can detect >>> any Triangle already present as key in the map, regardless the order of its >>> Vertex pointers. >>> > >>> > Can't you sort the Vertex slice by their X,Y,Z position? (You're then >>> not relying on the coordinates for identity, only for order. This breaks >>> for triangles that are actually lines or points, which may or may not be an >>> issue and can be handled separately...) >>> > >>> > //jb >>> > >>> > -- >>> > You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> > To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> > For more options, visit https://groups.google.com/d/optout. >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.