/*
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 *  Copyright (C) 2008 - INRIA - Arnaud TORSET
 *
 *  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
 *
 */

#include "matrixPow.h"
#include "lapack.h"
#include "eye.h"
#include "matrixMultiplication.h"


void dpowma(double* in, int size, double expand, double* out){

#ifndef WITHOUT_BLAS		
	switch ((int)expand){
		case 0 : 
			deyea(out,size,size);
			break;
		case 1 : 
			{
				int i;
				for (i=0;i<size*size;i++) out[i]=in[i];
			}
			break;
		default : 
			{
				int i=0,j=0,k=0;
				int One=1;
				
				for (i=1; i<expand; i++){
					for (j=0;j<size;j++) /*column*/ {
						for (k=0;k<size;k++)/*row*/{
							out[k+j*size]=ddot_(&size,in+k,&size,in+j*size,&One);
						}
					}
				}
			}
			break;
	}
#else
	switch ((int)expand){
		case 0 : 
			deyea(out,size,size);
			break;
		case 1 : 
			{
				int i;
				for (i=0;i<size*size;i++) out[i]=in[i];
			}
			break;
		default : 
			{
				int i=0,j=0;	
				double* Pow;
				Pow=malloc((uint)(size*size)*sizeof(double));
				for (i=0;i<size*size;i++) out[i]=in[i];
				for (i=1; i<expand; i++){
					for (j=0;j<size*size;j++) Pow[j]=out[j];
					dmulma(Pow,size,size,in,size,size,out);
				}
			}
			break;
	}
					

#endif
					
}