It does seem as though there is no way to meet all the criteria, unless the support for it comes from Java/Oracle. That said, I feel like having a complex type with reasonable performance is better than having nothing at all.
What I would like is a complex type that plays well with Clojure's generic abstractions and functional style (much like Ratio), and is indistinguishable from other types - for example, the ability to work with (map/reduce/filter), the ability to be a part of seqs and use Clojure core functions on it, and so on. It might not as efficient as the complex type in, say C++, but depending on your definition of reasonable, it might be acceptable. I am willing to explore this further. Alex, would opening up the type system as you pointed be a way to go? Also, I am not sure is this is possible for us to accomplish, but some academic work has been done where a Java complex class has been created, and through the use of semantic expansion, it has very high performance. PDF Link: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.42.7264&rep=rep1&type=pdf On Tuesday, April 28, 2015 at 12:22:08 AM UTC-4, Mikera wrote: > > Complex numbers are tricky because: > - They need to be fast in order to be useful for numerical computing. The > "obvious" implementations that you might create with boxed values, > vectors/maps, multimethods and protocols are likely to be unacceptable for > many use cases > - You still want to be able to use them in a generic way, with operations > that play nicely with other values (Doubles etc.) > > I have thought about this a lot w.r.t. core.matrix and have come to the > conclusion that there is no simple, elegant answer that meets all use cases. > > What I'd like to suggest is: > a) The community converge on a single, minimal, lightweight representation > for a boxed complex scalar value. This is probably best as a Java class > (for easy interop with Java libraries). I think > http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/complex/Complex.html > > is a good candidate > b) A lightweight wrapper library that provides nice complex functions in > Clojure, using the above type. Nothing fancy. But can make extensive use of > type hints etc. for performance so should be pretty fast > c) A library using core.matrix that implements complex vectors, complex > matrices etc but also uses a) for complex scalar values. This should use a > underlying double-array backed implementation for performance, probably > vectorz-clj would be best (though that could be hidden as an implementation > detail). This library would also implement all the core.matrix protocols > for the chosen complex number type, mostly just by calling b) directly > > > On Monday, 27 April 2015 23:39:34 UTC+8, Nik wrote: >> >> I have been thinking along the lines of mikera and Maik - and it seems >> like there is no further progress here? I would like to take a crack at >> creating a complex number type, but implemented as a library to Clojure. I >> am not sure where to start, and if anyone here has suggestions, I'd be >> happy to hear them. >> >> A complex number could simply be a vector of two elements, or a map with >> :real and :imag keys (or something lightweight) - and I am not sure what it >> would require to make this type work happily with code arithmetic functions >> in Clojure and Java Math. >> >> It would also have to work with seq operations in Clojure - for instance: >> If I have a complex number c = {:real 3 :imag 4}, and a vector v = [1 -2 >> c], it would be nice to have the call 'map #(Math/abs %) v' produce (1 2 >> 5). >> >> I am having trouble figuring out all the pieces that need to be >> implemented. Is it even possible to implement this as a library, or does >> this need to be a part of clojure.core? >> > -- 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.