/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 2i 2o raw_: tie(x, tau) = qr(a, raw_) BOOST_FORCEINLINE void eval2_2 ( A0& a0, A1& a1 , const nt2::policy<ext::raw_>& ) const { NT2_AS_TERMINAL_INOUT(o_semantic, x , boost::proto::child_c<0>(a0), boost::proto::child_c<0>(a1)); NT2_AS_TERMINAL_OUT(o_semantic, tau , boost::proto::child_c<1>(a1)); tau.resize(of_size(dim(x), 1)); NT2_LAPACK_VERIFY(nt2::geqrf( boost::proto::value(x) , boost::proto::value(tau))); assign_swap(boost::proto::child_c<0>(a1), x); assign_swap(boost::proto::child_c<1>(a1), tau); }
BOOST_FORCEINLINE void inverse(T1& ip) const { T1 inv(of_size(1, numel(ip))); inv(ip) = nt2::_(nt2_la_int(1), nt2_la_int(numel(ip))); assign_swap(ip, inv); }
BOOST_FORCEINLINE void eval2_2 ( A0& a0, A1& a1 , const T& ) const { nt2::container::table<type_t> work; NT2_AS_TERMINAL_INOUT(o_semantic , r, boost::proto::child_c<0>(a0), work); NT2_AS_TERMINAL_OUT (o_semantic , x, boost::proto::child_c<0>(a1)); nt2::container::table<type_t> tau; tie(x, tau) = qr(r, nt2::raw_); extract_qr(x, tau, r, T()); // extract raw or econ assign_swap(boost::proto::child_c<0>(a1), x); assign_swap(boost::proto::child_c<1>(a1), r); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 1i 2o raw_ BOOST_FORCEINLINE void eval1_2 ( A0& a0, A1& a1 , const nt2::policy<ext::raw_>& ) const { typedef nt2::memory::container<tag::table_, nt2_la_int, nt2::_2D> i_semantic; NT2_AS_TERMINAL_INOUT(o_semantic , lu, boost::proto::child_c<0>(a0) , boost::proto::child_c<0>(a1)); NT2_AS_TERMINAL_OUT(i_semantic, ls , boost::proto::child_c<1>(a1)); ls.resize(of_size(dim(lu), 1)); CHECK_LAPACK_LU_SUCCESS(nt2::getrf( boost::proto::value(lu) , boost::proto::value(ls))); assign_swap(boost::proto::child_c<0>(a1), lu); assign_swap(boost::proto::child_c<1>(a1), ls); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 2i 3o matrix_: tie(q, r, p) = qr(a, matrix_) BOOST_FORCEINLINE void eval2_3 ( A0& a0, A1& a1 , const nt2::policy<ext::matrix_>& ) const { nt2::container::table<type_t> work; NT2_AS_TERMINAL_INOUT(o_semantic, r , boost::proto::child_c<0>(a0), work); NT2_AS_TERMINAL_OUT (o_semantic, x , boost::proto::child_c<0>(a1)); nt2::container::table<type_t> tau; nt2::container::table<nt2_la_int> ip; tie(x, tau, ip) = qr(r, nt2::raw_); extract_qr(x, tau, r, nt2::policy<ext::raw_>()); assign_swap(boost::proto::child_c<0>(a1), x); assign_swap(boost::proto::child_c<1>(a1), r); boost::proto::child_c<2>(a1) = eye(numel(ip), nt2::meta::as_<type_t>())(nt2::_, ip); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 2i 3o vector_: tie(q, r, ip) = qr(a, vector_) BOOST_FORCEINLINE void eval2_3 ( A0& a0, A1& a1 , const nt2::policy<ext::vector_>& ) const { nt2::container::table<type_t> work; NT2_AS_TERMINAL_INOUT(o_semantic, r , boost::proto::child_c<0>(a0), work); NT2_AS_TERMINAL_OUT (o_semantic, x , boost::proto::child_c<0>(a1)); NT2_AS_TERMINAL_OUT (i_semantic, ip , boost::proto::child_c<2>(a1)); nt2::container::table<type_t> tau; tie(x, tau, ip) = qr(r, nt2::raw_); extract_qr(x, tau, r, nt2::policy<ext::raw_>()); assign_swap(boost::proto::child_c<0>(a1), x); assign_swap(boost::proto::child_c<1>(a1), r); assign_swap(boost::proto::child_c<2>(a1), ip); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 2i 3o raw_: tie(x, tau, ip) = qr(a, nt2::raw_) BOOST_FORCEINLINE void eval2_3 ( A0& a0, A1& a1 , const nt2::policy<ext::raw_>& ) const { nt2::container::table<type_t> work; NT2_AS_TERMINAL_INOUT(o_semantic, x , boost::proto::child_c<0>(a0), boost::proto::child_c<0>(a1)); NT2_AS_TERMINAL_OUT(o_semantic, tau , boost::proto::child_c<1>(a1)); NT2_AS_TERMINAL_OUT(i_semantic, ip , boost::proto::child_c<2>(a1)); tau.resize(of_size(dim(x), 1)); ip = nt2::zeros(nt2::width(x),1,nt2::meta::as_<nt2_la_int>()); NT2_LAPACK_VERIFY(nt2::geqp3( boost::proto::value(x) , boost::proto::value(ip) , boost::proto::value(tau))); assign_swap(boost::proto::child_c<0>(a1), x); assign_swap(boost::proto::child_c<1>(a1), tau); assign_swap(boost::proto::child_c<2>(a1), ip); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 1i 1o: x = qr(a) BOOST_FORCEINLINE void eval1_1 ( A0& a0, A1& a1 , const nt2::policy<ext::raw_>& ) const { NT2_AS_TERMINAL_INOUT(o_semantic, r , boost::proto::child_c<0>(a0), boost::proto::child_c<0>(a1)); o_semantic tau(of_size(height(r), 1)); NT2_LAPACK_VERIFY(nt2::geqrf( boost::proto::value(r) , tau)); assign_swap(boost::proto::child_c<0>(a1), r); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 1i 1o raw_ BOOST_FORCEINLINE void eval1_1 ( A0& a0, A1& a1 , const nt2::policy<ext::raw_>& ) const { NT2_AS_TERMINAL_INOUT(o_semantic , lu, boost::proto::child_c<0>(a0) , boost::proto::child_c<0>(a1)); nt2::container::table<nt2_la_int> ls(of_size(dim(lu), 1)); CHECK_LAPACK_LU_SUCCESS((nt2::getrf( boost::proto::value(lu) , boost::proto::value(ls)))); assign_swap(boost::proto::child_c<0>(a1), lu); }
/////////////////////////////////////////////////////////////////////////////// /// INTERNAL ONLY: 2i 3o BOOST_FORCEINLINE void eval2_3 ( A0& a0, A1& a1 , const nt2::policy<ext::vector_>& ) const { typedef typename boost::proto::result_of::child_c<A1&,2>::value_type child; typedef typename child::value_type itype_t; NT2_AS_TERMINAL_INOUT(o_semantic, lu , boost::proto::child_c<0>(a0) , boost::proto::child_c<1>(a1)); std::size_t d = dim(lu); nt2::container::table<nt2_la_int> ls(of_size(d, 1)); CHECK_LAPACK_LU_SUCCESS(nt2::getrf( boost::proto::value(lu) , boost::proto::value(ls))); nt2::container::table<itype_t> ip; construct_ip(ls, ip, height(lu)); boost::proto::child_c<0>(a1) = nt2::tri1l(lu(nt2::_, nt2::_(1, d) ) ); boost::proto::child_c<1>(a1) = nt2::triu(lu( nt2::_(1, d), nt2::_) ); inverse(ip); assign_swap(boost::proto::child_c<2>(a1), ip); }