Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 7c0698b8 authored by hhakim's avatar hhakim
Browse files

Make Palm4MSA and HierarchicalFact. algos compatible with complex matrices (C++, Matlab, Python).

Faust now manages to factorize complex matrices in the C++ core and wrappers are bound to it.

The results for real matrices are not changed at all: unit tests still return the exact same relative error between the original matrix and its approximate by factorization.

- For C++ core:
* Adapting the Palm4MSA class/algorithm: in calculation of gradient, transpose ops are replaced by conjugate-transpose.
* Adding a template parameter FPP2 to be able to instantiate StoppingCriterion with a different template parameter than for example MatDense. Before the template type was shared and obviously when the MatDense scalar type is complex we don't want the StoppingCriterion to become complex for the error treshold (that must remain a real value). This new template parameter type is passed through Palm4MSA, Hierarchical, Params, ParamsPalm classes and some functions. It is also used for ConstraintFPP because again we don't want a complex type (used for MatDense) to set the norm-based constraints (it must remain a real).
* Generate (cmake) new unit tests for hierarchicalFactorization test_palm4MSA faust_multiplication to test complex<float> and complex<double> (however the matrix tested remains a real matrix taken as complex matrix ; imaginary part is the zero matrix).
* ConstraintGeneric is not a template class anymore. The reason is that it's needed to know FPP2 when down-casting from ConstraintGeneric to ConstraintFPP and it makes the code a bit complicated when using a collection of ConstraintGeneric. (But maybe this modification is to rolli-back later).
To replace template class ConstraintGeneric, some member functions of that class become template functions.
Consistently, ConstraintType also receives the new template parameter type FPP2.

- For Matlab:
* Update cmake script for compilation of mex files mexPalm4MSA.cpp, mexHierarchical_fact.cpp for complex.
* New unit tests for complex versions of Palm4MSA and HierarchicalFact in FaustFactoryTest.m.

- For Python:
* New unit tests, equivalent to matlab's.
parent 9306b220
Branches
Tags
No related merge requests found
Showing
with 493 additions and 276 deletions
......@@ -346,6 +346,7 @@ if (BUILD_WRAPPER_MATLAB)
set(FAUST_MATLAB_SRC_DIR ${FAUST_SRC_WRAPPER_DIR}/matlab CACHE INTERNAL "")
set(FAUST_MATLAB_TOOLS_SRC_DIR ${FAUST_MATLAB_SRC_DIR}/tools CACHE INTERNAL "")
set(FAUST_MATLAB_MEX_SRC_DIR ${FAUST_MATLAB_SRC_DIR}/src CACHE INTERNAL "")
set(FAUST_MATLAB_MEX_MFILES_SRC_DIR ${FAUST_MATLAB_SRC_DIR}/mex CACHE INTERNAL "")
set(FAUST_MATLAB_DOC_SRC_DIR ${FAUST_MATLAB_SRC_DIR}/doc CACHE INTERNAL "")
set(FAUST_MATLAB_OLD_SRC_DIR ${FAUST_MATLAB_SRC_DIR}/old_matlab CACHE INTERNAL "")
set(FAUST_MATLAB_OLD_PROX_SRC_DIR ${FAUST_MATLAB_OLD_SRC_DIR}/proxs CACHE INTERNAL "")
......
......@@ -157,14 +157,17 @@ endif()
foreach(TEST_FPP float double)
foreach(FILE faust_mult faust_mult_cplx)
configure_file(${FAUST_SRC_TEST_SRC_UNIT_DIR}/${FILE}.cpp.in ${FAUST_BIN_TEST_SRC_DIR}/${FILE}_${TEST_FPP}.cpp @ONLY)
set(TEST_BIN_FILE ${FILE}_${TEST_FPP})
set(TEST_FILE_CPP ${TEST_BIN_FILE}.cpp)
message(STATUS ${TEST_FILE_CPP})
configure_file(${FAUST_SRC_TEST_SRC_UNIT_DIR}/${FILE}.cpp.in ${FAUST_BIN_TEST_SRC_DIR}/${TEST_FILE_CPP} @ONLY)
# Generation of the binary files in double and float precision
add_executable(${FILE}_${TEST_FPP} ${FAUST_BIN_TEST_SRC_DIR}/${FILE}_${TEST_FPP}.cpp ${FAUST_BIN_TEST_SRC_DIR}/)
add_executable(${TEST_BIN_FILE} ${FAUST_BIN_TEST_SRC_DIR}/${TEST_FILE_CPP} ${FAUST_BIN_TEST_SRC_DIR}/)
target_link_libraries(${FILE}_${TEST_FPP} ${FAUST_TARGET} ${MATIO_LIB_FILE} ${HDF5_LIB_FILE} ${OPENBLAS_LIB_FILE})
target_link_libraries(${TEST_BIN_FILE} ${FAUST_TARGET} ${MATIO_LIB_FILE} ${HDF5_LIB_FILE} ${OPENBLAS_LIB_FILE})
add_test(NAME UNIT_${FILE}_${TEST_FPP} COMMAND ${FAUST_BIN_TEST_BIN_DIR}/${FILE}_${TEST_FPP})
add_test(NAME UNIT_${TEST_BIN_FILE} COMMAND ${FAUST_BIN_TEST_BIN_DIR}/${TEST_BIN_FILE})
endforeach(FILE)
endforeach(TEST_FPP)
......@@ -188,17 +191,25 @@ if(MATIO_LIB_FILE AND MATIO_INC_DIR AND BUILD_READ_MAT_FILE) # AND HDF5_LIB_FILE
# test_palm4MSA : test the palm4MSA algorithm
# faust_multiplication : time comparison between Faust-vector product and Dense matrix-vector product
foreach(TEST_FPP float double)
foreach(testin hierarchicalFactorization test_palm4MSA faust_multiplication)
# copy CPU files cpp.in to the user's ./src/ directory in float et double precision
configure_file(${FAUST_SRC_TEST_SRC_CPP_DIR}/${testin}.cpp.in ${FAUST_BIN_TEST_SRC_DIR}/${testin}_${TEST_FPP}.cpp @ONLY)
foreach(TEST_FPP float double complex<float> complex<double>)
foreach(testin hierarchicalFactorization test_palm4MSA faust_multiplication faust_matdense_conjugate)
string(REGEX REPLACE "<|>" "" TEST_FILE_CPP ${TEST_FPP})
set(TEST_CPP_NAME ${testin}_${TEST_FILE_CPP})
set(TEST_FILE_CPP ${TEST_CPP_NAME}.cpp)
message(STATUS ${TEST_FILE_CPP}) # copy CPU files cpp.in to the user's ./src/ directory in float et double precision
if(TEST_FPP MATCHES float)
set(TEST_FPP2 "float")
else()
set(TEST_FPP2 "double")
endif()
configure_file(${FAUST_SRC_TEST_SRC_CPP_DIR}/${testin}.cpp.in ${FAUST_BIN_TEST_SRC_DIR}/${TEST_FILE_CPP} @ONLY)
# Generation of the binary files in double and float precision
add_executable(${testin}_${TEST_FPP} ${FAUST_BIN_TEST_SRC_DIR}/${testin}_${TEST_FPP}.cpp ${FAUST_BIN_TEST_SRC_DIR}/ ${FAUST_CMDLINE_TYPE_FORMAT_MAT_SRC_DIR}/faust_init_from_matio.cpp ${FAUST_CMDLINE_TYPE_FORMAT_MAT_SRC_DIR}/faust_init_from_matio_mat.cpp)
add_executable(${TEST_CPP_NAME} ${FAUST_BIN_TEST_SRC_DIR}/${TEST_FILE_CPP} ${FAUST_BIN_TEST_SRC_DIR}/ ${FAUST_CMDLINE_TYPE_FORMAT_MAT_SRC_DIR}/faust_init_from_matio.cpp ${FAUST_CMDLINE_TYPE_FORMAT_MAT_SRC_DIR}/faust_init_from_matio_mat.cpp)
if(BUILD_OPENBLAS)
target_link_libraries(${testin}_${TEST_FPP} ${FAUST_TARGET} ${MATIO_LIB_FILE} ${HDF5_LIB_FILE} ${OPENBLAS_LIB_FILE})
target_link_libraries(${TEST_CPP_NAME} ${FAUST_TARGET} ${MATIO_LIB_FILE} ${HDF5_LIB_FILE} ${OPENBLAS_LIB_FILE})
else(BUILD_OPENBLAS)
target_link_libraries(${testin}_${TEST_FPP} ${FAUST_TARGET} ${MATIO_LIB_FILE} ${HDF5_LIB_FILE})
target_link_libraries(${TEST_CPP_NAME} ${FAUST_TARGET} ${MATIO_LIB_FILE} ${HDF5_LIB_FILE})
endif(BUILD_OPENBLAS)
endforeach()
endforeach()
......
#include "faust_MatDense.h"
#include <iostream>
/** \brief unitary test for MatDense conjugate
*/
typedef @TEST_FPP@ FPP;
using namespace Faust;
using namespace std;
int main(int argc, char* argv[])
{
faust_unsigned_int dim1 = 3;
faust_unsigned_int dim2 = 4;
/* initilisation of the factors of the Faust */
// factor 1
MatDense<FPP,Cpu>* M;
MatDense<FPP,Cpu> M_copy;
M = MatDense<FPP,Cpu>::randMat(dim1,dim2);
M_copy = *M;
cout<<"mat value"<<endl;
M->Display();
M->conjugate(false);
cout<<"conjugate mat value (without eval)"<<endl;
M->Display();
M->transpose();
cout<<"conjugate-transpose mat value (with eval)"<<endl;
M->Display();
M->conjugate();
cout << "transpose mat value from conjugate-transpose (with eval)" << endl;
M->Display();
M->transpose();
assert(M->isEqual(M_copy));
cout << "mat value:" << endl;
M->Display();
return 0;
}
......@@ -63,6 +63,7 @@
*/
typedef @TEST_FPP@ FPP;
typedef @TEST_FPP2@ FPP2;
int main(int argc, char* argv[])
{
......@@ -93,7 +94,7 @@ int main(int argc, char* argv[])
expectedLambda = atof(argv[3]);
FPP epsilon = 0.0001;
FPP2 epsilon = 0.0001;
if (argc >= 5)
epsilon = atof(argv[4]);
......@@ -147,8 +148,8 @@ int main(int argc, char* argv[])
Faust::SpBlasHandle<Cpu> spblasHandle;
// parameter setting
Faust::Params<FPP,Cpu> params;
init_params_from_matiofile(params,configFilename.c_str(),"params");
Faust::Params<FPP,Cpu,FPP2> params;
init_params_from_matiofile<FPP,Cpu,FPP2>(params,configFilename.c_str(),"params");
params.Display();
// matrix to be factorized
......@@ -160,8 +161,7 @@ int main(int argc, char* argv[])
matrix.transpose();
//algorithm
Faust::HierarchicalFact<FPP,Cpu> hierFact(matrix,params,blasHandle,spblasHandle);
Faust::HierarchicalFact<FPP,Cpu,FPP2> hierFact(matrix,params,blasHandle,spblasHandle);
Faust::Timer t1;
t1.start();
......@@ -179,7 +179,7 @@ int main(int argc, char* argv[])
FPP lambda = hierFact.get_lambda();
if (argc >= 3)
{
if (std::abs(lambda - expectedLambda) > epsilon)
if (Faust::fabs(lambda - expectedLambda) > epsilon)
{
std::cerr<<"invalid lambda, must be equal to "<<std::setprecision(20)<<std::setprecision(20)<<expectedLambda<<" in the precision of "<<epsilon<<std::endl;
std::cerr<<"current value is "<<std::setprecision(20)<<lambda<<std::endl;
......@@ -220,7 +220,7 @@ int main(int argc, char* argv[])
Faust::MatDense<FPP,Cpu> faustProduct;
faustProduct=hierFactCore.get_product();
faustProduct-=matrix;
FPP relativeError = faustProduct.norm()/matrix.norm();
FPP2 relativeError = faustProduct.norm()/matrix.norm();
std::cout<<std::endl;
std::cout<<"**************** RELATIVE ERROR BETWEEN FAUST AND DATA MATRIX **************** "<<std::endl;
......
......@@ -54,6 +54,7 @@
using namespace std;
typedef @TEST_FPP@ FPP;
typedef @TEST_FPP2@ FPP2;
/** \brief Run a test of Faust::Palm4MSA
*/
int main()
......@@ -68,10 +69,10 @@ int main()
int cons1Name, cons1Parameter, cons1Row, cons1Col;
int cons2Name, cons2Row, cons2Col;
FPP cons2Parameter;
FPP2 cons2Parameter;
int nfacts, niter;
bool updateWay, verbose;
double initLambda;
FPP initLambda;
cons1Name = init_int_from_matio(configPalm2Filename, "cons1_name");
cons1Parameter = init_int_from_matio(configPalm2Filename, "cons1_parameter");
......@@ -79,7 +80,7 @@ int main()
cons1Col = init_int_from_matio(configPalm2Filename, "cons1_col");
cons2Name = init_int_from_matio(configPalm2Filename, "cons2_name");
cons2Parameter = (FPP) init_double_from_matio(configPalm2Filename, "cons2_parameter");
cons2Parameter = (FPP2) init_double_from_matio(configPalm2Filename, "cons2_parameter");
cons2Row = init_int_from_matio(configPalm2Filename, "cons2_row");
cons2Col = init_int_from_matio(configPalm2Filename, "cons2_col");
......@@ -93,9 +94,9 @@ int main()
// Creation du vecteur de contrainte
const Faust::ConstraintInt<FPP,Cpu> cons1(static_cast<faust_constraint_name>(cons1Name), cons1Parameter, cons1Row, cons1Col);
const Faust::ConstraintFPP<FPP,Cpu> cons2(static_cast<faust_constraint_name>(cons2Name), cons2Parameter, cons2Row, cons2Col);
const Faust::ConstraintFPP<FPP,Cpu,FPP2> cons2(static_cast<faust_constraint_name>(cons2Name), cons2Parameter, cons2Row, cons2Col);
vector<const Faust::ConstraintGeneric<FPP,Cpu>*> cons;
vector<const Faust::ConstraintGeneric*> cons;
cons.push_back(&cons1);
cons.push_back(&cons2);
......@@ -106,14 +107,14 @@ int main()
initFact.push_back(initFacts2);
// Creation du critere d'arret
Faust::StoppingCriterion<FPP> crit(niter);
Faust::StoppingCriterion<FPP2> crit(niter);
Faust::ParamsPalm<FPP,Cpu> params(data, nfacts, cons, initFact, crit, verbose, updateWay, initLambda);
Faust::ParamsPalm<FPP,Cpu,FPP2> params(data, nfacts, cons, initFact, crit, verbose, updateWay, initLambda);
Faust::BlasHandle<Cpu> blasHandle;
Faust::Palm4MSA<FPP,Cpu> palm2(params,blasHandle,true);
Faust::Palm4MSA<FPP,Cpu,FPP2> palm2(params,blasHandle,true);
// palm2.next_step();
palm2.compute_facts();
......@@ -126,7 +127,7 @@ int main()
Faust::MatDense<FPP,Cpu> faustProduct;
faustProduct=t->get_product();
faustProduct-=data;
FPP relativeError = faustProduct.norm()/data.norm();
FPP2 relativeError = faustProduct.norm()/data.norm();
std::cout<<std::endl;
std::cout<<"**************** RELATIVE ERROR BETWEEN FAUST AND DATA MATRIX **************** "<<std::endl;
......
......@@ -48,6 +48,34 @@ classdef FaustFactoryTest < matlab.unittest.TestCase
this.verifyEqual(norm(E,'fro')/norm(M,'fro'), 0.2710, 'AbsTol', 0.0001)
end
function test_fact_palm4msaCplx(this)
disp('Test FaustFactory.fact_palm4msaCplx()')
import matfaust.*;
num_facts = 2;
is_update_way_R2L = false;
init_lambda = 1.0;
init_facts = cell(2,1);
init_facts{1} = zeros(500,32);
init_facts{2} = eye(32);
%M = rand(500, 32)
load([this.faust_paths{1},'../../../misc/data/mat/config_compared_palm2.mat']);
% data matrix is loaded from file
M = data+j*data;
cons = cell(2,1);
cons{1} = ConstraintInt(ConstraintName(ConstraintName.SPLIN), 500, 32, 5);
cons{2} = ConstraintReal(ConstraintName(ConstraintName.NORMCOL), 32, 32, 1.0);
stop_crit = StoppingCriterion(200);
params = ParamsPalm4MSA(num_facts, is_update_way_R2L, init_lambda, cons, stop_crit, init_facts, ParamsFact.DEFAULT_STEP_SIZE, ParamsFact.DEFAULT_CONSTANT_STEP_SIZE);
F = FaustFactory.fact_palm4msa(M, params)
this.verifyEqual(size(F), size(M))
%disp('norm F: ')
%norm(F, 'fro')
E = full(F)-M;
disp('err: ')
norm(E,'fro')/norm(M,'fro')
this.verifyEqual(norm(E,'fro')/norm(M,'fro'), 0.9094, 'AbsTol', 0.0001)
end
function test_fact_hierarchical(this)
disp('Test FaustFactory.fact_hierarchical()')
import matfaust.*;
......@@ -84,7 +112,46 @@ classdef FaustFactoryTest < matlab.unittest.TestCase
norm(E,'fro')/norm(M,'fro')
% matrix to factorize and reference relative error come from
% misc/test/src/C++/hierarchicalFactorization.cpp
this.verifyEqual(norm(E,'fro')/norm(M,'fro'), 0.268513, 'AbsTol', 0.00001)
this.verifyEqual(norm(E,'fro')/norm(M,'fro'), 0.26851, 'AbsTol', 0.00001)
end
function test_fact_hierarchicalCplx(this)
disp('Test FaustFactory.fact_hierarchicalCplx()')
import matfaust.*;
num_facts = 4;
is_update_way_R2L = false;
init_lambda = 1.0;
%init_facts = cell(num_facts,1);
%init_facts{1} = zeros(500,32);
%for i=2:num_facts
%init_facts{i} = zeros(32);
%end
%M = rand(500, 32)
load([this.faust_paths{1},'../../../misc/data/mat/matrix_hierarchical_fact.mat'])
% matrix is loaded from file
M = matrix+j*matrix;
fact_cons = cell(3,1);
res_cons = cell(3, 1);
fact_cons{1} = ConstraintInt(ConstraintName(ConstraintName.SPLIN), 500, 32, 5);
fact_cons{2} = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 96);
fact_cons{3} = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 96);
res_cons{1} = ConstraintReal(ConstraintName(ConstraintName.NORMCOL), 32, 32, 1);
res_cons{2} = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 666);
res_cons{3} = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 333);
stop_crit = StoppingCriterion(200);
stop_crit2 = StoppingCriterion(200);
params = ParamsHierarchicalFact(num_facts, is_update_way_R2L, init_lambda,...
fact_cons, res_cons, size(M,1), size(M,2), {stop_crit, stop_crit2});
F = FaustFactory.fact_hierarchical(M, params)
this.verifyEqual(size(F), size(M))
%disp('norm F: ')
%norm(F, 'fro')
E = full(F)-M;
disp('err: ')
norm(E,'fro')/norm(M,'fro')
% matrix to factorize and reference relative error come from
% misc/test/src/C++/hierarchicalFactorization.cpp
this.verifyEqual(norm(E,'fro')/norm(M,'fro'), 0.99275, 'AbsTol', 0.00001)
end end
methods
......
......@@ -82,7 +82,7 @@ switch(opt)
disp('*** MEX FACTORISATION ***');
tic
%[lambda,fact]=mexHierarchical_fact(matrix,params);
[lambda, core_obj] = mexHierarchical_fact(matrix, params);
[lambda, core_obj] = mexHierarchical_factReal(matrix, params);
F = Faust(core_obj, isreal(matrix));
t=toc;
case 'MATLAB' %% factorisation (matlab)
......
......@@ -369,6 +369,77 @@ class TestFaustFactory(unittest.TestCase):
# misc/test/src/C++/hierarchicalFactorization.cpp
self.assertAlmostEqual(norm(E,"fro")/norm(M,"fro"), 0.268513, places=5)
def testFactHierarchCplx(self):
print("Test FaustFactory.fact_hierarchicalCplx()")
from pyfaust import FaustFactory, ParamsHierarchicalFact, ConstraintReal,\
ConstraintInt, ConstraintName, StoppingCriterion
num_facts = 4
is_update_way_R2L = False
init_lambda = 1.0
#M = np.random.rand(500, 32)
M = \
loadmat(sys.path[-1]+"/../../../misc/data/mat/matrix_hierarchical_fact.mat")['matrix']
M = M + np.complex(0,1)*M
# default step_size
fact0_cons = ConstraintInt(ConstraintName(ConstraintName.SPLIN), 500, 32, 5)
fact1_cons = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 96)
fact2_cons = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 96)
res0_cons = ConstraintReal(ConstraintName(ConstraintName.NORMCOL), 32, 32, 1)
res1_cons = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 666)
res2_cons = ConstraintInt(ConstraintName(ConstraintName.SP), 32, 32, 333)
stop_crit1 = StoppingCriterion(num_its=200)
stop_crit2 = StoppingCriterion(num_its=200)
param = ParamsHierarchicalFact(num_facts, is_update_way_R2L, init_lambda,
[fact0_cons, fact1_cons, fact2_cons],
[res0_cons, res1_cons, res2_cons],
M.shape[0],M.shape[1],[stop_crit1,
stop_crit2],
is_verbose=False)
F = FaustFactory.fact_hierarchical(M, param)
self.assertEqual(F.shape, M.shape)
#print(F.todense())
E = F.todense()-M
#print("err.:",norm(F.todense(), "fro"), norm(E,"fro"), norm (M,"fro"),
print("err: ", norm(E,"fro")/norm(M,"fro"))
# matrix to factorize and reference relative error come from
# misc/test/src/C++/hierarchicalFactorization.cpp
self.assertAlmostEqual(norm(E,"fro")/norm(M,"fro"), 0.99275, places=4)
def testFactPalm4MSACplx(self):
print("Test FaustFactory.fact_palm4msaCplx()")
from pyfaust import FaustFactory, ParamsPalm4MSA, ConstraintReal,\
ConstraintInt, ConstraintName, StoppingCriterion
num_facts = 2
is_update_way_R2L = False
init_lambda = 1.0
# init_facts = list()
# init_facts.append(np.zeros([500,32]))
# init_facts.append(np.eye(32))
#M = np.random.rand(500, 32)
M = \
loadmat(sys.path[-1]+"/../../../misc/data/mat/config_compared_palm2.mat")['data']
M = M + np.complex(0,1)*M
# default step_size
cons1 = ConstraintInt(ConstraintName(ConstraintName.SPLIN), 500, 32, 5)
cons2 = ConstraintReal(ConstraintName(ConstraintName.NORMCOL), 32,
32, 1.0)
stop_crit = StoppingCriterion(num_its=200)
param = ParamsPalm4MSA(num_facts, is_update_way_R2L, init_lambda,
[cons1, cons2], stop_crit, init_facts=None,
is_verbose=False, constant_step_size=False)
F = FaustFactory.fact_palm4msa(M, param)
#F.display()
#print("normF", F.norm("fro"))
self.assertEqual(F.shape, M.shape)
#print(F.todense())
E = F.todense()-M
#print("err.:",norm(F.todense(), "fro"), norm(E,"fro"), norm (M,"fro"))
print("err: ", norm(E,"fro")/norm(M,"fro"))
# matrix to factorize and reference relative error come from
# misc/test/src/C++/test_palm4MSA.cpp
self.assertAlmostEqual(norm(E,"fro")/norm(M,"fro"), 0.9094, places=4)
if __name__ == "__main__":
if(len(sys.argv)> 1):
# argv[1] is for adding a directory in PYTHONPATH
......
......@@ -66,11 +66,11 @@ See the parent class Faust::ConstraintGeneric for more detail. <br>
namespace Faust
{
template<typename FPP,Device DEVICE> class ConstraintGeneric;
class ConstraintGeneric;
template<typename FPP,Device DEVICE> class MatDense;
template<typename FPP,Device DEVICE>
class ConstraintFPP : public Faust::ConstraintGeneric<FPP,DEVICE>
template<typename FPP,Device DEVICE, typename FPP2 = double>
class ConstraintFPP : public Faust::ConstraintGeneric
{
......@@ -85,13 +85,13 @@ namespace Faust
ConstraintFPP(
const faust_constraint_name& constraintName_,
const FPP parameter_,
const FPP2 parameter_,
const int nbRows_,
const int nbCols_);
ConstraintFPP(const ConstraintFPP& constraint_);
FPP get_parameter() const {return m_parameter;};
FPP2 get_parameter() const {return m_parameter;};
virtual void set_default_parameter();
virtual void check_constraint_name()const;
......@@ -100,7 +100,7 @@ namespace Faust
private:
// parameter of constraint
FPP m_parameter;
FPP2 m_parameter;
static const char * m_className;
......
......@@ -44,22 +44,22 @@
#include <cstdlib>
#include "faust_exception.h"
template<typename FPP,Device DEVICE>
const char * Faust::ConstraintFPP<FPP,DEVICE>::m_className ="Faust::ConstraintFPP<FPP,DEVICE>::";
template<typename FPP,Device DEVICE, typename FPP2>
const char * Faust::ConstraintFPP<FPP,DEVICE,FPP2>::m_className ="Faust::ConstraintFPP<FPP,DEVICE,FPP2>::";
template<typename FPP,Device DEVICE>
Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP() :
Faust::ConstraintGeneric<FPP,DEVICE>()
template<typename FPP,Device DEVICE, typename FPP2>
Faust::ConstraintFPP<FPP,DEVICE,FPP2>::ConstraintFPP() :
Faust::ConstraintGeneric()
{
set_default_parameter();
}
template<typename FPP,Device DEVICE>
Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP(
template<typename FPP,Device DEVICE, typename FPP2>
Faust::ConstraintFPP<FPP,DEVICE,FPP2>::ConstraintFPP(
const faust_constraint_name& constraintName_,
const int nbRows_,
const int nbCols_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraintName_,
nbRows_,
nbCols_)
......@@ -67,13 +67,13 @@ Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP(
set_default_parameter();
}
template<typename FPP,Device DEVICE>
Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP(
template<typename FPP,Device DEVICE, typename FPP2>
Faust::ConstraintFPP<FPP,DEVICE,FPP2>::ConstraintFPP(
const faust_constraint_name& constraintName_,
const FPP defaultParameter_,
const FPP2 defaultParameter_,
const int nbRows_,
const int nbCols_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraintName_,
nbRows_,
nbCols_),
......@@ -82,10 +82,10 @@ Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP(
check_constraint_name();
}
template<typename FPP,Device DEVICE>
Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP(
const Faust::ConstraintFPP<FPP,DEVICE>& constraint_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
template<typename FPP,Device DEVICE, typename FPP2>
Faust::ConstraintFPP<FPP,DEVICE,FPP2>::ConstraintFPP(
const Faust::ConstraintFPP<FPP,DEVICE,FPP2>& constraint_) :
Faust::ConstraintGeneric(
constraint_.constraintName,
constraint_.nbRows,
constraint_.nbCols),
......@@ -96,8 +96,8 @@ Faust::ConstraintFPP<FPP,DEVICE>::ConstraintFPP(
template<typename FPP,Device DEVICE>
void Faust::ConstraintFPP<FPP,DEVICE>::check_constraint_name()const
template<typename FPP,Device DEVICE, typename FPP2>
void Faust::ConstraintFPP<FPP,DEVICE,FPP2>::check_constraint_name()const
{
switch (this->m_constraintName)
{
......@@ -111,8 +111,8 @@ void Faust::ConstraintFPP<FPP,DEVICE>::check_constraint_name()const
}
}
template<typename FPP,Device DEVICE>
void Faust::ConstraintFPP<FPP,DEVICE>::set_default_parameter()
template<typename FPP,Device DEVICE, typename FPP2>
void Faust::ConstraintFPP<FPP,DEVICE,FPP2>::set_default_parameter()
{
switch (this->m_constraintName)
......@@ -129,16 +129,16 @@ void Faust::ConstraintFPP<FPP,DEVICE>::set_default_parameter()
}
}
template<typename FPP,Device DEVICE>
void Faust::ConstraintFPP<FPP,DEVICE>::project(Faust::MatDense<FPP,DEVICE> & mat)const
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::ConstraintFPP<FPP,DEVICE,FPP2>::project(Faust::MatDense<FPP,DEVICE> & mat)const
{
switch (this->m_constraintName)
{
case CONSTRAINT_NAME_NORMCOL:
Faust::prox_normcol(mat,m_parameter);
Faust::prox_normcol<FPP, FPP2>(mat,m_parameter);
break;
case CONSTRAINT_NAME_NORMLIN:
Faust::prox_normlin(mat,m_parameter);
Faust::prox_normlin<FPP, FPP2>(mat,m_parameter);
break;
default:
handleError(m_className,"project : invalid constraint name");
......
......@@ -120,3 +120,43 @@ int get_type_constraint(const char * type)
handleError("Faust::ConstraintGeneric","::add_constraint : invalid constraint type");
}
const faust_constraint_name Faust::ConstraintGeneric::get_constraint_type() const
{
return m_constraintName;
}
const char* Faust::ConstraintGeneric::get_constraint_name()const
{
switch(m_constraintName)
{
case CONSTRAINT_NAME_SP:
return "CONSTRAINT_NAME_SP";
case CONSTRAINT_NAME_SPCOL:
return "CONSTRAINT_NAME_SPCOL";
case CONSTRAINT_NAME_SPLIN:
return "CONSTRAINT_NAME_SPLIN";
case CONSTRAINT_NAME_NORMCOL:
return "CONSTRAINT_NAME_NORMCOL";
case CONSTRAINT_NAME_SPLINCOL:
return "CONSTRAINT_NAME_SPLINCOL";
case CONSTRAINT_NAME_CONST:
return "CONSTRAINT_NAME_CONST";
case CONSTRAINT_NAME_SP_POS:
return "CONSTRAINT_NAME_SP_POS";
case CONSTRAINT_NAME_BLKDIAG:
return "CONSTRAINT_NAME_BLKDIAG";
case CONSTRAINT_NAME_SUPP:
return "CONSTRAINT_NAME_SUPP";
case CONSTRAINT_NAME_NORMLIN:
return "CONSTRAINT_NAME_NORMLIN";
default:
return "unknown constraint name";
}
}
const char * Faust::ConstraintGeneric::m_className="Faust::ConstraintGeneric::";
......@@ -71,54 +71,59 @@ namespace Faust {
//! \class ConstraintGeneric
//! \brief Contains the generic constraint parameters for the hierarchical factorization. See following table for more precision about the type of constraint. <br>
//! <img src="../../doc/html/constraint.png" alt="constraint parameters" width=800px />
template<typename FPP,Device DEVICE>
class ConstraintGeneric
{
public:
ConstraintGeneric() : m_constraintName(CONSTRAINT_NAME_SP),m_nbRows(32),m_nbCols(32) {} // contrainte par defaut (a voir avec Luc)
ConstraintGeneric(
const faust_constraint_name& constraintName_,
const faust_unsigned_int nbRows_,
const faust_unsigned_int nbCols_) :
m_constraintName(constraintName_),
m_nbRows(nbRows_),
m_nbCols(nbCols_){}
ConstraintGeneric(const ConstraintGeneric& constraint) :
m_constraintName(constraint.constraintName),
m_nbRows(constraint.nbRows),
m_nbCols(constraint.nbCols){}
const char* get_type() const;
const char* get_constraint_name()const;
const faust_constraint_name get_constraint_type() const;
bool is_constraint_parameter_int()const;
bool is_constraint_parameter_real()const;
bool is_constraint_parameter_mat()const;
const faust_unsigned_int get_rows() const {return m_nbRows;}
const faust_unsigned_int get_cols() const {return m_nbCols;}
virtual void set_default_parameter()=0;
virtual void check_constraint_name()const=0;
virtual void project(MatDense<FPP,DEVICE> & mat)const=0;
~ConstraintGeneric(){};
protected:
/// type of constraint
const faust_constraint_name m_constraintName;
// parameter of constraint
//const parameter_type parameter;
const faust_unsigned_int m_nbRows;
const faust_unsigned_int m_nbCols;
private :
static const char * m_className;
public:
ConstraintGeneric() : m_constraintName(CONSTRAINT_NAME_SP),m_nbRows(32),m_nbCols(32) {} // contrainte par defaut (a voir avec Luc)
ConstraintGeneric(
const faust_constraint_name& constraintName_,
const faust_unsigned_int nbRows_,
const faust_unsigned_int nbCols_) :
m_constraintName(constraintName_),
m_nbRows(nbRows_),
m_nbCols(nbCols_){}
ConstraintGeneric(const ConstraintGeneric& constraint) :
m_constraintName(constraint.m_constraintName),
m_nbRows(constraint.m_nbRows),
m_nbCols(constraint.m_nbCols){}
template<typename FPP,Device DEVICE, typename FPP2=double>
const char* get_type() const;
const char* get_constraint_name()const;
const faust_constraint_name get_constraint_type() const;
template<typename FPP,Device DEVICE, typename FPP2=double>
bool is_constraint_parameter_int()const;
template<typename FPP,Device DEVICE, typename FPP2=double>
bool is_constraint_parameter_real()const;
template<typename FPP,Device DEVICE, typename FPP2=double>
bool is_constraint_parameter_mat()const;
const faust_unsigned_int get_rows() const {return m_nbRows;}
const faust_unsigned_int get_cols() const {return m_nbCols;}
virtual void set_default_parameter()=0;
virtual void check_constraint_name()const=0;
template<typename FPP, Device DEVICE>
/*virtual*/ void project(MatDense<FPP,DEVICE> & mat)const;//=0; //template with (pure) virtual not authorized (otherwise it must be templates from class, not function)
template<typename FPP, Device DEVICE, typename FPP2>
/*virtual*/ void project(Faust::MatDense<FPP, DEVICE>&) const /*=0*/;
~ConstraintGeneric(){};
protected:
/// type of constraint
const faust_constraint_name m_constraintName;
// parameter of constraint
//const parameter_type parameter;
const faust_unsigned_int m_nbRows;
const faust_unsigned_int m_nbCols;
private :
static const char * m_className;
};
......
This diff is collapsed.
......@@ -66,10 +66,10 @@ template<typename FPP,Device DEVICE> class MatDense;
namespace Faust
{
template<typename FPP,Device DEVICE> class ConstraintGeneric;
class ConstraintGeneric;
template<typename FPP,Device DEVICE>
class ConstraintInt : public Faust::ConstraintGeneric<FPP,DEVICE>
class ConstraintInt : public Faust::ConstraintGeneric
{
......
......@@ -48,7 +48,7 @@ const char * Faust::ConstraintInt<FPP,DEVICE>::m_className="Faust::ConstraintInt
template<typename FPP,Device DEVICE>
Faust::ConstraintInt<FPP,DEVICE>::ConstraintInt() :
Faust::ConstraintGeneric<FPP,DEVICE>()
Faust::ConstraintGeneric()
{
set_default_parameter();
}
......@@ -58,7 +58,7 @@ Faust::ConstraintInt<FPP,DEVICE>::ConstraintInt(
const faust_constraint_name& constraintName_,
const faust_unsigned_int nbRows_,
const faust_unsigned_int nbCols_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraintName_,
nbRows_,
nbCols_)
......@@ -74,7 +74,7 @@ Faust::ConstraintInt<FPP,DEVICE>::ConstraintInt(
const faust_unsigned_int defaultParameter_,
const faust_unsigned_int nbRows_,
const faust_unsigned_int nbCols_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraintName_,
nbRows_,
nbCols_),
......@@ -86,7 +86,7 @@ Faust::ConstraintInt<FPP,DEVICE>::ConstraintInt(
template<typename FPP,Device DEVICE>
Faust::ConstraintInt<FPP,DEVICE>::ConstraintInt(
const Faust::ConstraintInt<FPP,DEVICE>& constraint_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraint_.constraintName,
constraint_.nbRows,
constraint_.nbCols),
......
......@@ -60,15 +60,15 @@
namespace Faust
{
template<typename FPP,Device DEVICE> class ConstraintGeneric;
class ConstraintGeneric;
template<typename FPP,Device DEVICE> class MatDense;
template<typename FPP,Device DEVICE>
class ConstraintMat : public Faust::ConstraintGeneric<FPP,DEVICE>
class ConstraintMat : public Faust::ConstraintGeneric
{
public:
ConstraintMat(); // ajouter parametre de contrainte par defaut (a voir avec Luc)
ConstraintMat(); // TODO: ajouter parametre de contrainte par defaut (a voir avec Luc)
ConstraintMat(
const faust_constraint_name& constraintName_,
......
......@@ -51,7 +51,7 @@ const char * Faust::ConstraintMat<FPP,DEVICE>::m_className="Faust::ConstraintMat
template<typename FPP,Device DEVICE>
Faust::ConstraintMat<FPP,DEVICE>::ConstraintMat() :
Faust::ConstraintGeneric<FPP,DEVICE>()
Faust::ConstraintGeneric()
{
set_default_parameter();
}
......@@ -61,7 +61,7 @@ Faust::ConstraintMat<FPP,DEVICE>::ConstraintMat(
const faust_constraint_name& constraintName_,
const faust_unsigned_int nbRows_,
const faust_unsigned_int nbCols_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraintName_,
nbRows_,
nbCols_)
......@@ -75,7 +75,7 @@ Faust::ConstraintMat<FPP,DEVICE>::ConstraintMat(
const Faust::MatDense<FPP,DEVICE> defaultParameter_,
const faust_unsigned_int nbRows_,
const faust_unsigned_int nbCols_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraintName_,
nbRows_,
nbCols_),
......@@ -87,7 +87,7 @@ Faust::ConstraintMat<FPP,DEVICE>::ConstraintMat(
template<typename FPP,Device DEVICE>
Faust::ConstraintMat<FPP,DEVICE>::ConstraintMat(
const Faust::ConstraintMat<FPP,DEVICE>& constraint_) :
Faust::ConstraintGeneric<FPP,DEVICE>(
Faust::ConstraintGeneric(
constraint_.constraintName,
constraint_.nbRows,
constraint_.nbCols),
......
......@@ -42,19 +42,19 @@
template<typename FPP,Device DEVICE> class ConstraintInt;
template<typename FPP,Device DEVICE> class ConstraintFPP;
template<typename FPP,Device DEVICE,typename FPP2> class ConstraintFPP;
template<typename FPP,Device DEVICE> class ConstraintMat;
//! \struct ConstraintType
//! \brief This structure defined the type of constraint. See following table for more precision about the type of constraint. <br>
//! <img src="../../doc/html/constraint.png" alt="constraint parameters" width=800px />
template<typename FPP,Device DEVICE>
template<typename FPP,Device DEVICE, typename FPP2=double>
struct ConstraintType
{
typedef const Faust::ConstraintFPP<FPP,DEVICE> ConstraintTypeNormcol;
typedef const Faust::ConstraintFPP<FPP,DEVICE> ConstraintTypeNormlin;
typedef const Faust::ConstraintFPP<FPP,DEVICE,FPP2> ConstraintTypeNormcol;
typedef const Faust::ConstraintFPP<FPP,DEVICE,FPP2> ConstraintTypeNormlin;
typedef const Faust::ConstraintMat<FPP,DEVICE> ConstraintTypeSupp;
typedef const Faust::ConstraintMat<FPP,DEVICE> ConstraintTypeConst;
typedef const Faust::ConstraintInt<FPP,DEVICE> ConstraintTypeSp;
......
......@@ -59,23 +59,23 @@
namespace Faust
{
template<typename FPP,Device DEVICE> class ConstraintGeneric;
template<typename FPP,Device DEVICE> class Palm4MSA;
class ConstraintGeneric;
template<typename FPP,Device DEVICE,typename FPP2> class Palm4MSA;
template<typename FPP,Device DEVICE> class MatDense;
template<typename FPP,Device DEVICE> class MatSparse;
template<typename FPP,Device DEVICE> class Transform;
template<typename FPP> class StoppingCriterion;
template<typename FPP2> class StoppingCriterion;
// template<Device DEVICE> class BlasHandle;
// template<Device DEVICE> class SpBlasHandle;
template<typename FPP,Device DEVICE>
template<typename FPP,Device DEVICE,typename FPP2 = double>
class HierarchicalFact
{
public:
HierarchicalFact(const Faust::MatDense<FPP,DEVICE>& M,const Faust::Params<FPP,DEVICE>& params_, Faust::BlasHandle<DEVICE> cublasHandle, SpBlasHandle<DEVICE> cusparseHandle);
HierarchicalFact(const Faust::MatDense<FPP,DEVICE>& M,const Faust::Params<FPP,DEVICE,FPP2>& params_, Faust::BlasHandle<DEVICE> cublasHandle, SpBlasHandle<DEVICE> cusparseHandle);
void get_facts(Faust::Transform<FPP,DEVICE> &)const;
void get_facts(std::vector<Faust::MatSparse<FPP,DEVICE> >&)const;
void get_facts(std::vector<Faust::MatDense<FPP,DEVICE> >& fact)const{fact = palm_global.get_facts();}
......@@ -92,17 +92,17 @@ namespace Faust
private:
const std::vector< std::vector<const Faust::ConstraintGeneric<FPP,DEVICE>*> > cons;
const std::vector< std::vector<const Faust::ConstraintGeneric*>> cons;
bool m_isUpdateWayR2L;
bool m_isFactSideLeft;
bool m_isVerbose;
int m_indFact ; //indice de factorisation (!= Faust::Palm4MSA::m_indFact : indice de facteur)
int nbFact; // nombre de factorisations (!= Faust::Palm4MSA::nbFact : nombre de facteurs)
Faust::Palm4MSA<FPP,DEVICE> palm_2;
Faust::Palm4MSA<FPP,DEVICE> palm_global;
Faust::Palm4MSA<FPP,DEVICE,FPP2> palm_2;
Faust::Palm4MSA<FPP,DEVICE,FPP2> palm_global;
const FPP default_lambda; // initial value of lambda for factorization into two factors
//std::vector<Faust::MatDense<FPP,DEVICE> > S;
std::vector<const Faust::ConstraintGeneric<FPP,DEVICE>*> cons_tmp_global;
std::vector<const Faust::ConstraintGeneric*> cons_tmp_global;
bool isFactorizationComputed;
std::vector<std::vector<FPP> > errors;
static const char * m_className;
......
......@@ -58,20 +58,20 @@ using namespace std;
//Faust::HierarchicalFact::Faust::HierarchicalFact(){} // voir avec Luc les parametres par defaut
template<typename FPP,Device DEVICE>
const char * Faust::HierarchicalFact<FPP,DEVICE>::m_className="Faust::HierarchicalFact";
template<typename FPP,Device DEVICE,typename FPP2>
const char * Faust::HierarchicalFact<FPP,DEVICE,FPP2>::m_className="Faust::HierarchicalFact";
template<typename FPP,Device DEVICE>
Faust::HierarchicalFact<FPP,DEVICE>::HierarchicalFact(const Faust::MatDense<FPP,DEVICE>& M,const Faust::Params<FPP,DEVICE>& params_, Faust::BlasHandle<DEVICE> cublasHandle, Faust::SpBlasHandle<DEVICE> cusparseHandle):
template<typename FPP,Device DEVICE,typename FPP2>
Faust::HierarchicalFact<FPP,DEVICE,FPP2>::HierarchicalFact(const Faust::MatDense<FPP,DEVICE>& M,const Faust::Params<FPP,DEVICE,FPP2>& params_, Faust::BlasHandle<DEVICE> cublasHandle, Faust::SpBlasHandle<DEVICE> cusparseHandle):
m_indFact(0),
cons(params_.cons),
m_isUpdateWayR2L(params_.isUpdateWayR2L),
m_isFactSideLeft(params_.isFactSideLeft),
m_isVerbose(params_.isVerbose),
nbFact(params_.m_nbFact-1),
palm_2(Palm4MSA<FPP,DEVICE>(M,params_, cublasHandle, false)),
palm_global(Palm4MSA<FPP,DEVICE>(M,params_, cublasHandle, true)),
cons_tmp_global(vector<const Faust::ConstraintGeneric<FPP,DEVICE>*>()),
palm_2(Palm4MSA<FPP,DEVICE,FPP2>(M,params_, cublasHandle, false)),
palm_global(Palm4MSA<FPP,DEVICE,FPP2>(M,params_, cublasHandle, true)),
cons_tmp_global(vector<const Faust::ConstraintGeneric*>()),
default_lambda(params_.init_lambda),
isFactorizationComputed(false),
errors(std::vector<std::vector<FPP> >(2,std::vector<FPP >(params_.m_nbFact-1,0.0))),
......@@ -84,8 +84,8 @@ Faust::HierarchicalFact<FPP,DEVICE>::HierarchicalFact(const Faust::MatDense<FPP,
}
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::init()
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::init()
{
#ifdef __COMPILE_TIMERS__
t_init.start();
......@@ -147,8 +147,8 @@ void check_validity()
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::next_step()
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::next_step()
{
#ifdef __COMPILE_TIMERS__
t_next_step.start();
......@@ -159,7 +159,7 @@ t_next_step.start();
handleError(m_className,"next_step : factorization has already been computed");
}
vector<const Faust::ConstraintGeneric<FPP,DEVICE>*> cons_tmp_2(2);
vector<const Faust::ConstraintGeneric*> cons_tmp_2(2);
cons_tmp_2[0]=cons[0][m_indFact];
cons_tmp_2[1]=cons[1][m_indFact];
......@@ -187,13 +187,13 @@ palm_2.print_local_timers();
if (m_isFactSideLeft)
{
cons_tmp_global[0]=cons[0][m_indFact];
typename vector<const Faust::ConstraintGeneric<FPP,DEVICE>*>::iterator it;
typename vector<const Faust::ConstraintGeneric*>::iterator it;
it = cons_tmp_global.begin();
cons_tmp_global.insert(it+1,cons[1][m_indFact]);
}
else
{
typename vector<const Faust::ConstraintGeneric<FPP,DEVICE>*>::iterator it;
typename vector<const Faust::ConstraintGeneric*>::iterator it;
it = cons_tmp_global.begin();
cons_tmp_global.insert(it+m_indFact,cons[0][m_indFact]);
cons_tmp_global[m_indFact+1]=cons[1][m_indFact];
......@@ -229,8 +229,8 @@ palm_2.print_prox_timers();
#endif
}
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::get_facts(Faust::Transform<FPP,DEVICE> & fact)const
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::get_facts(Faust::Transform<FPP,DEVICE> & fact)const
{
std::vector<Faust::MatSparse<FPP,DEVICE> > spfacts;
get_facts(spfacts);
......@@ -238,12 +238,12 @@ void Faust::HierarchicalFact<FPP,DEVICE>::get_facts(Faust::Transform<FPP,DEVICE>
fact = res;
}
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::get_facts(std::vector<Faust::MatSparse<FPP,DEVICE> >& sparse_facts)const
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::get_facts(std::vector<Faust::MatSparse<FPP,DEVICE> >& sparse_facts)const
{
/*if(!isFactorizationComputed)
{
cerr << "Error in Faust::HierarchicalFact<FPP,DEVICE>::get_facts : factorization has not been computed" << endl;
cerr << "Error in Faust::HierarchicalFact<FPP,DEVICE,FPP2>::get_facts : factorization has not been computed" << endl;
exit(EXIT_FAILURE);
}*/
......@@ -257,8 +257,8 @@ void Faust::HierarchicalFact<FPP,DEVICE>::get_facts(std::vector<Faust::MatSparse
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::compute_facts()
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::compute_facts()
{
if(isFactorizationComputed)
{
......@@ -268,7 +268,7 @@ void Faust::HierarchicalFact<FPP,DEVICE>::compute_facts()
init();
for (int i=0 ; i<=nbFact-1 ; i++)
{
cout << "Faust::HierarchicalFact<FPP,DEVICE>::compute_facts : factorisation "<<i+1<<"/"<<nbFact <<endl;
cout << "Faust::HierarchicalFact<FPP,DEVICE,FPP2>::compute_facts : factorisation "<<i+1<<"/"<<nbFact <<endl;
next_step();
}
......@@ -277,8 +277,8 @@ void Faust::HierarchicalFact<FPP,DEVICE>::compute_facts()
}
template<typename FPP,Device DEVICE>
const std::vector<std::vector< FPP> >& Faust::HierarchicalFact<FPP,DEVICE>::get_errors()const
template<typename FPP,Device DEVICE,typename FPP2>
const std::vector<std::vector< FPP> >& Faust::HierarchicalFact<FPP,DEVICE,FPP2>::get_errors()const
{
if(!isFactorizationComputed)
{
......@@ -287,8 +287,8 @@ const std::vector<std::vector< FPP> >& Faust::HierarchicalFact<FPP,DEVICE>::get_
return errors;
}
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::compute_errors()
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::compute_errors()
{
vector<Faust::MatSparse<FPP,DEVICE> > sp_facts;
get_facts(sp_facts);
......@@ -308,7 +308,7 @@ void Faust::HierarchicalFact<FPP,DEVICE>::compute_errors()
const Faust::MatDense<FPP,DEVICE> estimate_mat = faust_Transform_tmp.get_product(cublas_handle, cusparse_handle);
Faust::MatDense<FPP,DEVICE> data(palm_global.get_data());
FPP data_norm = data.norm();
FPP2 data_norm = data.norm();
data -= estimate_mat;
......@@ -320,11 +320,11 @@ void Faust::HierarchicalFact<FPP,DEVICE>::compute_errors()
#ifdef __COMPILE_TIMERS__
template<typename FPP,Device DEVICE> Faust::Timer Faust::HierarchicalFact<FPP,DEVICE>::t_init;
template<typename FPP,Device DEVICE> Faust::Timer Faust::HierarchicalFact<FPP,DEVICE>::t_next_step;
template<typename FPP,Device DEVICE,typename FPP2> Faust::Timer Faust::HierarchicalFact<FPP,DEVICE,FPP2>::t_init;
template<typename FPP,Device DEVICE,typename FPP2> Faust::Timer Faust::HierarchicalFact<FPP,DEVICE,FPP2>::t_next_step;
template<typename FPP,Device DEVICE>
void Faust::HierarchicalFact<FPP,DEVICE>::print_timers()const
template<typename FPP,Device DEVICE,typename FPP2>
void Faust::HierarchicalFact<FPP,DEVICE,FPP2>::print_timers()const
{
palm_global.print_global_timers();
cout << "timers in Faust::HierarchicalFact :" << endl;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment