From 7a7f685a8436b456b246c49baf76bb8af930b214 Mon Sep 17 00:00:00 2001 From: Sandeep Gupta Date: Fri, 7 Jul 2017 00:29:35 +0530 Subject: NORM --- src/c/linearAlgebra/fullrf/dfullrfa.c | 112 +++++++++ src/c/linearAlgebra/givens/dgivensa.c | 76 ++++++ src/c/linearAlgebra/hess/dhessa.c | 8 +- src/c/linearAlgebra/householder/dhouseholdera.c | 90 +++++++ src/c/linearAlgebra/includes/fullrf.h | 26 ++ src/c/linearAlgebra/includes/givens.h | 25 ++ src/c/linearAlgebra/includes/householder.h | 26 ++ src/c/linearAlgebra/includes/qr.h | 26 ++ src/c/linearAlgebra/includes/rowcomp.h | 26 ++ src/c/linearAlgebra/includes/sqroot.h | 26 ++ src/c/linearAlgebra/interfaces/int_fullrf.h | 28 +++ src/c/linearAlgebra/interfaces/int_givens.h | 32 +++ src/c/linearAlgebra/interfaces/int_householder.h | 28 +++ src/c/linearAlgebra/interfaces/int_qr.h | 34 +++ src/c/linearAlgebra/interfaces/int_rowcomp.h | 29 +++ src/c/linearAlgebra/interfaces/int_sqroot.h | 27 ++ src/c/linearAlgebra/proj/dproja.c | 73 ++++++ src/c/linearAlgebra/projspec/dprojspeca.c | 67 +++++ src/c/linearAlgebra/qr/dqra.c | 298 +++++++++++++++++++++++ src/c/linearAlgebra/rowcomp/drowcompa.c | 79 ++++++ src/c/linearAlgebra/sqroot/dsqroota.c | 130 ++++++++++ src/c/linearAlgebra/sva/dsvaa.c | 21 +- src/c/linearAlgebra/svd/.1.c.swp | Bin 0 -> 12288 bytes src/c/linearAlgebra/svd/zsvda.c | 33 ++- 24 files changed, 1295 insertions(+), 25 deletions(-) create mode 100644 src/c/linearAlgebra/fullrf/dfullrfa.c create mode 100644 src/c/linearAlgebra/givens/dgivensa.c create mode 100644 src/c/linearAlgebra/householder/dhouseholdera.c create mode 100644 src/c/linearAlgebra/includes/fullrf.h create mode 100644 src/c/linearAlgebra/includes/givens.h create mode 100644 src/c/linearAlgebra/includes/householder.h create mode 100644 src/c/linearAlgebra/includes/qr.h create mode 100644 src/c/linearAlgebra/includes/rowcomp.h create mode 100644 src/c/linearAlgebra/includes/sqroot.h create mode 100644 src/c/linearAlgebra/interfaces/int_fullrf.h create mode 100644 src/c/linearAlgebra/interfaces/int_givens.h create mode 100644 src/c/linearAlgebra/interfaces/int_householder.h create mode 100644 src/c/linearAlgebra/interfaces/int_qr.h create mode 100644 src/c/linearAlgebra/interfaces/int_rowcomp.h create mode 100644 src/c/linearAlgebra/interfaces/int_sqroot.h create mode 100644 src/c/linearAlgebra/proj/dproja.c create mode 100644 src/c/linearAlgebra/projspec/dprojspeca.c create mode 100644 src/c/linearAlgebra/qr/dqra.c create mode 100644 src/c/linearAlgebra/rowcomp/drowcompa.c create mode 100644 src/c/linearAlgebra/sqroot/dsqroota.c create mode 100644 src/c/linearAlgebra/svd/.1.c.swp (limited to 'src/c/linearAlgebra') diff --git a/src/c/linearAlgebra/fullrf/dfullrfa.c b/src/c/linearAlgebra/fullrf/dfullrfa.c new file mode 100644 index 00000000..a409ae35 --- /dev/null +++ b/src/c/linearAlgebra/fullrf/dfullrfa.c @@ -0,0 +1,112 @@ +/* Copyright (C) 2017 - IIT Bombay - FOSSEE + + This file must be used under the terms of the CeCILL. + This source file is licensed as described in the file COPYING, which + you should have received as part of this distribution. The terms + are also available at + http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt + Author: Sandeep Gupta + Organization: FOSSEE, IIT Bombay + Email: toolbox@scilab.in + */ + +/* FULL Rank factorization function in scilab */ + +/* + //[Q,M,rk]=fullrf(A) + //Full rank factorization : A=Q.M + //with range(Q)=range(A) and ker(M)=ker(A), + //Q full column rank , M full row rank + // rk = rank(A) = #columns(Q) = #rows(M) + //F.D. +*/ + +#include "fullrf.h" +#include +#include +#include "svd.h" +#include +#include "norm.h" +#include "matrixTranspose.h" +#include "matrixMultiplication.h" + +double dfullrfa(int ninp,double *inp1,int row,int col,double tol,double *out1,double *out2){ + + int i,j; + /* norm inp1 - norm(inp1,1)*/ + double na1; + na1 = dnorma(inp1,row,col,1); + + if(ninp == 1){ + tol = sqrt(pow(2,-52)); + } + + if(na1 < pow(1,-10)){ + out1 = NULL; + out2 = NULL; + return 0; + } + + double tol1; + tol1 = tol*na1; + + double *U,*S,*V; + U = (double *)malloc(row*row*sizeof(double)); + S = (double *)malloc(row*col*sizeof(double)); + V = (double *)malloc(col*col*sizeof(double)); + + double rk; + rk = dsvda(tol1,inp1,row,col,0,4,U,S,V); + + /* sq = sqrt(s) */ + for(i=0;i +#include +#include "norm.h" + +/* All variable names are according to scilab code */ + +void dgivensa(int ninp,double *inp1,int row,int col,double *inp2,int row1,int col1,int nout,double *out1,double *out2){ + double *x; + double r; + x = (double *)malloc((double)2*sizeof(double)); + if(ninp == 2){ + if(row != 1 || col != 1 || row1 != 1 || col1 != 1){ + printf("Wrong size for input argument: A column vector expected.\n"); + return; + } + *(x) = *(inp1); + *(x+1) = *(inp2); + } + else{ + //printf("(%d %d)",row,col); + if(row != 2 || col != 1){ + printf("Wrong size for input argument: A column vector expected.\n"); + return; + } + //printf("(%lf %lf)",inp1[0],inp1[1]); + x[0] = inp1[0]; + x[1] = inp1[1]; + } + if(*(x+1) != 0){ + //printf("(%lf %lf)",x[0],x[1]); + /*Norm of type 2 - find the maximum singular value*/ + r = dnorma(x,2,1,2); + //printf("%lf \n",r); + *(out1) = (*(x))/r; + *(out1+1) = -(*(x+1))/r; + *(out1+2) = (*(x+1))/r; + *(out1+3) = (*(x))/r; + if(nout == 2){ + *(out2) = r; + *(out2+1) = 0; + } + + } + else{ + *(out1) = 1; + *(out1+1) = 0; + *(out1+2) = 1; + *(out1+3) = 0; + if(nout == 2){ + *(out2) = *(x); + *(out2+1) = *(x+1); + } + } +} diff --git a/src/c/linearAlgebra/hess/dhessa.c b/src/c/linearAlgebra/hess/dhessa.c index 57f81b35..e1f2e2d1 100644 --- a/src/c/linearAlgebra/hess/dhessa.c +++ b/src/c/linearAlgebra/hess/dhessa.c @@ -20,11 +20,13 @@ #include "matrixTranspose.h" #include "matrixMultiplication.h" +/* Lapack subroutines - which are used*/ extern int dgehrd_(int *, int *,int *,double *,int *,double *,double *,int *,int *); extern int dorghr_(int *, int *,int *,double *,int *,double *,double *,int *,int *); - +/* All the vairbale names are given exactly the same name as scilab source code */ void dhessa(double *in1,int size,int nout,double *out1, double *out2){ +/* Variables names are done through, Lapack library. */ int i,j,k; int N = size; int ILO=1; @@ -41,11 +43,11 @@ void dhessa(double *in1,int size,int nout,double *out1, double *out2){ WORK = (double *)malloc((double)LWORK*sizeof(double)); dgehrd_(&N,&ILO,&IHI,A,&LDA,TAU,WORK,&N,&INFO); - for(i=0;i +#include +#include "householder.h" +#include "eye.h" +#include "matrixTranspose.h" +#include "matrixMultiplication.h" +#include +#include "norm.h" + +void dhouseholdera(int ninp,double *inp1,int row,double *inp2,double *out1){ + + int i,j; + double *x; + x = (double *)malloc(row*sizeof(double)); + + for(i=0;i +#include +#include "proj.h" +#include "eye.h" +#include "matrixTranspose.h" +#include "matrixMultiplication.h" +#include +#include "norm.h" + + +double dproja(double *x1,int l,int k,double *x2,int m2,int n2,double *y){ + int i,j; + double *w; + w = (double *)malloc(l*l*sizeof(double)); + double rk; + rk = drowcompa(1,x1,l,k,NULL,0,w); + + double *w1; + w1 = (double *)malloc(rk*l*sizeof(double)); + + for(i=0;i +#include +#include +#include "norm.h" +#include "eye.h" + +#define eps pow(2,-52) + +double dprojspeca(double *inp1,int row,int col,double *out1,double *out2,double *out3){ + double tol = pow(10,-6); + int i,j,index; + /*norm(A,1)*/ + double nor; + nor = dnorma(inp1,row,col,1); + + /* P=eye(A),D=A,S=0*P;index=1; */ + if(nor < eps*row*row){ + memcpy(out2,inp1,row*col*sizeof(double)); + deyea(out2,row,col); + memcpy(out3,inp1,row*col*sizeof(double)); + for(i=0;i tol){ + dinverma(inp1,out1,row); + for(i=0;i +#include +#include +#include "qr.h" +#include "lapack.h" +#include "string.h" +#include "matrixTranspose.h" + +/*For reference check Scilab source code & lapack library websites +Names of variable are almost same for convience. +*/ +/* +int min(int M,int N){ + if(M > N) return N; + return M; +} + +int max(int M,int N){ + if(M > N) return N; + return N; +}*/ + +/* External Function used of lapack library */ +extern double dgeqrf_(int *,int *,double *,int *,double *,double *,int *,int *); +extern double dlacpy_(char *,int *,int *,double *,int *,double *,int *); +extern double dgeqpf_(int *,int *,double *,int *,int *,double *,double *,int *); +extern double dorgqr_(int *,int *,int *,double *,int *,double *,double *,int *,int *); +extern void dlaset_(char *,int *,int *,double *,double *,double *,int *); + +/* function for finding qr */ +double dqra(int ninp,int nout,double *inp1,int M,int N,double tol,double *out1,double *out2,double *out3){ + int i,j; + char choice; + double alpha=0.0,beta=0.0; + int minMN = min(M,N); + + double *A; + A = (double *)malloc(M*N*sizeof(double)); + memcpy(A,inp1,M*N*sizeof(double)); + + if(M <= 0 || N <= 0){ + out1 = NULL; + out2 = NULL; + return 0; + } + /* doldqr */ + if(nout == 4){ /* [Q,R,rk,E]=qr(X [,tol]) */ + if(ninp == 1){ + tol = -1; + } + + int INFO,rk; + + int *JPVT; + JPVT = ( int *)malloc(N*sizeof(int)); + + double *TAU; + TAU = (double *)malloc(minMN*sizeof(double)); + + int LWORK = 3*N; + + double *WORK; + WORK = (double *)malloc(LWORK*sizeof(double)); + + for(i=1;i<=M;i++){ + JPVT[i-1]=0.0; + } + dgeqpf_(&M,&N,A,&M,JPVT,TAU,WORK,&INFO); + + choice = 'U'; + dlacpy_(&choice,&M,&N,A,&M,out2,&M); + + if(M > N){ + for(j=1;j<=N;j++){ + for(i=j+1;i<=M;i++){ + out2[i-1+(j-1)*M] = 0.0; + } + } + } + else{ + for(j=1;j<=M-1;j++){ + for(i=j+1;i<=M;i++){ + out2[i-1+(j-1)*M] = 0.0; + } + } + } + + if(M > N){ + choice = 'F'; + dlacpy_(&choice,&M,&N,A,&M,out1,&M); + for(j=N+1;j<=M;j++){ + for(i=1;i<=M;i++){ + out1[i-1+(j-1)*M] = 0.0; + } + } + } + else{ + choice = 'F'; + dlacpy_(&choice,&M,&M,A,&M,out1,&M); + } + + dorgqr_(&M,&M,&minMN,out1,&M,TAU,WORK,&LWORK,&INFO); + + choice = 'F'; + dlaset_(&choice,&N,&N,&alpha,&beta,out3,&N); + + for(j=1;j<=N;j++){ + i = JPVT[j-1]; + out3[i-1+(j-1)*N] = 1.0; + } + + double tt = abs(out2[0]); + + if(tol == -1){ + tol = (double)max(M,N)*pow(2,-52)*tt; + } + double ch; + //printf("%lf ",tol); + for(j=1;j<=minMN;j++){ + //printf("%e ",out2[(j-1)+(j-1)*M]); + if(out2[(j-1)+(j-1)*M] < 0){ + ch = -out2[(j-1)+(j-1)*M]; + } + else{ + ch = out2[(j-1)+(j-1)*M]; + } + if(ch > tol){ + rk = j; + } + else{ + break; + } + } + //printf("\n"); + return rk; + } + else if(ninp == 1){ + /* (intdgeqpf3) + [Q,R]=qr(A) + [Q,R,E]=qr(A) + */ + int LDA = M; + + double *TAU; + TAU = (double *)malloc(min(M,N)*sizeof(double)); + + int LWORK; + if(nout <= 2) + LWORK = N; + else + LWORK = 3*N; + + double *WORK; + WORK = (double *)malloc((LWORK+1)*sizeof(double)); + + int INFO; + + int *JPVT; + JPVT = (int *)malloc(N*sizeof(int)); + + if(nout <= 2){ + dgeqrf_(&M,&N,A,&M,TAU,WORK,&LWORK,&INFO); + } + else{ + for(i=0;i N){ + for(j=1;j<=N;j++){ + for(i=j+1;i<=M;i++){ + out2[i-1+(j-1)*M] = 0.0; + } + } + } + else{ + for(j=1;j<=M-1;j++){ + for(i=j+1;i<=M;i++){ + out2[i-1+(j-1)*M] = 0.0; + } + } + } + /* lQ - out1 */ + if(M > N){ + choice = 'F'; + dlacpy_(&choice,&M,&N,A,&M,out1,&M); + /*for(i=0;i 2){ + choice = 'F'; + dlaset_(&choice,&N,&N,&alpha,&beta,out3,&N); + for(j=1;j<=N;j++){ + i = *(JPVT+j-1); + //printf("%d ",i-1+(j-1)*N); + *(out3+i-1+(j-1)*N) = 1.0; + } + //printf("\n"); + } + } + else{/* + [[Q,R]=qr(A,'e') + [Q,R,E]=qr(A,'e') ] */ + int *JPVT; + JPVT = (int *)malloc(N*sizeof(int)); + + double *TAU; + TAU = (double *)malloc(min(M,N)*sizeof(double)); + int LWORK; + if(nout <= 2){ + LWORK = N; + } + else{ + LWORK = 3*N; + } + + double *WORK; + WORK = (double *)malloc(LWORK*sizeof(double)); + + int INFO; + if(nout <= 2) + dgeqrf_(&M,&N,A,&M,TAU,WORK,&LWORK,&INFO); + else{ + for(i=1;i<=N;i++){ + JPVT[i-1]=0.0; + } + dgeqpf_(&M,&N,A,&M,JPVT,TAU,WORK,&INFO); + } + choice = 'U'; + + dlacpy_(&choice,&minMN,&N,A,&M,out2,&minMN); + + if(N >= 2){ + for(j=1;j<=N-1;j++){ + if(j+1 <= minMN){ + for(i=j+1;i<=minMN;i++){ + out2[i-1+(j-1)*minMN] = 0.0; + } + } + } + } + choice = 'F'; + dlacpy_(&choice,&M,&minMN,A,&M,out1,&M); + dorgqr_(&M,&minMN,&minMN,out1,&M,TAU,WORK,&LWORK,&INFO); + + if(nout > 2){ + choice = 'F'; + dlaset_(&choice,&N,&N,&alpha,&beta,out3,&N); + for(j=1;j<=N;j++){ + i = JPVT[j-1]; + out3[i-1+(j-1)*N] = 1.0; + } + } + } + return 0; +} diff --git a/src/c/linearAlgebra/rowcomp/drowcompa.c b/src/c/linearAlgebra/rowcomp/drowcompa.c new file mode 100644 index 00000000..3161a2d6 --- /dev/null +++ b/src/c/linearAlgebra/rowcomp/drowcompa.c @@ -0,0 +1,79 @@ +/* Copyright (C) 2017 - IIT Bombay - FOSSEE + + This file must be used under the terms of the CeCILL. + This source file is licensed as described in the file COPYING, which + you should have received as part of this distribution. The terms + are also available at + http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt + Author: Sandeep Gupta + Organization: FOSSEE, IIT Bombay + Email: toolbox@scilab.in + */ + +/* This function is used to find row compression, range */ + +#include "rowcomp.h" +#include +#include +#include +#include "svd.h" +#include "norm.h" +#include "eye.h" +#include "matrixTranspose.h" +#include "qr.h" + +/* All variable names, are in consideration of scilab documentation. for reference please check the scilab code.*/ + +double drowcompa(int ninp,double *A,int row,int col,char *flag,double tol,double *w){ + double rk; + double *U; + double *S; + double *V; + double *q,*r,*e; + if(row == 0 || col == 0){ + w = NULL; + return 0; + } + + double nA1 = dnorma(A,row,col,1); + if(nA1 < sqrt(pow(2,-52))/10){ + deyea(w,row,col); + return 0; + } + if(ninp == 1){ + flag = "svd"; + tol = sqrt(pow(2,-52))*nA1; + } + else if(ninp == 2){ + tol = sqrt(pow(2,-52))*nA1; + } + else{ + if(tol < 0){ /* if tolerance is negative */ + printf(" Wrong values for input argument #: Non-negative scalar expected"); + } + } + int M = row,N=col; + int minMN = min(M,N); + char check[3]="qr"; + //printf(" %s ",flag); + if(strcmp(check,flag) == 0){ + /* calling qr function*/ + //printf(" * "); + q = (double *)malloc(M*min(M,N)*sizeof(double)); + r = (double *)malloc(minMN*N*sizeof(double)); + e = (double *)malloc(N*N*sizeof(double)); + rk = dqra(2,4,A,M,N,tol,q,r,e); + memcpy(w,q,row*col*sizeof(double)); + dtransposea(q,row,row,w); + return rk; + } + else{ + /* svd function type */ + U = (double *)malloc(row*row*sizeof(double)); + S = (double *)malloc(row*col*sizeof(double)); + V = (double *)malloc(col*col*sizeof(double)); + rk = dsvda(tol,A,row,col,0,4,U,S,V); + dtransposea(U,row,row,w); + return rk; + } +} diff --git a/src/c/linearAlgebra/sqroot/dsqroota.c b/src/c/linearAlgebra/sqroot/dsqroota.c new file mode 100644 index 00000000..a9062e65 --- /dev/null +++ b/src/c/linearAlgebra/sqroot/dsqroota.c @@ -0,0 +1,130 @@ +/* Copyright (C) 2017 - IIT Bombay - FOSSEE + + This file must be used under the terms of the CeCILL. + This source file is licensed as described in the file COPYING, which + you should have received as part of this distribution. The terms + are also available at + http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt + Author: Sandeep Gupta + Organization: FOSSEE, IIT Bombay + Email: toolbox@scilab.in + */ + +/* Function - sqroot of scilab, W*W' hermitian factorization */ + +#include +#include "stdlib.h" +#include "string.h" +#include +#include "matrixTranspose.h" +#include "svd.h" +#include "matrixMultiplication.h" + +#define eps 2.22044604925e-16 + +/*It would be good, if you are doing conversoins for only valid inputs before + running the program, check all the conditions before hand. +*/ + +void dsqroota(double *inp,int row,int col, double *out){ + if(row != col){ + printf("Enter valid inputs only - matrix should be symetric\n"); + return; + } + int i,j; + double *U,*S,*V; + double *A,*B; + int rk; + + U = (double *)malloc((double)row*row*sizeof(double)); + S = (double *)malloc((double)Min(row,col)*Min(row,col)*sizeof(double)); + V = (double *)malloc((double)col*col*sizeof(double)); + A = (double *)malloc(rk*rk*sizeof(double)); + B = (double *)malloc(rk*row*sizeof(double)); + + double *Q1; + Q1 = (double *)malloc(row*col*sizeof(double)); + + dtransposea(inp,row,col,Q1); + + double *Q2; + Q2 = (double *)malloc(col*row*sizeof(double)); + + /* Q2 = (inp+inp1')/2; */ + for(i=0;i 100*%eps then */ + if(maxi > 100*eps){ + printf("Warning: Wrong size for input argument and Symmetric expected\n"); + } + maxi = 0; + for(i=0;i tol){ @@ -52,7 +53,7 @@ void dsvaa(int ninp,double *in1,int row,int col,double in2,double *out1, \ tol = in2; if(tol > 1){ rk = tol; - if(rk > min(row,col)){ + if(rk > Min(row,col)){ printf("ERROR: Wrong value for input argument !"); out1 = NULL; out2 = NULL; @@ -70,21 +71,21 @@ void dsvaa(int ninp,double *in1,int row,int col,double in2,double *out1, \ } } arow = M; - acol = min(M,N); + acol = Min(M,N); /* Copying, the output in required format */ for(i=0;i N){ @@ -156,18 +165,18 @@ void zsvda(doubleComplex *in1,int row,int col,int in2,int nout, doubleComplex *o for(j=0;j