<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<br class="">
<div>
<div class="">On Dec 19, 2014, at 1:17 AM, Braun, Michael <<a href="mailto:braunm@mail.smu.edu" class="">braunm@mail.smu.edu</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<div class="">Following a suggestion in the Eigen support forum, I created a file eigen_sparse_plugin.h that contains the following:</div>
<div class=""><br class="">
</div>
<div class="">typedef Scalar value_type;</div>
<div class=""><br class="">
</div>
<div class="">
<div class="">template<typename S, int R, int Opt, int MR, int MC></div>
<div class="">inline void reserve(const Matrix<S,R,Opt,MR,MC> &reserveSizes)</div>
<div class="">{</div>
<div class=""> reserveInnerVectors(reserveSizes);</div>
<div class="">}</div>
</div>
<div class=""><br class="">
</div>
<div class="">This now appears to work after adding</div>
<div class=""><br class="">
</div>
<div class="">#define EIGEN_SPARSEMATRIX_PLUGIN <eigen_sparse_plugin.h> </div>
<div class=""><br class="">
</div>
<div class="">before including the Eigen headers.</div>
<div class=""><br class="">
</div>
<div class="">I did see another post on the Eigen mailing list (not the support forum) that suggests a traits-type approach. But maybe the best option would be to convince the Eigen folks to add the template specialization of reserve to the SparseMatrix class.
That decision is above my level of expertise.</div>
<div class=""><br class="">
</div>
</div>
</div>
<blockquote type="cite" class="">
<div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">
<div bgcolor="#FFFFFF" text="#000000" class=""><br class="">
<div class="moz-forward-container">-------- Forwarded Message --------
<table class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0">
<tbody class="">
<tr class="">
<th align="RIGHT" nowrap="nowrap" valign="BASELINE" class="">Subject: </th>
<td class="">Re: [CppAD] filling Eigen sparse matrix in presence of CppAD</td>
</tr>
<tr class="">
<th align="RIGHT" nowrap="nowrap" valign="BASELINE" class="">Date: </th>
<td class="">Thu, 18 Dec 2014 05:25:54 -0700</td>
</tr>
<tr class="">
<th align="RIGHT" nowrap="nowrap" valign="BASELINE" class="">From: </th>
<td class="">Brad Bell <a class="moz-txt-link-rfc2396E" href="mailto:bradbell@seanet.com">
<bradbell@seanet.com></a></td>
</tr>
<tr class="">
<th align="RIGHT" nowrap="nowrap" valign="BASELINE" class="">To: </th>
<td class=""><a class="moz-txt-link-abbreviated" href="mailto:cppad@list.coin-or.org">cppad@list.coin-or.org</a>, Mic >> Braun, Michael
<a class="moz-txt-link-rfc2396E" href="mailto:braunm@mail.smu.edu"><braunm@mail.smu.edu></a></td>
</tr>
</tbody>
</table>
<br class="">
<br class="">
<div class="moz-cite-prefix">Using g++ 4.8.3, if you delete<br class="">
typedef Scalar value_type;<br class="">
at line 24 of<br class="">
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://projects.coin-or.org/CppAD/browser/trunk/cppad/example/eigen_plugin.hpp">
https://projects.coin-or.org/CppAD/browser/trunk/cppad/example/eigen_plugin.hpp</a><br class="">
the error in compiling the example below goes away.<br class="">
<br class="">
CppAD expects <br class="">
Vector::value_type<br class="">
to be the type of the elements of a vector; see<br class="">
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://www.coin-or.org/CppAD/Doc/simplevector.xml#Value%20Type">
http://www.coin-or.org/CppAD/Doc/simplevector.xml#Value%20Type</a><br class="">
<br class="">
This is the same as for the C++ standard vector; as can be seen by searching for value_type on<br class="">
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://www.cplusplus.com/reference/vector/vector/">
http://www.cplusplus.com/reference/vector/vector/</a><br class="">
<br class="">
I wanted to ask about this on the eigen user's list<br class="">
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2014/12/maillist.html">
http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2014/12/maillist.html</a><br class="">
but I did not see your posting there.<br class="">
<br class="">
Brad<br class="">
<br class="">
<br class="">
On 12/17/2014 11:33 AM, Braun, Michael wrote:<br class="">
</div>
<blockquote cite="mid:C1E0B23C-F1A1-4C5B-9647-1FEBDEE26E44@smu.edu" type="cite" class="">
<meta http-equiv="Context-Type" content="text/html;
charset=us-ascii" class="">
<div class="">I posted this same question on the Eigen forum because I do not know if it is really an Eigen issue or a CppAD issue.</div>
<div class=""><br class="">
</div>
<div class="">As part of a larger application that uses CppAD, I am trying to fill an Eigen sparse matrix. The following MWE does not use CppAD, and when the first line (#define EIGEN_MATRIX_PLUGIN ... ) is commented out, this code runs fine. </div>
<div class=""><br class="">
</div>
<div class="">
<div class="">
<div class="">#define EIGEN_MATRIX_PLUGIN <cppad/example/eigen_plugin.hpp></div>
<div class=""><br class="">
</div>
<div class="">#include <Eigen/Eigen></div>
<div class="">#include <Eigen/Sparse></div>
<div class="">#include <cppad/cppad.hpp></div>
<div class="">#include <cppad/example/cppad_eigen.hpp></div>
<div class=""><br class="">
</div>
<div class="">void triptest () {</div>
<div class=""> typedef Eigen::Triplet<double> TT;</div>
<div class=""><br class="">
</div>
<div class=""> int n = 5;</div>
<div class=""> std::vector<TT> trips; </div>
<div class=""> Eigen::SparseMatrix<double> M(n,n);</div>
<div class=""> </div>
<div class=""> for (int i=0; i<n; i++) { </div>
<div class=""> trips.push_back (TT(i,i,i*i));</div>
<div class=""> }</div>
<div class=""> M.setFromTriplets(trips.begin(), trips.end());</div>
<div class=""> std::cout << M << "\n";</div>
<div class=""> </div>
<div class="">}</div>
<div class=""><br class="">
</div>
<div class="">int main (void)</div>
<div class="">{ </div>
<div class=""> triptest();</div>
<div class=""> return 0;</div>
<div class="">}</div>
</div>
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class="">But when left in, I get the following compile error:</div>
<div class=""><br class="">
</div>
<div class="">
<div class=""> $ clang++ -I/opt/cppad/include -I$R_HOME/library/RcppEigen/include trips.cpp -o trips.so</div>
<div class="">In file included from trips.cpp:4:</div>
<div class="">In file included from .../Eigen/Sparse:19:</div>
<div class="">In file included from .../Eigen/SparseCore:40:</div>
<div class=""><b class="">/Library/Frameworks/R.framework/Resources/library/RcppEigen/include/Eigen/src/SparseCore/SparseMatrix.h:957:11:
</b><span class=""><b class="">error: </b></span></div>
<div class=""><b class=""> call to member function 'reserve' is ambiguous</b></div>
<div class=""> trMat.reserve(wi);</div>
<div class=""><b class=""> ~~~~~~^~~~~~~</b></div>
<div class=""><b class="">.../Eigen/src/SparseCore/SparseMatrix.h:1013:13: note: </b></div>
<div class=""> in instantiation of function template specialization</div>
<div class=""> 'Eigen::internal::set_from_triplets<std::__1::__wrap_iter<Eigen::Triplet<double, int> *>,</div>
<div class=""> Eigen::SparseMatrix<double, 0, int> >' requested here</div>
<div class=""> internal::set_from_triplets(begin, end, *this);</div>
<div class=""><b class=""> ^</b></div>
<div class=""><b class="">trips.cpp:18:5: note: </b>in instantiation of function template specialization 'Eigen::SparseMatrix<double, 0,</div>
<div class=""> int>::setFromTriplets<std::__1::__wrap_iter<Eigen::Triplet<double, int> *> >' requested here</div>
<div class=""> M.setFromTriplets(trips.begin(), trips.end());</div>
<div class=""><b class=""> ^</b></div>
<div class=""><b class="">.../Eigen/src/SparseCore/SparseMatrix.h:270:17: note: </b></div>
<div class=""> candidate function [with SizesType = Eigen::Matrix<int, -1, 1, 0, -1, 1>]</div>
<div class=""> inline void reserve(const SizesType& reserveSizes, const typename SizesType::value_type& enableif = typenam...</div>
<div class=""><b class=""> ^</b></div>
<div class=""><b class="">.../Eigen/src/SparseCore/SparseMatrix.h:276:17: note: </b></div>
<div class=""> candidate function [with SizesType = Eigen::Matrix<int, -1, 1, 0, -1, 1>]</div>
<div class=""> inline void reserve(const SizesType& reserveSizes, const typename SizesType::Scalar& enableif =</div>
<div class=""><b class=""> ^</b></div>
<div class=""><b class="">.../Eigen/src/SparseCore/SparseMatrix.h:256:17: note: </b></div>
<div class=""> candidate function not viable: no known conversion from 'Matrix<Index, Dynamic, 1>' to 'Index' (aka 'int') for 1st</div>
<div class=""> argument</div>
<div class=""> inline void reserve(Index reserveSize)</div>
<div class=""><b class=""> ^</b></div>
</div>
<div class=""><b class=""><br class="">
</b></div>
<div class=""><br class="">
</div>
<div class="">Any idea what's going on? I have been able to narrow the problem directly to that first #define. Also, this appears to happen only with EIGEN_MATRIX_PLUGIN, and not ARRAY or SPARSEMATRIX.</div>
<div class=""><br class="">
</div>
<div class="">Thanks,</div>
<div class=""><br class="">
</div>
<div class="">Michael</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<br class="">
<div class="">
<div class="">--------------------------</div>
<div class="">Michael Braun</div>
<div class="">Associate Professor of Marketing</div>
<div class="">Cox School of Business</div>
<div class="">Southern Methodist University</div>
<div class="">Dallas, TX 75275</div>
<div class=""><a moz-do-not-send="true" href="mailto:braunm@smu.edu" class="">braunm@smu.edu</a></div>
<div class=""><br class="">
</div>
<br class="Apple-interchange-newline">
</div>
<br class="">
<br class="">
<fieldset class="mimeAttachmentHeader"></fieldset> <br class="">
<pre wrap="" class="">_______________________________________________
CppAD mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:CppAD@list.coin-or.org">CppAD@list.coin-or.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://list.coin-or.org/mailman/listinfo/cppad">http://list.coin-or.org/mailman/listinfo/cppad</a>
</pre>
</blockquote>
<br class="">
<br class="">
</div>
<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
<div apple-content-edited="true" class="">--------------------------------------------<br class="">
Michael Braun, Ph.D.<br class="">
Associate Professor of Marketing<br class="">
Cox School of Business<br class="">
Southern Methodist University<br class="">
<a href="mailto:braunm@smu.edu" class="">braunm@smu.edu</a><br class="">
<br class="">
</div>
<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
<div apple-content-edited="true" class="">
<div class="">--------------------------</div>
<div class="">Michael Braun</div>
<div class="">Associate Professor of Marketing</div>
<div class="">Cox School of Business</div>
<div class="">Southern Methodist University</div>
<div class="">Dallas, TX 75275</div>
<div class=""><a href="mailto:braunm@smu.edu" class="">braunm@smu.edu</a></div>
<div class=""><br class="">
</div>
<br class="Apple-interchange-newline">
</div>
<br class="">
</body>
</html>