mirror of
				https://github.com/aportelli/LatAnalyze.git
				synced 2025-11-02 23:34:32 +00:00 
			
		
		
		
	Compare commits
	
		
			5 Commits
		
	
	
		
			andrew-pr
			...
			fecc5690f3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					fecc5690f3 | ||
| c73b609ac5 | |||
| 05138baa08 | |||
| a0bdbfd9dd | |||
| 
						 | 
					269d0c338e | 
							
								
								
									
										2
									
								
								.github/workflows/build-macos.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-macos.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
name: Build macOS
 | 
					name: Build macOS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on: [push]
 | 
					on: [push, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
constexpr Index  size          = 8;
 | 
					constexpr Index  n             = 8;
 | 
				
			||||||
constexpr Index  nDraw         = 20000;
 | 
					constexpr Index  nDraw         = 20000;
 | 
				
			||||||
constexpr Index  nSample       = 2000;
 | 
					constexpr Index  nSample       = 2000;
 | 
				
			||||||
const     string stateFileName = "exRand.seed";
 | 
					const     string stateFileName = "exRand.seed";
 | 
				
			||||||
@@ -40,14 +40,14 @@ int main(void)
 | 
				
			|||||||
    p << PlotFunction(compile("return exp(-x_0^2/2)/sqrt(2*pi);", 1), -5., 5.);
 | 
					    p << PlotFunction(compile("return exp(-x_0^2/2)/sqrt(2*pi);", 1), -5., 5.);
 | 
				
			||||||
    p.display();
 | 
					    p.display();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DMat       var(size, size);
 | 
					    DMat       var(n, n);
 | 
				
			||||||
    DVec       mean(size);
 | 
					    DVec       mean(n);
 | 
				
			||||||
    DMatSample sample(nSample, size, 1);
 | 
					    DMatSample sample(nSample, n, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cout << "-- generating " << nSample << " Gaussian random vectors..." << endl;
 | 
					    cout << "-- generating " << nSample << " Gaussian random vectors..." << endl;
 | 
				
			||||||
    var   = DMat::Random(size, size);
 | 
					    var   = DMat::Random(n, n);
 | 
				
			||||||
    var  *= var.adjoint();
 | 
					    var  *= var.adjoint();
 | 
				
			||||||
    mean  = DVec::Random(size); 
 | 
					    mean  = DVec::Random(n); 
 | 
				
			||||||
    RandomNormal mgauss(mean, var, rd());
 | 
					    RandomNormal mgauss(mean, var, rd());
 | 
				
			||||||
    sample[central] = mgauss();
 | 
					    sample[central] = mgauss();
 | 
				
			||||||
    FOR_STAT_ARRAY(sample, s)
 | 
					    FOR_STAT_ARRAY(sample, s)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -217,146 +217,25 @@ void RunContext::reset(void)
 | 
				
			|||||||
#define CODE_WIDTH 6
 | 
					#define CODE_WIDTH 6
 | 
				
			||||||
#define CODE_MOD   setw(CODE_WIDTH) << left
 | 
					#define CODE_MOD   setw(CODE_WIDTH) << left
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instruction operator ////////////////////////////////////////////////////////
 | 
					auto readConstant(Program::const_iterator ip)
 | 
				
			||||||
ostream &Latan::operator<<(ostream& out, const Instruction& ins)
 | 
					    -> std::tuple<double, Program::const_iterator>
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ins.print(out);
 | 
					    double value = 0.0;
 | 
				
			||||||
 | 
					    std::copy(ip, ip + sizeof(double), reinterpret_cast<std::uint8_t*>(&value));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return out;
 | 
					    return std::make_tuple(value, ip + sizeof(double));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Push constructors ///////////////////////////////////////////////////////////
 | 
					auto readAddress(Program::const_iterator ip)
 | 
				
			||||||
Push::Push(const double val)
 | 
					    -> std::tuple<unsigned int, Program::const_iterator>
 | 
				
			||||||
: type_(ArgType::Constant)
 | 
					 | 
				
			||||||
, val_(val)
 | 
					 | 
				
			||||||
, address_(0)
 | 
					 | 
				
			||||||
, name_("")
 | 
					 | 
				
			||||||
{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Push::Push(const unsigned int address, const string &name)
 | 
					 | 
				
			||||||
: type_(ArgType::Variable)
 | 
					 | 
				
			||||||
, val_(0.0)
 | 
					 | 
				
			||||||
, address_(address)
 | 
					 | 
				
			||||||
, name_(name)
 | 
					 | 
				
			||||||
{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Push execution //////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Push::operator()(RunContext &context) const
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (type_ == ArgType::Constant)
 | 
					    unsigned int address = 0.0;
 | 
				
			||||||
    {
 | 
					    const auto end = ip + sizeof(unsigned int);
 | 
				
			||||||
        context.stack().push(val_);
 | 
					    std::copy(ip, end, reinterpret_cast<std::uint8_t*>(&address));
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
    else
 | 
					    return std::make_tuple(address, end);
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        context.stack().push(context.getVariable(address_));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    context.incrementInsIndex();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Push print //////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Push::print(ostream &out) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    out << CODE_MOD << "push";
 | 
					 | 
				
			||||||
    if (type_ == ArgType::Constant)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        out << CODE_MOD << val_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        out << CODE_MOD << name_ << " @v" << address_;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Pop constructor /////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
Pop::Pop(const unsigned int address, const string &name)
 | 
					 | 
				
			||||||
: address_(address)
 | 
					 | 
				
			||||||
, name_(name)
 | 
					 | 
				
			||||||
{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Pop execution ///////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Pop::operator()(RunContext &context) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!name_.empty())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        context.setVariable(address_, context.stack().top());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    context.stack().pop();
 | 
					 | 
				
			||||||
    context.incrementInsIndex();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Pop print ///////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Pop::print(ostream &out) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    out << CODE_MOD << "pop" << CODE_MOD << name_ << " @v" << address_;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Store constructor ///////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
Store::Store(const unsigned int address, const string &name)
 | 
					 | 
				
			||||||
: address_(address)
 | 
					 | 
				
			||||||
, name_(name)
 | 
					 | 
				
			||||||
{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Store execution /////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Store::operator()(RunContext &context) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!name_.empty())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        context.setVariable(address_, context.stack().top());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    context.incrementInsIndex();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Store print /////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Store::print(ostream &out) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    out << CODE_MOD << "store" << CODE_MOD << name_ << " @v" << address_;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Call constructor ////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
Call::Call(const unsigned int address, const string &name)
 | 
					 | 
				
			||||||
: address_(address)
 | 
					 | 
				
			||||||
, name_(name)
 | 
					 | 
				
			||||||
{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Call execution //////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Call::operator()(RunContext &context) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    context.stack().push((*context.getFunction(address_))(context.stack()));
 | 
					 | 
				
			||||||
    context.incrementInsIndex();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Call print //////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void Call::print(ostream &out) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    out << CODE_MOD << "call" << CODE_MOD << name_ << " @f" << address_;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Math operations /////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
#define DEF_OP(name, nArg, exp, insName)\
 | 
					 | 
				
			||||||
void name::operator()(RunContext &context) const\
 | 
					 | 
				
			||||||
{\
 | 
					 | 
				
			||||||
    double x[nArg];\
 | 
					 | 
				
			||||||
    for (int i = 0; i < nArg; ++i)\
 | 
					 | 
				
			||||||
    {\
 | 
					 | 
				
			||||||
        x[nArg-1-i] = context.stack().top();\
 | 
					 | 
				
			||||||
        context.stack().pop();\
 | 
					 | 
				
			||||||
    }\
 | 
					 | 
				
			||||||
    context.stack().push(exp);\
 | 
					 | 
				
			||||||
    context.incrementInsIndex();\
 | 
					 | 
				
			||||||
}\
 | 
					 | 
				
			||||||
void name::print(ostream &out) const\
 | 
					 | 
				
			||||||
{\
 | 
					 | 
				
			||||||
    out << CODE_MOD << insName;\
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DEF_OP(Neg, 1, -x[0],          "neg")
 | 
					 | 
				
			||||||
DEF_OP(Add, 2, x[0] + x[1],    "add")
 | 
					 | 
				
			||||||
DEF_OP(Sub, 2, x[0] - x[1],    "sub")
 | 
					 | 
				
			||||||
DEF_OP(Mul, 2, x[0]*x[1],      "mul")
 | 
					 | 
				
			||||||
DEF_OP(Div, 2, x[0]/x[1],      "div")
 | 
					 | 
				
			||||||
DEF_OP(Pow, 2, pow(x[0],x[1]), "pow")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/******************************************************************************
 | 
					/******************************************************************************
 | 
				
			||||||
 *                        ExprNode implementation                             *
 | 
					 *                        ExprNode implementation                             *
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
@@ -442,29 +321,35 @@ ostream &Latan::operator<<(ostream &out, const ExprNode &n)
 | 
				
			|||||||
    return out;
 | 
					    return out;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PUSH_INS(program, type, ...)\
 | 
					// Bytecode helper functions ///////////////////////////////////////////////////
 | 
				
			||||||
program.push_back(unique_ptr<type>(new type(__VA_ARGS__)))
 | 
					void pushInstruction(Program &program, const Instruction instruction) {
 | 
				
			||||||
#define GET_ADDRESS(address, table, name)\
 | 
					    program.push_back(static_cast<std::uint8_t>(instruction));
 | 
				
			||||||
try\
 | 
					}
 | 
				
			||||||
{\
 | 
					
 | 
				
			||||||
    address = (table).at(name);\
 | 
					void pushAddress(Program &program, const unsigned int address) {
 | 
				
			||||||
}\
 | 
					    const auto address_ptr = reinterpret_cast<const std::uint8_t*>(&address);
 | 
				
			||||||
catch (out_of_range)\
 | 
					    const auto size = sizeof(unsigned int);
 | 
				
			||||||
{\
 | 
					    program.insert(program.end(), address_ptr, address_ptr + size);
 | 
				
			||||||
    address         = (table).size();\
 | 
					}
 | 
				
			||||||
    (table)[(name)] = address;\
 | 
					
 | 
				
			||||||
}\
 | 
					void pushConstant(Program &program, const double value) {
 | 
				
			||||||
 | 
					    const auto value_ptr = reinterpret_cast<const std::uint8_t*>(&value);
 | 
				
			||||||
 | 
					    const auto size = sizeof(double);
 | 
				
			||||||
 | 
					    program.insert(program.end(), value_ptr, value_ptr + size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// VarNode compile /////////////////////////////////////////////////////////////
 | 
					// VarNode compile /////////////////////////////////////////////////////////////
 | 
				
			||||||
void VarNode::compile(Program &program, RunContext &context) const
 | 
					void VarNode::compile(Program &program, RunContext &context) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PUSH_INS(program, Push, context.getVariableAddress(getName()), getName());
 | 
					    pushInstruction(program, Instruction::LOAD);
 | 
				
			||||||
 | 
					    pushAddress(program, context.getVariableAddress(getName()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CstNode compile /////////////////////////////////////////////////////////////
 | 
					// CstNode compile /////////////////////////////////////////////////////////////
 | 
				
			||||||
void CstNode::compile(Program &program, RunContext &context __dumb) const
 | 
					void CstNode::compile(Program &program, RunContext &context __dumb) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PUSH_INS(program, Push, strTo<double>(getName()));
 | 
					    pushInstruction(program, Instruction::CONST);
 | 
				
			||||||
 | 
					    pushConstant(program, strTo<double>(getName()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SemicolonNode compile ///////////////////////////////////////////////////////
 | 
					// SemicolonNode compile ///////////////////////////////////////////////////////
 | 
				
			||||||
@@ -482,6 +367,10 @@ void SemicolonNode::compile(Program &program, RunContext &context) const
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            n[i].compile(program, context);
 | 
					            n[i].compile(program, context);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        // Where a variable has just been assigned, pop it off the stack.
 | 
				
			||||||
 | 
					        if (isAssign) {
 | 
				
			||||||
 | 
					            pushInstruction(program, Instruction::POP);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -492,19 +381,10 @@ void AssignNode::compile(Program &program, RunContext &context) const
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    if (isDerivedFrom<VarNode>(&n[0]))
 | 
					    if (isDerivedFrom<VarNode>(&n[0]))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        bool hasSemicolonParent = isDerivedFrom<SemicolonNode>(getParent());
 | 
					 | 
				
			||||||
        unsigned int address;
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        n[1].compile(program, context);
 | 
					        n[1].compile(program, context);
 | 
				
			||||||
        address = context.addVariable(n[0].getName());
 | 
					        const unsigned int address = context.addVariable(n[0].getName());
 | 
				
			||||||
        if (hasSemicolonParent)
 | 
					        pushInstruction(program, Instruction::STORE);
 | 
				
			||||||
        {
 | 
					        pushAddress(program, address);
 | 
				
			||||||
            PUSH_INS(program, Pop, address, n[0].getName());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            PUSH_INS(program, Store, address, n[0].getName());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -519,19 +399,37 @@ void AssignNode::compile(Program &program, RunContext &context) const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void MathOpNode::compile(Program &program, RunContext &context) const
 | 
					void MathOpNode::compile(Program &program, RunContext &context) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#define PUSH_BINARY_OP(op, instruction) \
 | 
				
			||||||
 | 
					    case op: \
 | 
				
			||||||
 | 
					        pushInstruction(program, Instruction::instruction); \
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    auto &n = *this;
 | 
					    auto &n = *this;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    for (Index i = 0; i < n.getNArg(); ++i)
 | 
					    for (Index i = 0; i < n.getNArg(); ++i)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        n[i].compile(program, context);
 | 
					        n[i].compile(program, context);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    IFNODE("-", 1)   PUSH_INS(program, Neg,);
 | 
					    if (n.getName() == "-" and n.getNArg() == 1) {
 | 
				
			||||||
    ELIFNODE("+", 2) PUSH_INS(program, Add,);
 | 
					        pushInstruction(program, Instruction::NEG);
 | 
				
			||||||
    ELIFNODE("-", 2) PUSH_INS(program, Sub,);
 | 
					        return;
 | 
				
			||||||
    ELIFNODE("*", 2) PUSH_INS(program, Mul,);
 | 
					    }
 | 
				
			||||||
    ELIFNODE("/", 2) PUSH_INS(program, Div,);
 | 
					
 | 
				
			||||||
    ELIFNODE("^", 2) PUSH_INS(program, Pow,);
 | 
					    if (getNArg() != 2) {
 | 
				
			||||||
    ELSE LATAN_ERROR(Compilation, "unknown operator '" + getName() + "'");
 | 
					        LATAN_ERROR(Compilation, "unknown operator '" + getName() + "'");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (getName()[0]) {
 | 
				
			||||||
 | 
					    PUSH_BINARY_OP('+', ADD)
 | 
				
			||||||
 | 
					    PUSH_BINARY_OP('-', SUB)
 | 
				
			||||||
 | 
					    PUSH_BINARY_OP('*', MUL)
 | 
				
			||||||
 | 
					    PUSH_BINARY_OP('/', DIV)
 | 
				
			||||||
 | 
					    PUSH_BINARY_OP('^', POW)
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					        LATAN_ERROR(Compilation, "unknown operator '" + getName() + "'");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef PUSH_BINARY_OP
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FuncNode compile ////////////////////////////////////////////////////////////
 | 
					// FuncNode compile ////////////////////////////////////////////////////////////
 | 
				
			||||||
@@ -543,7 +441,8 @@ void FuncNode::compile(Program &program, RunContext &context) const
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        n[i].compile(program, context);
 | 
					        n[i].compile(program, context);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    PUSH_INS(program, Call, context.getFunctionAddress(getName()), getName());
 | 
					    pushInstruction(program, Instruction::CALL);
 | 
				
			||||||
 | 
					    pushAddress(program, context.getFunctionAddress(getName()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ReturnNode compile ////////////////////////////////////////////////////////////
 | 
					// ReturnNode compile ////////////////////////////////////////////////////////////
 | 
				
			||||||
@@ -552,7 +451,7 @@ void ReturnNode::compile(Program &program, RunContext &context) const
 | 
				
			|||||||
    auto &n = *this;
 | 
					    auto &n = *this;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    n[0].compile(program, context);
 | 
					    n[0].compile(program, context);
 | 
				
			||||||
    program.push_back(nullptr);
 | 
					    pushInstruction(program, Instruction::RET);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/******************************************************************************
 | 
					/******************************************************************************
 | 
				
			||||||
@@ -582,7 +481,7 @@ MathInterpreter::MathInterpreter(const std::string &code)
 | 
				
			|||||||
// access //////////////////////////////////////////////////////////////////////
 | 
					// access //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
const Instruction * MathInterpreter::operator[](const Index i) const
 | 
					const Instruction * MathInterpreter::operator[](const Index i) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return program_[i].get();
 | 
					    return reinterpret_cast<const Instruction*>(&program_[i]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ExprNode * MathInterpreter::getAST(void) const
 | 
					const ExprNode * MathInterpreter::getAST(void) const
 | 
				
			||||||
@@ -592,7 +491,7 @@ const ExprNode * MathInterpreter::getAST(void) const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void MathInterpreter::push(const Instruction *i)
 | 
					void MathInterpreter::push(const Instruction *i)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    program_.push_back(unique_ptr<const Instruction>(i));
 | 
					    pushInstruction(program_, *i);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// initialization //////////////////////////////////////////////////////////////
 | 
					// initialization //////////////////////////////////////////////////////////////
 | 
				
			||||||
@@ -695,7 +594,7 @@ void MathInterpreter::compile(RunContext &context)
 | 
				
			|||||||
            root_->compile(program_, context);
 | 
					            root_->compile(program_, context);
 | 
				
			||||||
            for (unsigned int i = 0; i < program_.size(); ++i)
 | 
					            for (unsigned int i = 0; i < program_.size(); ++i)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (!program_[i])
 | 
					                if (static_cast<Instruction>(program_[i]) == Instruction::RET)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    gotReturn = true;
 | 
					                    gotReturn = true;
 | 
				
			||||||
                    program_.resize(i);
 | 
					                    program_.resize(i);
 | 
				
			||||||
@@ -726,20 +625,145 @@ void MathInterpreter::operator()(RunContext &context)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void MathInterpreter::execute(RunContext &context) const
 | 
					void MathInterpreter::execute(RunContext &context) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    context.setInsIndex(0);
 | 
					#define BINARY_OP_CASE(instruction, expr) \
 | 
				
			||||||
    while (context.getInsIndex() != program_.size())
 | 
					        case Instruction::instruction: { \
 | 
				
			||||||
    {
 | 
					            const auto second = context.stack().top(); \
 | 
				
			||||||
        (*(program_[context.getInsIndex()]))(context);
 | 
					            context.stack().pop(); \
 | 
				
			||||||
 | 
					            const auto first = context.stack().top(); \
 | 
				
			||||||
 | 
					            context.stack().pop(); \
 | 
				
			||||||
 | 
					            context.stack().push(expr); \
 | 
				
			||||||
 | 
					            break; \
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    auto ip = program_.begin();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (ip != program_.end()) {
 | 
				
			||||||
 | 
					        const auto instruction = static_cast<Instruction>(*ip);
 | 
				
			||||||
 | 
					        ip++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (instruction) {
 | 
				
			||||||
 | 
					        BINARY_OP_CASE(ADD, first + second)
 | 
				
			||||||
 | 
					        BINARY_OP_CASE(SUB, first - second)
 | 
				
			||||||
 | 
					        BINARY_OP_CASE(MUL, first * second)
 | 
				
			||||||
 | 
					        BINARY_OP_CASE(DIV, first / second)
 | 
				
			||||||
 | 
					        BINARY_OP_CASE(POW, std::pow(first, second))
 | 
				
			||||||
 | 
					        case Instruction::NEG: {
 | 
				
			||||||
 | 
					            const auto operand = context.stack().top();
 | 
				
			||||||
 | 
					            context.stack().pop();
 | 
				
			||||||
 | 
					            context.stack().push(-operand);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case Instruction::CONST: {
 | 
				
			||||||
 | 
					            double value = 0.0;
 | 
				
			||||||
 | 
					            std::tie(value, ip) = readConstant(ip);
 | 
				
			||||||
 | 
					            context.stack().push(value);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case Instruction::POP:
 | 
				
			||||||
 | 
					            context.stack().pop();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case Instruction::LOAD: {
 | 
				
			||||||
 | 
					            unsigned int address = 0;
 | 
				
			||||||
 | 
					            std::tie(address, ip) = readAddress(ip);
 | 
				
			||||||
 | 
					            context.stack().push(context.getVariable(address));
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case Instruction::STORE: {
 | 
				
			||||||
 | 
					            unsigned int address = 0;
 | 
				
			||||||
 | 
					            std::tie(address, ip) = readAddress(ip);
 | 
				
			||||||
 | 
					            context.setVariable(address, context.stack().top());
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case Instruction::CALL: {
 | 
				
			||||||
 | 
					            unsigned int address = 0;
 | 
				
			||||||
 | 
					            std::tie(address, ip) = readAddress(ip);
 | 
				
			||||||
 | 
					            auto& stack = context.stack();
 | 
				
			||||||
 | 
					            stack.push((*context.getFunction(address))(stack));
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case Instruction::RET:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef BINARY_OP_CASE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Program::const_iterator instructionToStream(
 | 
				
			||||||
 | 
					    ostream &out, Program::const_iterator ip)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    const auto instruction = static_cast<Instruction>(*ip);
 | 
				
			||||||
 | 
					    ip++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (instruction) {
 | 
				
			||||||
 | 
					    case Instruction::ADD:
 | 
				
			||||||
 | 
					        out << "ADD";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::SUB:
 | 
				
			||||||
 | 
					        out << "SUB";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::MUL:
 | 
				
			||||||
 | 
					        out << "MUL";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::DIV:
 | 
				
			||||||
 | 
					        out << "DIV";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::POW:
 | 
				
			||||||
 | 
					        out << "POW";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::NEG:
 | 
				
			||||||
 | 
					        out << "NEG";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::CONST: {
 | 
				
			||||||
 | 
					        double value = 0.0;
 | 
				
			||||||
 | 
					        std::tie(value, ip) = readConstant(ip);
 | 
				
			||||||
 | 
					        out << CODE_MOD << setfill(' ') << "CONST" << value;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case Instruction::POP:
 | 
				
			||||||
 | 
					        out << "POP";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case Instruction::LOAD: {
 | 
				
			||||||
 | 
					        unsigned int address = 0;
 | 
				
			||||||
 | 
					        std::tie(address, ip) = readAddress(ip);
 | 
				
			||||||
 | 
					        out << CODE_MOD << setfill(' ') << "LOAD" << address;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case Instruction::STORE: {
 | 
				
			||||||
 | 
					        unsigned int address = 0;
 | 
				
			||||||
 | 
					        std::tie(address, ip) = readAddress(ip);
 | 
				
			||||||
 | 
					        out << CODE_MOD << setfill(' ') << "STORE" << address;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case Instruction::CALL: {
 | 
				
			||||||
 | 
					        unsigned int address = 0;
 | 
				
			||||||
 | 
					        std::tie(address, ip) = readAddress(ip);
 | 
				
			||||||
 | 
					        out << CODE_MOD << setfill(' ') << "CALL" << address;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case Instruction::RET:
 | 
				
			||||||
 | 
					        out << "RET";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ip;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ostream &programToStream(ostream &out, const Program &program)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    auto ip = program.begin();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (ip != program.end()) {
 | 
				
			||||||
 | 
					        const auto i = std::distance(program.begin(), ip);
 | 
				
			||||||
 | 
					        cout << setw(4) << setfill('0') << right << i << "  ";
 | 
				
			||||||
 | 
					        ip = instructionToStream(out, ip);
 | 
				
			||||||
 | 
					        out << '\n';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return out;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IO //////////////////////////////////////////////////////////////////////////
 | 
					// IO //////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
ostream &Latan::operator<<(ostream &out, const MathInterpreter &program)
 | 
					ostream &Latan::operator<<(ostream &out, const MathInterpreter &program)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    for (unsigned int i = 0; i < program.program_.size(); ++i)
 | 
					    return programToStream(out, program.program_);
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        out << *(program.program_[i]) << endl;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return out;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,8 @@
 | 
				
			|||||||
#ifndef Latan_MathInterpreter_hpp_
 | 
					#ifndef Latan_MathInterpreter_hpp_
 | 
				
			||||||
#define	Latan_MathInterpreter_hpp_
 | 
					#define	Latan_MathInterpreter_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Functional/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Core/ParserState.hpp>
 | 
					#include <LatAnalyze/Core/ParserState.hpp>
 | 
				
			||||||
@@ -79,108 +81,26 @@ private:
 | 
				
			|||||||
 *                         Instruction classes                                *
 | 
					 *                         Instruction classes                                *
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
// Abstract base
 | 
					// Abstract base
 | 
				
			||||||
class Instruction
 | 
					
 | 
				
			||||||
{
 | 
					enum class Instruction : std::uint8_t {
 | 
				
			||||||
public:
 | 
					    ADD,
 | 
				
			||||||
    // destructor
 | 
					    SUB,
 | 
				
			||||||
    virtual ~Instruction(void) = default;
 | 
					    MUL,
 | 
				
			||||||
    // instruction execution
 | 
					    DIV,
 | 
				
			||||||
    virtual void operator()(RunContext &context) const = 0;
 | 
					    POW,
 | 
				
			||||||
    friend std::ostream & operator<<(std::ostream &out, const Instruction &ins);
 | 
					    NEG,
 | 
				
			||||||
private:
 | 
					    CONST,
 | 
				
			||||||
    virtual void print(std::ostream &out) const = 0;
 | 
					    POP,
 | 
				
			||||||
 | 
					    LOAD,
 | 
				
			||||||
 | 
					    STORE,
 | 
				
			||||||
 | 
					    CALL,
 | 
				
			||||||
 | 
					    RET,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::ostream & operator<<(std::ostream &out, const Instruction &ins);
 | 
					std::ostream & operator<<(std::ostream &out, const Instruction &ins);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instruction container
 | 
					// Instruction container
 | 
				
			||||||
typedef std::vector<std::unique_ptr<const Instruction>> Program;
 | 
					typedef std::vector<std::uint8_t> Program;
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Push
 | 
					 | 
				
			||||||
class Push: public Instruction
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    enum class ArgType
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Constant = 0,
 | 
					 | 
				
			||||||
        Variable = 1
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    //constructors
 | 
					 | 
				
			||||||
    explicit Push(const double val);
 | 
					 | 
				
			||||||
    explicit Push(const unsigned int address, const std::string &name);
 | 
					 | 
				
			||||||
    // instruction execution
 | 
					 | 
				
			||||||
    virtual void operator()(RunContext &context) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    virtual void print(std::ostream& out) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    ArgType      type_;
 | 
					 | 
				
			||||||
    double       val_;
 | 
					 | 
				
			||||||
    unsigned int address_;
 | 
					 | 
				
			||||||
    std::string  name_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Pop
 | 
					 | 
				
			||||||
class Pop: public Instruction
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    //constructor
 | 
					 | 
				
			||||||
    explicit Pop(const unsigned int address, const std::string &name);
 | 
					 | 
				
			||||||
    // instruction execution
 | 
					 | 
				
			||||||
    virtual void operator()(RunContext &context) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    virtual void print(std::ostream& out) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    unsigned int address_;
 | 
					 | 
				
			||||||
    std::string name_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Store
 | 
					 | 
				
			||||||
class Store: public Instruction
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    //constructor
 | 
					 | 
				
			||||||
    explicit Store(const unsigned int address, const std::string &name);
 | 
					 | 
				
			||||||
    // instruction execution
 | 
					 | 
				
			||||||
    virtual void operator()(RunContext &context) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    virtual void print(std::ostream& out) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    unsigned int address_;
 | 
					 | 
				
			||||||
    std::string name_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Call function
 | 
					 | 
				
			||||||
class Call: public Instruction
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    //constructor
 | 
					 | 
				
			||||||
    explicit Call(const unsigned int address, const std::string &name);
 | 
					 | 
				
			||||||
    // instruction execution
 | 
					 | 
				
			||||||
    virtual void operator()(RunContext &context) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    virtual void print(std::ostream& out) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    unsigned int address_;
 | 
					 | 
				
			||||||
    std::string name_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Floating point operations
 | 
					 | 
				
			||||||
#define DECL_OP(name)\
 | 
					 | 
				
			||||||
class name: public Instruction\
 | 
					 | 
				
			||||||
{\
 | 
					 | 
				
			||||||
public:\
 | 
					 | 
				
			||||||
    virtual void operator()(RunContext &context) const;\
 | 
					 | 
				
			||||||
private:\
 | 
					 | 
				
			||||||
    virtual void print(std::ostream &out) const;\
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DECL_OP(Neg);
 | 
					 | 
				
			||||||
DECL_OP(Add);
 | 
					 | 
				
			||||||
DECL_OP(Sub);
 | 
					 | 
				
			||||||
DECL_OP(Mul);
 | 
					 | 
				
			||||||
DECL_OP(Div);
 | 
					 | 
				
			||||||
DECL_OP(Pow);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/******************************************************************************
 | 
					/******************************************************************************
 | 
				
			||||||
 *                            Expression node classes                         *
 | 
					 *                            Expression node classes                         *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,23 +108,6 @@ inline std::string strFrom(const T x)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// specialization for vectors
 | 
					// specialization for vectors
 | 
				
			||||||
template<>
 | 
					 | 
				
			||||||
inline std::vector<Index> strTo<std::vector<Index>>(const std::string &str)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    std::vector<Index>  res;
 | 
					 | 
				
			||||||
    std::vector<double> vbuf;
 | 
					 | 
				
			||||||
    double              buf;
 | 
					 | 
				
			||||||
    std::istringstream  stream(str);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    while (!stream.eof())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        stream >> buf;
 | 
					 | 
				
			||||||
        res.push_back(buf);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return res;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<>
 | 
					template<>
 | 
				
			||||||
inline DVec strTo<DVec>(const std::string &str)
 | 
					inline DVec strTo<DVec>(const std::string &str)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -253,39 +253,16 @@ DMatSample CorrelatorUtils::shift(const DMatSample &c, const Index ts)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DMatSample CorrelatorUtils::fold(const DMatSample &c, const CorrelatorModels::ModelPar &par)
 | 
					DMatSample CorrelatorUtils::fold(const DMatSample &c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const Index nt  = c[central].rows();
 | 
					    const Index nt  = c[central].rows();
 | 
				
			||||||
    DMatSample  buf = c;
 | 
					    DMatSample  buf = c;
 | 
				
			||||||
    int         sign;
 | 
					 | 
				
			||||||
    bool        fold = false;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (par.type)
 | 
					    FOR_STAT_ARRAY(buf, s)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        case CorrelatorType::cosh:
 | 
					        for (Index t = 0; t < nt; ++t)
 | 
				
			||||||
        case CorrelatorType::cst:
 | 
					 | 
				
			||||||
            sign = 1;
 | 
					 | 
				
			||||||
            fold = true;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case CorrelatorType::sinh:
 | 
					 | 
				
			||||||
            sign = -1;
 | 
					 | 
				
			||||||
            fold = true;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        case CorrelatorType::linear:
 | 
					 | 
				
			||||||
            cout << "Linear model is asymmetric: will not fold." << endl;
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (fold)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        FOR_STAT_ARRAY(buf, s)
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            for (Index t = 0; t < nt; ++t)
 | 
					            buf[s](t) = 0.5*(c[s](t) + c[s]((nt - t) % nt));
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                buf[s](t) = 0.5*(c[s](t) + sign*c[s]((nt - t) % nt));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,7 @@ namespace CorrelatorModels
 | 
				
			|||||||
namespace CorrelatorUtils
 | 
					namespace CorrelatorUtils
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DMatSample shift(const DMatSample &c, const Index ts);
 | 
					    DMatSample shift(const DMatSample &c, const Index ts);
 | 
				
			||||||
    DMatSample fold(const DMatSample &c, const CorrelatorModels::ModelPar &par);
 | 
					    DMatSample fold(const DMatSample &c);
 | 
				
			||||||
    DMatSample fourierTransform(const DMatSample &c, FFT &fft, 
 | 
					    DMatSample fourierTransform(const DMatSample &c, FFT &fft, 
 | 
				
			||||||
                                const unsigned int dir = FFT::Forward);
 | 
					                                const unsigned int dir = FFT::Forward);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,16 +146,6 @@ double Histogram::getX(const Index i) const
 | 
				
			|||||||
    return x_(i);
 | 
					    return x_(i);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
double Histogram::getXMin(void) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return xMin_;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
double Histogram::getXMax(void) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return xMax_;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
double Histogram::operator[](const Index i) const
 | 
					double Histogram::operator[](const Index i) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return bin_(i)*(isNormalized() ? norm_ : 1.);
 | 
					    return bin_(i)*(isNormalized() ? norm_ : 1.);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,8 +52,6 @@ public:
 | 
				
			|||||||
    const StatArray<double> & getData(void) const;
 | 
					    const StatArray<double> & getData(void) const;
 | 
				
			||||||
    const StatArray<double> & getWeight(void) const;
 | 
					    const StatArray<double> & getWeight(void) const;
 | 
				
			||||||
    double                    getX(const Index i) const;
 | 
					    double                    getX(const Index i) const;
 | 
				
			||||||
    double                    getXMin(void) const;
 | 
					 | 
				
			||||||
    double                    getXMax(void) const;
 | 
					 | 
				
			||||||
    double                    operator[](const Index i) const;
 | 
					    double                    operator[](const Index i) const;
 | 
				
			||||||
    double                    operator()(const double x) const;
 | 
					    double                    operator()(const double x) const;
 | 
				
			||||||
    // percentiles & confidence interval
 | 
					    // percentiles & confidence interval
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -300,67 +300,6 @@ const XYStatData & XYSampleData::getData(void)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// fit /////////////////////////////////////////////////////////////////////////
 | 
					// fit /////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					 | 
				
			||||||
void XYSampleData::fitSample(std::vector<Minimizer *> &minimizer,
 | 
					 | 
				
			||||||
                             const std::vector<const DoubleModel *> &v,
 | 
					 | 
				
			||||||
                             SampleFitResult &result,
 | 
					 | 
				
			||||||
                             DVec &init,
 | 
					 | 
				
			||||||
                             Index s)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    result.resize(nSample_);
 | 
					 | 
				
			||||||
    result.chi2_.resize(nSample_);
 | 
					 | 
				
			||||||
    result.model_.resize(v.size());
 | 
					 | 
				
			||||||
    FitResult sampleResult;
 | 
					 | 
				
			||||||
    setDataToSample(s);
 | 
					 | 
				
			||||||
    if (s == central)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        sampleResult        = data_.fit(minimizer, init, v);
 | 
					 | 
				
			||||||
        init                = sampleResult.segment(0, init.size());
 | 
					 | 
				
			||||||
        result.nPar_        = sampleResult.getNPar();
 | 
					 | 
				
			||||||
        result.nDof_        = sampleResult.nDof_;
 | 
					 | 
				
			||||||
        result.parName_     = sampleResult.parName_;
 | 
					 | 
				
			||||||
        result.corrRangeDb_ = Math::svdDynamicRangeDb(getFitCorrMat());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        sampleResult = data_.fit(*(minimizer.back()), init, v);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    result[s]       = sampleResult;
 | 
					 | 
				
			||||||
    result.chi2_[s] = sampleResult.getChi2();
 | 
					 | 
				
			||||||
    for (unsigned int j = 0; j < v.size(); ++j)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        result.model_[j].resize(nSample_);
 | 
					 | 
				
			||||||
        result.model_[j][s] = sampleResult.getModel(j);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SampleFitResult XYSampleData::fit(std::vector<Minimizer *> &minimizer,
 | 
					 | 
				
			||||||
                                  const DVec &init,
 | 
					 | 
				
			||||||
                                  const std::vector<const DoubleModel *> &v,
 | 
					 | 
				
			||||||
                                  Index s)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    computeVarMat();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    SampleFitResult result;
 | 
					 | 
				
			||||||
    DVec      initCopy = init;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fitSample(minimizer, v, result, initCopy, s);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SampleFitResult XYSampleData::fit(Minimizer &minimizer,
 | 
					 | 
				
			||||||
                                  const DVec &init,
 | 
					 | 
				
			||||||
                                  const std::vector<const DoubleModel *> &v,
 | 
					 | 
				
			||||||
                                  Index s)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    vector<Minimizer *> mv{&minimizer};
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return fit(mv, init, v, s);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SampleFitResult XYSampleData::fit(std::vector<Minimizer *> &minimizer,
 | 
					SampleFitResult XYSampleData::fit(std::vector<Minimizer *> &minimizer,
 | 
				
			||||||
                                  const DVec &init,
 | 
					                                  const DVec &init,
 | 
				
			||||||
                                  const std::vector<const DoubleModel *> &v)
 | 
					                                  const std::vector<const DoubleModel *> &v)
 | 
				
			||||||
@@ -368,14 +307,43 @@ SampleFitResult XYSampleData::fit(std::vector<Minimizer *> &minimizer,
 | 
				
			|||||||
    computeVarMat();
 | 
					    computeVarMat();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    SampleFitResult      result;
 | 
					    SampleFitResult      result;
 | 
				
			||||||
 | 
					    FitResult            sampleResult;
 | 
				
			||||||
    DVec                 initCopy = init;
 | 
					    DVec                 initCopy = init;
 | 
				
			||||||
    Minimizer::Verbosity verbCopy = minimizer.back()->getVerbosity();
 | 
					    Minimizer::Verbosity verbCopy = minimizer.back()->getVerbosity();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    result.resize(nSample_);
 | 
				
			||||||
 | 
					    result.chi2_.resize(nSample_);
 | 
				
			||||||
 | 
					    result.model_.resize(v.size());
 | 
				
			||||||
    FOR_STAT_ARRAY(result, s)
 | 
					    FOR_STAT_ARRAY(result, s)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        fitSample(minimizer, v, result, initCopy, s);
 | 
					        setDataToSample(s);
 | 
				
			||||||
 | 
					        if (s == central)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            sampleResult = data_.fit(minimizer, initCopy, v);
 | 
				
			||||||
 | 
					            initCopy     = sampleResult.segment(0, initCopy.size());
 | 
				
			||||||
 | 
					            if (verbCopy != Minimizer::Verbosity::Debug)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                minimizer.back()->setVerbosity(Minimizer::Verbosity::Silent);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            sampleResult = data_.fit(*(minimizer.back()), initCopy, v);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        result[s]       = sampleResult;
 | 
				
			||||||
 | 
					        result.chi2_[s] = sampleResult.getChi2();
 | 
				
			||||||
 | 
					        for (unsigned int j = 0; j < v.size(); ++j)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            result.model_[j].resize(nSample_);
 | 
				
			||||||
 | 
					            result.model_[j][s] = sampleResult.getModel(j);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    minimizer.back()->setVerbosity(verbCopy);
 | 
					    minimizer.back()->setVerbosity(verbCopy);
 | 
				
			||||||
 | 
					    result.nPar_       = sampleResult.getNPar();
 | 
				
			||||||
 | 
					    result.nDof_       = sampleResult.nDof_;
 | 
				
			||||||
 | 
					    result.parName_    = sampleResult.parName_;
 | 
				
			||||||
 | 
					    result.corrRangeDb_ = Math::svdDynamicRangeDb(getFitCorrMat());
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -103,13 +103,6 @@ public:
 | 
				
			|||||||
    // get internal XYStatData
 | 
					    // get internal XYStatData
 | 
				
			||||||
    const XYStatData & getData(void);
 | 
					    const XYStatData & getData(void);
 | 
				
			||||||
    // fit
 | 
					    // fit
 | 
				
			||||||
    void            fitSample(std::vector<Minimizer *> &minimizer, 
 | 
					 | 
				
			||||||
                              const std::vector<const DoubleModel *> &v, 
 | 
					 | 
				
			||||||
                              SampleFitResult &sampleResult, DVec &init, Index s);
 | 
					 | 
				
			||||||
    SampleFitResult fit(std::vector<Minimizer *> &minimizer, const DVec &init, 
 | 
					 | 
				
			||||||
                        const std::vector<const DoubleModel *> &v, Index s);
 | 
					 | 
				
			||||||
    SampleFitResult fit(Minimizer &minimizer, const DVec &init, 
 | 
					 | 
				
			||||||
                        const std::vector<const DoubleModel *> &v, Index s);
 | 
					 | 
				
			||||||
    SampleFitResult fit(std::vector<Minimizer *> &minimizer, const DVec &init,
 | 
					    SampleFitResult fit(std::vector<Minimizer *> &minimizer, const DVec &init,
 | 
				
			||||||
                        const std::vector<const DoubleModel *> &v);
 | 
					                        const std::vector<const DoubleModel *> &v);
 | 
				
			||||||
    SampleFitResult fit(Minimizer &minimizer, const DVec &init,
 | 
					    SampleFitResult fit(Minimizer &minimizer, const DVec &init,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    // parse arguments /////////////////////////////////////////////////////////
 | 
					    // parse arguments /////////////////////////////////////////////////////////
 | 
				
			||||||
    OptParser            opt;
 | 
					    OptParser            opt;
 | 
				
			||||||
    bool                 parsed, doLaplace, doPlot, doHeatmap, doCorr, fold, doScan;
 | 
					    bool                 parsed, doLaplace, doPlot, doHeatmap, doCorr, fold, doScan, noGuess;
 | 
				
			||||||
    string               corrFileName, model, outFileName, outFmt, savePlot;
 | 
					    string               corrFileName, model, outFileName, outFmt, savePlot;
 | 
				
			||||||
    Index                ti, tf, shift, nPar, thinning;
 | 
					    Index                ti, tf, shift, nPar, thinning;
 | 
				
			||||||
    double               svdTol;
 | 
					    double               svdTol;
 | 
				
			||||||
@@ -59,6 +59,8 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
                  "show the fit plot");
 | 
					                  "show the fit plot");
 | 
				
			||||||
    opt.addOption("h", "heatmap"  , OptParser::OptType::trigger, true,
 | 
					    opt.addOption("h", "heatmap"  , OptParser::OptType::trigger, true,
 | 
				
			||||||
                  "show the fit correlation heatmap");
 | 
					                  "show the fit correlation heatmap");
 | 
				
			||||||
 | 
					    opt.addOption("", "no-guess"  , OptParser::OptType::trigger, true,
 | 
				
			||||||
 | 
					                  "do not try to guess fit parameters");
 | 
				
			||||||
    opt.addOption("", "save-plot", OptParser::OptType::value, true,
 | 
					    opt.addOption("", "save-plot", OptParser::OptType::value, true,
 | 
				
			||||||
                    "saves the source and .pdf", "");
 | 
					                    "saves the source and .pdf", "");
 | 
				
			||||||
    opt.addOption("", "scan", OptParser::OptType::trigger, true,
 | 
					    opt.addOption("", "scan", OptParser::OptType::trigger, true,
 | 
				
			||||||
@@ -87,6 +89,7 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    fold         = opt.gotOption("fold");
 | 
					    fold         = opt.gotOption("fold");
 | 
				
			||||||
    doPlot       = opt.gotOption("p");
 | 
					    doPlot       = opt.gotOption("p");
 | 
				
			||||||
    doHeatmap    = opt.gotOption("h");
 | 
					    doHeatmap    = opt.gotOption("h");
 | 
				
			||||||
 | 
					    noGuess      = opt.gotOption("no-guess");
 | 
				
			||||||
    savePlot     = opt.optionValue("save-plot");
 | 
					    savePlot     = opt.optionValue("save-plot");
 | 
				
			||||||
    doScan       = opt.gotOption("scan");
 | 
					    doScan       = opt.gotOption("scan");
 | 
				
			||||||
    switch (opt.optionValue<unsigned int>("v"))
 | 
					    switch (opt.optionValue<unsigned int>("v"))
 | 
				
			||||||
@@ -114,7 +117,6 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    nt      = corr[central].rows();
 | 
					    nt      = corr[central].rows();
 | 
				
			||||||
    corr    = corr.block(0, 0, nt, 1);
 | 
					    corr    = corr.block(0, 0, nt, 1);
 | 
				
			||||||
    corr    = CorrelatorUtils::shift(corr, shift);
 | 
					    corr    = CorrelatorUtils::shift(corr, shift);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (doLaplace)
 | 
					    if (doLaplace)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        vector<double> filter = {1., -2., 1.};
 | 
					        vector<double> filter = {1., -2., 1.};
 | 
				
			||||||
@@ -156,11 +158,6 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (fold)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        corr = CorrelatorUtils::fold(corr,modelPar);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // fit /////////////////////////////////////////////////////////////////////
 | 
					    // fit /////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    DVec                init(nPar);
 | 
					    DVec                init(nPar);
 | 
				
			||||||
    NloptMinimizer      globMin(NloptMinimizer::Algorithm::GN_CRS2_LM);
 | 
					    NloptMinimizer      globMin(NloptMinimizer::Algorithm::GN_CRS2_LM);
 | 
				
			||||||
@@ -173,13 +170,14 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    fitter.setThinning(thinning);
 | 
					    fitter.setThinning(thinning);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // set initial values ******************************************************
 | 
					    // set initial values ******************************************************
 | 
				
			||||||
    if (modelPar.type != CorrelatorType::undefined)
 | 
					    if ((modelPar.type != CorrelatorType::undefined) and !noGuess)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        init = CorrelatorModels::parameterGuess(corr, modelPar);
 | 
					        init = CorrelatorModels::parameterGuess(corr, modelPar);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        init.fill(0.1);
 | 
					        init.fill(1.);
 | 
				
			||||||
 | 
					        init(0) = 0.2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // set limits for minimisers ***********************************************
 | 
					    // set limits for minimisers ***********************************************
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,42 +18,30 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Io/Io.hpp>
 | 
					#include <LatAnalyze/Io/Io.hpp>
 | 
				
			||||||
#include <LatAnalyze/Core/OptParser.hpp>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    OptParser            opt;
 | 
					 | 
				
			||||||
    Index  nSample;
 | 
					    Index  nSample;
 | 
				
			||||||
    double val, err;
 | 
					    double val, err;
 | 
				
			||||||
    string outFileName;
 | 
					    string outFileName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    opt.addOption("r", "seed"      , OptParser::OptType::value,   true,
 | 
					    if (argc != 5)
 | 
				
			||||||
                    "random generator seed (default: random)"); 
 | 
					 | 
				
			||||||
    opt.addOption("", "help"      , OptParser::OptType::trigger, true,
 | 
					 | 
				
			||||||
                  "show this help message and exit");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool parsed = opt.parse(argc, argv);
 | 
					 | 
				
			||||||
    if (!parsed or (opt.getArgs().size() != 4) or opt.gotOption("help"))
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        cerr << "usage: " << argv[0];
 | 
					        cerr << "usage: " << argv[0];
 | 
				
			||||||
        cerr << " <central value> <error> <nSample> <output file>" << endl;
 | 
					        cerr << " <central value> <error> <nSample> <output file>" << endl;
 | 
				
			||||||
        cerr << endl << "Possible options:" << endl << opt << endl;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return EXIT_FAILURE;
 | 
					        return EXIT_FAILURE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    val         = strTo<double>(argv[1]);
 | 
					    val         = strTo<double>(argv[1]);
 | 
				
			||||||
    err         = strTo<double>(argv[2]);
 | 
					    err         = strTo<double>(argv[2]);
 | 
				
			||||||
    nSample     = strTo<Index>(argv[3]);
 | 
					    nSample     = strTo<Index>(argv[3]);
 | 
				
			||||||
    outFileName = argv[4];
 | 
					    outFileName = argv[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    random_device         rd;
 | 
					    random_device         rd;
 | 
				
			||||||
    SeedType              seed = (opt.gotOption("r")) ? opt.optionValue<SeedType>("r") : rd();
 | 
					    mt19937               gen(rd());
 | 
				
			||||||
    mt19937               gen(seed);
 | 
					 | 
				
			||||||
    normal_distribution<> dis(val, err);
 | 
					    normal_distribution<> dis(val, err);
 | 
				
			||||||
    DSample               res(nSample);
 | 
					    DSample               res(nSample);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,23 +38,9 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        DMatSample s    = Io::load<DMatSample>(fileName);
 | 
					        DMatSample s    = Io::load<DMatSample>(fileName);
 | 
				
			||||||
        string     name = Io::getFirstName(fileName);
 | 
					        string     name = Io::getFirstName(fileName);
 | 
				
			||||||
        Index nRows     = s[central].rows();
 | 
					 | 
				
			||||||
        Index nCols     = s[central].cols();
 | 
					 | 
				
			||||||
        cout << scientific;
 | 
					        cout << scientific;
 | 
				
			||||||
        cout << "central value +/-  standard deviation\n" << endl;
 | 
					        cout << "central value:\n"      << s[central]               << endl;
 | 
				
			||||||
        cout << "Re:" << endl;
 | 
					        cout << "standard deviation:\n" << s.variance().cwiseSqrt() << endl;
 | 
				
			||||||
        for(Index i = 0; i < nRows; i++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            cout << s[central](i,0) << " +/- " << s.variance().cwiseSqrt()(i,0) << endl;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if(nCols == 2)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            cout << "\nIm:" << endl;
 | 
					 | 
				
			||||||
            for(Index i = 0; i < nRows; i++)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                cout << s[central](i,1) << " +/- " << s.variance().cwiseSqrt()(i,1) << endl;
 | 
					 | 
				
			||||||
            }   
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!copy.empty())
 | 
					        if (!copy.empty())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Io::save(s, copy, File::Mode::write, name);
 | 
					            Io::save(s, copy, File::Mode::write, name);
 | 
				
			||||||
@@ -65,8 +51,8 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
        DSample s    = Io::load<DSample>(fileName);
 | 
					        DSample s    = Io::load<DSample>(fileName);
 | 
				
			||||||
        string  name = Io::getFirstName(fileName);
 | 
					        string  name = Io::getFirstName(fileName);
 | 
				
			||||||
        cout << scientific;
 | 
					        cout << scientific;
 | 
				
			||||||
        cout << "central value +/-  standard deviation\n" << endl;
 | 
					        cout << "central value:\n"      << s[central]         << endl;
 | 
				
			||||||
        cout << s[central] << " +/- " << sqrt(s.variance()) << endl;
 | 
					        cout << "standard deviation:\n" << sqrt(s.variance()) << endl;
 | 
				
			||||||
        if (!copy.empty())
 | 
					        if (!copy.empty())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Io::save(s, copy, File::Mode::write, name);
 | 
					            Io::save(s, copy, File::Mode::write, name);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user