The current implementation of the phylim app only accepts a model_result object. This does not work if the model result has come from a split_codon=True model. In the latter case, there is no single likelihood function so the line
tree = model_result.lf.tree
fails because model_result.lf is an ordered dictionary instead of a likelihood function.
Here are several possible solutions.
solution 1
To this is to implement a separate method that uses singledispatchmethod decorator to split the inference based on whether the input data is a model_result or a likelihood function object. A user could then extract the individual likelihood functions from a split_codon model result and pass each separately to the app.
This allows a user to handle custom cases themselves, but puts the burden of that solution on them.
solution 2
We examine whether the model result has multiple values and if it does we iterate over those values producing a single PhyloLimitRec as the output.
This is the lowest barrier to the user and does not require a change on the current phylim.main() method.
solution 3
We do both of the above. I think this is what's going to be required.
the workaround
For current users, if you encounter this problem here's the work around. In brief, you will need to create a separate model_result from each likelihood function in your split_codon=True result.
from cogent3.app.result import model_result
from cogent3.app.composable import define_app
from phylim.apps import phylim, PhyloLimitRec
@define_app
def phylim_split_codon(result: model_result, check_one: phylim) -> PhyloLimitRec:
"""checks individual likelihood functions from a split_codon model_result"""
for k in range (1, 4):
value = result[k]
one = model_result(name=result.name, source=result.source)
one['value'] = value
checked = check_one(one)
if not checked.is_identifiable:
return checked
return checked
The current implementation of the
phylimapp only accepts amodel_resultobject. This does not work if the model result has come from asplit_codon=Truemodel. In the latter case, there is no single likelihood function so the linefails because
model_result.lfis an ordered dictionary instead of a likelihood function.Here are several possible solutions.
solution 1
To this is to implement a separate method that uses
singledispatchmethoddecorator to split the inference based on whether the input data is amodel_resultor a likelihood function object. A user could then extract the individual likelihood functions from a split_codon model result and pass each separately to the app.This allows a user to handle custom cases themselves, but puts the burden of that solution on them.
solution 2
We examine whether the model result has multiple values and if it does we iterate over those values producing a single
PhyloLimitRecas the output.This is the lowest barrier to the user and does not require a change on the current
phylim.main()method.solution 3
We do both of the above. I think this is what's going to be required.
the workaround
For current users, if you encounter this problem here's the work around. In brief, you will need to create a separate
model_resultfrom each likelihood function in yoursplit_codon=Trueresult.