[mlpack] maximum problem size for PrimalDualSolver?
Joe Dinius
josephwdinius at gmail.com
Mon Sep 2 16:35:18 EDT 2019
Ryan,
Thanks so much for your awesome explanation and for looking into it! It's
really amusing (to me anyways) that, just before reading this, I was going
through the armadillo docs and read the following:
- *Can I use the C++11 auto keyword with Armadillo objects and/or
expressions?*
Use of C++11 *auto* is *not recommended* with Armadillo objects and
expressions. Armadillo has a template meta-programming framework which
creates lots of short lived temporaries that are not handled by *auto*.
and *immediately* thought "maybe this is what's happening with my SDP
code". HAHAHA. I will try it out and let you know how it goes.
On Mon, Sep 2, 2019 at 10:57 AM Ryan Curtin <ryan at ratml.org> wrote:
> On Mon, Sep 02, 2019 at 09:21:32AM -0700, Joe Dinius wrote:
> > Sure, no problem. Attached is a compressed minimal example that only has
> > armadillo (9.599) and ensmallen (1.15.1) as dependencies; openmp is
> > optional.
>
> Hey Joe,
>
> Thanks for the code---I was able to unpack and build it really easily.
> I found the issue and it is actually caused by a somehow-invalid use of
> 'auto'. Here was my debugging route:
>
> First I compiled the program and ran to verify that it gave the same
> output as you saw. Indeed it did... so I then used gdb to see how large
> of a matrix it tried to allocate. I discovered that size_Y at line 115
> of ensmallen-sdp.cpp had a value of 93824992850192. That seemed...
> invalid.
>
> Then, I also found that constr_map.A_[0] had reasonable size (less than
> 300 rows and columns).
>
> I noticed that 'size_Y' was being set like this:
>
> auto const & size_Y = constr_map.getConstraintMapA()[0].n_rows;
>
> In the past, I've learned to avoid using 'auto' because sometimes it can
> infer the wrong types. Generally I will see this happen with longer
> Armadillo expressions. For instance, the following code scares me:
>
> using namespace arma;
> mat x, y;
> auto z = x.t() * y + (x.t() * x - 3);
>
> The reason that scares me is because we are hoping that the compiler
> will infer 'mat' as the type of z, but we don't have a guarantee. In
> fact, more often than not, it will infer some internal Armadillo type
> that represents the expression (due to Armadillo's delayed evaluation
> framework), and this will result in code that doesn't behave as
> expected.
>
> I'm quite surprised, though, that 'auto' failed to infer the correct
> type of n_rows, which is arma::uword. When I changed it to the
> following (I prefer size_t to uword), the test ran without error:
>
> size_t const & size_Y = constr_map.getConstraintMapA()[0].n_rows;
>
> I'm unsure of why the compiler had an issue with this, since there's no
> delayed expression. Perhaps it has to do with dereferencing the
> std::vector getConstraintMapA()---I am not sure.
>
> In any case, I hope this is helpful! If you dig in further and figure
> out why the type is being inferred wrong, I'd be interested to find out.
> But for now I will just continue to avoid 'auto' unless there is no
> possibility the compiler can get it wrong. :) (And even then I might
> avoid it too, just for paranoia's sake!)
>
> --
> Ryan Curtin | "Because for the people who knew what it was, it
> ryan at ratml.org | would be attacking their brain."
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://knife.lugatgt.org/pipermail/mlpack/attachments/20190902/86139615/attachment-0001.html>
More information about the mlpack
mailing list