Dmitriy,

This is very pretty.




On Mon, Jun 24, 2013 at 6:48 PM, Dmitriy Lyubimov <dlie...@gmail.com> wrote:

> Ok, so i was fairly easily able to build some DSL for our matrix
> manipulation (similar to breeze) in scala:
>
> inline matrix or vector:
>
> val  a = dense((1, 2, 3), (3, 4, 5))
>
> val b:Vector = (1,2,3)
>
> block views and assignments (element/row/vector/block/block of row or
> vector)
>
>
> a(::, 0)
> a(1, ::)
> a(0 to 1, 1 to 2)
>
> assignments
>
> a(0, ::) :=(3, 5, 7)
> a(0, 0 to 1) :=(3, 5)
> a(0 to 1, 0 to 1) := dense((1, 1), (2, 2.5))
>
> operators
>
> // hadamard
> val c = a * b
>  a *= b
>
> // matrix mul
>  val m = a %*% b
>
> and bunch of other little things like sum, mean, colMeans etc. That much is
> easy.
>
> Also stuff like the ones found in breeze along the lines
>
> val (u,v,s) = svd(a)
>
> diag ((1,2,3))
>
> and Cholesky in similar ways.
>
> I don't have "inline" initialization for sparse things (yet) simply because
> i don't need them, but of course all regular java constructors and methods
> are retained, all that is just a syntactic sugar in the spirit of DSLs in
> hope to make things a bit mroe readable.
>
> my (very little, and very insignificantly opinionated, really) criticism of
> Breeze in this context is its inconsistency between dense and sparse
> representations, namely, lack of consistent overarching trait(s), so that
> building structure-agnostic solvers like Mahout's Cholesky solver is
> impossible, as well as cross-type matrix use (say, the way i understand it,
> it is pretty much imposible to multiply a sparse matrix by a dense matrix).
>
> I suspect these problems stem from the fact that the authors for whatever
> reason decided to hardwire dense things with JBlas solvers whereas i dont
> believe matrix storage structures must be. But these problems do appear to
> be serious enough  for me to ignore Breeze for now. If i decide to plug in
> jblas dense solvers, i guess i will just have them as yet another top-level
> routine interface taking any Matrix, e.g.
>
> val (u,v,s) = svd(m, jblas=true)
>
>
>
> On Sun, Jun 23, 2013 at 7:08 PM, Dmitriy Lyubimov <dlie...@gmail.com>
> wrote:
>
> > Thank you.
> > On Jun 23, 2013 6:16 PM, "Ted Dunning" <ted.dunn...@gmail.com> wrote:
> >
> >> I think that this contract has migrated a bit from the first starting
> >> point.
> >>
> >> My feeling is that there is a de facto contract now that the matrix
> slice
> >> is a single row.
> >>
> >> Sent from my iPhone
> >>
> >> On Jun 23, 2013, at 16:32, Dmitriy Lyubimov <dlie...@gmail.com> wrote:
> >>
> >> > What does Matrix. iterateAll() contractually do? Practically it seems
> >> to be
> >> > row wise iteration for some implementations but it doesnt seem
> >> > contractually state so in the javadoc. What is MatrixSlice if it is
> >> neither
> >> > a row nor a colimn? How can i tell what exactly it is i am iterating
> >> over?
> >> > On Jun 19, 2013 12:21 AM, "Ted Dunning" <ted.dunn...@gmail.com>
> wrote:
> >> >
> >> >> On Wed, Jun 19, 2013 at 5:29 AM, Jake Mannix <jake.man...@gmail.com>
> >> >> wrote:
> >> >>
> >> >>>> Question #2: which in-core solvers are available for Mahout
> >> matrices? I
> >> >>>> know there's SSVD, probably Cholesky, is there something else? In
> >> >>>> paticular, i need to be solving linear systems, I guess Cholesky
> >> should
> >> >>> be
> >> >>>> equipped enough to do just that?
> >> >>>>
> >> >>>> Question #3: why did we try to import Colt solvers rather than
> >> actually
> >> >>>> depend on Colt in the first place? Why did we not accept Colt's
> >> sparse
> >> >>>> matrices and created native ones instead?
> >> >>>>
> >> >>>> Colt seems to have a notion of parse in-core matrices too and seems
> >> >> like
> >> >>> a
> >> >>>> well-rounded solution. However, it doesn't seem like being actively
> >> >>>> supported, whereas I know Mahout experienced continued enhancements
> >> to
> >> >>> the
> >> >>>> in-core matrix support.
> >> >>>>
> >> >>>
> >> >>> Colt was totally abandoned, and I talked to the original author and
> he
> >> >>> blessed it's adoption.  When we pulled it in, we found it was
> woefully
> >> >>> undertested,
> >> >>> and tried our best to hook it in with proper tests and use APIs that
> >> fit
> >> >>> with
> >> >>> the use cases we had.  Plus, we already had the start of some linear
> >> apis
> >> >>> (i.e.
> >> >>> the Vector interface) and dropping the API completely seemed not
> >> terribly
> >> >>> worth it at the time.
> >> >>>
> >> >>
> >> >> There was even more to it than that.
> >> >>
> >> >> Colt was under-tested and there have been warts that had to be pulled
> >> out
> >> >> in much of the code.
> >> >>
> >> >> But, worse than that, Colt's matrix and vector structure was a real
> >> bugger
> >> >> to extend or change.  It also had all kinds of cruft where it
> >> pretended to
> >> >> support matrices of things, but in fact only supported matrices of
> >> doubles
> >> >> and floats.
> >> >>
> >> >> So using Colt as it was (and is since it is largely abandoned) was a
> >> >> non-starter.
> >> >>
> >> >> As far as in-memory solvers, we have:
> >> >>
> >> >> 1) LR decomposition (tested and kinda fast)
> >> >>
> >> >> 2) Cholesky decomposition (tested)
> >> >>
> >> >> 3) SVD (tested)
> >> >>
> >>
> >
>

Reply via email to