23#include <gsl/gsl_blas.h> 
   25#include <yarp/gsl/Gsl.h> 
   30namespace learningmachine {
 
   33void dchud(
double* r, 
int ldr, 
int p, 
double* 
x, 
double* 
z, 
int ldz, 
int nz,
 
   34           double* 
y, 
double* rho, 
double* c, 
double* s,
 
   35           unsigned char rtrans, 
unsigned char ztrans) {
 
   37    double* work = (
double*) 0x0;
 
   38    double* tbuff = (
double*) 0x0;
 
   41    double scale, workscale, rhoscale;
 
   44    work = (
double*) malloc(
p * 
sizeof(
double));
 
   45    cblas_dcopy(
p, 
x, 1, work, 1);
 
   47    stp = (rtrans == 1) ? 
p : 1;
 
   50    for(i = 0, tbuff = r; (int)i < 
p; tbuff+=(
p+1), i++) {
 
   52        cblas_drotg(tbuff, work+i, c+i, s+i);
 
   63            cblas_drot(
p-i-1, tbuff+stp, stp, work+i+1, 1, c[i], s[i]);
 
   70        work = (
double*) malloc(nz * 
sizeof(
double));
 
   71        cblas_dcopy(nz, 
y, 1, work, 1);
 
   73        stp = (ztrans == 1) ? 1 : nz;
 
   74        stp2 = (ztrans == 1) ? ldz : 1;
 
   77        for(i = 0; (int)i < 
p; i++) {
 
   78            cblas_drot(nz, 
z+i*stp, stp2, work, 1, c[i], s[i]);
 
   82        for(i = 0; (int)i < nz; i++) {
 
   87                scale = work[i] + rho[i];
 
   88                workscale = work[i] / scale;
 
   89                rhoscale = rho[i] / scale;
 
   90                rho[i] = scale * sqrt((workscale)*(workscale) + (rhoscale)*(rhoscale));
 
 
  100                                gsl_matrix* Z, gsl_vector* 
y, gsl_vector* rho,
 
  101                                unsigned char rtrans, 
unsigned char ztrans) {
 
  110    ldr = rtrans ? R->size2 : R->size1;
 
  111    p = rtrans ? R->size1 : R->size2;
 
  114    if(Z != NULL && 
y != NULL && rho != NULL) {
 
  115        ldz = ztrans ? Z->size2 : Z->size1;
 
  116        nz = ztrans ? Z->size1 : Z->size2;
 
  122    dchud(R->data, ldr, 
p, 
x->data, Zp, ldz, nz, yp, rhop, c->data, s->data, rtrans, ztrans);
 
  125    for(i = 0; i < 
p; i++) {
 
  126        for(j = 0; j < i; j++) {
 
  128                gsl_matrix_set(R, j, i, gsl_matrix_get(R, i, j));
 
  130                gsl_matrix_set(R, i, j, gsl_matrix_get(R, j, i));
 
 
  136void cholupdate(yarp::sig::Matrix& R, 
const yarp::sig::Vector& 
x, yarp::sig::Vector& c, yarp::sig::Vector& s,
 
  137                yarp::sig::Matrix& Z, 
const yarp::sig::Vector& 
y, yarp::sig::Vector& rho, 
bool rtrans, 
bool ztrans) {
 
  138    yarp::gsl::GslMatrix RGslMat(R), ZGslMat(Z);
 
  139    yarp::gsl::GslVector xGslVec(
x), yGslVec(
y), rhoGslVec(rho), cGslVec(c), sGslVec(s);
 
  141    gsl_matrix* Rgsl = (gsl_matrix*) RGslMat.getGslMatrix();
 
  142    gsl_vector* xgsl = (gsl_vector*) xGslVec.getGslVector();
 
  143    gsl_matrix* Zgsl = (gsl_matrix*) ZGslMat.getGslMatrix();
 
  144    gsl_vector* ygsl = (gsl_vector*) yGslVec.getGslVector();
 
  145    gsl_vector* rhogsl = (gsl_vector*) rhoGslVec.getGslVector();
 
  146    gsl_vector* cgsl = (gsl_vector*) cGslVec.getGslVector();
 
  147    gsl_vector* sgsl = (gsl_vector*) sGslVec.getGslVector();
 
 
  152void cholupdate(yarp::sig::Matrix& R, 
const yarp::sig::Vector& 
x, 
bool rtrans) {
 
  153    yarp::sig::Vector c(R.cols());
 
  154    yarp::sig::Vector s(R.cols());
 
  156    yarp::gsl::GslMatrix RGslMat(R);
 
  157    yarp::gsl::GslVector xGslVec(
x), cGslVec(c), sGslVec(s);
 
  159    gsl_matrix* Rgsl = (gsl_matrix*) RGslMat.getGslMatrix();
 
  160    gsl_vector* xgsl = (gsl_vector*) xGslVec.getGslVector();
 
  161    gsl_vector* cgsl = (gsl_vector*) cGslVec.getGslVector();
 
  162    gsl_vector* sgsl = (gsl_vector*) sGslVec.getGslVector();
 
 
  167void cholsolve(
const yarp::sig::Matrix& R, 
const yarp::sig::Matrix& B, yarp::sig::Matrix& X) {
 
  168    assert(B.rows() == X.rows());
 
  169    assert(B.cols() == X.cols());
 
  170    assert(R.rows() == R.cols());
 
  171    assert(R.cols() == B.cols());
 
  175    for(
int r = 0; r < B.rows(); r++) {
 
 
  185yarp::sig::Matrix 
cholsolve(
const yarp::sig::Matrix& R, 
const yarp::sig::Matrix& B) {
 
  186    yarp::sig::Matrix X(B.rows(), B.cols());
 
 
  191void cholsolve(
const yarp::sig::Matrix& R, 
const yarp::sig::Vector& b, yarp::sig::Vector& 
x) {
 
  194    yarp::gsl::GslMatrix RGslMat(R);
 
  195    yarp::gsl::GslVector bGslVec(b), xGslVec(
x);
 
  197    gsl_matrix* Rgsl = (gsl_matrix*) RGslMat.getGslMatrix();
 
  198    gsl_vector* bgsl = (gsl_vector*) bGslVec.getGslVector();
 
  199    gsl_vector* xgsl = (gsl_vector*) xGslVec.getGslVector();
 
  201    info = gsl_linalg_cholesky_solve(Rgsl, bgsl, xgsl);
 
  203        throw std::runtime_error(gsl_strerror(info));
 
 
  207yarp::sig::Vector 
cholsolve(
const yarp::sig::Matrix& R, 
const yarp::sig::Vector& b) {
 
  208    yarp::sig::Vector 
x(b.size());
 
 
  213yarp::sig::Matrix 
outerprod(
const yarp::sig::Vector& v1, 
const yarp::sig::Vector& v2) {
 
  214    yarp::sig::Matrix 
out(v1.size(), v2.size());
 
  215    for(
int r = 0; r < 
out.rows(); r++) {
 
  216        for(
int c = 0; c < 
out.cols(); c++) {
 
  217            out(r, c) = v1(r) * v2(c);
 
 
  223yarp::sig::Vector& 
addvec(yarp::sig::Vector& v, 
double val) {
 
  224    for(
size_t i = 0; i < v.size(); i++) {
 
 
  230void trsolve(
const yarp::sig::Matrix& 
A, 
const yarp::sig::Vector& b, yarp::sig::Vector& 
x, 
bool transa) {
 
  231    yarp::gsl::GslMatrix AGslMat(
A);
 
  232    yarp::gsl::GslVector bGslVec(b), xGslVec(
x);
 
  234    gsl_matrix* Agsl = (gsl_matrix*) AGslMat.getGslMatrix();
 
  235    gsl_vector* bgsl = (gsl_vector*) bGslVec.getGslVector();
 
  236    gsl_vector* xgsl = (gsl_vector*) xGslVec.getGslVector();
 
  238    gsl_vector_memcpy(xgsl, bgsl);
 
  239    CBLAS_TRANSPOSE trans = transa ? CblasTrans : CblasNoTrans;
 
  240    gsl_blas_dtrsv(CblasUpper, trans, CblasNonUnit, Agsl, xgsl);
 
 
  243yarp::sig::Vector 
trsolve(
const yarp::sig::Matrix& 
A, 
const yarp::sig::Vector& b, 
bool transa) {
 
  244    yarp::sig::Vector 
x(b.size());
 
 
  249void fillrandom(yarp::sig::Vector& v, yarp::math::RandScalar& prng) {
 
  251    for(i = 0; i < v.size(); i++) {
 
 
  256void fillrandom(yarp::sig::Matrix& M, yarp::math::RandScalar& prng) {
 
  258    for(r = 0; r < M.rows(); r++) {
 
  259        for(c = 0; c < M.cols(); c++) {
 
  260            M(r, c) = prng.get();
 
 
  265void fillrandom(yarp::sig::Vector& v, yarp::math::RandnScalar& prng) {
 
  267    for(i = 0; i < v.size(); i++) {
 
 
  272void fillrandom(yarp::sig::Matrix& M, yarp::math::RandnScalar& prng) {
 
  274    for(r = 0; r < M.rows(); r++) {
 
  275        for(c = 0; c < M.cols(); c++) {
 
  276            M(r, c) = prng.get();
 
 
  281yarp::sig::Vector 
random(
int length, yarp::math::RandScalar& prng) {
 
  282    yarp::sig::Vector v(length);
 
 
  287yarp::sig::Matrix 
random(
int rows, 
int columns, yarp::math::RandScalar& prng) {
 
  288    yarp::sig::Matrix M(rows, columns);
 
 
  293yarp::sig::Vector 
random(
int length, yarp::math::RandnScalar& prng) {
 
  294    yarp::sig::Vector v(length);
 
 
  299yarp::sig::Matrix 
random(
int rows, 
int columns, yarp::math::RandnScalar& prng) {
 
  300    yarp::sig::Matrix M(rows, columns);
 
 
  305yarp::sig::Vector& 
map(yarp::sig::Vector& v, 
double (op)(
double)) {
 
  306    for(
size_t i = 0; i < v.size(); i++) {
 
 
  312yarp::sig::Matrix& 
map(yarp::sig::Matrix& M, 
double (op)(
double)) {
 
  313    for(
int r = 0; r < M.rows(); r++) {
 
  314        for(
int c = 0; c < M.cols(); c++) {
 
  315            M(r, c) = op(M(r, c));
 
 
  321yarp::sig::Vector 
map(
const yarp::sig::Vector& v, 
double (op)(
double)) {
 
  322    yarp::sig::Vector 
out(v.size());
 
  323    for(
size_t i = 0; i < 
out.size(); i++) {
 
 
  329yarp::sig::Matrix 
map(
const yarp::sig::Matrix& M, 
double (op)(
double)) {
 
  330    yarp::sig::Matrix 
out(M.rows(), M.cols());
 
  331    for(
int r = 0; r < 
out.rows(); r++) {
 
  332        for(
int c = 0; c < 
out.cols(); c++) {
 
  333            out(r, c) = op(M(r, c));
 
 
  339yarp::sig::Vector& 
cosvec(yarp::sig::Vector& v){
 
  340    return map(v, std::cos);
 
 
  343yarp::sig::Vector& 
sinvec(yarp::sig::Vector& v){
 
  344    return map(v, std::sin);
 
 
  347yarp::sig::Matrix& 
cosmat(yarp::sig::Matrix& M) {
 
  348    return map(M, std::cos);
 
 
  351yarp::sig::Matrix& 
sinmat(yarp::sig::Matrix& M) {
 
  352    return map(M, std::sin);
 
 
  355yarp::sig::Vector 
cosvec(
const yarp::sig::Vector& v){
 
  356    return map(v, std::cos);
 
 
  359yarp::sig::Vector 
sinvec(
const yarp::sig::Vector& v){
 
  360    return map(v, std::sin);
 
 
  363yarp::sig::Matrix 
cosmat(
const yarp::sig::Matrix& M) {
 
  364    return map(M, std::cos);
 
 
  367yarp::sig::Matrix 
sinmat(
const yarp::sig::Matrix& M) {
 
  368    return map(M, std::sin);
 
 
void cholupdate(yarp::sig::Matrix &R, const yarp::sig::Vector &x, yarp::sig::Vector &c, yarp::sig::Vector &s, yarp::sig::Matrix &Z, const yarp::sig::Vector &y, yarp::sig::Vector &rho, bool rtrans=0, bool ztrans=0)
Perform a rank-1 update to a Cholesky factor, while updating additional vectors using the used Given'...
 
yarp::sig::Vector & cosvec(yarp::sig::Vector &v)
Computes the cosine of a vector element-wise inplace.
 
yarp::sig::Matrix outerprod(const yarp::sig::Vector &v1, const yarp::sig::Vector &v2)
Computes the outer product of two vectors.
 
void gsl_linalg_cholesky_update(gsl_matrix *R, gsl_vector *x, gsl_vector *c, gsl_vector *s, gsl_matrix *Z=NULL, gsl_vector *y=NULL, gsl_vector *rho=NULL, unsigned char rtrans=0, unsigned char ztrans=0)
 
void dchud(double *r, int ldr, int p, double *x, double *z, int ldz, int nz, double *y, double *rho, double *c, double *s, unsigned char rtrans=0, unsigned char ztrans=0)
Mathematical helper functions for use in the learningMachine library.
 
void fillrandom(yarp::sig::Vector &v, yarp::math::RandScalar &prng)
Fills an entire vector using the provided pseudo random number generator.
 
yarp::sig::Vector & map(yarp::sig::Vector &v, double(op)(double))
Performs a unary operator inplace on each element of a vector.
 
yarp::sig::Vector random(int length, yarp::math::RandScalar &prng)
Returns a random vector with given dimensionality.
 
void cholsolve(const yarp::sig::Matrix &R, const yarp::sig::Matrix &B, yarp::sig::Matrix &X)
Solves a system A*x=b for multiple row vectors in B using a precomputed Cholesky factor R.
 
yarp::sig::Vector & addvec(yarp::sig::Vector &v, double val)
Adds a scalar to a vector inplace.
 
yarp::sig::Matrix & cosmat(yarp::sig::Matrix &M)
Computes the cosine of a matrix element-wise inplace.
 
yarp::sig::Matrix & sinmat(yarp::sig::Matrix &M)
Computes the sine of a matrix element-wise inplace.
 
yarp::sig::Vector & sinvec(yarp::sig::Vector &v)
Computes the sine of a vector element-wise inplace.
 
void trsolve(const yarp::sig::Matrix &A, const yarp::sig::Vector &b, yarp::sig::Vector &x, bool transa=false)
Solves a triangular linear system Ax=b where A is triangular.
 
This file contains the definition of unique IDs for the body parts and the skin parts of the robot.