[med-svn] [Git][med-team/hyphy][master] 4 commits: routine-update: New upstream version
Étienne Mollier (@emollier)
gitlab at salsa.debian.org
Sat Jan 13 16:07:04 GMT 2024
Étienne Mollier pushed to branch master at Debian Med / hyphy
Commits:
16c076a1 by Étienne Mollier at 2024-01-13T16:59:20+01:00
routine-update: New upstream version
- - - - -
14ff91d5 by Étienne Mollier at 2024-01-13T16:59:21+01:00
New upstream version 2.5.59+dfsg
- - - - -
3ff2a942 by Étienne Mollier at 2024-01-13T16:59:29+01:00
Update upstream source from tag 'upstream/2.5.59+dfsg'
Update to upstream version '2.5.59+dfsg'
with Debian dir 44ea0abcc2f5c6230c5a94bd2e54cad9ff0d8088
- - - - -
0339ccbb by Étienne Mollier at 2024-01-13T17:04:44+01:00
routine-update: Ready to upload to unstable
- - - - -
13 changed files:
- CMakeLists.txt
- debian/changelog
- res/TemplateBatchFiles/SelectionAnalyses/FADE.bf
- res/TemplateBatchFiles/SelectionAnalyses/MEME.bf
- res/TemplateBatchFiles/SelectionAnalyses/error-filter.bf
- src/core/formula.cpp
- src/core/global_things.cpp
- src/core/include/formula.h
- src/core/include/matrix.h
- src/core/include/simplelist.h
- src/core/likefunc.cpp
- src/core/matrix.cpp
- src/core/tree.cpp
Changes:
=====================================
CMakeLists.txt
=====================================
@@ -169,7 +169,11 @@ set_source_files_properties(${SRC_CORE} ${SRC_NEW} {SRC_UTILS} PROPERTIES COMPIL
set(DEFAULT_WARNING_FLAGS " -w -Weffc++ -Wextra -Wall ")
set(DEFAULT_DEBUG_WARNING_FLAGS "-Wall -Wno-int-to-pointer-cast -Wno-conversion-null -Wno-sign-compare")
+set(ADDITIONAL_FLAGS "")
+if (DEBUGFLAGS)
+ set(ADDITIONAL_FLAGS "-g")
+endif()
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
@@ -289,7 +293,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
endif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
#set(DEFAULT_COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} -fopt-info -fopt-info-vec-missed")
-set(DEFAULT_COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS}")
+set(DEFAULT_COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} ${ADDITIONAL_FLAGS}")
if(NOT DEFINED DEFAULT_COMPILE_FLAGS)
set(DEFAULT_COMPILE_FLAGS "")
@@ -299,7 +303,7 @@ if(NOT DEFINED DEFAULT_LINK_FLAGS)
set(DEFAULT_LINK_FLAGS "")
endif(NOT DEFINED DEFAULT_LINK_FLAGS)
-set(DEFAULT_LINK_FLAGS "${DEFAULT_LINK_FLAGS} ")
+set(DEFAULT_LINK_FLAGS "${DEFAULT_LINK_FLAGS} ${ADDITIONAL_FLAGS}")
if(NOT DEFINED DEFAULT_WARNING_FLAGS)
set(DEFAULT_WARNING_FLAGS "")
@@ -309,7 +313,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
set(DEFAULT_COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} -fwasm-exceptions ")
endif()
-MESSAGE ("Set default compiler flags to ${DEFAULT_COMPILE_FLAGS}")
+MESSAGE ("Set compiler flags to ${DEFAULT_COMPILE_FLAGS}")
+MESSAGE ("Set linker flags to ${DEFAULT_LINK_FLAGS}")
#-------------------------------------------------------------------------------
# OpenMP support
=====================================
debian/changelog
=====================================
@@ -1,3 +1,9 @@
+hyphy (2.5.59+dfsg-1) unstable; urgency=medium
+
+ * New upstream version
+
+ -- Étienne Mollier <emollier at debian.org> Sat, 13 Jan 2024 17:00:01 +0100
+
hyphy (2.5.58+dfsg-1) unstable; urgency=medium
* New upstream version
=====================================
res/TemplateBatchFiles/SelectionAnalyses/FADE.bf
=====================================
@@ -544,7 +544,7 @@ for (fade.residue = 0; fade.residue < 20; fade.residue += 1) {
LikelihoodFunction fade.lf = (fade.lf.components);
estimators.ApplyExistingEstimates ("fade.lf", fade.model_id_to_object, fade.baseline_fit, None);
-
+
fade.conditionals.raw = fade.ComputeOnGrid ("fade.lf",
fade.grid.MatrixToDict (fade.cache[terms.fade.cache.grid]),
"fade.pass2.evaluator",
=====================================
res/TemplateBatchFiles/SelectionAnalyses/MEME.bf
=====================================
@@ -659,7 +659,15 @@ for (meme.partition_index = 0; meme.partition_index < meme.partition_count; meme
SetParameter (DEFER_CONSTRAINT_APPLICATION, 1, 0);
+ utility.ToggleEnvVariable ("LOOP_TREE_ITERATOR_PREORDER", TRUE);
+
+ is_root = TRUE;
+
for (_node_; in; meme.site_tree_fel) {
+ if (is_root) {
+ is_root = FALSE;
+ continue;
+ }
_bl_ = ((meme.final_partitioned_mg_results[terms.branch_length])[meme.partition_index])[_node_];
_node_class_ = (meme.selected_branches[meme.partition_index])[_node_];
if (_node_class_ != terms.tree_attributes.test) {
@@ -669,10 +677,10 @@ for (meme.partition_index = 0; meme.partition_index < meme.partition_count; meme
meme.apply_site_constraints ("meme.site_tree_bsrel",_node_,_bl_,meme.scaler_mapping ['FG']);
meme.apply_site_constraints ("meme.site_tree_fel",_node_,_bl_,meme.scaler_mapping ['FEL-FG']);
}
-
-
}
+ utility.ToggleEnvVariable ("LOOP_TREE_ITERATOR_PREORDER", None);
+
SetParameter (DEFER_CONSTRAINT_APPLICATION, 0, 0);
=====================================
res/TemplateBatchFiles/SelectionAnalyses/error-filter.bf
=====================================
@@ -94,10 +94,14 @@ if (efilter.error_sink_proportion == 0) {
}
efilter.error_sink_prior_odds_ratio = Min (1e25,efilter.error_sink_proportion / efilter.fast_omega_proportion);
+efilter.verbose_logging = utility.GetEnvVariable ("VERBOSE_LOGGING");
+
efilter.site_offset = 0;
utility.ToggleEnvVariable ("LOOP_TREE_ITERATOR_PREORDER", TRUE);
+
+
for (p = 0; p < efilter.input[terms.json.partition_count]; p+=1) {
efilter.sequences = {};
efilter.masked_sites = {};
@@ -175,6 +179,19 @@ for (p = 0; p < efilter.input[terms.json.partition_count]; p+=1) {
efilter.site_BF2 = 1e25;
}
+ if (efilter.verbose_logging ) {
+ if (efilter.site_BF >= efilter.threshold || efilter.site_BF2 >= efilter.ratio_threshold) {
+ if (efilter.site_BF >= efilter.threshold && efilter.site_BF2 >= efilter.ratio_threshold) {
+ fprintf (stdout, "FILTERED\n");
+ } else {
+ fprintf (stdout, "KEPT\n");
+ }
+ fprintf (stdout, ">" + (site+1) + "/" + node, " " + efilter.site_BF + ":" +efilter.site_BF2 + "\n");
+
+ }
+ }
+
+
if (efilter.site_BF >= efilter.threshold && efilter.site_BF2 >= efilter.ratio_threshold) {
if (efilter.masked_sites/node) { // terminal node
if (efilter.masked_already [ntm] != 1) {
@@ -189,12 +206,15 @@ for (p = 0; p < efilter.input[terms.json.partition_count]; p+=1) {
if (efilter.masked_already [ntm] != 1) {
efilter.masked_sites [ntm] + (site + efilter.site_offset);
}
- }
- //console.log ("Masking everything " + site + " " + node + " " + Abs (efilter.leaf_descendants) / Abs (efilter.sequences));
+ }
+ if (efilter.verbose_logging) {}
+ console.log ("Masking everything " + site + " " + node + " " + Abs (efilter.leaf_descendants) / Abs (efilter.sequences));
+ }
break;
}
for (ntm, ignore; in; efilter.leaf_descendants[node]) {
efilter.write_out[ntm] = "---";
+ //console.log ("Masking child " + ntm + " of parent " + node + " at site " + (1+site));
if (efilter.masked_already [ntm] != 1) {
efilter.masked_sites [ntm] + (site + efilter.site_offset);
}
=====================================
src/core/formula.cpp
=====================================
@@ -2309,15 +2309,26 @@ bool _Formula::ConvertToSimple (_AVLList& variable_index) {
delete [] simpleExpressionStatus;
simpleExpressionStatus = nil;
}
+
+ theStack.Reset();
+ long available_slots = MIN (32, sizeof (long) * MEMORYSTEP / sizeof (hyFloat));
+ long used_float_slots = 0;
+ hyFloat * store_constant = (hyFloat*)theStack.theStack._getStatic();
+
if (!theFormula.empty()) {
simpleExpressionStatus = new long [theFormula.countitems()];
for (unsigned long i=0UL; i<theFormula.countitems(); i++) {
_Operation* this_op = ItemAt (i);
- simpleExpressionStatus[i] = -4L;
+ simpleExpressionStatus[i] = -64L;
if (this_op->theNumber) {
- simpleExpressionStatus[i] = -1L;
+ if (used_float_slots < available_slots) {
+ store_constant [used_float_slots++] = this_op->theNumber->Value();
+ simpleExpressionStatus[i] = -1L - used_float_slots;
+ } else {
+ simpleExpressionStatus[i] = -1L;
+ }
} else if (this_op->theData >= 0) {
this_op->theData = variable_index.FindLong (this_op->theData);
simpleExpressionStatus[i] = this_op->theData;
@@ -2331,8 +2342,10 @@ bool _Formula::ConvertToSimple (_AVLList& variable_index) {
this_op->numberOfTerms = -3;
}
}
- if (this_op->opCode == HY_OP_CODE_RANDOM || this_op->opCode == HY_OP_CODE_TIME)
+
+ if (this_op->opCode == HY_OP_CODE_RANDOM || this_op->opCode == HY_OP_CODE_TIME) {
has_volatiles = true;
+ }
if (this_op->numberOfTerms == 2) {
switch (this_op->opCode) {
@@ -2393,95 +2406,98 @@ hyFloat _Formula::ComputeSimple (_SimpleFormulaDatum* stack, _SimpleFormulaDatum
if (theFormula.nonempty()) {
long stackTop = 0;
unsigned long upper_bound = NumberOperations();
-
+
+ const hyFloat * constants = (hyFloat*)theStack.theStack._getStatic();
+
for (unsigned long i=0UL; i<upper_bound; i++) {
- if (simpleExpressionStatus[i] == -1L) {
- stack[stackTop++].value = ItemAt (i)->theNumber->Value();
- /*if (thisOp->theNumber) {
- stack[stackTop++].value = thisOp->theNumber->Value();
- continue;*/
+ if (simpleExpressionStatus[i] >= 0L) {
+ stack[stackTop++] = varValues[simpleExpressionStatus[i]];
} else {
- if (simpleExpressionStatus[i] >= 0) {
- stack[stackTop++] = varValues[simpleExpressionStatus[i]];
+ if (simpleExpressionStatus[i] <= -2L && simpleExpressionStatus[i] >= -32L) {
+ stack[stackTop++].value = constants[-simpleExpressionStatus[i] - 2L];
} else {
- if (simpleExpressionStatus[i] <= -10000L) {
- stackTop--;
- switch (-simpleExpressionStatus[i] - 10000L) {
- case HY_OP_CODE_ADD:
- stack[stackTop-1].value = stack[stackTop-1].value + stack[stackTop].value;
- break;
- case HY_OP_CODE_SUB:
- stack[stackTop-1].value = stack[stackTop-1].value - stack[stackTop].value;
- break;
- case HY_OP_CODE_MUL:
- stack[stackTop-1].value = stack[stackTop-1].value * stack[stackTop].value;
- break;
- case HY_OP_CODE_DIV:
- stack[stackTop-1].value = stack[stackTop-1].value / stack[stackTop].value;
- break;
- case HY_OP_CODE_POWER: {
- //stack[stackTop-1].value = pow (stack[stackTop-1].value, stack[stackTop].value);
-
- if (stack[stackTop-1].value==0.0) {
- if (stack[stackTop].value > 0.0) {
- return 0.0;
- } else {
- return 1.0;
- }
- }
- stack[stackTop-1].value = pow (stack[stackTop-1].value, stack[stackTop].value);
-
- break;
- }
- default:
- HandleApplicationError ("Internal error in _Formula::ComputeSimple - unsupported shortcut operation.)", true);
- return 0.0;
- }
+ if (simpleExpressionStatus[i] == -1L) {
+ stack[stackTop++].value = ((_Operation**)theFormula.list_data)[i]->theNumber->Value();
} else {
- _Operation const* thisOp = ItemAt (i);
- stackTop--;
- if (thisOp->numberOfTerms==2) {
- hyFloat (*theFunc) (hyFloat, hyFloat);
- theFunc = (hyFloat(*)(hyFloat,hyFloat))thisOp->opCode;
- if (stackTop<1L) {
- HandleApplicationError ("Internal error in _Formula::ComputeSimple - stack underflow.)", true);
- return 0.0;
+ if (simpleExpressionStatus[i] <= -10000L) {
+ stackTop--;
+ switch (-simpleExpressionStatus[i] - 10000L) {
+ case HY_OP_CODE_ADD:
+ stack[stackTop-1].value = stack[stackTop-1].value + stack[stackTop].value;
+ break;
+ case HY_OP_CODE_SUB:
+ stack[stackTop-1].value = stack[stackTop-1].value - stack[stackTop].value;
+ break;
+ case HY_OP_CODE_MUL:
+ stack[stackTop-1].value = stack[stackTop-1].value * stack[stackTop].value;
+ break;
+ case HY_OP_CODE_DIV:
+ stack[stackTop-1].value = stack[stackTop-1].value / stack[stackTop].value;
+ break;
+ case HY_OP_CODE_POWER: {
+ //stack[stackTop-1].value = pow (stack[stackTop-1].value, stack[stackTop].value);
+
+ if (stack[stackTop-1].value==0.0) {
+ if (stack[stackTop].value > 0.0) {
+ return 0.0;
+ } else {
+ return 1.0;
+ }
+ }
+ stack[stackTop-1].value = pow (stack[stackTop-1].value, stack[stackTop].value);
+
+ break;
+ }
+ default:
+ HandleApplicationError ("Internal error in _Formula::ComputeSimple - unsupported shortcut operation.)", true);
+ return 0.0;
}
- stack[stackTop-1].value = (*theFunc)(stack[stackTop-1].value,stack[stackTop].value);
} else {
- switch (thisOp->numberOfTerms) {
- case -2 : {
- hyFloat (*theFunc) (hyPointer,hyFloat);
- theFunc = (hyFloat(*)(hyPointer,hyFloat))thisOp->opCode;
+ _Operation const* thisOp = ItemAt (i);
+ stackTop--;
+ if (thisOp->numberOfTerms==2) {
+ hyFloat (*theFunc) (hyFloat, hyFloat);
+ theFunc = (hyFloat(*)(hyFloat,hyFloat))thisOp->opCode;
if (stackTop<1L) {
HandleApplicationError ("Internal error in _Formula::ComputeSimple - stack underflow.)", true);
return 0.0;
}
- stack[stackTop-1].value = (*theFunc)(stack[stackTop-1].reference,stack[stackTop].value);
- break;
- }
- case -3 : {
- void (*theFunc) (hyPointer,hyFloat,hyFloat);
- theFunc = (void(*)(hyPointer,hyFloat,hyFloat))thisOp->opCode;
- if (stackTop != 2 || i != theFormula.lLength - 1) {
- HandleApplicationError ("Internal error in _Formula::ComputeSimple - stack underflow or MCoord command is not the last one.)", true);
-
- return 0.0;
- }
- //stackTop = 0;
- // value, reference, index
- (*theFunc)(stack[1].reference,stack[2].value, stack[0].value);
- break;
- }
- default: {
- hyFloat (*theFunc) (hyFloat);
- theFunc = (hyFloat(*)(hyFloat))thisOp->opCode;
- stack[stackTop].value = (*theFunc)(stack[stackTop].value);
- ++stackTop;
+ stack[stackTop-1].value = (*theFunc)(stack[stackTop-1].value,stack[stackTop].value);
+ } else {
+ switch (thisOp->numberOfTerms) {
+ case -2 : {
+ hyFloat (*theFunc) (hyPointer,hyFloat);
+ theFunc = (hyFloat(*)(hyPointer,hyFloat))thisOp->opCode;
+ if (stackTop<1L) {
+ HandleApplicationError ("Internal error in _Formula::ComputeSimple - stack underflow.)", true);
+ return 0.0;
+ }
+ stack[stackTop-1].value = (*theFunc)(stack[stackTop-1].reference,stack[stackTop].value);
+ break;
+ }
+ case -3 : {
+ void (*theFunc) (hyPointer,hyFloat,hyFloat);
+ theFunc = (void(*)(hyPointer,hyFloat,hyFloat))thisOp->opCode;
+ if (stackTop != 2 || i != theFormula.lLength - 1) {
+ HandleApplicationError ("Internal error in _Formula::ComputeSimple - stack underflow or MCoord command is not the last one.)", true);
+
+ return 0.0;
+ }
+ //stackTop = 0;
+ // value, reference, index
+ (*theFunc)(stack[1].reference,stack[2].value, stack[0].value);
+ break;
+ }
+ default: {
+ hyFloat (*theFunc) (hyFloat);
+ theFunc = (hyFloat(*)(hyFloat))thisOp->opCode;
+ stack[stackTop].value = (*theFunc)(stack[stackTop].value);
+ ++stackTop;
+ }
+ }
+
}
- }
-
}
}
}
=====================================
src/core/global_things.cpp
=====================================
@@ -122,7 +122,7 @@ namespace hy_global {
kErrorStringMatrixExportError ("Export matrix called with a non-polynomial matrix argument"),
kErrorStringNullOperand ("Attempting to operate on an undefined value; this is probably the result of an earlier 'soft' error condition"),
kErrorNumerical ("To treat numerical errors as warnings, please specify \"ENV=TOLERATE_NUMERICAL_ERRORS=1;\" as the command line argument. This often resolves the issue, which is indicative of numerical instability."),
- kHyPhyVersion = _String ("2.5.58"),
+ kHyPhyVersion = _String ("2.5.59"),
kNoneToken = "None",
kNullToken = "null",
=====================================
src/core/include/formula.h
=====================================
@@ -80,7 +80,7 @@ protected:
_List* resultCache;
_Stack theStack;
_List theFormula;
- long* simpleExpressionStatus;
+ long* simpleExpressionStatus;
/**
SLKP: 20200924
Added this shorthand to improve memory locality and speed-up SimpleCompute performance
=====================================
src/core/include/matrix.h
=====================================
@@ -75,6 +75,7 @@ struct _CompiledMatrixData {
hyFloat * formulaValues;
long * formulaRefs;
+ long stackDepth;
bool has_volatile_entries;
_SimpleList varIndex,
=====================================
src/core/include/simplelist.h
=====================================
@@ -684,6 +684,10 @@ class _SimpleList:public BaseObj {
long* quickArrayAccess(void) {
return (long*)list_data;
}
+
+ long* _getStatic () {
+ return static_data;
+ }
};
//TODO:Why is this a global function? If it needs to be, should be in helpers.cpp
=====================================
src/core/likefunc.cpp
=====================================
@@ -4589,10 +4589,13 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
shrink_factor = MAX(GOLDEN_RATIO,MIN(stdFactor,oldAverage/averageChange));
long steps = logLHistory.get_used();
+ //printf ("DIFFS\n");
for (long k = 1; k <= MIN(5, steps-1); k++) {
diffs[k-1] = logLHistory.theData[steps-k] - logLHistory.theData[steps-k-1];
- //printf ("\n==> DIFFS %ld : %g\n", k, diffs[k-1]);
+ //printf ("==> DIFFS %ld : %g\n", k, diffs[k-1]);
}
+ //printf ("\n");
+
if (steps > 2 && diffs[0] >= diffs[1]) {
convergenceMode = 1;
}
@@ -4647,7 +4650,8 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
}
}
- if (convergenceMode >= 2) {
+ //printf ("NO CHANGE %d\n", noChange.countitems());
+ if (convergenceMode >= 3) {
noChange.Clear();
noChange << -1;
}
@@ -4772,6 +4776,9 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
}
large_change.Clear();
+
+ //ObjectToConsole (&_variables_that_dont_change);
+ //NLToConsole();
LoggerAddCoordinatewisePhase (shrink_factor, convergenceMode);
@@ -4810,12 +4817,20 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
}
}
+ if (_variables_that_dont_change.get (current_index) > 1) {
+ if (convergenceMode <= 2 && inCount < termFactor -1) {
+ averageChange2+=bestVal;
+ continue;
+ }
+ }
+
_Vector *vH = nil;
hyFloat precisionStep = 0.,
brackStep;
if (use_adaptive_step) {
+
vH = (_Vector*)(*stepHistory)(current_index);
//hyFloat suggestedPrecision = currentPrecision*(1.+198./(1.+exp(sqrt(loopCounter))));
@@ -4934,9 +4949,17 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
if (cj != 0.) {
averageChange += fabs (ch/cj);
}
- if ((ch < precisionStep*0.01 /*|| lastLogL - maxSoFar < 1e-6*/) && inCount == 0) {
- nc2 << current_index;
+ //printf ("VAR %d change %g (%g, %d)\n", current_index, ch, precisionStep*0.01, inCount);
+
+ if (ch < 1e-6) {
_variables_that_dont_change[current_index] ++;
+ } else {
+ _variables_that_dont_change[current_index] = 0;
+ }
+
+ if ((ch < precisionStep*0.01 /*|| lastLogL - maxSoFar < 1e-6*/) && inCount < termFactor - 1) {
+ nc2 << current_index;
+
}
} else {
averageChange += ch;
@@ -4999,7 +5022,15 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
averageChange/=(hyFloat)(indexInd.lLength-nc2.lLength+1);
// mean of change in parameter values during the last step
+ //BufferToConsole("\nNO CHANGE BEFORE\n");
+ //ObjectToConsole(&noChange);
+ //NLToConsole ();
+ //ObjectToConsole(&nc2);
+ //NLToConsole ();
+
+
if (glVars.lLength == indexInd.lLength) {
+ // only global variables in the LF
noChange.Clear();
noChange.Duplicate (&nc2);
} else {
@@ -5015,20 +5046,24 @@ _Matrix* _LikelihoodFunction::Optimize (_AssociativeList const * options)
});
if (at_boundary.nonempty()) {
- _SimpleList nc3;
- nc3.Union (nc2,at_boundary);
- noChange.Subtract (nc3,glVars);
- //ObjectToConsole(&at_boundary);
- //NLToConsole();
+ //_SimpleList nc3;
+ //nc3.Union (nc2,at_boundary);
+ //noChange.Subtract (nc3,glVars);
+ noChange.Union (nc2, at_boundary);
+ // variables on the boundary and those that did not change will be skipped in the next iteration.
} else {
- noChange.Subtract (nc2,glVars);
+ //noChange.Subtract (nc2,glVars);
+ noChange = nc2;
}
+ // always interate over globals
}
if (noChange.empty()) {
noChange << -1;
}
-
+
+ //BufferToConsole("\nNO CHANGE AFTER\n");
+ //ObjectToConsole(&noChange);
forward = true;
=====================================
src/core/matrix.cpp
=====================================
@@ -2479,6 +2479,25 @@ bool _Matrix::ProcessFormulas (long& stackLength, _AVLList& varList, _S
_Formula ** theFormulas = (_Formula**)theData;
bool isGood = true;
+
+ auto process_formula = [&] (_Formula * this_formula) -> bool {
+ if (runAll || this_formula->AmISimple(stackLength,varList)) {
+ _String * flaString = (_String*)this_formula->toStr(kFormulaStringConversionNormal, nil,true);
+ long fref = flaStrings.Insert(flaString,newFormulas.lLength);
+ if (fref < 0) {
+ references << flaStrings.GetXtra (-fref-1);
+ DeleteObject (flaString);
+ } else {
+ newFormulas << (long)this_formula;
+ references << fref;
+ }
+
+ } else {
+ isGood = false;
+ return false;
+ }
+ return true;
+ };
if (theIndex) {
for (long i = 0L; i<lDim; i++) {
@@ -2488,20 +2507,7 @@ bool _Matrix::ProcessFormulas (long& stackLength, _AVLList& varList, _S
references << -1;
continue;
}
- thisFormula = theFormulas[i];
- if (runAll || thisFormula->AmISimple(stackLength,varList)) {
- _String * flaString = (_String*)thisFormula->toStr(kFormulaStringConversionNormal, nil,true);
- long fref = flaStrings.Insert(flaString,newFormulas.lLength);
- if (fref < 0) {
- references << flaStrings.GetXtra (-fref-1);
- DeleteObject (flaString);
- } else {
- newFormulas << (long)thisFormula;
- references << fref;
- }
-
- } else {
- isGood = false;
+ if (! process_formula (theFormulas[i])) {
break;
}
} else {
@@ -2510,28 +2516,18 @@ bool _Matrix::ProcessFormulas (long& stackLength, _AVLList& varList, _S
}
} else {
for (long i = 0L; i<lDim; i++) {
- if ((theFormulas[i]!=(_Formula*)ZEROPOINTER)&&(!theFormulas[i]->IsEmpty())) {
- thisFormula = theFormulas[i];
-
+
+ thisFormula = theFormulas[i];
+
+ if ((thisFormula!=(_Formula*)ZEROPOINTER)&&(!thisFormula->IsEmpty())) {
if (stencil && CheckEqual(stencil->theData[i],0.0)) {
references << -1;
continue;
}
-
- if (runAll || thisFormula->AmISimple(stackLength,varList)) {
- _String * flaString = (_String*)thisFormula->toStr(kFormulaStringConversionNormal, nil,true);
- long fref = flaStrings.Insert(flaString,newFormulas.lLength);
- if (fref < 0) {
- references << flaStrings.GetXtra (-fref-1);
- DeleteObject (flaString);
- } else {
- newFormulas << (long)thisFormula;
- references << fref;
- }
- } else {
- isGood = false;
+ if (! process_formula (thisFormula)) {
break;
}
+
} else {
references << -1;
}
@@ -2686,6 +2682,7 @@ void _Matrix::MakeMeSimple (void) {
cmd = new _CompiledMatrixData;
cmd->has_volatile_entries = false;
+ cmd->stackDepth = stackLength;
for (unsigned long k = 0; k < newFormulas.lLength; k++) {
cmd->has_volatile_entries = ((_Formula*)newFormulas.get(k))->ConvertToSimple(varList) || cmd->has_volatile_entries;
@@ -5359,7 +5356,7 @@ void _Matrix::CompressSparseMatrix (bool transpose, hyFloat * stash) {
_Matrix* _Matrix::Exponentiate (hyFloat scale_to, bool check_transition, _Matrix * existing_storage) {
// find the maximal elements of the matrix
-
+
try {
if (!is_square()) {
throw _String ("Exponentiate is not defined for non-square matrices");
@@ -5679,8 +5676,9 @@ _Matrix* _Matrix::Exponentiate (hyFloat scale_to, bool check_transition, _Mat
if (check_transition) {
bool pass = true;
if (result->is_dense()) {
- for (unsigned long r = 0L; r < result->lDim; r += result->vDim) {
+ for (unsigned long r = 0L; r < result->lDim; r += result->vDim + 1) {
if (result->theData[r] > 1.) {
+ //printf ("\nDIAGONAL > 1 (%d, %g)\n", r, result->theData[r]);
pass = false;
break;
}
=====================================
src/core/tree.cpp
=====================================
@@ -2750,14 +2750,7 @@ void _TheTree::ExponentiateMatrices (_List& expNodes, long tc, long catI
}
-
- //if (hasExpForm && (3*(flatTree.countitems() + flatLeaves.countitems()) < (mes_counter-b4)))
- // printf ("%d/%d (%d)\n\n", mes_counter-b4, expNodes.lLength, flatTree.countitems() + flatLeaves.countitems());
- //printf ("%ld %d\n", nodesToDo.lLength, hasExpForm);
- //ObjectToConsole(&isExplicitForm);
-
- unsigned long id;
-
+
_List * computedExponentials = hasExpForm? new _List (matrixQueue.lLength) : nil;
_SimpleList parallel, serial;
@@ -2773,14 +2766,14 @@ void _TheTree::ExponentiateMatrices (_List& expNodes, long tc, long catI
if (parallel.lLength) {
#ifdef _OPENMP
#if _OPENMP>=201511
- #pragma omp parallel for default(shared) private (id) schedule(dynamic, cs) proc_bind(spread) if (nt>1) num_threads (nt)
+ #pragma omp parallel for default(shared) schedule(dynamic, cs) proc_bind(spread) if (nt>1) num_threads (nt)
#else
#if _OPENMP>=200803
- #pragma omp parallel for default(shared) private (id) schedule(guided) proc_bind(spread) if (nt>1) num_threads (nt)
+ #pragma omp parallel for default(shared) schedule(guided) proc_bind(spread) if (nt>1) num_threads (nt)
#endif
#endif
#endif
- for (id = 0; id < parallel.lLength; id++) {
+ for (long id = 0L; id < parallel.lLength; id++) {
long matrixID = parallel.get (id);
if (isExplicitForm.list_data[matrixID] == 0 || !hasExpForm) { // normal matrix to exponentiate
((_CalcNode*) nodesToDo(matrixID))->SetCompExp ((_Matrix*)matrixQueue(matrixID), catID, true);
@@ -2790,27 +2783,12 @@ void _TheTree::ExponentiateMatrices (_List& expNodes, long tc, long catI
}
}
- for ( id = 0; id < serial.lLength; id++) {
+ for (long id = 0L; id < serial.lLength; id++) {
long matrixID = serial.get (id);
_Matrix *already_computed = ((_Matrix*)matrixQueue(matrixID));
(*computedExponentials) [matrixID] = already_computed;
}
- /*for (matrixID = 0; matrixID < matrixQueue.lLength; matrixID++) {
- if (isExplicitForm.list_data[matrixID] == 0 || !hasExpForm) { // normal matrix to exponentiate
- ((_CalcNode*) nodesToDo(matrixID))->SetCompExp ((_Matrix*)matrixQueue(matrixID), catID, true);
- } else {
- if (isExplicitForm.list_data[matrixID] > 0) {
- (*computedExponentials) [matrixID] = ((_Matrix*)matrixQueue(matrixID))->Exponentiate(1., true);
- } else {
- _Matrix *already_computed = ((_Matrix*)matrixQueue(matrixID));
- (*computedExponentials) [matrixID] = already_computed;
- //printf ("\tNO MATRIX UPDATE %d (%d)\n", matrixID, already_computed->GetReferenceCounter());
- //ObjectToConsole( (*computedExponentials) [matrixID] );
- //already_computed ->AddAReference();
- }
- }
- }*/
if (computedExponentials) {
_CalcNode * current_node = nil;
View it on GitLab: https://salsa.debian.org/med-team/hyphy/-/compare/fbc1f5c84605cd290cce7ed5d59d72d4b4b2b23a...0339ccbb62d48ae89f5fe95b29c2186fb5aac43b
--
View it on GitLab: https://salsa.debian.org/med-team/hyphy/-/compare/fbc1f5c84605cd290cce7ed5d59d72d4b4b2b23a...0339ccbb62d48ae89f5fe95b29c2186fb5aac43b
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20240113/00994427/attachment-0001.htm>
More information about the debian-med-commit
mailing list