Skip to content

Commit 48cbb82

Browse files
committed
Fix double free. Allow frequencies to be equal from the command line using -f e
1 parent 8024a37 commit 48cbb82

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/physher.c

+19-13
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,7 @@ int main(int argc, char* argv[]){
14371437

14381438
{ARGS_OPTION_STRING, 'm', "model", "substmodel.type", &model_string_user, "Susbtitution model"},
14391439
{ARGS_OPTION_STRING, 0, "states", "substmodel.states", &markov_states, "State space of Markov process. For nucleotide --states A,C,G,T"},
1440-
{ARGS_OPTION_STRING, 'f', "frequencies", "substmodel.freqs", &frequencies_string_user, "Frequencies as an array. For nucleotide -f 0.2,0.3,0.4,0.1"},
1440+
{ARGS_OPTION_STRING, 'f', "frequencies", "substmodel.freqs", &frequencies_string_user, "Frequencies as an array or 'e' for equal frequencies. For nucleotide -f 0.2,0.3,0.4,0.1"},
14411441
{ARGS_OPTION_STRING, 'r', "rates", "substmodel.rates", &rates_user, "Relative rates of the susbtitution matrix"},
14421442
{ARGS_OPTION_BOOLEAN, 0, "q-normalize", "substmodel.matrix.normalize", &normalize_q, "Normalize rate matrix"},
14431443
{ARGS_OPTION_FLAG, 0, "f-unknown", "substmodel.root.freqs.unknown", &frequencies_unknown, "Set frequencies to 1.0"},
@@ -1733,7 +1733,7 @@ int main(int argc, char* argv[]){
17331733

17341734
}
17351735
else {
1736-
model_string = model_string_user;
1736+
model_string = String_clone(model_string_user);
17371737
}
17381738
}
17391739
else{
@@ -1867,9 +1867,17 @@ int main(int argc, char* argv[]){
18671867

18681868
double *frequencies_user = NULL;
18691869
if ( frequencies_string_user != NULL ) {
1870-
unsigned nfreqs = 0;
1871-
frequencies_user = String_to_double_array( frequencies_string_user, ',', &nfreqs);
1872-
assert(nfreqs==dataType->stateCount);
1870+
if(strlen(frequencies_string_user) == 1 && tolower(frequencies_string_user[0]) == 'e'){
1871+
frequencies_user = dvector(matrixDimension);
1872+
for (int i = 0; i < matrixDimension; i ++) {
1873+
frequencies_user[i] = 1.0/matrixDimension;
1874+
}
1875+
}
1876+
else{
1877+
unsigned nfreqs = 0;
1878+
frequencies_user = String_to_double_array( frequencies_string_user, ',', &nfreqs);
1879+
assert(nfreqs==matrixDimension);
1880+
}
18731881
}
18741882

18751883
if ( dataType->type == DATA_TYPE_NUCLEOTIDE ) {
@@ -2091,11 +2099,8 @@ int main(int argc, char* argv[]){
20912099
StringBuffer_append_string(info, "Model: Generic\n\n");
20922100

20932101
// empirical
2094-
double *freqs = dvector(matrixDimension);
20952102
unsigned *rateIndexes = NULL;
20962103

2097-
//empirical_generic_frequencies(seqs, freqs);
2098-
20992104
if( strcasecmp(model_string,"ER") == 0 ){
21002105
rateIndexes = uivector(matrixDimension*matrixDimension);
21012106
}
@@ -2122,11 +2127,12 @@ int main(int argc, char* argv[]){
21222127

21232128
free(rateIndexes);
21242129

2125-
2126-
memcpy(mod->_freqs, freqs, matrixDimension*sizeof(double));
2127-
2128-
free(freqs);
2129-
2130+
if(frequencies_user != NULL){
2131+
memcpy(mod->_freqs, frequencies_user, sizeof(double)*matrixDimension);
2132+
}
2133+
else if(!frequencies_unknown){
2134+
empirical_generic_frequencies(seqs, mod->_freqs);
2135+
}
21302136
if(!normalize_q){
21312137
mod->normalize = false;
21322138
mod->need_update = true;

0 commit comments

Comments
 (0)