/******************************************************* * Copyright (c) 2014, ArrayFire * All rights reserved. * * This file is distributed under 3-clause BSD license. * The complete license agreement can be obtained at: * http://arrayfire.com/licenses/BSD-3-Clause ********************************************************/ #include #include #include "error.hpp" namespace af { void svd(array &u, array &s, array &vt, const array &in) { af_array sl = 0, ul = 0, vtl = 0; AF_THROW(af_svd(&ul, &sl, &vtl, in.get())); s = array(sl); u = array(ul); vt = array(vtl); } void svdInPlace(array &u, array &s, array &vt, array &in) { af_array sl = 0, ul = 0, vtl = 0; AF_THROW(af_svd_inplace(&ul, &sl, &vtl, in.get())); s = array(sl); u = array(ul); vt = array(vtl); } void lu(array &out, array &pivot, const array &in, const bool is_lapack_piv) { out = in.copy(); af_array p = 0; AF_THROW(af_lu_inplace(&p, out.get(), is_lapack_piv)); pivot = array(p); } void lu(array &lower, array &upper, array &pivot, const array &in) { af_array l = 0, u = 0, p = 0; AF_THROW(af_lu(&l, &u, &p, in.get())); lower = array(l); upper = array(u); pivot = array(p); } void luInPlace(array &pivot, array &in, const bool is_lapack_piv) { af_array p = 0; AF_THROW(af_lu_inplace(&p, in.get(), is_lapack_piv)); pivot = array(p); } void qr(array &out, array &tau, const array &in) { out = in.copy(); af_array t = 0; AF_THROW(af_qr_inplace(&t, out.get())); tau = array(t); } void qr(array &q, array &r, array &tau, const array &in) { af_array q_ = 0, r_ = 0, t_ = 0; AF_THROW(af_qr(&q_, &r_, &t_, in.get())); q = array(q_); r = array(r_); tau = array(t_); } void qrInPlace(array &tau, array &in) { af_array t = 0; AF_THROW(af_qr_inplace(&t, in.get())); tau = array(t); } int cholesky(array &out, const array &in, const bool is_upper) { int info = 0; af_array res; AF_THROW(af_cholesky(&res, &info, in.get(), is_upper)); out = array(res); return info; } int choleskyInPlace(array &in, const bool is_upper) { int info = 0; AF_THROW(af_cholesky_inplace(&info, in.get(), is_upper)); return info; } array solve(const array &a, const array &b, const matProp options) { af_array out; AF_THROW(af_solve(&out, a.get(), b.get(), options)); return array(out); } array solveLU(const array &a, const array &piv, const array &b, const matProp options) { af_array out; AF_THROW(af_solve_lu(&out, a.get(), piv.get(), b.get(), options)); return array(out); } array inverse(const array &in, const matProp options) { af_array out; AF_THROW(af_inverse(&out, in.get(), options)); return array(out); } array pinverse(const array &in, const double tol, const matProp options) { af_array out; AF_THROW(af_pinverse(&out, in.get(), tol, options)); return array(out); } unsigned rank(const array &in, const double tol) { unsigned r = 0; AF_THROW(af_rank(&r, in.get(), tol)); return r; } #define INSTANTIATE_DET(TR, TC) \ template<> \ AFAPI TR det(const array &in) { \ double real; \ double imag; \ AF_THROW(af_det(&real, &imag, in.get())); \ return real; \ } \ template<> \ AFAPI TC det(const array &in) { \ double real; \ double imag; \ AF_THROW(af_det(&real, &imag, in.get())); \ TC out((TR)real, (TR)imag); \ return out; \ } INSTANTIATE_DET(float, af_cfloat) INSTANTIATE_DET(double, af_cdouble) double norm(const array &in, const normType type, const double p, const double q) { double out; AF_THROW(af_norm(&out, in.get(), type, p, q)); return out; } bool isLAPACKAvailable() { bool out = false; AF_THROW(af_is_lapack_available(&out)); return out; } } // namespace af