229 lines
8.5 KiB
C++
229 lines
8.5 KiB
C++
#include "Settings.h"
|
||
#include <vector>
|
||
#include <iostream>
|
||
#include <fstream>
|
||
#include <cstdio>
|
||
#include <boost/algorithm/string.hpp>
|
||
#include <boost/tokenizer.hpp>
|
||
#include <QVector>
|
||
#include <qmath.h>
|
||
|
||
#ifdef LINUX
|
||
#define sscanf_s sscanf
|
||
#endif
|
||
|
||
#define sscanf_s sscanf
|
||
|
||
// Default parameters
|
||
bool Settings::WRITE_FULL_STATISTICS_TO_FILE = false;
|
||
|
||
int Settings::Iterations = 10;
|
||
long int Settings::InitPopSize = 10;
|
||
float Settings::InitRatioBetweenPops = 1.f;
|
||
|
||
|
||
double Settings::BirthRate = 0.01;
|
||
double Settings::NaturalDeathRate = 0.01;
|
||
|
||
long int Settings::KMaxParameter = 10000;
|
||
|
||
int Settings::OffspringsMean = 3;
|
||
float Settings::CoadaptiveThreshold = 0;
|
||
float Settings::CoadaptiveMinimumP = 0.2f;
|
||
float Settings::CoadaptiveMaximumTrait = 15.f;
|
||
|
||
float Settings::DiseaseThreshold = 1;
|
||
std::string Settings::CoadaptiveGenesInteraction = "onechromosome";
|
||
std::string Settings::DiseaseGenesInteraction = "add";
|
||
|
||
|
||
std::string Settings::BreedingStrategy = "default";
|
||
std::string Settings::GenToPhenStrategy = "default";
|
||
std::string Settings::PhenToFitStrategy = "default";
|
||
std::string Settings::RecombinationStrategy = "default";
|
||
|
||
double Settings::ProbMtDNARecomb = 0.0;
|
||
int Settings::PopulationHomoInitSize = 1000;
|
||
int Settings::PopulationAncientInitSize = 1000;
|
||
double Settings::migrationPartHomoToAncient = 0.1;
|
||
double Settings::migrationPartAncientToHomo = 0.1;
|
||
int Settings::generationsPerMigration = 100;
|
||
int Settings::locusLength = 60;
|
||
double Settings::percentDiffLoci = 0.1;
|
||
int Settings::numLoci = 50;
|
||
// (END) Default parameters
|
||
int Settings::globalGenerations;
|
||
int Settings::maxYval;
|
||
int Settings::minYval;
|
||
QVector<double> Settings::homoCommonSize;
|
||
QVector<double> Settings::homoFemaleSize;
|
||
QVector<double> Settings::homoMaleSize;
|
||
QVector<double> Settings::ancientCommonSize;
|
||
QVector<double> Settings::ancientFemaleSize;
|
||
QVector<double> Settings::ancientMaleSize;
|
||
QVector<double> Settings::generations;
|
||
|
||
std::vector<std::string> Settings::initMtDNA;
|
||
std::vector<std::string> Settings::initMtDNA_ancient;
|
||
std::vector<std::string> Settings::calcScript;
|
||
|
||
QVector<QVector<double> > Settings::malesGene;
|
||
QVector<QVector<double> > Settings::femalesGene;
|
||
QVector<std::string> Settings::geneName;
|
||
|
||
|
||
void Settings::initGUIvect()
|
||
{
|
||
// Settings::globalGenerations = 1;
|
||
// Settings::maxYval = 0;
|
||
// Settings::minYval = 0;
|
||
// Settings::homoCommonSize.clear();
|
||
// Settings::homoFemaleSize.clear();
|
||
// Settings::homoMaleSize.clear();
|
||
// Settings::ancientCommonSize.clear();
|
||
// Settings::ancientFemaleSize.clear();
|
||
// Settings::ancientMaleSize.clear();
|
||
// Settings::generations.clear();
|
||
|
||
// Settings::initMtDNA.clear();
|
||
// Settings::initMtDNA_ancient.clear();
|
||
// Settings::calcScript.clear();
|
||
|
||
Settings::generations.push_back(0);
|
||
|
||
Settings::homoCommonSize.push_back(Settings::PopulationHomoInitSize);
|
||
Settings::homoFemaleSize.push_back(Settings::PopulationHomoInitSize / 2);
|
||
Settings::homoMaleSize.push_back(Settings::PopulationHomoInitSize / 2);
|
||
Settings::ancientCommonSize.push_back(Settings::PopulationAncientInitSize);
|
||
Settings::ancientFemaleSize.push_back(Settings::PopulationAncientInitSize / 2);
|
||
Settings::ancientMaleSize.push_back(Settings::PopulationAncientInitSize / 2);
|
||
}
|
||
|
||
void Settings::fillVectors(BisexualPopulation* pop_Sapiens, BisexualPopulation* pop_Ancient)
|
||
{
|
||
Settings::globalGenerations++;
|
||
Settings::generations.push_back(Settings::globalGenerations);
|
||
Settings::ancientCommonSize.push_back(pop_Ancient->females.size() + pop_Ancient->males.size());
|
||
Settings::homoCommonSize.push_back(pop_Sapiens->females.size() + pop_Sapiens->males.size());
|
||
Settings::ancientMaleSize.push_back(pop_Ancient->males.size());
|
||
Settings::ancientFemaleSize.push_back(pop_Ancient->females.size());
|
||
Settings::homoMaleSize.push_back(pop_Sapiens->males.size());
|
||
Settings::homoFemaleSize.push_back(pop_Sapiens->females.size());
|
||
Settings::maxYval = qMax(pop_Ancient->females.size() + pop_Ancient->males.size(), pop_Sapiens->females.size() + pop_Sapiens->males.size());
|
||
Settings::minYval = qMin(pop_Ancient->females.size() + pop_Ancient->males.size(), pop_Sapiens->females.size() + pop_Sapiens->males.size());
|
||
}
|
||
|
||
void Settings::initScript(std::string fileName){
|
||
std::vector<std::string> script;
|
||
std::ifstream file(fileName.c_str());
|
||
std::string str;
|
||
|
||
while(getline(file,str)){
|
||
if(str.length() > 2)
|
||
script.push_back(str);
|
||
}
|
||
file.close();
|
||
|
||
// process Script
|
||
unsigned int curLine;
|
||
for(curLine = 0; curLine < script.size(); curLine++){
|
||
if(script.at(curLine).at(0) == '/' || script.at(curLine).at(0) == '#')
|
||
continue;
|
||
|
||
std::vector<std::string > tokensVector; // Search for tokens
|
||
boost::split(tokensVector, script.at(curLine), boost::is_any_of("=") );
|
||
|
||
std::string instr = tokensVector.at(0);
|
||
boost::to_lower(instr);
|
||
boost::trim(instr);
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(instr == "fullstat"){
|
||
int flag = 0;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%d", &flag);
|
||
if(flag != 0)
|
||
Settings::WRITE_FULL_STATISTICS_TO_FILE = true;
|
||
}
|
||
else if(instr == "generations" || instr == "iterations" ){
|
||
int iter = Settings::Iterations;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%d", &iter);
|
||
Settings::Iterations = iter;
|
||
}
|
||
else if(instr == "initpopsize" || instr == "init_pop_size" || instr == "popsize" ){
|
||
long int size = Settings::InitPopSize;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%ld", &size);
|
||
Settings::InitPopSize = size;
|
||
}
|
||
else if(instr == "initratio" || instr == "init_ratio" || instr == "init_ratio_between_pop_size" ){
|
||
float size = Settings::InitRatioBetweenPops;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%f", &size);
|
||
Settings::InitRatioBetweenPops = size;
|
||
}
|
||
else if(instr == "birth" || instr == "birthrate" || instr == "birth_rate" ){
|
||
double rate = Settings::BirthRate;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%lg", &rate);
|
||
Settings::BirthRate = rate;
|
||
}
|
||
else if(instr == "death" || instr == "deathrate" || instr == "death_rate" ){
|
||
double rate = Settings::NaturalDeathRate;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%lg", &rate);
|
||
Settings::NaturalDeathRate = rate;
|
||
}
|
||
else if(instr == "kmax"){
|
||
long int kMax = Settings::KMaxParameter;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%ld", &kMax);
|
||
Settings::KMaxParameter = kMax;
|
||
}
|
||
else if(instr == "offsprings" || instr == "offsprings_mean" ){
|
||
int offsprings = Settings::OffspringsMean;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%d", &offsprings);
|
||
Settings::OffspringsMean = offsprings;
|
||
}
|
||
else if(instr == "coadaptivet" || instr == "coadaptive_threshold" ){
|
||
float coadaptive = Settings::CoadaptiveThreshold;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%f", &coadaptive);
|
||
Settings::CoadaptiveThreshold = coadaptive;
|
||
}
|
||
else if(instr == "coadaptivemax" || instr == "coadaptive_maximum_trait" ){
|
||
float coadaptive = Settings::CoadaptiveMaximumTrait;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%f", &coadaptive);
|
||
Settings::CoadaptiveMaximumTrait = coadaptive;
|
||
}
|
||
else if(instr == "coadaptivemin" || instr == "coadaptive_minimum_p" ){
|
||
float coadaptive = Settings::CoadaptiveMinimumP;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%f", &coadaptive);
|
||
Settings::CoadaptiveMinimumP = coadaptive;
|
||
}
|
||
else if(instr == "diseaset" || instr == "disease_threshold" ){
|
||
float disease = Settings::DiseaseThreshold;
|
||
sscanf_s(tokensVector.at(1).c_str(),"%f", &disease);
|
||
Settings::DiseaseThreshold = disease;
|
||
}
|
||
else if(instr == "coadaptivegenesinteract" || instr == "cgi"){
|
||
//long int kMax = Settings::KMaxParameter;
|
||
//sscanf_s(tokensVector.at(1).c_str(),"%ld", &kMax);
|
||
std::string cgi = tokensVector.at(1);
|
||
boost::to_lower(cgi);
|
||
boost::trim(cgi);
|
||
Settings::CoadaptiveGenesInteraction = cgi;
|
||
}
|
||
else if(instr == "diseasegenesinteract" || instr == "dgi"){
|
||
//long int kMax = Settings::KMaxParameter;
|
||
//sscanf_s(tokensVector.at(1).c_str(),"%ld", &kMax);
|
||
std::string dgi = tokensVector.at(1);
|
||
boost::to_lower(dgi);
|
||
boost::trim(dgi);
|
||
Settings::DiseaseGenesInteraction = dgi;
|
||
}
|
||
//*****************************
|
||
else if(instr == "breedings"){
|
||
//long int kMax = Settings::KMaxParameter;
|
||
//sscanf_s(tokensVector.at(1).c_str(),"%ld", &kMax);
|
||
std::string strategy = tokensVector.at(1);
|
||
boost::to_lower(strategy);
|
||
boost::trim(strategy);
|
||
Settings::BreedingStrategy = strategy;
|
||
}
|
||
} // (END) for(curLine = 0; curLine < script.size(); curLine++)
|
||
}
|