# 9.2 Calling BLAS/LAPACK Routines from MOSEK¶

Sometimes users need to perform linear algebra operations that involve dense matrices and vectors. Also MOSEK extensively uses high-performance linear algebra routines from the BLAS and LAPACK packages and some of these routines are included in the package shipped to the users.

The MOSEK versions of BLAS/LAPACK routines:

• use MOSEK data types and return value conventions,
• preserve the BLAS/LAPACK naming convention.

Therefore the user can leverage on efficient linear algebra routines, with a simplified interface, with no need for additional packages.

List of available routines

Table 9.1 BLAS routines available.
BLAS Name MOSEK function Math Expression
AXPY Env.axpy $$y=\alpha x+y$$
DOT Env.dot $$x^T y$$
GEMV Env.gemv $$y=\alpha Ax + \beta y$$
GEMM Env.gemm $$C=\alpha AB+ \beta C$$
SYRK Env.syrk $$C=\alpha AA^T+ \beta C$$
Table 9.2 LAPACK routines available.
LAPACK Name MOSEK function Description
POTRF Env.potrf Cholesky factorization of a semidefinite symmetric matrix
SYEVD Env.syevd Eigenvalues and eigenvectors of a symmetric matrix
SYEIG Env.syeig Eigenvalues of a symmetric matrix

Source code examples

In Listing 9.2 we provide a simple working example. It has no practical meaning except showing how to organize the input and call the methods.

Listing 9.2 Calling BLAS and LAPACK routines from Optimizer API for .NET. Click here to download.
using System;

namespace mosek.example
{
public class blas_lapack
{
public static void Main ()
{
const int n = 3, m = 2, k = 2;

double alpha = 2.0, beta = 0.5;
double[] x = {1.0, 1.0, 1.0};
double[] y = {1.0, 2.0, 3.0};
double[] z = {1.0, 1.0};

/*A has m=2 rows and k=3 cols*/
double[] A = {1.0, 1.0, 2.0, 2.0, 3.0, 3.0};
/*B has k=3 rows and n=3 cols*/
double[] B = {1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
1.0, 1.0, 1.0
};
double[] C = {1.0, 2.0, 3.0,
4.0, 5.0, 6.0
};

double[] D = {1.0, 1.0, 1.0, 1.0};
double[] Q = {1.0, 0.0, 0.0, 2.0};
double[] v = new double;

double xy;

using (mosek.Env env = new mosek.Env())
{
/* BLAS routines */

try
{

env.dot(n, x, y, out xy);

env.axpy(n, alpha, x, y);

env.gemv(mosek.transpose.no, m, n, alpha, A, x, beta, z);

env.gemm(mosek.transpose.no, mosek.transpose.no, m, n, k, alpha, A, B, beta, C);

env.syrk(mosek.uplo.lo, mosek.transpose.no, m, k, alpha, A, beta, D);

/* LAPACK routines*/

env.potrf(mosek.uplo.lo, m, Q);

env.syeig(mosek.uplo.lo, m, Q, v);

env.syevd(mosek.uplo.lo, m, Q, v);
}
catch (mosek.Exception e)
{
Console.WriteLine (e.Code);
Console.WriteLine (e);
}
finally
{
if (env != null)  env.Dispose ();
}
}
}
}
}