Commit 765cd6e1 authored by MIJIEUX Thomas's avatar MIJIEUX Thomas

set MORSE_Xgesvd parameter to proper values

parent 5aafb270
......@@ -149,7 +149,6 @@ public:
void ComputeQRFacto(Block& Q, Block& R, //input are already allocated
int hStart=0, int vStart=0) //if QR of part of block
{
//Sizes needed
int sizeQrBlock = SizeBlock - vStart;
......@@ -164,10 +163,10 @@ public:
//Copy triangular R part inside input R
if (R.getSizeBlock() != 0) { //R isn't allocated, then we don't
//copy inside
for(int i=0; i<sizeQrBlock ; ++i) {
for (int i=0; i<sizeQrBlock ; ++i)
memcpy(R.getPtr(i),&datas[(vStart+i)*ldb+hStart],(i+1)*sizeof(Scalar));
}
}
//Call to orgqr //orgqr does not exist in Lapack for complex,
//but Lapack has a complex counter part called ungqr, which is
//called if Scalar is a complex type
......@@ -179,27 +178,29 @@ public:
std::cout<<"Generating full Q after QR\n"<<std::endl;
//First copy inside Q because current block does not have
//necessary space for a full QR facto
for(int i=0 ; i<sizeQrBlock ; ++i) {
/*
for (int i=0 ; i<sizeQrBlock ; ++i) {
memcpy(Q.getPtr(i),&datas[hStart+(vStart+i)*ldb],
(ldb-hStart)*sizeof(Scalar));
}
*/
orgqr = KI::orgqr(ldb-hStart,sizeQrBlock,
&datas[hStart+ldb*vStart], ldb,
tau,
Q.getPtr(),Q.getLeadingDim(),
tau,true);
true);
if (orgqr != 0)
std::cout<<"Problem on Q generation after QR facto\n";
} else { //Else, only leading p directions are computed
std::cout<<"Generating partial Q after QR\n"<<std::endl;
orgqr = KI::orgqr(ldb-hStart,sizeQrBlock,
&datas[hStart+vStart*ldb],ldb, tau,false);
&datas[hStart+vStart*ldb],ldb,
tau,
Q.getPtr(), Q.getLeadingDim(),
false);
if (orgqr != 0)
std::cout<<"Problem on Q generation after QR facto\n";
//Copy output to Q
for (int i=0 ; i<Q.getSizeBlock() ; ++i) {
memcpy(Q.getPtr(i),&datas[hStart+(vStart+i)*ldb],
(ldb-hStart)*sizeof(Scalar));
}
}
}
......@@ -208,7 +209,8 @@ public:
*
*/
template<class Matrix>
void ComputeQRFacto_own(Block& Q, Block& R, // inputs are already allocated
void ComputeQRFacto_own(Block& Q, // inputs are already allocated
Block& R, // inputs are already allocated
Matrix & A)
{
int n = getLeadingDim();
......
......@@ -36,22 +36,23 @@ public:
*
* @param
*/
void OrthoWP(Scalar *toWrite, int ldToWrite) {
void OrthoWP(Scalar *toWrite, int ldToWrite)
{
if (cursor>0) {
std::cout<<"Ortho of "<<getSizeW()<<" vectors in W against "<<getSizeP()
<<" vectors in P\n";
//Generate coef inside C
KI::Tgemm(getSizeP(),getSizeW(),Parent::getLeadingDim(),
getP(),Parent::getLeadingDim(),
getW(),Parent::getLeadingDim(),
toWrite,ldToWrite,Scalar(1),Scalar(0));
getP(),Parent::getLeadingDim(),
getW(),Parent::getLeadingDim(),
toWrite,ldToWrite,Scalar(1),Scalar(0));
//Modify W part relatively to C and P
//Wj=(-1) * Pj * toWrite + Wj;
KI::gemm(Parent::getLeadingDim(),getSizeW(),getSizeP(),
getP(),Parent::getLeadingDim(),
toWrite,ldToWrite,
getW(),Parent::getLeadingDim(),
Scalar(-1),Scalar(1));
getP(),Parent::getLeadingDim(),
toWrite,ldToWrite,
getW(),Parent::getLeadingDim(),
Scalar(-1),Scalar(1));
std::cout<<"WP :: Ortho done\n";
}
}
......@@ -60,7 +61,8 @@ public:
* @brief Compute QR facto of W part. W will be overwritten by
* Q. R part generated will go inside input toWrite ptr
*/
void QRofW(Scalar *toWriteR, int ldR) {
void QRofW(Scalar *toWriteR, int ldR)
{
//Create temporary tau
typename KI:: template TauHolder<Scalar> tau;
......@@ -68,17 +70,18 @@ public:
//1 - Call qr facto on W bloc
int geqrf = KI::geqrf(Parent::getLeadingDim(),getSizeW(),getW(),
Parent::getLeadingDim(), tau);
if (geqrf != 0) {
if (geqrf != 0)
std::cout<<"Problem on QR facto\n";
}
//2 - get the R part and write it in input
for(int i=0 ; i<getSizeW() ; ++i) {
for (int i=0 ; i<getSizeW() ; ++i) {
memcpy(&toWriteR[i*ldR],&getW()[i*Parent::getLeadingDim()],
(i+1)*sizeof(Scalar));
}
//3 - Call orgqr on W block
int orgqr = KI::orgqr(Parent::getLeadingDim(),getSizeW(),
getW(),Parent::getLeadingDim(),tau);
getW(),Parent::getLeadingDim(),tau,
(Scalar*)nullptr, 0);
//check
if (orgqr != 0) {
std::cout<<"Problem in BlockWP::QRofW\n";
......@@ -94,12 +97,14 @@ public:
void ComputeProduct(BlockSPK& input,
int nbKeptDir, //Correspond to the number of
//kept directions
Scalar* toWrite,int ldToWrite) {
Scalar *toWrite,
int ldToWrite)
{
KI::gemm(Parent::getLeadingDim(),nbKeptDir,Parent::getSizeBlock(),
Parent::getPtr(),Parent::getLeadingDim(),
input.getPtr(),input.getLeadingDim(),
toWrite,ldToWrite,
Scalar(1),Scalar(0));
Parent::getPtr(),Parent::getLeadingDim(),
input.getPtr(),input.getLeadingDim(),
toWrite,ldToWrite,
Scalar(1),Scalar(0));
}
/**
......@@ -108,7 +113,7 @@ public:
*/
void ComputeProduct(BlockSPK& input,
int nbKeptDir) //Correspond to the start of
//discarded directions
//discarded directions
{
int sizeInputBlock = input.getSizeBlock() - nbKeptDir;
//Create temporary blck to store result,
......@@ -119,10 +124,10 @@ public:
<<"sizeInputBlock :: "<<sizeInputBlock<<"\n";
KI::gemm(Parent::getLeadingDim(),sizeInputBlock,Parent::getSizeBlock(),
Parent::getPtr(),Parent::getLeadingDim(),
input.getPtr(nbKeptDir),input.getLeadingDim(),
temp.getPtr(),temp.getLeadingDim(),
Scalar(1),Scalar(0));
Parent::getPtr(),Parent::getLeadingDim(),
input.getPtr(nbKeptDir),input.getLeadingDim(),
temp.getPtr(),temp.getLeadingDim(),
Scalar(1),Scalar(0));
//temp will be copied back inside P part, and cursor will be
//updated
......@@ -137,7 +142,8 @@ public:
}
//Check othogonality between p and W
void CheckOrthoPW() {
void CheckOrthoPW()
{
BlockSPK temp{getSizeW(),getSizeP()};
KI::Tgemm(getSizeP(),getSizeW(),Parent::getLeadingDim(),
getP(),Parent::getLeadingDim(),
......
......@@ -6,6 +6,13 @@
#include <cstring>
#include <unordered_map>
#ifndef IBBGMRESDR_KERNELINTERFACE_HPP_INSIDE
#error "Never include this header directly; Use KernelInterface.hpp instead"
#endif
#define ChameleonKernI LapackKernI
//struct ChameleonKernI // : implements KernelInterface "Concept"
struct ChameleonKernI // : implements KernelInterface "Concept"
{
template<class T>
......@@ -479,8 +486,8 @@ int ChameleonKernI::gesvd(char jobu,char jobvt,
{
MORSE_desc_t *tau = NULL;
MORSE_Alloc_Workspace_sgesvd(m, n, &tau, 1, 1);
int r = MORSE_sgesvd(job_conv[jobu],
job_conv[jobvt],
int r = MORSE_sgesvd(job_conv.at(jobu),
job_conv.at(jobvt),
m, n,
A, ldA, sigma, tau,
U, ldU, V, ldV);
......@@ -499,8 +506,8 @@ int ChameleonKernI::gesvd(char jobu,char jobvt,
{
MORSE_desc_t *tau = NULL;
MORSE_Alloc_Workspace_dgesvd(m, n, &tau, 1, 1);
int r = MORSE_dgesvd(job_conv[jobu],
job_conv[jobvt],
int r = MORSE_dgesvd(job_conv.at(jobu),
job_conv.at(jobvt),
m, n,
A, ldA, sigma, tau,
U, ldU, V, ldV);
......@@ -519,8 +526,8 @@ int ChameleonKernI::gesvd(char jobu,char jobvt,
{
MORSE_desc_t *tau = NULL;
MORSE_Alloc_Workspace_cgesvd(m, n, &tau, 1, 1);
int r = MORSE_cgesvd(jobu,
jobvt,
int r = MORSE_cgesvd(job_conv.at(jobu),
job_conv.at(jobvt),
m, n,
A, ldA, sigma, tau,
U, ldU, V, ldV);
......@@ -539,8 +546,8 @@ int ChameleonKernI::gesvd(char jobu, char jobvt,
{
MORSE_desc_t *tau = NULL;
MORSE_Alloc_Workspace_zgesvd(m, n, &tau, 1, 1);
int r = MORSE_zgesvd(jobu,
jobvt,
int r = MORSE_zgesvd(job_conv.at(jobu),
job_conv.at(jobvt),
m, n,
A, ldA, sigma, tau,
U, ldU, V, ldV);
......
#ifndef IBBGMRESDR_KERNELINTERFACE_HPP
#define IBBGMRESDR_KERNELINTERFACE_HPP
#include <complex>
/**
* @brief This static struct is used in order to choose from 'N' or
......@@ -30,8 +31,9 @@ struct Trans<double>{
constexpr static const char trans = 'T';
};
#include "LapackInterface.hpp"
#define IBBGMRESDR_KERNELINTERFACE_HPP_INSIDE
//#include "LapackInterface.hpp"
#include "ChameleonInterface.hpp"
#undef IBBGMRESDR_KERNELINTERFACE_HPP_INSIDE
#endif // IBBGMRESDR_KERNELINTERFACE_HPP
......@@ -10,6 +10,10 @@
#include "../ext_inc/cblas.h"
#include "../ext_inc/lapacke.h"
#ifndef IBBGMRESDR_KERNELINTERFACE_HPP_INSIDE
#error "Never include this header directly; Use KernelInterface.hpp instead"
#endif
struct LapackKernI // : implements KernelInterface "Concept"
{
......
......@@ -5,7 +5,7 @@
#include "../src/Arnoldi_IB.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_QRInc.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
/**
......
......@@ -6,7 +6,7 @@
#include "../src/Arnoldi_IB.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_QRInc.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
/**
......
......@@ -5,7 +5,7 @@
#include "../src/Arnoldi_IB.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_QRInc.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
/**
......
#include "../src/Block.hpp"
#include "../src/Utils.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include <vector>
#include <random>
......
#include <random>
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Block.hpp"
template<class Scalar,class Primary>
......
#include <random>
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Block.hpp"
template<class Scalar,class Primary>
......
......@@ -4,7 +4,7 @@
#include <stdint.h>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_IB.hpp"
......
......@@ -4,7 +4,7 @@
#include <stdint.h>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_IB.hpp"
......
......@@ -4,7 +4,7 @@
#include <stdint.h>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_IB.hpp"
......@@ -56,39 +56,39 @@ template<
>
class InputMatrix{
int dim;
Scalar * data;
Scalar *data;
public:
InputMatrix() : dim(0),data(nullptr) {
}
InputMatrix(int inSize) : dim(inSize),data(nullptr) {
data = new Scalar[dim*dim];
}
~InputMatrix() {
delete [] data;
InputMatrix():
dim(0),
data(nullptr)
{
}
int size() {
return dim;
InputMatrix(int inSize):
dim(inSize),
data(new Scalar[dim*dim])
{
}
Scalar * getPtr() {
return data;
}
~InputMatrix() { delete [] data; }
int size() const { return dim; }
Scalar* getPtr() { return data; }
const Scalar* getPtr() const { return data; }
bool useRightPreCond() const { return false; }
void initMatrix(std::random_device& rd) {
void initMatrix(std::random_device& rd)
{
std::mt19937 gen(/*rd()*/0);
std::uniform_real_distribution<> dis(0, 2);
for(int i=0 ; i<dim ; ++i) {
for(int j=0 ; j<dim ; ++j) {
for(int i=0 ; i<dim ; ++i)
for(int j=0 ; j<dim ; ++j)
data[dim*i+j] = {dis(gen),dis(gen)};
}
}
}
void MatBlockVect(Block<Scalar,Primary>& in, Block<Scalar,Primary>& out,
int idxToWrite=0) {
void MatBlockVect(Block<Scalar,Primary>& in,
Block<Scalar,Primary>& out,
int idxToWrite=0)
{
KI::gemm(dim,in.getSizeBlock(),dim,
data,dim,
in.getPtr(), in.getLeadingDim(),
......@@ -96,7 +96,8 @@ public:
Scalar(1),Scalar(0));
}
void MatBaseProduct(Scalar * toRead, int nbRHS, Scalar* ptrToWrite) {
void MatBaseProduct(Scalar *toRead, int nbRHS, Scalar* ptrToWrite)
{
KI::gemm(dim,nbRHS, dim,
data,dim,
toRead,dim,
......@@ -104,7 +105,8 @@ public:
Scalar(1),Scalar(0));
}
void dispFirstBlock(int SizeBlock) {
void dispFirstBlock(int SizeBlock)
{
std::cout<<"Displaying Matrix A\n";
for(int i=0 ; i<SizeBlock ; ++i) {
for(int j=0 ; j<SizeBlock ; ++j) {
......@@ -114,25 +116,22 @@ public:
}
}
bool useRightPreCond() {
return false;
}
void preCondBlockVect(Block<Scalar,Primary>& input, Block<Scalar,Primary>& output) {
for(int j=0 ; j<output.getSizeBlock() ; ++j) {
for(int i=0 ; i<dim ; ++i) {
void preCondBlockVect(Block<Scalar,Primary>& input, Block<Scalar,Primary>& output)
{
for(int j=0 ; j<output.getSizeBlock() ; ++j)
for(int i=0 ; i<dim ; ++i)
output.getPtr(j)[i] = input.getPtr(j)[i]*(Scalar(1)/data[i*dim+i]);
}
}
}
void preCondBaseProduct(Scalar * ptr,Block<Scalar,Primary>& output) {
for(int j=0 ; j<output.getSizeBlock() ; ++j) {
for(int i=0 ; i<dim ; ++i) {
void preCondBaseProduct(Scalar *ptr,Block<Scalar,Primary>& output)
{
for(int j=0 ; j<output.getSizeBlock() ; ++j)
for(int i=0 ; i<dim ; ++i)
output.getPtr(j)[i] = ptr[j*dim+i]*(Scalar(1)/(data[i*dim+i]));
}
}
}
void initDim(int inDim) {
void initDim(int inDim)
{
this->dim = inDim;
if (data) {
std::cout<<"Error : Data already allocated\n Exiting\n";
......@@ -141,15 +140,15 @@ public:
this->data = new Scalar[dim*dim];
}
void DotProduct(int size, Scalar* vectA, Scalar*vectB, Scalar*res) {
void DotProduct(int size, Scalar* vectA, Scalar*vectB, Scalar*res)
{
std::cout<<"No Dot product set \n";
exit(0);
}
};
int main(int ac, char ** av) {
int main(int ac, char **av)
{
std::vector<std::string > args(av,av+ac);
for(auto ag : args)
std::cout << ag << "\n";
......@@ -323,8 +322,10 @@ int main(int ac, char ** av) {
Logger<Primary> log;
double tic = Logger<Primary>::GetTime();
nb3 = BGMRes<Arnoldi2,Matrix,Scalar,Primary>(mat,RHS,X0,max_ite,restart,sol,log,
epsilon,scheme);
nb3 = BGMRes<Arnoldi2,Matrix,Scalar,Primary>(
mat,RHS,X0,max_ite,restart,
sol,log,epsilon,scheme
);
elapsed3 = Logger<Primary>::GetTime() - tic;
......
......@@ -4,7 +4,7 @@
#include <stdint.h>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/Arnoldi.hpp"
#include "../src/Arnoldi_IB.hpp"
......
......@@ -4,7 +4,7 @@
#include <sstream>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/BGMRes.hpp"
#include "../src/BGMResDR.hpp"
......@@ -42,20 +42,9 @@ public:
{
}
~InputMatrix()
{
delete [] data;
}
int size()
{
return dim;
}
Scalar * getPtr()
{
return data;
}
~InputMatrix() { delete [] data; }
int size() const { return dim; }
Scalar *getPtr() { return data; }
void initMatrixWithRandom(std::random_device& rd, double maxValue=2)
{
......@@ -247,7 +236,7 @@ int main(int argc, char *argv[])
BlockSP XExact{SizeBlock, dim};
BlockSP RHS{SizeBlock, dim};
for(int i=0; i<SizeBlock ; ++i)
for (int i=0; i<SizeBlock ; ++i)
XExact.getPtr(i)[i] = Scalar{1/*,1*/};
mat.MatBlockVect(XExact, RHS);
......@@ -260,11 +249,9 @@ int main(int argc, char *argv[])
if (args.size() > 3)
nb_ev = std::stoi(args[3]);
(void) nb_ev;
std::vector<Primary> epsilon{1e-5};
using Arnoldi2 = Arnoldi_IB<Matrix,Scalar,Primary>;
TestRet r1 = runTest<Arnoldi2>(mat, RHS, XExact,
restart, SizeBlock, dim,
epsilon, ArnOrtho::BLOCK);
......
......@@ -3,7 +3,7 @@
#include <fstream>
#include <istream>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/BGMRes.hpp"
#include "../src/BGMResDR.hpp"
......@@ -30,28 +30,27 @@ template<
>
class InputMatrix{
int dim;
Scalar * data;
Scalar *data;
public:
InputMatrix() : dim(0),data(nullptr) {
InputMatrix():
dim(0),
data(nullptr)
{
}
InputMatrix(int inSize) : dim(inSize),data(nullptr) {
InputMatrix(int inSize):
dim(inSize),
data(nullptr)
{
data = new Scalar[dim*dim];
}
~InputMatrix() {
delete [] data;
}
int size() {
return dim;
}
~InputMatrix() { delete [] data; }
int size() const { return dim; }
Scalar *getPtr() { return data; }
Scalar * getPtr() {
return data;
}
void initMatrix(std::random_device& rd) {
void initMatrix(std::random_device& rd)
{
std::mt19937 gen(/*rd()*/0);
std::uniform_real_distribution<> dis(0, 2);
for(int i=0 ; i<dim ; ++i) {
......@@ -61,34 +60,39 @@ public:
}
}
void MatBlockVect(Block<Scalar,Primary>& in, Block<Scalar,Primary>& out,
int idxToWrite=0) {
void MatBlockVect(Block<Scalar,Primary>& in,
Block<Scalar,Primary>& out,
int idxToWrite=0)
{
KI::gemm(dim,in.getSizeBlock(),dim,
data,dim,
in.getPtr(), in.getLeadingDim(),
out.getPtr(idxToWrite),out.getLeadingDim(),
Scalar(1),Scalar(0));
data,dim,
in.getPtr(), in.getLeadingDim(),
out.getPtr(idxToWrite),out.getLeadingDim(),
Scalar(1),Scalar(0));
}
void MatBaseProduct(Scalar * toRead, int nbRHS, Scalar* ptrToWrite) {
void MatBaseProduct(Scalar * toRead, int nbRHS, Scalar* ptrToWrite)
{
KI::gemm(dim,nbRHS, dim,
data,dim,
toRead,dim,
ptrToWrite,dim,
Scalar(1),Scalar(0));
data,dim,
toRead,dim,
ptrToWrite,dim,
Scalar(1),Scalar(0));
}
bool useRightPreCond() {
return false;
}
void preCondBlockVect(Block<Scalar,Primary>& input, Block<Scalar,Primary>& output) {
bool useRightPreCond() const { return false; }
void preCondBlockVect(Block<Scalar,Primary>& input,
Block<Scalar,Primary>& output)
{
for(int j=0 ; j<output.getSizeBlock() ; ++j) {
for(int i=0 ; i<dim ; ++i) {
output.getPtr(j)[i] = input.getPtr(j)[i]*(Scalar(1)/data[i*dim+i]);
}
}
}
void preCondBaseProduct(Scalar * ptr,Block<Scalar,Primary>& output) {
void preCondBaseProduct(Scalar *ptr,Block<Scalar,Primary>& output)
{
for(int j=0 ; j<output.getSizeBlock() ; ++j) {
for(int i=0 ; i<dim ; ++i) {
output.getPtr(j)[i] = ptr[j*dim+i]*(Scalar(1)/(data[i*dim+i]));
......@@ -96,7 +100,8 @@ public:
}
}
void importMatrixCmplx(std::ifstream& file) {
void importMatrixCmplx(std::ifstream& file)
{
if (file.is_open()) {
bool commentLine = true;
std::string line;
......@@ -136,7 +141,9 @@ public:
exit(0);
}
}
void importMatrixReal(std::ifstream& file) {
void importMatrixReal(std::ifstream& file)
{
if (file.is_open()) {
bool commentLine = true;
std::string line;
......@@ -179,7 +186,8 @@ public:
}
}
Primary getInfNorm() {
Primary getInfNorm()
{
if (data) {
Primary max = Primary{0};
for(int k=0 ; k<dim ; ++k) {
......
#include <random>
#include <iostream>
#include <fstream>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/BGMRes.hpp"
#include "../src/BGMResDR.hpp"
......
......@@ -2,7 +2,7 @@
#include <iostream>
#include <fstream>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"
#include "../src/BGMRes.hpp"
#include "../src/BGMResDR.hpp"
......
......@@ -2,7 +2,7 @@
#include <iostream>
#include <fstream>
#include "../src/Block.hpp"
#include "../src/LapackInterface.hpp"
#include "../src/KernelInterface.hpp"
#include "../src/Logger.hpp"