38 #include <Evergreen/evergreen.hpp>
40 typedef unsigned long int uiint;
50 template <
typename Label>
60 std::map<int, double>
chgLLhoods = {{1, 0.7}, {2, 0.9}, {3, 0.7}, {4, 0.5}, {5, 0.5}};
67 return std::pow(2., log2(1. -
beta_) + summ * log2(1. -
alpha_));
75 evergreen::TableDependency<Label>
createProteinFactor(Label
id,
double prior,
int nrMissingPeps = 0);
91 evergreen::TableDependency<Label>
createSumFactor(
size_t nrParents, Label nId);
93 evergreen::TableDependency<Label>
createChargeFactor(Label repId, Label chargeId,
int chg);
100 evergreen::PseudoAdditiveDependency<Label>
createBFPeptideProbabilisticAdderFactor(
const std::set<Label> & parentProteinIDs, Label nId,
const std::vector<evergreen::TableDependency <Label> > & deps);
117 const std::vector<std::vector<Label>> & parentsOfPeps,
118 const std::vector<double> & pepEvidences,
119 evergreen::InferenceGraphBuilder<Label> & igb);
129 template <
typename Label>
131 assert(0. <= alpha && alpha <= 1.);
132 assert(0. <= beta && beta <= 1.);
133 assert(0. <= gamma && gamma <= 1.);
136 assert(0. < pep_prior && pep_prior < 1.);
141 pepPrior_ = pep_prior;
144 template <
typename Label>
146 double prior = gamma_;
147 if (nrMissingPeps > 0)
149 double powFactor = std::pow(1.0 - alpha_, -nrMissingPeps);
150 prior = -prior/(prior * powFactor - prior - powFactor);
152 double table[] = {1.0 - prior, prior};
153 evergreen::LabeledPMF<Label> lpmf({
id}, evergreen::PMF({0L}, evergreen::Tensor<double>::from_array(table)));
154 return evergreen::TableDependency<Label>(lpmf,p_);
157 template <
typename Label>
159 if (nrMissingPeps > 0)
161 double powFactor = std::pow(1.0 - alpha_, -nrMissingPeps);
162 prior = -prior/(prior * powFactor - prior - powFactor);
164 double table[] = {1.0 - prior, prior};
165 evergreen::LabeledPMF<Label> lpmf({
id}, evergreen::PMF({0L}, evergreen::Tensor<double>::from_array(table)));
166 return evergreen::TableDependency<Label>(lpmf,p_);
169 template <
typename Label>
171 double table[] = {(1 - prob) * (1 - pepPrior_), prob * pepPrior_};
172 evergreen::LabeledPMF<Label> lpmf({
id}, evergreen::PMF({0L}, evergreen::Tensor<double>::from_array(table)));
173 return evergreen::TableDependency<Label>(lpmf,p_);
177 template <
typename Label>
179 evergreen::Tensor<double> table({static_cast<unsigned long>(nrParents + 1) , 2});
180 for (
unsigned long i=0; i <= nrParents; ++i) {
181 double notConditional = notConditionalGivenSum(i);
182 unsigned long indexArr[2] = {i,0ul};
183 table[indexArr] = notConditional;
184 unsigned long indexArr2[2] = {i,1ul};
185 table[indexArr2] = 1.0 - notConditional;
188 evergreen::LabeledPMF<Label> lpmf({nId, pepId}, evergreen::PMF({0L,0L}, table));
190 return evergreen::TableDependency<Label>(lpmf,p_);
193 template <
typename Label>
195 evergreen::Tensor<double> table({static_cast<unsigned long>(nrParents + 1) , 2});
196 unsigned long z[2]{0ul,0ul};
197 unsigned long z1[2]{0ul,1ul};
198 table[z] = 1. - beta_;
200 for (
unsigned long i=1; i <= nrParents; ++i) {
201 double notConditional = notConditionalGivenSum(i);
202 unsigned long indexArr[2] = {i,0ul};
203 table[indexArr] = notConditional / i;
204 unsigned long indexArr2[2] = {i,1ul};
205 table[indexArr2] = (1.0 - notConditional) / i;
208 evergreen::LabeledPMF<Label> lpmf({nId, pepId}, evergreen::PMF({0L,0L}, table));
210 return evergreen::TableDependency<Label>(lpmf,p_);
213 template <
typename Label>
215 evergreen::Tensor<double> table({nrParents+1});
216 for (
unsigned long i=0; i <= nrParents; ++i) {
217 table[i] = 1.0/(nrParents+1.);
220 evergreen::LabeledPMF<Label> lpmf({nId}, evergreen::PMF({0L}, table));
222 return evergreen::TableDependency<Label>(lpmf,p_);
225 template <
typename Label>
227 using arr =
unsigned long[2];
228 evergreen::Tensor<double> table({2,2});
229 table[arr{0,0}] = 0.999;
230 table[arr{0,1}] = 0.001;
231 table[arr{1,0}] = 0.1;
232 table[arr{1,1}] = 0.9;
234 evergreen::LabeledPMF<Label> lpmf({seqId,repId}, evergreen::PMF({0L,0L}, table));
236 return evergreen::TableDependency<Label>(lpmf,p_);
239 template <
typename Label>
241 double chgPrior = chgLLhoods[chg];
242 using arr =
unsigned long[2];
243 evergreen::Tensor<double> table({2,2});
244 table[arr{0,0}] = 0.999;
245 table[arr{0,1}] = 0.001;
246 table[arr{1,0}] = 0.1;
247 table[arr{1,1}] = chgPrior;
249 evergreen::LabeledPMF<Label> lpmf({repId,chgId}, evergreen::PMF({0L,0L}, table));
251 return evergreen::TableDependency<Label>(lpmf,p_);
254 template <
typename Label>
256 std::vector<std::vector<Label>> parents;
257 std::transform(parentProteinIDs.begin(), parentProteinIDs.end(), std::back_inserter(parents), [](
const Label& l){
return std::vector<Label>{l};});
258 return evergreen::AdditiveDependency<Label>(parents, {nId}, p_);
261 template <
typename Label>
263 std::vector<std::vector<Label>> parents;
264 std::transform(parentProteinIDs.begin(), parentProteinIDs.end(), std::back_inserter(parents), [](
const Label& l){
return std::vector<Label>{l};});
265 return evergreen::AdditiveDependency<Label>(parents, {nId}, p_);
268 template <
typename Label>
270 std::vector<std::vector<Label>> parents;
271 std::transform(parentProteinIDs.begin(), parentProteinIDs.end(), std::back_inserter(parents), [](
const Label& l){
return std::vector<Label>{l};});
272 return evergreen::PseudoAdditiveDependency<Label>(parents, {nId}, deps, p_);
277 template <
typename Label>
279 const std::vector<std::vector<Label>>& parentsOfPeps,
280 const std::vector<double>& pepEvidences,
281 evergreen::InferenceGraphBuilder<Label>& igb)
284 assert(parentsOfPeps.size() == pepEvidences.size());
285 for (
const std::vector<uiint>& parents : parentsOfPeps)
286 for (Label parent : parents)
287 assert(
std::find(protIDs.begin(), protIDs.end(), parent) != protIDs.end());
289 for (
uiint pid : protIDs)
290 igb.insert_dependency(createProteinFactor(pid));
292 for (
uiint j = 0; j < parentsOfPeps.size(); j++)
294 igb.insert_dependency(createPeptideEvidenceFactor(j,pepEvidences[j]));
295 igb.insert_dependency(createSumEvidenceFactor(parentsOfPeps[j],j,j));
296 igb.insert_dependency(createPeptideProbabilisticAdderFactor(parentsOfPeps[j],j));