Both, actually. The algorithm incrementally builds a tree via simulation. There's a step of traversing the current version of the tree to find a leaf, which requires immutability, as I have to remember the path taken (the path is generated via simulation, not by walking an existing tree structure, so requires updates to the state maps). But once at a leaf, I run multiple simulations in parallel, and provided each starts with an independent mutable "copy", then the subsequent states can be mutable. That should be a big perf win, since it's where the algo spends a lot of it's time. The data structures that hold the statistics about the states in the tree could also be mutable. These are keyed by state maps, hoping improved hash/equality performance will help a little there as well.
On Sunday, April 23, 2017 at 1:18:56 PM UTC-7, Zach Tellman wrote: > > Are you relying on the immutability of these structures, or are they > effectively always transient? > On Sun, Apr 23, 2017 at 11:02 AM Dave Dixon <dave.d...@gmail.com > <javascript:>> wrote: > >> FWIW, the use-case I have essentially involves Monte Carlo simulations. >> So we start with a state (non-empty map), and then make a series of >> modifications to it. Various statistics are held in hash-maps keyed by the >> state, so there's a lot of lookups and modifications in those maps. >> >> That said, I'm not sure if for this particular case I care too much using >> Clojure idioms vs. direct API access. The algorithms tend to be >> hand-tweaked for performance anyway. The big win for me in wrapping >> bifurcan would be the ability to use spec without having to write >> specialized specs, generators, etc. >> >> >> On Thursday, April 20, 2017 at 9:53:56 PM UTC-7, Zach Tellman wrote: >> >>> Sure, happy to elaborate. Bifurcan offers potential performance wins a >>> few different ways: >>> >>> * We can use standard Java equality semantics, bypassing all the >>> overhead of the hash calculations and enhanced numeric equality checks >>> (this can lead to moderate performance gains) >>> * We can use a mutable data structure as long as it never escapes a >>> local context (this can lead to significant performance gains) >>> * We can use the extra capabilities the data structures expose, like >>> concatenation, slicing, set operations, etc. (this is too dependent on the >>> use case to really quantify) >>> >> >>> it would be easy to have a `map` and `map*` method that expose Clojure >>> and Java equality semantics, respectively, but that puts a big onus on the >>> developer to determine if the latter is safe for their use case. I've been >>> bit by this when I've used j.u.c.ConcurrentHashMap before, so I expect >>> people will suffer similarly weird bugs. >>> >>> However, I think there's a way to use the mutable data structures. >>> Technically, transient data structures allow arbitrary persistent data >>> structures to be batch updated, but in practice they tend to be empty, and >>> after they're populated they tend to be treated as read-only. >>> >>> If we're convinced this is common enough, every empty transient data >>> structure could be mutable, and when we make it persistent we could wrap it >>> in a "virtual" collection [1] which allows updates without touching the >>> base collection. This would allow for faster writes, faster reads, and >>> only marginally slower updates if those are required. >>> >>> This is all predicated on a bunch of assumptions that are hard to >>> validate, but if this describes enough real-world use cases, it could lead >>> to a big, easy performance win. It's even possible to automatically >>> replace the base Clojure collections with these alternatives using >>> something like Sleight [2]. >>> >>> Anyway, that's what I've been mulling over. If anyone has opinions, I'm >>> happy to hear them. >>> >>> Zach >>> >>> [1] >>> https://github.com/lacuna/bifurcan/blob/master/src/io/lacuna/bifurcan/Maps.java#L103 >>> [2] https://github.com/ztellman/sleight >>> >>> On Thu, Apr 20, 2017 at 8:55 AM Dave Dixon <dave.d...@gmail.com> wrote: >>> >>>> Sounds great. If you have time, I'd certainly like to hear your >>>> thoughts on the issues of equality semantics and transients, maybe I can >>>> ponder and make some suggestions based on my target use-case. >>>> >>>> >>>> On Tuesday, April 18, 2017 at 9:32:32 AM UTC-7, Zach Tellman wrote: >>>> >>>>> To be clear, my intention was always to wrap the implementations in >>>>> the appropriate Clojure interfaces, and I don't believe that will cause >>>>> much, if any, of a performance hit (inlining is magic). However, there >>>>> are >>>>> some real questions regarding how to expose non-standard equality >>>>> semantics, and whether transients should be represented using the >>>>> immutable >>>>> or mutable collection variants. >>>>> >>>>> For what it's worth, I have about 1/3 of an implementation of >>>>> Clojure-compatible versions of these data structures, I just wanted to >>>>> mull >>>>> on the above questions a bit before going further. I'm happy to discuss >>>>> them here in more depth if you have any questions or opinions. >>>>> >>>>> Zach >>>>> >>>>> On Tue, Apr 18, 2017 at 6:53 AM Dave Dixon <dave.d...@gmail.com> >>>>> wrote: >>>>> >>>> Stared at this a bit yesterday. Seems like if you want to leverage spec >>>>>> while using bifurcan, then the bifurcan types need to have the Clojure >>>>>> wrapper. The alternative appears to be re-implementing at least a large >>>>>> subset of collection-related spec code, which is a lot to bite off. Also >>>>>> tried updating some existing code to use bifurcan. Similar to spec, >>>>>> there >>>>>> are going to be cases which are less perf sensitive, where it would be >>>>>> nice >>>>>> to use code that is polymorphic for collections, and drop down to the >>>>>> fast >>>>>> interface in perf-sensitive parts. >>>>>> >>>>>> >>>>>> On Monday, April 17, 2017 at 1:52:39 PM UTC-7, Dave Dixon wrote: >>>>>>> >>>>>>> What is the issue with wrapping in Clojure interfaces? Added >>>>>>> overhead of function calls? >>>>>>> >>>>>>> I'm finding myself in the process of doing some of this, at least >>>>>>> for constructors. Also thinking of generating predicates/generators for >>>>>>> use >>>>>>> with spec. >>>>>>> >>>>>>> On Monday, March 27, 2017 at 9:51:46 AM UTC-7, Zach Tellman wrote: >>>>>>> >>>>>>>> This is a slightly irregular announcement, because it's not for a >>>>>>>> Clojure library. Rather, it's for a library written purely in Java: >>>>>>>> https://github.com/lacuna/bifurcan. >>>>>>>> >>>>>>>> This is a collection of mutable and immutable data structures, >>>>>>>> designed to address some of my personal frustrations with what's >>>>>>>> available >>>>>>>> in the Clojure and Java ecosystems. Notably, they have pluggable >>>>>>>> equality >>>>>>>> semantics, so while they *can* use Clojure's expensive hash and >>>>>>>> equality >>>>>>>> checks, they don't *have* to. They also provide high-performance >>>>>>>> mutable >>>>>>>> variants of the data structure which share an API with their immutable >>>>>>>> cousins. >>>>>>>> >>>>>>>> I'm posting it here to ask for people's thoughts on how, if at all, >>>>>>>> this should be exposed as a Clojure library. It would be simple to >>>>>>>> simply >>>>>>>> wrap them in the Clojure interfaces and make them behave identically >>>>>>>> to >>>>>>>> Clojure's own data structures, but that kind of obviates the point. >>>>>>>> However, creating an entirely new set of accessors means that we can't >>>>>>>> leverage Clojure's standard library. >>>>>>>> >>>>>>>> It's possible that I'm alone in my frustrations, and no Clojure >>>>>>>> wrapper is necessary. But if this does solve a problem you have, I'd >>>>>>>> like >>>>>>>> to hear more about what it is, and how you think Bifurcan might help. >>>>>>>> Please feel free to reply here, or to grab me at Clojure/West and talk >>>>>>>> about it there. >>>>>>>> >>>>>>>> Thanks in advance, >>>>>>>> Zach >>>>>>>> >>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> >>>>> To post to this group, send email to clo...@googlegroups.com >>>>> >>>>> >>>>>> Note that posts from new members are moderated - please be patient >>>>>> with your first post. >>>>>> To unsubscribe from this group, send email to >>>>>> >>>>> clojure+u...@googlegroups.com >>>>> >>>>> >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/clojure?hl=en >>>>>> --- >>>>>> You received this message because you are subscribed to a topic in >>>>>> the Google Groups "Clojure" group. >>>>>> To unsubscribe from this topic, visit >>>>>> https://groups.google.com/d/topic/clojure/1m_I7IrDGb0/unsubscribe. >>>>>> >>>>> To unsubscribe from this group and all its topics, send an email to >>>>>> clojure+u...@googlegroups.com. >>>>> >>>>> >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clo...@googlegroups.com >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> To unsubscribe from this group, send email to >>>> clojure+u...@googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/group/clojure?hl=en >>>> --- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "Clojure" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/clojure/1m_I7IrDGb0/unsubscribe. >>>> To unsubscribe from this group and all its topics, send an email to >>>> clojure+u...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com >> <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to a topic in the >> Google Groups "Clojure" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/clojure/1m_I7IrDGb0/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.