Add hyperparameter convergence_best

move test libraries to test folder
This commit is contained in:
2024-04-30 00:52:09 +02:00
parent f014928411
commit ae469b8146
721 changed files with 206095 additions and 2496 deletions

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -65,280 +65,280 @@
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L156">_ZN8bayesnet7Network3fitERKN2at6TensorES4_S4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE</a></td>
<td class="coverFnHi">1</td>
<td class="coverFnHi">11</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L14">_ZN8bayesnet7NetworkC2Ef</a></td>
<td class="coverFnHi">2</td>
<td class="coverFnHi">22</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L422">_ZNK8bayesnet7Network8dump_cptB5cxx11Ev</a></td>
<td class="coverFnHi">2</td>
<td class="coverFnHi">22</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L273">_ZN8bayesnet7Network5scoreERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_</a></td>
<td class="coverFnHi">5</td>
<td class="coverFnHi">55</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L342">_ZNK8bayesnet7Network4showB5cxx11Ev</a></td>
<td class="coverFnHi">7</td>
<td class="coverFnHi">77</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L40">_ZN8bayesnet7Network10getSamplesEv</a></td>
<td class="coverFnHi">12</td>
<td class="coverFnHi">132</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L235">_ZN8bayesnet7Network7predictERKSt6vectorIS1_IiSaIiEESaIS3_EE</a></td>
<td class="coverFnHi">12</td>
<td class="coverFnHi">132</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L65">_ZNK8bayesnet7Network9getStatesEv</a></td>
<td class="coverFnHi">12</td>
<td class="coverFnHi">132</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L175">_ZN8bayesnet7Network3fitERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_RKS1_IdSaIdEERKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISJ_EERKSJ_RKSt3mapISJ_S3_St4lessISJ_ESaISt4pairISO_S3_EEE</a></td>
<td class="coverFnHi">21</td>
<td class="coverFnHi">231</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L355">_ZNK8bayesnet7Network5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">22</td>
<td class="coverFnHi">242</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L381">_ZNK8bayesnet7Network11getNumEdgesEv</a></td>
<td class="coverFnHi">48</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L57">_ZNK8bayesnet7Network11getFeaturesB5cxx11Ev</a></td>
<td class="coverFnHi">52</td>
<td class="coverFnHi">563</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L385">_ZN8bayesnet7Network16topological_sortB5cxx11Ev</a></td>
<td class="coverFnHi">55</td>
<td class="coverFnHi">605</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L57">_ZNK8bayesnet7Network11getFeaturesB5cxx11Ev</a></td>
<td class="coverFnHi">607</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L369">_ZNK8bayesnet7Network8getEdgesB5cxx11Ev</a></td>
<td class="coverFnHi">59</td>
<td class="coverFnHi">684</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L257">_ZN8bayesnet7Network13predict_probaERKSt6vectorIS1_IiSaIiEESaIS3_EE</a></td>
<td class="coverFnHi">68</td>
<td class="coverFnHi">777</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L228">_ZN8bayesnet7Network7predictERKN2at6TensorE</a></td>
<td class="coverFnHi">245</td>
<td class="coverFnHi">3262</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L27">_ZN8bayesnet7Network10initializeEv</a></td>
<td class="coverFnHi">286</td>
<td class="coverFnHi">3358</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L222">_ZN8bayesnet7Network13predict_probaERKN2at6TensorE</a></td>
<td class="coverFnHi">304</td>
<td class="coverFnHi">3540</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L167">_ZN8bayesnet7Network3fitERKN2at6TensorES4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE</a></td>
<td class="coverFnHi">305</td>
<td class="coverFnHi">3545</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L188">_ZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorE</a></td>
<td class="coverFnHi">313</td>
<td class="coverFnHi">3633</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L147">_ZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEE</a></td>
<td class="coverFnHi">313</td>
<td class="coverFnHi">3633</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L118">_ZN8bayesnet7Network12checkFitDataEiiiRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RKSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEERKN2at6TensorE</a></td>
<td class="coverFnHi">327</td>
<td class="coverFnHi">3787</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L18">_ZN8bayesnet7NetworkC2ERKS0_</a></td>
<td class="coverFnHi">414</td>
<td class="coverFnHi">4761</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L36">_ZNK8bayesnet7Network13getMaxThreadsEv</a></td>
<td class="coverFnHi">417</td>
<td class="coverFnHi">4794</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L11">_ZN8bayesnet7NetworkC2Ev</a></td>
<td class="coverFnHi">435</td>
<td class="coverFnHi">4992</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L61">_ZNK8bayesnet7Network17getClassNumStatesEv</a></td>
<td class="coverFnHi">496</td>
<td class="coverFnHi">5704</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L203">_ZN8bayesnet7Network14predict_tensorERKN2at6TensorEb</a></td>
<td class="coverFnHi">549</td>
<td class="coverFnHi">6802</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L44">_ZN8bayesnet7Network7addNodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">8878</td>
<td class="coverFnHi">116878</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L194">_ZZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorEENKUlvE_clEv</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L150">_ZZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEEENKUlRSE_E_clESK_</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L285">_ZN8bayesnet7Network14predict_sampleERKSt6vectorIiSaIiEE</a></td>
<td class="coverFnHi">13606</td>
<td class="coverFnHi">155486</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L93">_ZN8bayesnet7Network7addEdgeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_</a></td>
<td class="coverFnHi">16946</td>
<td class="coverFnHi">224276</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L77">_ZN8bayesnet7Network8isCyclicERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt13unordered_setIS6_St4hashIS6_ESt8equal_toIS6_ESaIS6_EESG_</a></td>
<td class="coverFnHi">22324</td>
<td class="coverFnHi">295830</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L299">_ZN8bayesnet7Network14predict_sampleERKN2at6TensorE</a></td>
<td class="coverFnHi">95840</td>
<td class="coverFnHi">1163291</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L320">_ZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE</a></td>
<td class="coverFnHi">109442</td>
<td class="coverFnHi">1318733</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L312">_ZN8bayesnet7Network13computeFactorERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE</a></td>
<td class="coverFnHi">437768</td>
<td class="coverFnHi">5150558</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L339">_ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKdE_clESH_</a></td>
<td class="coverFnHi">437768</td>
<td class="coverFnHi">5150558</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L326">_ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlvE_clEv</a></td>
<td class="coverFnHi">437768</td>
<td class="coverFnHi">5150558</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L73">_ZNK8bayesnet7Network12getClassNameB5cxx11Ev</a></td>
<td class="coverFnHi">437774</td>
<td class="coverFnHi">5150624</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L114">_ZN8bayesnet7Network8getNodesB5cxx11Ev</a></td>
<td class="coverFnHi">437841</td>
<td class="coverFnHi">5151361</td>
</tr>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -65,280 +65,280 @@
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L40">_ZN8bayesnet7Network10getSamplesEv</a></td>
<td class="coverFnHi">12</td>
<td class="coverFnHi">132</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L27">_ZN8bayesnet7Network10initializeEv</a></td>
<td class="coverFnHi">286</td>
<td class="coverFnHi">3358</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L188">_ZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorE</a></td>
<td class="coverFnHi">313</td>
<td class="coverFnHi">3633</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L118">_ZN8bayesnet7Network12checkFitDataEiiiRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_RKSt3mapIS7_S1_IiSaIiEESt4lessIS7_ESaISt4pairISC_SG_EEERKN2at6TensorE</a></td>
<td class="coverFnHi">327</td>
<td class="coverFnHi">3787</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L312">_ZN8bayesnet7Network13computeFactorERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE</a></td>
<td class="coverFnHi">437768</td>
<td class="coverFnHi">5150558</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L222">_ZN8bayesnet7Network13predict_probaERKN2at6TensorE</a></td>
<td class="coverFnHi">304</td>
<td class="coverFnHi">3540</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L257">_ZN8bayesnet7Network13predict_probaERKSt6vectorIS1_IiSaIiEESaIS3_EE</a></td>
<td class="coverFnHi">68</td>
<td class="coverFnHi">777</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L320">_ZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE</a></td>
<td class="coverFnHi">109442</td>
<td class="coverFnHi">1318733</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L299">_ZN8bayesnet7Network14predict_sampleERKN2at6TensorE</a></td>
<td class="coverFnHi">95840</td>
<td class="coverFnHi">1163291</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L285">_ZN8bayesnet7Network14predict_sampleERKSt6vectorIiSaIiEE</a></td>
<td class="coverFnHi">13606</td>
<td class="coverFnHi">155486</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L203">_ZN8bayesnet7Network14predict_tensorERKN2at6TensorEb</a></td>
<td class="coverFnHi">549</td>
<td class="coverFnHi">6802</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L385">_ZN8bayesnet7Network16topological_sortB5cxx11Ev</a></td>
<td class="coverFnHi">55</td>
<td class="coverFnHi">605</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L167">_ZN8bayesnet7Network3fitERKN2at6TensorES4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE</a></td>
<td class="coverFnHi">305</td>
<td class="coverFnHi">3545</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L156">_ZN8bayesnet7Network3fitERKN2at6TensorES4_S4_RKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKSB_RKSt3mapISB_S5_IiSaIiEESt4lessISB_ESaISt4pairISG_SK_EEE</a></td>
<td class="coverFnHi">1</td>
<td class="coverFnHi">11</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L175">_ZN8bayesnet7Network3fitERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_RKS1_IdSaIdEERKS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISJ_EERKSJ_RKSt3mapISJ_S3_St4lessISJ_ESaISt4pairISO_S3_EEE</a></td>
<td class="coverFnHi">21</td>
<td class="coverFnHi">231</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L273">_ZN8bayesnet7Network5scoreERKSt6vectorIS1_IiSaIiEESaIS3_EERKS3_</a></td>
<td class="coverFnHi">5</td>
<td class="coverFnHi">55</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L93">_ZN8bayesnet7Network7addEdgeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_</a></td>
<td class="coverFnHi">16946</td>
<td class="coverFnHi">224276</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L44">_ZN8bayesnet7Network7addNodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">8878</td>
<td class="coverFnHi">116878</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L228">_ZN8bayesnet7Network7predictERKN2at6TensorE</a></td>
<td class="coverFnHi">245</td>
<td class="coverFnHi">3262</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L235">_ZN8bayesnet7Network7predictERKSt6vectorIS1_IiSaIiEESaIS3_EE</a></td>
<td class="coverFnHi">12</td>
<td class="coverFnHi">132</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L114">_ZN8bayesnet7Network8getNodesB5cxx11Ev</a></td>
<td class="coverFnHi">437841</td>
<td class="coverFnHi">5151361</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L77">_ZN8bayesnet7Network8isCyclicERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt13unordered_setIS6_St4hashIS6_ESt8equal_toIS6_ESaIS6_EESG_</a></td>
<td class="coverFnHi">22324</td>
<td class="coverFnHi">295830</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L147">_ZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEE</a></td>
<td class="coverFnHi">313</td>
<td class="coverFnHi">3633</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L18">_ZN8bayesnet7NetworkC2ERKS0_</a></td>
<td class="coverFnHi">414</td>
<td class="coverFnHi">4761</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L14">_ZN8bayesnet7NetworkC2Ef</a></td>
<td class="coverFnHi">2</td>
<td class="coverFnHi">22</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L11">_ZN8bayesnet7NetworkC2Ev</a></td>
<td class="coverFnHi">435</td>
<td class="coverFnHi">4992</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L57">_ZNK8bayesnet7Network11getFeaturesB5cxx11Ev</a></td>
<td class="coverFnHi">52</td>
<td class="coverFnHi">607</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L381">_ZNK8bayesnet7Network11getNumEdgesEv</a></td>
<td class="coverFnHi">48</td>
<td class="coverFnHi">563</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L73">_ZNK8bayesnet7Network12getClassNameB5cxx11Ev</a></td>
<td class="coverFnHi">437774</td>
<td class="coverFnHi">5150624</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L36">_ZNK8bayesnet7Network13getMaxThreadsEv</a></td>
<td class="coverFnHi">417</td>
<td class="coverFnHi">4794</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L61">_ZNK8bayesnet7Network17getClassNumStatesEv</a></td>
<td class="coverFnHi">496</td>
<td class="coverFnHi">5704</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L342">_ZNK8bayesnet7Network4showB5cxx11Ev</a></td>
<td class="coverFnHi">7</td>
<td class="coverFnHi">77</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L355">_ZNK8bayesnet7Network5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">22</td>
<td class="coverFnHi">242</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L422">_ZNK8bayesnet7Network8dump_cptB5cxx11Ev</a></td>
<td class="coverFnHi">2</td>
<td class="coverFnHi">22</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L369">_ZNK8bayesnet7Network8getEdgesB5cxx11Ev</a></td>
<td class="coverFnHi">59</td>
<td class="coverFnHi">684</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L65">_ZNK8bayesnet7Network9getStatesEv</a></td>
<td class="coverFnHi">12</td>
<td class="coverFnHi">132</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L194">_ZZN8bayesnet7Network11completeFitERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEERKN2at6TensorEENKUlvE_clEv</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L339">_ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKdE_clESH_</a></td>
<td class="coverFnHi">437768</td>
<td class="coverFnHi">5150558</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L326">_ZZN8bayesnet7Network14exactInferenceERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlvE_clEv</a></td>
<td class="coverFnHi">437768</td>
<td class="coverFnHi">5150558</td>
</tr>
<tr>
<td class="coverFn"><a href="Network.cc.gcov.html#L150">_ZZN8bayesnet7Network9setStatesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIiSaIiEESt4lessIS7_ESaISt4pairIKS7_SA_EEEENKUlRSE_E_clESK_</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -72,405 +72,405 @@
<span id="L10"><span class="lineNum"> 10</span> : #include &quot;Network.h&quot;</span>
<span id="L11"><span class="lineNum"> 11</span> : #include &quot;bayesnet/utils/bayesnetUtils.h&quot;</span>
<span id="L12"><span class="lineNum"> 12</span> : namespace bayesnet {</span>
<span id="L13"><span class="lineNum"> 13</span> <span class="tlaGNC tlaBgGNC"> 435 : Network::Network() : fitted{ false }, maxThreads{ 0.95 }, classNumStates{ 0 }, laplaceSmoothing{ 0 }</span></span>
<span id="L13"><span class="lineNum"> 13</span> <span class="tlaGNC tlaBgGNC"> 4992 : Network::Network() : fitted{ false }, maxThreads{ 0.95 }, classNumStates{ 0 }, laplaceSmoothing{ 0 }</span></span>
<span id="L14"><span class="lineNum"> 14</span> : {</span>
<span id="L15"><span class="lineNum"> 15</span> <span class="tlaGNC"> 435 : }</span></span>
<span id="L16"><span class="lineNum"> 16</span> <span class="tlaGNC"> 2 : Network::Network(float maxT) : fitted{ false }, maxThreads{ maxT }, classNumStates{ 0 }, laplaceSmoothing{ 0 }</span></span>
<span id="L15"><span class="lineNum"> 15</span> <span class="tlaGNC"> 4992 : }</span></span>
<span id="L16"><span class="lineNum"> 16</span> <span class="tlaGNC"> 22 : Network::Network(float maxT) : fitted{ false }, maxThreads{ maxT }, classNumStates{ 0 }, laplaceSmoothing{ 0 }</span></span>
<span id="L17"><span class="lineNum"> 17</span> : {</span>
<span id="L18"><span class="lineNum"> 18</span> : </span>
<span id="L19"><span class="lineNum"> 19</span> <span class="tlaGNC"> 2 : }</span></span>
<span id="L20"><span class="lineNum"> 20</span> <span class="tlaGNC"> 414 : Network::Network(const Network&amp; other) : laplaceSmoothing(other.laplaceSmoothing), features(other.features), className(other.className), classNumStates(other.getClassNumStates()),</span></span>
<span id="L21"><span class="lineNum"> 21</span> <span class="tlaGNC"> 828 : maxThreads(other.getMaxThreads()), fitted(other.fitted), samples(other.samples)</span></span>
<span id="L19"><span class="lineNum"> 19</span> <span class="tlaGNC"> 22 : }</span></span>
<span id="L20"><span class="lineNum"> 20</span> <span class="tlaGNC"> 4761 : Network::Network(const Network&amp; other) : laplaceSmoothing(other.laplaceSmoothing), features(other.features), className(other.className), classNumStates(other.getClassNumStates()),</span></span>
<span id="L21"><span class="lineNum"> 21</span> <span class="tlaGNC"> 9522 : maxThreads(other.getMaxThreads()), fitted(other.fitted), samples(other.samples)</span></span>
<span id="L22"><span class="lineNum"> 22</span> : {</span>
<span id="L23"><span class="lineNum"> 23</span> <span class="tlaGNC"> 414 : if (samples.defined())</span></span>
<span id="L24"><span class="lineNum"> 24</span> <span class="tlaGNC"> 1 : samples = samples.clone();</span></span>
<span id="L25"><span class="lineNum"> 25</span> <span class="tlaGNC"> 419 : for (const auto&amp; node : other.nodes) {</span></span>
<span id="L26"><span class="lineNum"> 26</span> <span class="tlaGNC"> 5 : nodes[node.first] = std::make_unique&lt;Node&gt;(*node.second);</span></span>
<span id="L23"><span class="lineNum"> 23</span> <span class="tlaGNC"> 4761 : if (samples.defined())</span></span>
<span id="L24"><span class="lineNum"> 24</span> <span class="tlaGNC"> 11 : samples = samples.clone();</span></span>
<span id="L25"><span class="lineNum"> 25</span> <span class="tlaGNC"> 4816 : for (const auto&amp; node : other.nodes) {</span></span>
<span id="L26"><span class="lineNum"> 26</span> <span class="tlaGNC"> 55 : nodes[node.first] = std::make_unique&lt;Node&gt;(*node.second);</span></span>
<span id="L27"><span class="lineNum"> 27</span> : }</span>
<span id="L28"><span class="lineNum"> 28</span> <span class="tlaGNC"> 414 : }</span></span>
<span id="L29"><span class="lineNum"> 29</span> <span class="tlaGNC"> 286 : void Network::initialize()</span></span>
<span id="L28"><span class="lineNum"> 28</span> <span class="tlaGNC"> 4761 : }</span></span>
<span id="L29"><span class="lineNum"> 29</span> <span class="tlaGNC"> 3358 : void Network::initialize()</span></span>
<span id="L30"><span class="lineNum"> 30</span> : {</span>
<span id="L31"><span class="lineNum"> 31</span> <span class="tlaGNC"> 286 : features.clear();</span></span>
<span id="L32"><span class="lineNum"> 32</span> <span class="tlaGNC"> 286 : className = &quot;&quot;;</span></span>
<span id="L33"><span class="lineNum"> 33</span> <span class="tlaGNC"> 286 : classNumStates = 0;</span></span>
<span id="L34"><span class="lineNum"> 34</span> <span class="tlaGNC"> 286 : fitted = false;</span></span>
<span id="L35"><span class="lineNum"> 35</span> <span class="tlaGNC"> 286 : nodes.clear();</span></span>
<span id="L36"><span class="lineNum"> 36</span> <span class="tlaGNC"> 286 : samples = torch::Tensor();</span></span>
<span id="L37"><span class="lineNum"> 37</span> <span class="tlaGNC"> 286 : }</span></span>
<span id="L38"><span class="lineNum"> 38</span> <span class="tlaGNC"> 417 : float Network::getMaxThreads() const</span></span>
<span id="L31"><span class="lineNum"> 31</span> <span class="tlaGNC"> 3358 : features.clear();</span></span>
<span id="L32"><span class="lineNum"> 32</span> <span class="tlaGNC"> 3358 : className = &quot;&quot;;</span></span>
<span id="L33"><span class="lineNum"> 33</span> <span class="tlaGNC"> 3358 : classNumStates = 0;</span></span>
<span id="L34"><span class="lineNum"> 34</span> <span class="tlaGNC"> 3358 : fitted = false;</span></span>
<span id="L35"><span class="lineNum"> 35</span> <span class="tlaGNC"> 3358 : nodes.clear();</span></span>
<span id="L36"><span class="lineNum"> 36</span> <span class="tlaGNC"> 3358 : samples = torch::Tensor();</span></span>
<span id="L37"><span class="lineNum"> 37</span> <span class="tlaGNC"> 3358 : }</span></span>
<span id="L38"><span class="lineNum"> 38</span> <span class="tlaGNC"> 4794 : float Network::getMaxThreads() const</span></span>
<span id="L39"><span class="lineNum"> 39</span> : {</span>
<span id="L40"><span class="lineNum"> 40</span> <span class="tlaGNC"> 417 : return maxThreads;</span></span>
<span id="L40"><span class="lineNum"> 40</span> <span class="tlaGNC"> 4794 : return maxThreads;</span></span>
<span id="L41"><span class="lineNum"> 41</span> : }</span>
<span id="L42"><span class="lineNum"> 42</span> <span class="tlaGNC"> 12 : torch::Tensor&amp; Network::getSamples()</span></span>
<span id="L42"><span class="lineNum"> 42</span> <span class="tlaGNC"> 132 : torch::Tensor&amp; Network::getSamples()</span></span>
<span id="L43"><span class="lineNum"> 43</span> : {</span>
<span id="L44"><span class="lineNum"> 44</span> <span class="tlaGNC"> 12 : return samples;</span></span>
<span id="L44"><span class="lineNum"> 44</span> <span class="tlaGNC"> 132 : return samples;</span></span>
<span id="L45"><span class="lineNum"> 45</span> : }</span>
<span id="L46"><span class="lineNum"> 46</span> <span class="tlaGNC"> 8878 : void Network::addNode(const std::string&amp; name)</span></span>
<span id="L46"><span class="lineNum"> 46</span> <span class="tlaGNC"> 116878 : void Network::addNode(const std::string&amp; name)</span></span>
<span id="L47"><span class="lineNum"> 47</span> : {</span>
<span id="L48"><span class="lineNum"> 48</span> <span class="tlaGNC"> 8878 : if (name == &quot;&quot;) {</span></span>
<span id="L49"><span class="lineNum"> 49</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Node name cannot be empty&quot;);</span></span>
<span id="L48"><span class="lineNum"> 48</span> <span class="tlaGNC"> 116878 : if (name == &quot;&quot;) {</span></span>
<span id="L49"><span class="lineNum"> 49</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Node name cannot be empty&quot;);</span></span>
<span id="L50"><span class="lineNum"> 50</span> : }</span>
<span id="L51"><span class="lineNum"> 51</span> <span class="tlaGNC"> 8876 : if (nodes.find(name) != nodes.end()) {</span></span>
<span id="L51"><span class="lineNum"> 51</span> <span class="tlaGNC"> 116856 : if (nodes.find(name) != nodes.end()) {</span></span>
<span id="L52"><span class="lineNum"> 52</span> <span class="tlaUNC tlaBgUNC"> 0 : return;</span></span>
<span id="L53"><span class="lineNum"> 53</span> : }</span>
<span id="L54"><span class="lineNum"> 54</span> <span class="tlaGNC tlaBgGNC"> 8876 : if (find(features.begin(), features.end(), name) == features.end()) {</span></span>
<span id="L55"><span class="lineNum"> 55</span> <span class="tlaGNC"> 8876 : features.push_back(name);</span></span>
<span id="L54"><span class="lineNum"> 54</span> <span class="tlaGNC tlaBgGNC"> 116856 : if (find(features.begin(), features.end(), name) == features.end()) {</span></span>
<span id="L55"><span class="lineNum"> 55</span> <span class="tlaGNC"> 116856 : features.push_back(name);</span></span>
<span id="L56"><span class="lineNum"> 56</span> : }</span>
<span id="L57"><span class="lineNum"> 57</span> <span class="tlaGNC"> 8876 : nodes[name] = std::make_unique&lt;Node&gt;(name);</span></span>
<span id="L57"><span class="lineNum"> 57</span> <span class="tlaGNC"> 116856 : nodes[name] = std::make_unique&lt;Node&gt;(name);</span></span>
<span id="L58"><span class="lineNum"> 58</span> : }</span>
<span id="L59"><span class="lineNum"> 59</span> <span class="tlaGNC"> 52 : std::vector&lt;std::string&gt; Network::getFeatures() const</span></span>
<span id="L59"><span class="lineNum"> 59</span> <span class="tlaGNC"> 607 : std::vector&lt;std::string&gt; Network::getFeatures() const</span></span>
<span id="L60"><span class="lineNum"> 60</span> : {</span>
<span id="L61"><span class="lineNum"> 61</span> <span class="tlaGNC"> 52 : return features;</span></span>
<span id="L61"><span class="lineNum"> 61</span> <span class="tlaGNC"> 607 : return features;</span></span>
<span id="L62"><span class="lineNum"> 62</span> : }</span>
<span id="L63"><span class="lineNum"> 63</span> <span class="tlaGNC"> 496 : int Network::getClassNumStates() const</span></span>
<span id="L63"><span class="lineNum"> 63</span> <span class="tlaGNC"> 5704 : int Network::getClassNumStates() const</span></span>
<span id="L64"><span class="lineNum"> 64</span> : {</span>
<span id="L65"><span class="lineNum"> 65</span> <span class="tlaGNC"> 496 : return classNumStates;</span></span>
<span id="L65"><span class="lineNum"> 65</span> <span class="tlaGNC"> 5704 : return classNumStates;</span></span>
<span id="L66"><span class="lineNum"> 66</span> : }</span>
<span id="L67"><span class="lineNum"> 67</span> <span class="tlaGNC"> 12 : int Network::getStates() const</span></span>
<span id="L67"><span class="lineNum"> 67</span> <span class="tlaGNC"> 132 : int Network::getStates() const</span></span>
<span id="L68"><span class="lineNum"> 68</span> : {</span>
<span id="L69"><span class="lineNum"> 69</span> <span class="tlaGNC"> 12 : int result = 0;</span></span>
<span id="L70"><span class="lineNum"> 70</span> <span class="tlaGNC"> 72 : for (auto&amp; node : nodes) {</span></span>
<span id="L71"><span class="lineNum"> 71</span> <span class="tlaGNC"> 60 : result += node.second-&gt;getNumStates();</span></span>
<span id="L69"><span class="lineNum"> 69</span> <span class="tlaGNC"> 132 : int result = 0;</span></span>
<span id="L70"><span class="lineNum"> 70</span> <span class="tlaGNC"> 792 : for (auto&amp; node : nodes) {</span></span>
<span id="L71"><span class="lineNum"> 71</span> <span class="tlaGNC"> 660 : result += node.second-&gt;getNumStates();</span></span>
<span id="L72"><span class="lineNum"> 72</span> : }</span>
<span id="L73"><span class="lineNum"> 73</span> <span class="tlaGNC"> 12 : return result;</span></span>
<span id="L73"><span class="lineNum"> 73</span> <span class="tlaGNC"> 132 : return result;</span></span>
<span id="L74"><span class="lineNum"> 74</span> : }</span>
<span id="L75"><span class="lineNum"> 75</span> <span class="tlaGNC"> 437774 : std::string Network::getClassName() const</span></span>
<span id="L75"><span class="lineNum"> 75</span> <span class="tlaGNC"> 5150624 : std::string Network::getClassName() const</span></span>
<span id="L76"><span class="lineNum"> 76</span> : {</span>
<span id="L77"><span class="lineNum"> 77</span> <span class="tlaGNC"> 437774 : return className;</span></span>
<span id="L77"><span class="lineNum"> 77</span> <span class="tlaGNC"> 5150624 : return className;</span></span>
<span id="L78"><span class="lineNum"> 78</span> : }</span>
<span id="L79"><span class="lineNum"> 79</span> <span class="tlaGNC"> 22324 : bool Network::isCyclic(const std::string&amp; nodeId, std::unordered_set&lt;std::string&gt;&amp; visited, std::unordered_set&lt;std::string&gt;&amp; recStack)</span></span>
<span id="L79"><span class="lineNum"> 79</span> <span class="tlaGNC"> 295830 : bool Network::isCyclic(const std::string&amp; nodeId, std::unordered_set&lt;std::string&gt;&amp; visited, std::unordered_set&lt;std::string&gt;&amp; recStack)</span></span>
<span id="L80"><span class="lineNum"> 80</span> : {</span>
<span id="L81"><span class="lineNum"> 81</span> <span class="tlaGNC"> 22324 : if (visited.find(nodeId) == visited.end()) // if node hasn't been visited yet</span></span>
<span id="L81"><span class="lineNum"> 81</span> <span class="tlaGNC"> 295830 : if (visited.find(nodeId) == visited.end()) // if node hasn't been visited yet</span></span>
<span id="L82"><span class="lineNum"> 82</span> : {</span>
<span id="L83"><span class="lineNum"> 83</span> <span class="tlaGNC"> 22324 : visited.insert(nodeId);</span></span>
<span id="L84"><span class="lineNum"> 84</span> <span class="tlaGNC"> 22324 : recStack.insert(nodeId);</span></span>
<span id="L85"><span class="lineNum"> 85</span> <span class="tlaGNC"> 27702 : for (Node* child : nodes[nodeId]-&gt;getChildren()) {</span></span>
<span id="L86"><span class="lineNum"> 86</span> <span class="tlaGNC"> 5384 : if (visited.find(child-&gt;getName()) == visited.end() &amp;&amp; isCyclic(child-&gt;getName(), visited, recStack))</span></span>
<span id="L87"><span class="lineNum"> 87</span> <span class="tlaGNC"> 6 : return true;</span></span>
<span id="L88"><span class="lineNum"> 88</span> <span class="tlaGNC"> 5380 : if (recStack.find(child-&gt;getName()) != recStack.end())</span></span>
<span id="L89"><span class="lineNum"> 89</span> <span class="tlaGNC"> 2 : return true;</span></span>
<span id="L83"><span class="lineNum"> 83</span> <span class="tlaGNC"> 295830 : visited.insert(nodeId);</span></span>
<span id="L84"><span class="lineNum"> 84</span> <span class="tlaGNC"> 295830 : recStack.insert(nodeId);</span></span>
<span id="L85"><span class="lineNum"> 85</span> <span class="tlaGNC"> 367384 : for (Node* child : nodes[nodeId]-&gt;getChildren()) {</span></span>
<span id="L86"><span class="lineNum"> 86</span> <span class="tlaGNC"> 71620 : if (visited.find(child-&gt;getName()) == visited.end() &amp;&amp; isCyclic(child-&gt;getName(), visited, recStack))</span></span>
<span id="L87"><span class="lineNum"> 87</span> <span class="tlaGNC"> 66 : return true;</span></span>
<span id="L88"><span class="lineNum"> 88</span> <span class="tlaGNC"> 71576 : if (recStack.find(child-&gt;getName()) != recStack.end())</span></span>
<span id="L89"><span class="lineNum"> 89</span> <span class="tlaGNC"> 22 : return true;</span></span>
<span id="L90"><span class="lineNum"> 90</span> : }</span>
<span id="L91"><span class="lineNum"> 91</span> : }</span>
<span id="L92"><span class="lineNum"> 92</span> <span class="tlaGNC"> 22318 : recStack.erase(nodeId); // remove node from recursion stack before function ends</span></span>
<span id="L93"><span class="lineNum"> 93</span> <span class="tlaGNC"> 22318 : return false;</span></span>
<span id="L92"><span class="lineNum"> 92</span> <span class="tlaGNC"> 295764 : recStack.erase(nodeId); // remove node from recursion stack before function ends</span></span>
<span id="L93"><span class="lineNum"> 93</span> <span class="tlaGNC"> 295764 : return false;</span></span>
<span id="L94"><span class="lineNum"> 94</span> : }</span>
<span id="L95"><span class="lineNum"> 95</span> <span class="tlaGNC"> 16946 : void Network::addEdge(const std::string&amp; parent, const std::string&amp; child)</span></span>
<span id="L95"><span class="lineNum"> 95</span> <span class="tlaGNC"> 224276 : void Network::addEdge(const std::string&amp; parent, const std::string&amp; child)</span></span>
<span id="L96"><span class="lineNum"> 96</span> : {</span>
<span id="L97"><span class="lineNum"> 97</span> <span class="tlaGNC"> 16946 : if (nodes.find(parent) == nodes.end()) {</span></span>
<span id="L98"><span class="lineNum"> 98</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Parent node &quot; + parent + &quot; does not exist&quot;);</span></span>
<span id="L97"><span class="lineNum"> 97</span> <span class="tlaGNC"> 224276 : if (nodes.find(parent) == nodes.end()) {</span></span>
<span id="L98"><span class="lineNum"> 98</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Parent node &quot; + parent + &quot; does not exist&quot;);</span></span>
<span id="L99"><span class="lineNum"> 99</span> : }</span>
<span id="L100"><span class="lineNum"> 100</span> <span class="tlaGNC"> 16944 : if (nodes.find(child) == nodes.end()) {</span></span>
<span id="L101"><span class="lineNum"> 101</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Child node &quot; + child + &quot; does not exist&quot;);</span></span>
<span id="L100"><span class="lineNum"> 100</span> <span class="tlaGNC"> 224254 : if (nodes.find(child) == nodes.end()) {</span></span>
<span id="L101"><span class="lineNum"> 101</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Child node &quot; + child + &quot; does not exist&quot;);</span></span>
<span id="L102"><span class="lineNum"> 102</span> : }</span>
<span id="L103"><span class="lineNum"> 103</span> : // Temporarily add edge to check for cycles</span>
<span id="L104"><span class="lineNum"> 104</span> <span class="tlaGNC"> 16942 : nodes[parent]-&gt;addChild(nodes[child].get());</span></span>
<span id="L105"><span class="lineNum"> 105</span> <span class="tlaGNC"> 16942 : nodes[child]-&gt;addParent(nodes[parent].get());</span></span>
<span id="L106"><span class="lineNum"> 106</span> <span class="tlaGNC"> 16942 : std::unordered_set&lt;std::string&gt; visited;</span></span>
<span id="L107"><span class="lineNum"> 107</span> <span class="tlaGNC"> 16942 : std::unordered_set&lt;std::string&gt; recStack;</span></span>
<span id="L108"><span class="lineNum"> 108</span> <span class="tlaGNC"> 16942 : if (isCyclic(nodes[child]-&gt;getName(), visited, recStack)) // if adding this edge forms a cycle</span></span>
<span id="L104"><span class="lineNum"> 104</span> <span class="tlaGNC"> 224232 : nodes[parent]-&gt;addChild(nodes[child].get());</span></span>
<span id="L105"><span class="lineNum"> 105</span> <span class="tlaGNC"> 224232 : nodes[child]-&gt;addParent(nodes[parent].get());</span></span>
<span id="L106"><span class="lineNum"> 106</span> <span class="tlaGNC"> 224232 : std::unordered_set&lt;std::string&gt; visited;</span></span>
<span id="L107"><span class="lineNum"> 107</span> <span class="tlaGNC"> 224232 : std::unordered_set&lt;std::string&gt; recStack;</span></span>
<span id="L108"><span class="lineNum"> 108</span> <span class="tlaGNC"> 224232 : if (isCyclic(nodes[child]-&gt;getName(), visited, recStack)) // if adding this edge forms a cycle</span></span>
<span id="L109"><span class="lineNum"> 109</span> : {</span>
<span id="L110"><span class="lineNum"> 110</span> : // remove problematic edge</span>
<span id="L111"><span class="lineNum"> 111</span> <span class="tlaGNC"> 2 : nodes[parent]-&gt;removeChild(nodes[child].get());</span></span>
<span id="L112"><span class="lineNum"> 112</span> <span class="tlaGNC"> 2 : nodes[child]-&gt;removeParent(nodes[parent].get());</span></span>
<span id="L113"><span class="lineNum"> 113</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Adding this edge forms a cycle in the graph.&quot;);</span></span>
<span id="L111"><span class="lineNum"> 111</span> <span class="tlaGNC"> 22 : nodes[parent]-&gt;removeChild(nodes[child].get());</span></span>
<span id="L112"><span class="lineNum"> 112</span> <span class="tlaGNC"> 22 : nodes[child]-&gt;removeParent(nodes[parent].get());</span></span>
<span id="L113"><span class="lineNum"> 113</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Adding this edge forms a cycle in the graph.&quot;);</span></span>
<span id="L114"><span class="lineNum"> 114</span> : }</span>
<span id="L115"><span class="lineNum"> 115</span> <span class="tlaGNC"> 16944 : }</span></span>
<span id="L116"><span class="lineNum"> 116</span> <span class="tlaGNC"> 437841 : std::map&lt;std::string, std::unique_ptr&lt;Node&gt;&gt;&amp; Network::getNodes()</span></span>
<span id="L115"><span class="lineNum"> 115</span> <span class="tlaGNC"> 224254 : }</span></span>
<span id="L116"><span class="lineNum"> 116</span> <span class="tlaGNC"> 5151361 : std::map&lt;std::string, std::unique_ptr&lt;Node&gt;&gt;&amp; Network::getNodes()</span></span>
<span id="L117"><span class="lineNum"> 117</span> : {</span>
<span id="L118"><span class="lineNum"> 118</span> <span class="tlaGNC"> 437841 : return nodes;</span></span>
<span id="L118"><span class="lineNum"> 118</span> <span class="tlaGNC"> 5151361 : return nodes;</span></span>
<span id="L119"><span class="lineNum"> 119</span> : }</span>
<span id="L120"><span class="lineNum"> 120</span> <span class="tlaGNC"> 327 : void Network::checkFitData(int n_samples, int n_features, int n_samples_y, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states, const torch::Tensor&amp; weights)</span></span>
<span id="L120"><span class="lineNum"> 120</span> <span class="tlaGNC"> 3787 : void Network::checkFitData(int n_samples, int n_features, int n_samples_y, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states, const torch::Tensor&amp; weights)</span></span>
<span id="L121"><span class="lineNum"> 121</span> : {</span>
<span id="L122"><span class="lineNum"> 122</span> <span class="tlaGNC"> 327 : if (weights.size(0) != n_samples) {</span></span>
<span id="L123"><span class="lineNum"> 123</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Weights (&quot; + std::to_string(weights.size(0)) + &quot;) must have the same number of elements as samples (&quot; + std::to_string(n_samples) + &quot;) in Network::fit&quot;);</span></span>
<span id="L122"><span class="lineNum"> 122</span> <span class="tlaGNC"> 3787 : if (weights.size(0) != n_samples) {</span></span>
<span id="L123"><span class="lineNum"> 123</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Weights (&quot; + std::to_string(weights.size(0)) + &quot;) must have the same number of elements as samples (&quot; + std::to_string(n_samples) + &quot;) in Network::fit&quot;);</span></span>
<span id="L124"><span class="lineNum"> 124</span> : }</span>
<span id="L125"><span class="lineNum"> 125</span> <span class="tlaGNC"> 325 : if (n_samples != n_samples_y) {</span></span>
<span id="L126"><span class="lineNum"> 126</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;X and y must have the same number of samples in Network::fit (&quot; + std::to_string(n_samples) + &quot; != &quot; + std::to_string(n_samples_y) + &quot;)&quot;);</span></span>
<span id="L125"><span class="lineNum"> 125</span> <span class="tlaGNC"> 3765 : if (n_samples != n_samples_y) {</span></span>
<span id="L126"><span class="lineNum"> 126</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;X and y must have the same number of samples in Network::fit (&quot; + std::to_string(n_samples) + &quot; != &quot; + std::to_string(n_samples_y) + &quot;)&quot;);</span></span>
<span id="L127"><span class="lineNum"> 127</span> : }</span>
<span id="L128"><span class="lineNum"> 128</span> <span class="tlaGNC"> 323 : if (n_features != featureNames.size()) {</span></span>
<span id="L129"><span class="lineNum"> 129</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;X and features must have the same number of features in Network::fit (&quot; + std::to_string(n_features) + &quot; != &quot; + std::to_string(featureNames.size()) + &quot;)&quot;);</span></span>
<span id="L128"><span class="lineNum"> 128</span> <span class="tlaGNC"> 3743 : if (n_features != featureNames.size()) {</span></span>
<span id="L129"><span class="lineNum"> 129</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;X and features must have the same number of features in Network::fit (&quot; + std::to_string(n_features) + &quot; != &quot; + std::to_string(featureNames.size()) + &quot;)&quot;);</span></span>
<span id="L130"><span class="lineNum"> 130</span> : }</span>
<span id="L131"><span class="lineNum"> 131</span> <span class="tlaGNC"> 321 : if (features.size() == 0) {</span></span>
<span id="L132"><span class="lineNum"> 132</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;The network has not been initialized. You must call addNode() before calling fit()&quot;);</span></span>
<span id="L131"><span class="lineNum"> 131</span> <span class="tlaGNC"> 3721 : if (features.size() == 0) {</span></span>
<span id="L132"><span class="lineNum"> 132</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;The network has not been initialized. You must call addNode() before calling fit()&quot;);</span></span>
<span id="L133"><span class="lineNum"> 133</span> : }</span>
<span id="L134"><span class="lineNum"> 134</span> <span class="tlaGNC"> 319 : if (n_features != features.size() - 1) {</span></span>
<span id="L135"><span class="lineNum"> 135</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;X and local features must have the same number of features in Network::fit (&quot; + std::to_string(n_features) + &quot; != &quot; + std::to_string(features.size() - 1) + &quot;)&quot;);</span></span>
<span id="L134"><span class="lineNum"> 134</span> <span class="tlaGNC"> 3699 : if (n_features != features.size() - 1) {</span></span>
<span id="L135"><span class="lineNum"> 135</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;X and local features must have the same number of features in Network::fit (&quot; + std::to_string(n_features) + &quot; != &quot; + std::to_string(features.size() - 1) + &quot;)&quot;);</span></span>
<span id="L136"><span class="lineNum"> 136</span> : }</span>
<span id="L137"><span class="lineNum"> 137</span> <span class="tlaGNC"> 317 : if (find(features.begin(), features.end(), className) == features.end()) {</span></span>
<span id="L138"><span class="lineNum"> 138</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Class Name not found in Network::features&quot;);</span></span>
<span id="L137"><span class="lineNum"> 137</span> <span class="tlaGNC"> 3677 : if (find(features.begin(), features.end(), className) == features.end()) {</span></span>
<span id="L138"><span class="lineNum"> 138</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Class Name not found in Network::features&quot;);</span></span>
<span id="L139"><span class="lineNum"> 139</span> : }</span>
<span id="L140"><span class="lineNum"> 140</span> <span class="tlaGNC"> 9296 : for (auto&amp; feature : featureNames) {</span></span>
<span id="L141"><span class="lineNum"> 141</span> <span class="tlaGNC"> 8983 : if (find(features.begin(), features.end(), feature) == features.end()) {</span></span>
<span id="L142"><span class="lineNum"> 142</span> <span class="tlaGNC"> 2 : throw std::invalid_argument(&quot;Feature &quot; + feature + &quot; not found in Network::features&quot;);</span></span>
<span id="L140"><span class="lineNum"> 140</span> <span class="tlaGNC"> 121476 : for (auto&amp; feature : featureNames) {</span></span>
<span id="L141"><span class="lineNum"> 141</span> <span class="tlaGNC"> 117843 : if (find(features.begin(), features.end(), feature) == features.end()) {</span></span>
<span id="L142"><span class="lineNum"> 142</span> <span class="tlaGNC"> 22 : throw std::invalid_argument(&quot;Feature &quot; + feature + &quot; not found in Network::features&quot;);</span></span>
<span id="L143"><span class="lineNum"> 143</span> : }</span>
<span id="L144"><span class="lineNum"> 144</span> <span class="tlaGNC"> 8981 : if (states.find(feature) == states.end()) {</span></span>
<span id="L144"><span class="lineNum"> 144</span> <span class="tlaGNC"> 117821 : if (states.find(feature) == states.end()) {</span></span>
<span id="L145"><span class="lineNum"> 145</span> <span class="tlaUNC tlaBgUNC"> 0 : throw std::invalid_argument(&quot;Feature &quot; + feature + &quot; not found in states&quot;);</span></span>
<span id="L146"><span class="lineNum"> 146</span> : }</span>
<span id="L147"><span class="lineNum"> 147</span> : }</span>
<span id="L148"><span class="lineNum"> 148</span> <span class="tlaGNC tlaBgGNC"> 313 : }</span></span>
<span id="L149"><span class="lineNum"> 149</span> <span class="tlaGNC"> 313 : void Network::setStates(const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L148"><span class="lineNum"> 148</span> <span class="tlaGNC tlaBgGNC"> 3633 : }</span></span>
<span id="L149"><span class="lineNum"> 149</span> <span class="tlaGNC"> 3633 : void Network::setStates(const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L150"><span class="lineNum"> 150</span> : {</span>
<span id="L151"><span class="lineNum"> 151</span> : // Set states to every Node in the network</span>
<span id="L152"><span class="lineNum"> 152</span> <span class="tlaGNC"> 313 : for_each(features.begin(), features.end(), [this, &amp;states](const std::string&amp; feature) {</span></span>
<span id="L153"><span class="lineNum"> 153</span> <span class="tlaGNC"> 9288 : nodes.at(feature)-&gt;setNumStates(states.at(feature).size());</span></span>
<span id="L154"><span class="lineNum"> 154</span> <span class="tlaGNC"> 9288 : });</span></span>
<span id="L155"><span class="lineNum"> 155</span> <span class="tlaGNC"> 313 : classNumStates = nodes.at(className)-&gt;getNumStates();</span></span>
<span id="L156"><span class="lineNum"> 156</span> <span class="tlaGNC"> 313 : }</span></span>
<span id="L152"><span class="lineNum"> 152</span> <span class="tlaGNC"> 3633 : for_each(features.begin(), features.end(), [this, &amp;states](const std::string&amp; feature) {</span></span>
<span id="L153"><span class="lineNum"> 153</span> <span class="tlaGNC"> 121388 : nodes.at(feature)-&gt;setNumStates(states.at(feature).size());</span></span>
<span id="L154"><span class="lineNum"> 154</span> <span class="tlaGNC"> 121388 : });</span></span>
<span id="L155"><span class="lineNum"> 155</span> <span class="tlaGNC"> 3633 : classNumStates = nodes.at(className)-&gt;getNumStates();</span></span>
<span id="L156"><span class="lineNum"> 156</span> <span class="tlaGNC"> 3633 : }</span></span>
<span id="L157"><span class="lineNum"> 157</span> : // X comes in nxm, where n is the number of features and m the number of samples</span>
<span id="L158"><span class="lineNum"> 158</span> <span class="tlaGNC"> 1 : void Network::fit(const torch::Tensor&amp; X, const torch::Tensor&amp; y, const torch::Tensor&amp; weights, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L158"><span class="lineNum"> 158</span> <span class="tlaGNC"> 11 : void Network::fit(const torch::Tensor&amp; X, const torch::Tensor&amp; y, const torch::Tensor&amp; weights, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L159"><span class="lineNum"> 159</span> : {</span>
<span id="L160"><span class="lineNum"> 160</span> <span class="tlaGNC"> 1 : checkFitData(X.size(1), X.size(0), y.size(0), featureNames, className, states, weights);</span></span>
<span id="L161"><span class="lineNum"> 161</span> <span class="tlaGNC"> 1 : this-&gt;className = className;</span></span>
<span id="L162"><span class="lineNum"> 162</span> <span class="tlaGNC"> 1 : torch::Tensor ytmp = torch::transpose(y.view({ y.size(0), 1 }), 0, 1);</span></span>
<span id="L163"><span class="lineNum"> 163</span> <span class="tlaGNC"> 3 : samples = torch::cat({ X , ytmp }, 0);</span></span>
<span id="L164"><span class="lineNum"> 164</span> <span class="tlaGNC"> 5 : for (int i = 0; i &lt; featureNames.size(); ++i) {</span></span>
<span id="L165"><span class="lineNum"> 165</span> <span class="tlaGNC"> 12 : auto row_feature = X.index({ i, &quot;...&quot; });</span></span>
<span id="L166"><span class="lineNum"> 166</span> <span class="tlaGNC"> 4 : }</span></span>
<span id="L167"><span class="lineNum"> 167</span> <span class="tlaGNC"> 1 : completeFit(states, weights);</span></span>
<span id="L168"><span class="lineNum"> 168</span> <span class="tlaGNC"> 6 : }</span></span>
<span id="L169"><span class="lineNum"> 169</span> <span class="tlaGNC"> 305 : void Network::fit(const torch::Tensor&amp; samples, const torch::Tensor&amp; weights, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L160"><span class="lineNum"> 160</span> <span class="tlaGNC"> 11 : checkFitData(X.size(1), X.size(0), y.size(0), featureNames, className, states, weights);</span></span>
<span id="L161"><span class="lineNum"> 161</span> <span class="tlaGNC"> 11 : this-&gt;className = className;</span></span>
<span id="L162"><span class="lineNum"> 162</span> <span class="tlaGNC"> 11 : torch::Tensor ytmp = torch::transpose(y.view({ y.size(0), 1 }), 0, 1);</span></span>
<span id="L163"><span class="lineNum"> 163</span> <span class="tlaGNC"> 33 : samples = torch::cat({ X , ytmp }, 0);</span></span>
<span id="L164"><span class="lineNum"> 164</span> <span class="tlaGNC"> 55 : for (int i = 0; i &lt; featureNames.size(); ++i) {</span></span>
<span id="L165"><span class="lineNum"> 165</span> <span class="tlaGNC"> 132 : auto row_feature = X.index({ i, &quot;...&quot; });</span></span>
<span id="L166"><span class="lineNum"> 166</span> <span class="tlaGNC"> 44 : }</span></span>
<span id="L167"><span class="lineNum"> 167</span> <span class="tlaGNC"> 11 : completeFit(states, weights);</span></span>
<span id="L168"><span class="lineNum"> 168</span> <span class="tlaGNC"> 66 : }</span></span>
<span id="L169"><span class="lineNum"> 169</span> <span class="tlaGNC"> 3545 : void Network::fit(const torch::Tensor&amp; samples, const torch::Tensor&amp; weights, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L170"><span class="lineNum"> 170</span> : {</span>
<span id="L171"><span class="lineNum"> 171</span> <span class="tlaGNC"> 305 : checkFitData(samples.size(1), samples.size(0) - 1, samples.size(1), featureNames, className, states, weights);</span></span>
<span id="L172"><span class="lineNum"> 172</span> <span class="tlaGNC"> 305 : this-&gt;className = className;</span></span>
<span id="L173"><span class="lineNum"> 173</span> <span class="tlaGNC"> 305 : this-&gt;samples = samples;</span></span>
<span id="L174"><span class="lineNum"> 174</span> <span class="tlaGNC"> 305 : completeFit(states, weights);</span></span>
<span id="L175"><span class="lineNum"> 175</span> <span class="tlaGNC"> 305 : }</span></span>
<span id="L171"><span class="lineNum"> 171</span> <span class="tlaGNC"> 3545 : checkFitData(samples.size(1), samples.size(0) - 1, samples.size(1), featureNames, className, states, weights);</span></span>
<span id="L172"><span class="lineNum"> 172</span> <span class="tlaGNC"> 3545 : this-&gt;className = className;</span></span>
<span id="L173"><span class="lineNum"> 173</span> <span class="tlaGNC"> 3545 : this-&gt;samples = samples;</span></span>
<span id="L174"><span class="lineNum"> 174</span> <span class="tlaGNC"> 3545 : completeFit(states, weights);</span></span>
<span id="L175"><span class="lineNum"> 175</span> <span class="tlaGNC"> 3545 : }</span></span>
<span id="L176"><span class="lineNum"> 176</span> : // input_data comes in nxm, where n is the number of features and m the number of samples</span>
<span id="L177"><span class="lineNum"> 177</span> <span class="tlaGNC"> 21 : void Network::fit(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; input_data, const std::vector&lt;int&gt;&amp; labels, const std::vector&lt;double&gt;&amp; weights_, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L177"><span class="lineNum"> 177</span> <span class="tlaGNC"> 231 : void Network::fit(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; input_data, const std::vector&lt;int&gt;&amp; labels, const std::vector&lt;double&gt;&amp; weights_, const std::vector&lt;std::string&gt;&amp; featureNames, const std::string&amp; className, const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states)</span></span>
<span id="L178"><span class="lineNum"> 178</span> : {</span>
<span id="L179"><span class="lineNum"> 179</span> <span class="tlaGNC"> 21 : const torch::Tensor weights = torch::tensor(weights_, torch::kFloat64);</span></span>
<span id="L180"><span class="lineNum"> 180</span> <span class="tlaGNC"> 21 : checkFitData(input_data[0].size(), input_data.size(), labels.size(), featureNames, className, states, weights);</span></span>
<span id="L181"><span class="lineNum"> 181</span> <span class="tlaGNC"> 7 : this-&gt;className = className;</span></span>
<span id="L179"><span class="lineNum"> 179</span> <span class="tlaGNC"> 231 : const torch::Tensor weights = torch::tensor(weights_, torch::kFloat64);</span></span>
<span id="L180"><span class="lineNum"> 180</span> <span class="tlaGNC"> 231 : checkFitData(input_data[0].size(), input_data.size(), labels.size(), featureNames, className, states, weights);</span></span>
<span id="L181"><span class="lineNum"> 181</span> <span class="tlaGNC"> 77 : this-&gt;className = className;</span></span>
<span id="L182"><span class="lineNum"> 182</span> : // Build tensor of samples (nxm) (n+1 because of the class)</span>
<span id="L183"><span class="lineNum"> 183</span> <span class="tlaGNC"> 7 : samples = torch::zeros({ static_cast&lt;int&gt;(input_data.size() + 1), static_cast&lt;int&gt;(input_data[0].size()) }, torch::kInt32);</span></span>
<span id="L184"><span class="lineNum"> 184</span> <span class="tlaGNC"> 35 : for (int i = 0; i &lt; featureNames.size(); ++i) {</span></span>
<span id="L185"><span class="lineNum"> 185</span> <span class="tlaGNC"> 112 : samples.index_put_({ i, &quot;...&quot; }, torch::tensor(input_data[i], torch::kInt32));</span></span>
<span id="L183"><span class="lineNum"> 183</span> <span class="tlaGNC"> 77 : samples = torch::zeros({ static_cast&lt;int&gt;(input_data.size() + 1), static_cast&lt;int&gt;(input_data[0].size()) }, torch::kInt32);</span></span>
<span id="L184"><span class="lineNum"> 184</span> <span class="tlaGNC"> 385 : for (int i = 0; i &lt; featureNames.size(); ++i) {</span></span>
<span id="L185"><span class="lineNum"> 185</span> <span class="tlaGNC"> 1232 : samples.index_put_({ i, &quot;...&quot; }, torch::tensor(input_data[i], torch::kInt32));</span></span>
<span id="L186"><span class="lineNum"> 186</span> : }</span>
<span id="L187"><span class="lineNum"> 187</span> <span class="tlaGNC"> 28 : samples.index_put_({ -1, &quot;...&quot; }, torch::tensor(labels, torch::kInt32));</span></span>
<span id="L188"><span class="lineNum"> 188</span> <span class="tlaGNC"> 7 : completeFit(states, weights);</span></span>
<span id="L189"><span class="lineNum"> 189</span> <span class="tlaGNC"> 56 : }</span></span>
<span id="L190"><span class="lineNum"> 190</span> <span class="tlaGNC"> 313 : void Network::completeFit(const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states, const torch::Tensor&amp; weights)</span></span>
<span id="L187"><span class="lineNum"> 187</span> <span class="tlaGNC"> 308 : samples.index_put_({ -1, &quot;...&quot; }, torch::tensor(labels, torch::kInt32));</span></span>
<span id="L188"><span class="lineNum"> 188</span> <span class="tlaGNC"> 77 : completeFit(states, weights);</span></span>
<span id="L189"><span class="lineNum"> 189</span> <span class="tlaGNC"> 616 : }</span></span>
<span id="L190"><span class="lineNum"> 190</span> <span class="tlaGNC"> 3633 : void Network::completeFit(const std::map&lt;std::string, std::vector&lt;int&gt;&gt;&amp; states, const torch::Tensor&amp; weights)</span></span>
<span id="L191"><span class="lineNum"> 191</span> : {</span>
<span id="L192"><span class="lineNum"> 192</span> <span class="tlaGNC"> 313 : setStates(states);</span></span>
<span id="L193"><span class="lineNum"> 193</span> <span class="tlaGNC"> 313 : laplaceSmoothing = 1.0 / samples.size(1); // To use in CPT computation</span></span>
<span id="L194"><span class="lineNum"> 194</span> <span class="tlaGNC"> 313 : std::vector&lt;std::thread&gt; threads;</span></span>
<span id="L195"><span class="lineNum"> 195</span> <span class="tlaGNC"> 9601 : for (auto&amp; node : nodes) {</span></span>
<span id="L196"><span class="lineNum"> 196</span> <span class="tlaGNC"> 9288 : threads.emplace_back([this, &amp;node, &amp;weights]() {</span></span>
<span id="L197"><span class="lineNum"> 197</span> <span class="tlaGNC"> 9288 : node.second-&gt;computeCPT(samples, features, laplaceSmoothing, weights);</span></span>
<span id="L198"><span class="lineNum"> 198</span> <span class="tlaGNC"> 9288 : });</span></span>
<span id="L192"><span class="lineNum"> 192</span> <span class="tlaGNC"> 3633 : setStates(states);</span></span>
<span id="L193"><span class="lineNum"> 193</span> <span class="tlaGNC"> 3633 : laplaceSmoothing = 1.0 / samples.size(1); // To use in CPT computation</span></span>
<span id="L194"><span class="lineNum"> 194</span> <span class="tlaGNC"> 3633 : std::vector&lt;std::thread&gt; threads;</span></span>
<span id="L195"><span class="lineNum"> 195</span> <span class="tlaGNC"> 125021 : for (auto&amp; node : nodes) {</span></span>
<span id="L196"><span class="lineNum"> 196</span> <span class="tlaGNC"> 121388 : threads.emplace_back([this, &amp;node, &amp;weights]() {</span></span>
<span id="L197"><span class="lineNum"> 197</span> <span class="tlaGNC"> 121388 : node.second-&gt;computeCPT(samples, features, laplaceSmoothing, weights);</span></span>
<span id="L198"><span class="lineNum"> 198</span> <span class="tlaGNC"> 121388 : });</span></span>
<span id="L199"><span class="lineNum"> 199</span> : }</span>
<span id="L200"><span class="lineNum"> 200</span> <span class="tlaGNC"> 9601 : for (auto&amp; thread : threads) {</span></span>
<span id="L201"><span class="lineNum"> 201</span> <span class="tlaGNC"> 9288 : thread.join();</span></span>
<span id="L200"><span class="lineNum"> 200</span> <span class="tlaGNC"> 125021 : for (auto&amp; thread : threads) {</span></span>
<span id="L201"><span class="lineNum"> 201</span> <span class="tlaGNC"> 121388 : thread.join();</span></span>
<span id="L202"><span class="lineNum"> 202</span> : }</span>
<span id="L203"><span class="lineNum"> 203</span> <span class="tlaGNC"> 313 : fitted = true;</span></span>
<span id="L204"><span class="lineNum"> 204</span> <span class="tlaGNC"> 313 : }</span></span>
<span id="L205"><span class="lineNum"> 205</span> <span class="tlaGNC"> 549 : torch::Tensor Network::predict_tensor(const torch::Tensor&amp; samples, const bool proba)</span></span>
<span id="L203"><span class="lineNum"> 203</span> <span class="tlaGNC"> 3633 : fitted = true;</span></span>
<span id="L204"><span class="lineNum"> 204</span> <span class="tlaGNC"> 3633 : }</span></span>
<span id="L205"><span class="lineNum"> 205</span> <span class="tlaGNC"> 6802 : torch::Tensor Network::predict_tensor(const torch::Tensor&amp; samples, const bool proba)</span></span>
<span id="L206"><span class="lineNum"> 206</span> : {</span>
<span id="L207"><span class="lineNum"> 207</span> <span class="tlaGNC"> 549 : if (!fitted) {</span></span>
<span id="L208"><span class="lineNum"> 208</span> <span class="tlaGNC"> 2 : throw std::logic_error(&quot;You must call fit() before calling predict()&quot;);</span></span>
<span id="L207"><span class="lineNum"> 207</span> <span class="tlaGNC"> 6802 : if (!fitted) {</span></span>
<span id="L208"><span class="lineNum"> 208</span> <span class="tlaGNC"> 22 : throw std::logic_error(&quot;You must call fit() before calling predict()&quot;);</span></span>
<span id="L209"><span class="lineNum"> 209</span> : }</span>
<span id="L210"><span class="lineNum"> 210</span> <span class="tlaGNC"> 547 : torch::Tensor result;</span></span>
<span id="L211"><span class="lineNum"> 211</span> <span class="tlaGNC"> 547 : result = torch::zeros({ samples.size(1), classNumStates }, torch::kFloat64);</span></span>
<span id="L212"><span class="lineNum"> 212</span> <span class="tlaGNC"> 96385 : for (int i = 0; i &lt; samples.size(1); ++i) {</span></span>
<span id="L213"><span class="lineNum"> 213</span> <span class="tlaGNC"> 287520 : const torch::Tensor sample = samples.index({ &quot;...&quot;, i });</span></span>
<span id="L214"><span class="lineNum"> 214</span> <span class="tlaGNC"> 95840 : auto psample = predict_sample(sample);</span></span>
<span id="L215"><span class="lineNum"> 215</span> <span class="tlaGNC"> 95838 : auto temp = torch::tensor(psample, torch::kFloat64);</span></span>
<span id="L210"><span class="lineNum"> 210</span> <span class="tlaGNC"> 6780 : torch::Tensor result;</span></span>
<span id="L211"><span class="lineNum"> 211</span> <span class="tlaGNC"> 6780 : result = torch::zeros({ samples.size(1), classNumStates }, torch::kFloat64);</span></span>
<span id="L212"><span class="lineNum"> 212</span> <span class="tlaGNC"> 1170049 : for (int i = 0; i &lt; samples.size(1); ++i) {</span></span>
<span id="L213"><span class="lineNum"> 213</span> <span class="tlaGNC"> 3489873 : const torch::Tensor sample = samples.index({ &quot;...&quot;, i });</span></span>
<span id="L214"><span class="lineNum"> 214</span> <span class="tlaGNC"> 1163291 : auto psample = predict_sample(sample);</span></span>
<span id="L215"><span class="lineNum"> 215</span> <span class="tlaGNC"> 1163269 : auto temp = torch::tensor(psample, torch::kFloat64);</span></span>
<span id="L216"><span class="lineNum"> 216</span> : // result.index_put_({ i, &quot;...&quot; }, torch::tensor(predict_sample(sample), torch::kFloat64));</span>
<span id="L217"><span class="lineNum"> 217</span> <span class="tlaGNC"> 287514 : result.index_put_({ i, &quot;...&quot; }, temp);</span></span>
<span id="L218"><span class="lineNum"> 218</span> <span class="tlaGNC"> 95840 : }</span></span>
<span id="L219"><span class="lineNum"> 219</span> <span class="tlaGNC"> 545 : if (proba)</span></span>
<span id="L220"><span class="lineNum"> 220</span> <span class="tlaGNC"> 304 : return result;</span></span>
<span id="L221"><span class="lineNum"> 221</span> <span class="tlaGNC"> 482 : return result.argmax(1);</span></span>
<span id="L222"><span class="lineNum"> 222</span> <span class="tlaGNC"> 192225 : }</span></span>
<span id="L217"><span class="lineNum"> 217</span> <span class="tlaGNC"> 3489807 : result.index_put_({ i, &quot;...&quot; }, temp);</span></span>
<span id="L218"><span class="lineNum"> 218</span> <span class="tlaGNC"> 1163291 : }</span></span>
<span id="L219"><span class="lineNum"> 219</span> <span class="tlaGNC"> 6758 : if (proba)</span></span>
<span id="L220"><span class="lineNum"> 220</span> <span class="tlaGNC"> 3540 : return result;</span></span>
<span id="L221"><span class="lineNum"> 221</span> <span class="tlaGNC"> 6436 : return result.argmax(1);</span></span>
<span id="L222"><span class="lineNum"> 222</span> <span class="tlaGNC"> 2333340 : }</span></span>
<span id="L223"><span class="lineNum"> 223</span> : // Return mxn tensor of probabilities</span>
<span id="L224"><span class="lineNum"> 224</span> <span class="tlaGNC"> 304 : torch::Tensor Network::predict_proba(const torch::Tensor&amp; samples)</span></span>
<span id="L224"><span class="lineNum"> 224</span> <span class="tlaGNC"> 3540 : torch::Tensor Network::predict_proba(const torch::Tensor&amp; samples)</span></span>
<span id="L225"><span class="lineNum"> 225</span> : {</span>
<span id="L226"><span class="lineNum"> 226</span> <span class="tlaGNC"> 304 : return predict_tensor(samples, true);</span></span>
<span id="L226"><span class="lineNum"> 226</span> <span class="tlaGNC"> 3540 : return predict_tensor(samples, true);</span></span>
<span id="L227"><span class="lineNum"> 227</span> : }</span>
<span id="L228"><span class="lineNum"> 228</span> : </span>
<span id="L229"><span class="lineNum"> 229</span> : // Return mxn tensor of probabilities</span>
<span id="L230"><span class="lineNum"> 230</span> <span class="tlaGNC"> 245 : torch::Tensor Network::predict(const torch::Tensor&amp; samples)</span></span>
<span id="L230"><span class="lineNum"> 230</span> <span class="tlaGNC"> 3262 : torch::Tensor Network::predict(const torch::Tensor&amp; samples)</span></span>
<span id="L231"><span class="lineNum"> 231</span> : {</span>
<span id="L232"><span class="lineNum"> 232</span> <span class="tlaGNC"> 245 : return predict_tensor(samples, false);</span></span>
<span id="L232"><span class="lineNum"> 232</span> <span class="tlaGNC"> 3262 : return predict_tensor(samples, false);</span></span>
<span id="L233"><span class="lineNum"> 233</span> : }</span>
<span id="L234"><span class="lineNum"> 234</span> : </span>
<span id="L235"><span class="lineNum"> 235</span> : // Return mx1 std::vector of predictions</span>
<span id="L236"><span class="lineNum"> 236</span> : // tsamples is nxm std::vector of samples</span>
<span id="L237"><span class="lineNum"> 237</span> <span class="tlaGNC"> 12 : std::vector&lt;int&gt; Network::predict(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; tsamples)</span></span>
<span id="L237"><span class="lineNum"> 237</span> <span class="tlaGNC"> 132 : std::vector&lt;int&gt; Network::predict(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; tsamples)</span></span>
<span id="L238"><span class="lineNum"> 238</span> : {</span>
<span id="L239"><span class="lineNum"> 239</span> <span class="tlaGNC"> 12 : if (!fitted) {</span></span>
<span id="L240"><span class="lineNum"> 240</span> <span class="tlaGNC"> 4 : throw std::logic_error(&quot;You must call fit() before calling predict()&quot;);</span></span>
<span id="L239"><span class="lineNum"> 239</span> <span class="tlaGNC"> 132 : if (!fitted) {</span></span>
<span id="L240"><span class="lineNum"> 240</span> <span class="tlaGNC"> 44 : throw std::logic_error(&quot;You must call fit() before calling predict()&quot;);</span></span>
<span id="L241"><span class="lineNum"> 241</span> : }</span>
<span id="L242"><span class="lineNum"> 242</span> <span class="tlaGNC"> 8 : std::vector&lt;int&gt; predictions;</span></span>
<span id="L243"><span class="lineNum"> 243</span> <span class="tlaGNC"> 8 : std::vector&lt;int&gt; sample;</span></span>
<span id="L244"><span class="lineNum"> 244</span> <span class="tlaGNC"> 891 : for (int row = 0; row &lt; tsamples[0].size(); ++row) {</span></span>
<span id="L245"><span class="lineNum"> 245</span> <span class="tlaGNC"> 885 : sample.clear();</span></span>
<span id="L246"><span class="lineNum"> 246</span> <span class="tlaGNC"> 6563 : for (int col = 0; col &lt; tsamples.size(); ++col) {</span></span>
<span id="L247"><span class="lineNum"> 247</span> <span class="tlaGNC"> 5678 : sample.push_back(tsamples[col][row]);</span></span>
<span id="L242"><span class="lineNum"> 242</span> <span class="tlaGNC"> 88 : std::vector&lt;int&gt; predictions;</span></span>
<span id="L243"><span class="lineNum"> 243</span> <span class="tlaGNC"> 88 : std::vector&lt;int&gt; sample;</span></span>
<span id="L244"><span class="lineNum"> 244</span> <span class="tlaGNC"> 9801 : for (int row = 0; row &lt; tsamples[0].size(); ++row) {</span></span>
<span id="L245"><span class="lineNum"> 245</span> <span class="tlaGNC"> 9735 : sample.clear();</span></span>
<span id="L246"><span class="lineNum"> 246</span> <span class="tlaGNC"> 72193 : for (int col = 0; col &lt; tsamples.size(); ++col) {</span></span>
<span id="L247"><span class="lineNum"> 247</span> <span class="tlaGNC"> 62458 : sample.push_back(tsamples[col][row]);</span></span>
<span id="L248"><span class="lineNum"> 248</span> : }</span>
<span id="L249"><span class="lineNum"> 249</span> <span class="tlaGNC"> 885 : std::vector&lt;double&gt; classProbabilities = predict_sample(sample);</span></span>
<span id="L249"><span class="lineNum"> 249</span> <span class="tlaGNC"> 9735 : std::vector&lt;double&gt; classProbabilities = predict_sample(sample);</span></span>
<span id="L250"><span class="lineNum"> 250</span> : // Find the class with the maximum posterior probability</span>
<span id="L251"><span class="lineNum"> 251</span> <span class="tlaGNC"> 883 : auto maxElem = max_element(classProbabilities.begin(), classProbabilities.end());</span></span>
<span id="L252"><span class="lineNum"> 252</span> <span class="tlaGNC"> 883 : int predictedClass = distance(classProbabilities.begin(), maxElem);</span></span>
<span id="L253"><span class="lineNum"> 253</span> <span class="tlaGNC"> 883 : predictions.push_back(predictedClass);</span></span>
<span id="L254"><span class="lineNum"> 254</span> <span class="tlaGNC"> 883 : }</span></span>
<span id="L255"><span class="lineNum"> 255</span> <span class="tlaGNC"> 12 : return predictions;</span></span>
<span id="L256"><span class="lineNum"> 256</span> <span class="tlaGNC"> 10 : }</span></span>
<span id="L251"><span class="lineNum"> 251</span> <span class="tlaGNC"> 9713 : auto maxElem = max_element(classProbabilities.begin(), classProbabilities.end());</span></span>
<span id="L252"><span class="lineNum"> 252</span> <span class="tlaGNC"> 9713 : int predictedClass = distance(classProbabilities.begin(), maxElem);</span></span>
<span id="L253"><span class="lineNum"> 253</span> <span class="tlaGNC"> 9713 : predictions.push_back(predictedClass);</span></span>
<span id="L254"><span class="lineNum"> 254</span> <span class="tlaGNC"> 9713 : }</span></span>
<span id="L255"><span class="lineNum"> 255</span> <span class="tlaGNC"> 132 : return predictions;</span></span>
<span id="L256"><span class="lineNum"> 256</span> <span class="tlaGNC"> 110 : }</span></span>
<span id="L257"><span class="lineNum"> 257</span> : // Return mxn std::vector of probabilities</span>
<span id="L258"><span class="lineNum"> 258</span> : // tsamples is nxm std::vector of samples</span>
<span id="L259"><span class="lineNum"> 259</span> <span class="tlaGNC"> 68 : std::vector&lt;std::vector&lt;double&gt;&gt; Network::predict_proba(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; tsamples)</span></span>
<span id="L259"><span class="lineNum"> 259</span> <span class="tlaGNC"> 777 : std::vector&lt;std::vector&lt;double&gt;&gt; Network::predict_proba(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; tsamples)</span></span>
<span id="L260"><span class="lineNum"> 260</span> : {</span>
<span id="L261"><span class="lineNum"> 261</span> <span class="tlaGNC"> 68 : if (!fitted) {</span></span>
<span id="L262"><span class="lineNum"> 262</span> <span class="tlaGNC"> 2 : throw std::logic_error(&quot;You must call fit() before calling predict_proba()&quot;);</span></span>
<span id="L261"><span class="lineNum"> 261</span> <span class="tlaGNC"> 777 : if (!fitted) {</span></span>
<span id="L262"><span class="lineNum"> 262</span> <span class="tlaGNC"> 22 : throw std::logic_error(&quot;You must call fit() before calling predict_proba()&quot;);</span></span>
<span id="L263"><span class="lineNum"> 263</span> : }</span>
<span id="L264"><span class="lineNum"> 264</span> <span class="tlaGNC"> 66 : std::vector&lt;std::vector&lt;double&gt;&gt; predictions;</span></span>
<span id="L265"><span class="lineNum"> 265</span> <span class="tlaGNC"> 66 : std::vector&lt;int&gt; sample;</span></span>
<span id="L266"><span class="lineNum"> 266</span> <span class="tlaGNC"> 12787 : for (int row = 0; row &lt; tsamples[0].size(); ++row) {</span></span>
<span id="L267"><span class="lineNum"> 267</span> <span class="tlaGNC"> 12721 : sample.clear();</span></span>
<span id="L268"><span class="lineNum"> 268</span> <span class="tlaGNC"> 193587 : for (int col = 0; col &lt; tsamples.size(); ++col) {</span></span>
<span id="L269"><span class="lineNum"> 269</span> <span class="tlaGNC"> 180866 : sample.push_back(tsamples[col][row]);</span></span>
<span id="L264"><span class="lineNum"> 264</span> <span class="tlaGNC"> 755 : std::vector&lt;std::vector&lt;double&gt;&gt; predictions;</span></span>
<span id="L265"><span class="lineNum"> 265</span> <span class="tlaGNC"> 755 : std::vector&lt;int&gt; sample;</span></span>
<span id="L266"><span class="lineNum"> 266</span> <span class="tlaGNC"> 146506 : for (int row = 0; row &lt; tsamples[0].size(); ++row) {</span></span>
<span id="L267"><span class="lineNum"> 267</span> <span class="tlaGNC"> 145751 : sample.clear();</span></span>
<span id="L268"><span class="lineNum"> 268</span> <span class="tlaGNC"> 1941951 : for (int col = 0; col &lt; tsamples.size(); ++col) {</span></span>
<span id="L269"><span class="lineNum"> 269</span> <span class="tlaGNC"> 1796200 : sample.push_back(tsamples[col][row]);</span></span>
<span id="L270"><span class="lineNum"> 270</span> : }</span>
<span id="L271"><span class="lineNum"> 271</span> <span class="tlaGNC"> 12721 : predictions.push_back(predict_sample(sample));</span></span>
<span id="L271"><span class="lineNum"> 271</span> <span class="tlaGNC"> 145751 : predictions.push_back(predict_sample(sample));</span></span>
<span id="L272"><span class="lineNum"> 272</span> : }</span>
<span id="L273"><span class="lineNum"> 273</span> <span class="tlaGNC"> 132 : return predictions;</span></span>
<span id="L274"><span class="lineNum"> 274</span> <span class="tlaGNC"> 66 : }</span></span>
<span id="L275"><span class="lineNum"> 275</span> <span class="tlaGNC"> 5 : double Network::score(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; tsamples, const std::vector&lt;int&gt;&amp; labels)</span></span>
<span id="L273"><span class="lineNum"> 273</span> <span class="tlaGNC"> 1510 : return predictions;</span></span>
<span id="L274"><span class="lineNum"> 274</span> <span class="tlaGNC"> 755 : }</span></span>
<span id="L275"><span class="lineNum"> 275</span> <span class="tlaGNC"> 55 : double Network::score(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; tsamples, const std::vector&lt;int&gt;&amp; labels)</span></span>
<span id="L276"><span class="lineNum"> 276</span> : {</span>
<span id="L277"><span class="lineNum"> 277</span> <span class="tlaGNC"> 5 : std::vector&lt;int&gt; y_pred = predict(tsamples);</span></span>
<span id="L278"><span class="lineNum"> 278</span> <span class="tlaGNC"> 3 : int correct = 0;</span></span>
<span id="L279"><span class="lineNum"> 279</span> <span class="tlaGNC"> 581 : for (int i = 0; i &lt; y_pred.size(); ++i) {</span></span>
<span id="L280"><span class="lineNum"> 280</span> <span class="tlaGNC"> 578 : if (y_pred[i] == labels[i]) {</span></span>
<span id="L281"><span class="lineNum"> 281</span> <span class="tlaGNC"> 486 : correct++;</span></span>
<span id="L277"><span class="lineNum"> 277</span> <span class="tlaGNC"> 55 : std::vector&lt;int&gt; y_pred = predict(tsamples);</span></span>
<span id="L278"><span class="lineNum"> 278</span> <span class="tlaGNC"> 33 : int correct = 0;</span></span>
<span id="L279"><span class="lineNum"> 279</span> <span class="tlaGNC"> 6391 : for (int i = 0; i &lt; y_pred.size(); ++i) {</span></span>
<span id="L280"><span class="lineNum"> 280</span> <span class="tlaGNC"> 6358 : if (y_pred[i] == labels[i]) {</span></span>
<span id="L281"><span class="lineNum"> 281</span> <span class="tlaGNC"> 5346 : correct++;</span></span>
<span id="L282"><span class="lineNum"> 282</span> : }</span>
<span id="L283"><span class="lineNum"> 283</span> : }</span>
<span id="L284"><span class="lineNum"> 284</span> <span class="tlaGNC"> 6 : return (double)correct / y_pred.size();</span></span>
<span id="L285"><span class="lineNum"> 285</span> <span class="tlaGNC"> 3 : }</span></span>
<span id="L284"><span class="lineNum"> 284</span> <span class="tlaGNC"> 66 : return (double)correct / y_pred.size();</span></span>
<span id="L285"><span class="lineNum"> 285</span> <span class="tlaGNC"> 33 : }</span></span>
<span id="L286"><span class="lineNum"> 286</span> : // Return 1xn std::vector of probabilities</span>
<span id="L287"><span class="lineNum"> 287</span> <span class="tlaGNC"> 13606 : std::vector&lt;double&gt; Network::predict_sample(const std::vector&lt;int&gt;&amp; sample)</span></span>
<span id="L287"><span class="lineNum"> 287</span> <span class="tlaGNC"> 155486 : std::vector&lt;double&gt; Network::predict_sample(const std::vector&lt;int&gt;&amp; sample)</span></span>
<span id="L288"><span class="lineNum"> 288</span> : {</span>
<span id="L289"><span class="lineNum"> 289</span> : // Ensure the sample size is equal to the number of features</span>
<span id="L290"><span class="lineNum"> 290</span> <span class="tlaGNC"> 13606 : if (sample.size() != features.size() - 1) {</span></span>
<span id="L291"><span class="lineNum"> 291</span> <span class="tlaGNC"> 4 : throw std::invalid_argument(&quot;Sample size (&quot; + std::to_string(sample.size()) +</span></span>
<span id="L292"><span class="lineNum"> 292</span> <span class="tlaGNC"> 6 : &quot;) does not match the number of features (&quot; + std::to_string(features.size() - 1) + &quot;)&quot;);</span></span>
<span id="L290"><span class="lineNum"> 290</span> <span class="tlaGNC"> 155486 : if (sample.size() != features.size() - 1) {</span></span>
<span id="L291"><span class="lineNum"> 291</span> <span class="tlaGNC"> 44 : throw std::invalid_argument(&quot;Sample size (&quot; + std::to_string(sample.size()) +</span></span>
<span id="L292"><span class="lineNum"> 292</span> <span class="tlaGNC"> 66 : &quot;) does not match the number of features (&quot; + std::to_string(features.size() - 1) + &quot;)&quot;);</span></span>
<span id="L293"><span class="lineNum"> 293</span> : }</span>
<span id="L294"><span class="lineNum"> 294</span> <span class="tlaGNC"> 13604 : std::map&lt;std::string, int&gt; evidence;</span></span>
<span id="L295"><span class="lineNum"> 295</span> <span class="tlaGNC"> 200142 : for (int i = 0; i &lt; sample.size(); ++i) {</span></span>
<span id="L296"><span class="lineNum"> 296</span> <span class="tlaGNC"> 186538 : evidence[features[i]] = sample[i];</span></span>
<span id="L294"><span class="lineNum"> 294</span> <span class="tlaGNC"> 155464 : std::map&lt;std::string, int&gt; evidence;</span></span>
<span id="L295"><span class="lineNum"> 295</span> <span class="tlaGNC"> 2014056 : for (int i = 0; i &lt; sample.size(); ++i) {</span></span>
<span id="L296"><span class="lineNum"> 296</span> <span class="tlaGNC"> 1858592 : evidence[features[i]] = sample[i];</span></span>
<span id="L297"><span class="lineNum"> 297</span> : }</span>
<span id="L298"><span class="lineNum"> 298</span> <span class="tlaGNC"> 27208 : return exactInference(evidence);</span></span>
<span id="L299"><span class="lineNum"> 299</span> <span class="tlaGNC"> 13604 : }</span></span>
<span id="L298"><span class="lineNum"> 298</span> <span class="tlaGNC"> 310928 : return exactInference(evidence);</span></span>
<span id="L299"><span class="lineNum"> 299</span> <span class="tlaGNC"> 155464 : }</span></span>
<span id="L300"><span class="lineNum"> 300</span> : // Return 1xn std::vector of probabilities</span>
<span id="L301"><span class="lineNum"> 301</span> <span class="tlaGNC"> 95840 : std::vector&lt;double&gt; Network::predict_sample(const torch::Tensor&amp; sample)</span></span>
<span id="L301"><span class="lineNum"> 301</span> <span class="tlaGNC"> 1163291 : std::vector&lt;double&gt; Network::predict_sample(const torch::Tensor&amp; sample)</span></span>
<span id="L302"><span class="lineNum"> 302</span> : {</span>
<span id="L303"><span class="lineNum"> 303</span> : // Ensure the sample size is equal to the number of features</span>
<span id="L304"><span class="lineNum"> 304</span> <span class="tlaGNC"> 95840 : if (sample.size(0) != features.size() - 1) {</span></span>
<span id="L305"><span class="lineNum"> 305</span> <span class="tlaGNC"> 4 : throw std::invalid_argument(&quot;Sample size (&quot; + std::to_string(sample.size(0)) +</span></span>
<span id="L306"><span class="lineNum"> 306</span> <span class="tlaGNC"> 6 : &quot;) does not match the number of features (&quot; + std::to_string(features.size() - 1) + &quot;)&quot;);</span></span>
<span id="L304"><span class="lineNum"> 304</span> <span class="tlaGNC"> 1163291 : if (sample.size(0) != features.size() - 1) {</span></span>
<span id="L305"><span class="lineNum"> 305</span> <span class="tlaGNC"> 44 : throw std::invalid_argument(&quot;Sample size (&quot; + std::to_string(sample.size(0)) +</span></span>
<span id="L306"><span class="lineNum"> 306</span> <span class="tlaGNC"> 66 : &quot;) does not match the number of features (&quot; + std::to_string(features.size() - 1) + &quot;)&quot;);</span></span>
<span id="L307"><span class="lineNum"> 307</span> : }</span>
<span id="L308"><span class="lineNum"> 308</span> <span class="tlaGNC"> 95838 : std::map&lt;std::string, int&gt; evidence;</span></span>
<span id="L309"><span class="lineNum"> 309</span> <span class="tlaGNC"> 2448008 : for (int i = 0; i &lt; sample.size(0); ++i) {</span></span>
<span id="L310"><span class="lineNum"> 310</span> <span class="tlaGNC"> 2352170 : evidence[features[i]] = sample[i].item&lt;int&gt;();</span></span>
<span id="L308"><span class="lineNum"> 308</span> <span class="tlaGNC"> 1163269 : std::map&lt;std::string, int&gt; evidence;</span></span>
<span id="L309"><span class="lineNum"> 309</span> <span class="tlaGNC"> 30202277 : for (int i = 0; i &lt; sample.size(0); ++i) {</span></span>
<span id="L310"><span class="lineNum"> 310</span> <span class="tlaGNC"> 29039008 : evidence[features[i]] = sample[i].item&lt;int&gt;();</span></span>
<span id="L311"><span class="lineNum"> 311</span> : }</span>
<span id="L312"><span class="lineNum"> 312</span> <span class="tlaGNC"> 191676 : return exactInference(evidence);</span></span>
<span id="L313"><span class="lineNum"> 313</span> <span class="tlaGNC"> 95838 : }</span></span>
<span id="L314"><span class="lineNum"> 314</span> <span class="tlaGNC"> 437768 : double Network::computeFactor(std::map&lt;std::string, int&gt;&amp; completeEvidence)</span></span>
<span id="L312"><span class="lineNum"> 312</span> <span class="tlaGNC"> 2326538 : return exactInference(evidence);</span></span>
<span id="L313"><span class="lineNum"> 313</span> <span class="tlaGNC"> 1163269 : }</span></span>
<span id="L314"><span class="lineNum"> 314</span> <span class="tlaGNC"> 5150558 : double Network::computeFactor(std::map&lt;std::string, int&gt;&amp; completeEvidence)</span></span>
<span id="L315"><span class="lineNum"> 315</span> : {</span>
<span id="L316"><span class="lineNum"> 316</span> <span class="tlaGNC"> 437768 : double result = 1.0;</span></span>
<span id="L317"><span class="lineNum"> 317</span> <span class="tlaGNC"> 6084992 : for (auto&amp; node : getNodes()) {</span></span>
<span id="L318"><span class="lineNum"> 318</span> <span class="tlaGNC"> 5647224 : result *= node.second-&gt;getFactorValue(completeEvidence);</span></span>
<span id="L316"><span class="lineNum"> 316</span> <span class="tlaGNC"> 5150558 : double result = 1.0;</span></span>
<span id="L317"><span class="lineNum"> 317</span> <span class="tlaGNC"> 72453396 : for (auto&amp; node : getNodes()) {</span></span>
<span id="L318"><span class="lineNum"> 318</span> <span class="tlaGNC"> 67302838 : result *= node.second-&gt;getFactorValue(completeEvidence);</span></span>
<span id="L319"><span class="lineNum"> 319</span> : }</span>
<span id="L320"><span class="lineNum"> 320</span> <span class="tlaGNC"> 437768 : return result;</span></span>
<span id="L320"><span class="lineNum"> 320</span> <span class="tlaGNC"> 5150558 : return result;</span></span>
<span id="L321"><span class="lineNum"> 321</span> : }</span>
<span id="L322"><span class="lineNum"> 322</span> <span class="tlaGNC"> 109442 : std::vector&lt;double&gt; Network::exactInference(std::map&lt;std::string, int&gt;&amp; evidence)</span></span>
<span id="L322"><span class="lineNum"> 322</span> <span class="tlaGNC"> 1318733 : std::vector&lt;double&gt; Network::exactInference(std::map&lt;std::string, int&gt;&amp; evidence)</span></span>
<span id="L323"><span class="lineNum"> 323</span> : {</span>
<span id="L324"><span class="lineNum"> 324</span> <span class="tlaGNC"> 109442 : std::vector&lt;double&gt; result(classNumStates, 0.0);</span></span>
<span id="L325"><span class="lineNum"> 325</span> <span class="tlaGNC"> 109442 : std::vector&lt;std::thread&gt; threads;</span></span>
<span id="L326"><span class="lineNum"> 326</span> <span class="tlaGNC"> 109442 : std::mutex mtx;</span></span>
<span id="L327"><span class="lineNum"> 327</span> <span class="tlaGNC"> 547210 : for (int i = 0; i &lt; classNumStates; ++i) {</span></span>
<span id="L328"><span class="lineNum"> 328</span> <span class="tlaGNC"> 437768 : threads.emplace_back([this, &amp;result, &amp;evidence, i, &amp;mtx]() {</span></span>
<span id="L329"><span class="lineNum"> 329</span> <span class="tlaGNC"> 437768 : auto completeEvidence = std::map&lt;std::string, int&gt;(evidence);</span></span>
<span id="L330"><span class="lineNum"> 330</span> <span class="tlaGNC"> 437768 : completeEvidence[getClassName()] = i;</span></span>
<span id="L331"><span class="lineNum"> 331</span> <span class="tlaGNC"> 437768 : double factor = computeFactor(completeEvidence);</span></span>
<span id="L332"><span class="lineNum"> 332</span> <span class="tlaGNC"> 437768 : std::lock_guard&lt;std::mutex&gt; lock(mtx);</span></span>
<span id="L333"><span class="lineNum"> 333</span> <span class="tlaGNC"> 437768 : result[i] = factor;</span></span>
<span id="L334"><span class="lineNum"> 334</span> <span class="tlaGNC"> 437768 : });</span></span>
<span id="L324"><span class="lineNum"> 324</span> <span class="tlaGNC"> 1318733 : std::vector&lt;double&gt; result(classNumStates, 0.0);</span></span>
<span id="L325"><span class="lineNum"> 325</span> <span class="tlaGNC"> 1318733 : std::vector&lt;std::thread&gt; threads;</span></span>
<span id="L326"><span class="lineNum"> 326</span> <span class="tlaGNC"> 1318733 : std::mutex mtx;</span></span>
<span id="L327"><span class="lineNum"> 327</span> <span class="tlaGNC"> 6469291 : for (int i = 0; i &lt; classNumStates; ++i) {</span></span>
<span id="L328"><span class="lineNum"> 328</span> <span class="tlaGNC"> 5150558 : threads.emplace_back([this, &amp;result, &amp;evidence, i, &amp;mtx]() {</span></span>
<span id="L329"><span class="lineNum"> 329</span> <span class="tlaGNC"> 5150558 : auto completeEvidence = std::map&lt;std::string, int&gt;(evidence);</span></span>
<span id="L330"><span class="lineNum"> 330</span> <span class="tlaGNC"> 5150558 : completeEvidence[getClassName()] = i;</span></span>
<span id="L331"><span class="lineNum"> 331</span> <span class="tlaGNC"> 5150558 : double factor = computeFactor(completeEvidence);</span></span>
<span id="L332"><span class="lineNum"> 332</span> <span class="tlaGNC"> 5150558 : std::lock_guard&lt;std::mutex&gt; lock(mtx);</span></span>
<span id="L333"><span class="lineNum"> 333</span> <span class="tlaGNC"> 5150558 : result[i] = factor;</span></span>
<span id="L334"><span class="lineNum"> 334</span> <span class="tlaGNC"> 5150558 : });</span></span>
<span id="L335"><span class="lineNum"> 335</span> : }</span>
<span id="L336"><span class="lineNum"> 336</span> <span class="tlaGNC"> 547210 : for (auto&amp; thread : threads) {</span></span>
<span id="L337"><span class="lineNum"> 337</span> <span class="tlaGNC"> 437768 : thread.join();</span></span>
<span id="L336"><span class="lineNum"> 336</span> <span class="tlaGNC"> 6469291 : for (auto&amp; thread : threads) {</span></span>
<span id="L337"><span class="lineNum"> 337</span> <span class="tlaGNC"> 5150558 : thread.join();</span></span>
<span id="L338"><span class="lineNum"> 338</span> : }</span>
<span id="L339"><span class="lineNum"> 339</span> : // Normalize result</span>
<span id="L340"><span class="lineNum"> 340</span> <span class="tlaGNC"> 109442 : double sum = accumulate(result.begin(), result.end(), 0.0);</span></span>
<span id="L341"><span class="lineNum"> 341</span> <span class="tlaGNC"> 547210 : transform(result.begin(), result.end(), result.begin(), [sum](const double&amp; value) { return value / sum; });</span></span>
<span id="L342"><span class="lineNum"> 342</span> <span class="tlaGNC"> 218884 : return result;</span></span>
<span id="L343"><span class="lineNum"> 343</span> <span class="tlaGNC"> 109442 : }</span></span>
<span id="L344"><span class="lineNum"> 344</span> <span class="tlaGNC"> 7 : std::vector&lt;std::string&gt; Network::show() const</span></span>
<span id="L340"><span class="lineNum"> 340</span> <span class="tlaGNC"> 1318733 : double sum = accumulate(result.begin(), result.end(), 0.0);</span></span>
<span id="L341"><span class="lineNum"> 341</span> <span class="tlaGNC"> 6469291 : transform(result.begin(), result.end(), result.begin(), [sum](const double&amp; value) { return value / sum; });</span></span>
<span id="L342"><span class="lineNum"> 342</span> <span class="tlaGNC"> 2637466 : return result;</span></span>
<span id="L343"><span class="lineNum"> 343</span> <span class="tlaGNC"> 1318733 : }</span></span>
<span id="L344"><span class="lineNum"> 344</span> <span class="tlaGNC"> 77 : std::vector&lt;std::string&gt; Network::show() const</span></span>
<span id="L345"><span class="lineNum"> 345</span> : {</span>
<span id="L346"><span class="lineNum"> 346</span> <span class="tlaGNC"> 7 : std::vector&lt;std::string&gt; result;</span></span>
<span id="L346"><span class="lineNum"> 346</span> <span class="tlaGNC"> 77 : std::vector&lt;std::string&gt; result;</span></span>
<span id="L347"><span class="lineNum"> 347</span> : // Draw the network</span>
<span id="L348"><span class="lineNum"> 348</span> <span class="tlaGNC"> 40 : for (auto&amp; node : nodes) {</span></span>
<span id="L349"><span class="lineNum"> 349</span> <span class="tlaGNC"> 33 : std::string line = node.first + &quot; -&gt; &quot;;</span></span>
<span id="L350"><span class="lineNum"> 350</span> <span class="tlaGNC"> 77 : for (auto child : node.second-&gt;getChildren()) {</span></span>
<span id="L351"><span class="lineNum"> 351</span> <span class="tlaGNC"> 44 : line += child-&gt;getName() + &quot;, &quot;;</span></span>
<span id="L348"><span class="lineNum"> 348</span> <span class="tlaGNC"> 440 : for (auto&amp; node : nodes) {</span></span>
<span id="L349"><span class="lineNum"> 349</span> <span class="tlaGNC"> 363 : std::string line = node.first + &quot; -&gt; &quot;;</span></span>
<span id="L350"><span class="lineNum"> 350</span> <span class="tlaGNC"> 847 : for (auto child : node.second-&gt;getChildren()) {</span></span>
<span id="L351"><span class="lineNum"> 351</span> <span class="tlaGNC"> 484 : line += child-&gt;getName() + &quot;, &quot;;</span></span>
<span id="L352"><span class="lineNum"> 352</span> : }</span>
<span id="L353"><span class="lineNum"> 353</span> <span class="tlaGNC"> 33 : result.push_back(line);</span></span>
<span id="L354"><span class="lineNum"> 354</span> <span class="tlaGNC"> 33 : }</span></span>
<span id="L355"><span class="lineNum"> 355</span> <span class="tlaGNC"> 7 : return result;</span></span>
<span id="L353"><span class="lineNum"> 353</span> <span class="tlaGNC"> 363 : result.push_back(line);</span></span>
<span id="L354"><span class="lineNum"> 354</span> <span class="tlaGNC"> 363 : }</span></span>
<span id="L355"><span class="lineNum"> 355</span> <span class="tlaGNC"> 77 : return result;</span></span>
<span id="L356"><span class="lineNum"> 356</span> <span class="tlaUNC tlaBgUNC"> 0 : }</span></span>
<span id="L357"><span class="lineNum"> 357</span> <span class="tlaGNC tlaBgGNC"> 22 : std::vector&lt;std::string&gt; Network::graph(const std::string&amp; title) const</span></span>
<span id="L357"><span class="lineNum"> 357</span> <span class="tlaGNC tlaBgGNC"> 242 : std::vector&lt;std::string&gt; Network::graph(const std::string&amp; title) const</span></span>
<span id="L358"><span class="lineNum"> 358</span> : {</span>
<span id="L359"><span class="lineNum"> 359</span> <span class="tlaGNC"> 22 : auto output = std::vector&lt;std::string&gt;();</span></span>
<span id="L360"><span class="lineNum"> 360</span> <span class="tlaGNC"> 22 : auto prefix = &quot;digraph BayesNet {\nlabel=&lt;BayesNet &quot;;</span></span>
<span id="L361"><span class="lineNum"> 361</span> <span class="tlaGNC"> 22 : auto suffix = &quot;&gt;\nfontsize=30\nfontcolor=blue\nlabelloc=t\nlayout=circo\n&quot;;</span></span>
<span id="L362"><span class="lineNum"> 362</span> <span class="tlaGNC"> 22 : std::string header = prefix + title + suffix;</span></span>
<span id="L363"><span class="lineNum"> 363</span> <span class="tlaGNC"> 22 : output.push_back(header);</span></span>
<span id="L364"><span class="lineNum"> 364</span> <span class="tlaGNC"> 175 : for (auto&amp; node : nodes) {</span></span>
<span id="L365"><span class="lineNum"> 365</span> <span class="tlaGNC"> 153 : auto result = node.second-&gt;graph(className);</span></span>
<span id="L366"><span class="lineNum"> 366</span> <span class="tlaGNC"> 153 : output.insert(output.end(), result.begin(), result.end());</span></span>
<span id="L367"><span class="lineNum"> 367</span> <span class="tlaGNC"> 153 : }</span></span>
<span id="L368"><span class="lineNum"> 368</span> <span class="tlaGNC"> 22 : output.push_back(&quot;}\n&quot;);</span></span>
<span id="L369"><span class="lineNum"> 369</span> <span class="tlaGNC"> 44 : return output;</span></span>
<span id="L370"><span class="lineNum"> 370</span> <span class="tlaGNC"> 22 : }</span></span>
<span id="L371"><span class="lineNum"> 371</span> <span class="tlaGNC"> 59 : std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt; Network::getEdges() const</span></span>
<span id="L359"><span class="lineNum"> 359</span> <span class="tlaGNC"> 242 : auto output = std::vector&lt;std::string&gt;();</span></span>
<span id="L360"><span class="lineNum"> 360</span> <span class="tlaGNC"> 242 : auto prefix = &quot;digraph BayesNet {\nlabel=&lt;BayesNet &quot;;</span></span>
<span id="L361"><span class="lineNum"> 361</span> <span class="tlaGNC"> 242 : auto suffix = &quot;&gt;\nfontsize=30\nfontcolor=blue\nlabelloc=t\nlayout=circo\n&quot;;</span></span>
<span id="L362"><span class="lineNum"> 362</span> <span class="tlaGNC"> 242 : std::string header = prefix + title + suffix;</span></span>
<span id="L363"><span class="lineNum"> 363</span> <span class="tlaGNC"> 242 : output.push_back(header);</span></span>
<span id="L364"><span class="lineNum"> 364</span> <span class="tlaGNC"> 1925 : for (auto&amp; node : nodes) {</span></span>
<span id="L365"><span class="lineNum"> 365</span> <span class="tlaGNC"> 1683 : auto result = node.second-&gt;graph(className);</span></span>
<span id="L366"><span class="lineNum"> 366</span> <span class="tlaGNC"> 1683 : output.insert(output.end(), result.begin(), result.end());</span></span>
<span id="L367"><span class="lineNum"> 367</span> <span class="tlaGNC"> 1683 : }</span></span>
<span id="L368"><span class="lineNum"> 368</span> <span class="tlaGNC"> 242 : output.push_back(&quot;}\n&quot;);</span></span>
<span id="L369"><span class="lineNum"> 369</span> <span class="tlaGNC"> 484 : return output;</span></span>
<span id="L370"><span class="lineNum"> 370</span> <span class="tlaGNC"> 242 : }</span></span>
<span id="L371"><span class="lineNum"> 371</span> <span class="tlaGNC"> 684 : std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt; Network::getEdges() const</span></span>
<span id="L372"><span class="lineNum"> 372</span> : {</span>
<span id="L373"><span class="lineNum"> 373</span> <span class="tlaGNC"> 59 : auto edges = std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt;();</span></span>
<span id="L374"><span class="lineNum"> 374</span> <span class="tlaGNC"> 937 : for (const auto&amp; node : nodes) {</span></span>
<span id="L375"><span class="lineNum"> 375</span> <span class="tlaGNC"> 878 : auto head = node.first;</span></span>
<span id="L376"><span class="lineNum"> 376</span> <span class="tlaGNC"> 2456 : for (const auto&amp; child : node.second-&gt;getChildren()) {</span></span>
<span id="L377"><span class="lineNum"> 377</span> <span class="tlaGNC"> 1578 : auto tail = child-&gt;getName();</span></span>
<span id="L378"><span class="lineNum"> 378</span> <span class="tlaGNC"> 1578 : edges.push_back({ head, tail });</span></span>
<span id="L379"><span class="lineNum"> 379</span> <span class="tlaGNC"> 1578 : }</span></span>
<span id="L380"><span class="lineNum"> 380</span> <span class="tlaGNC"> 878 : }</span></span>
<span id="L381"><span class="lineNum"> 381</span> <span class="tlaGNC"> 59 : return edges;</span></span>
<span id="L373"><span class="lineNum"> 373</span> <span class="tlaGNC"> 684 : auto edges = std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt;();</span></span>
<span id="L374"><span class="lineNum"> 374</span> <span class="tlaGNC"> 10684 : for (const auto&amp; node : nodes) {</span></span>
<span id="L375"><span class="lineNum"> 375</span> <span class="tlaGNC"> 10000 : auto head = node.first;</span></span>
<span id="L376"><span class="lineNum"> 376</span> <span class="tlaGNC"> 27937 : for (const auto&amp; child : node.second-&gt;getChildren()) {</span></span>
<span id="L377"><span class="lineNum"> 377</span> <span class="tlaGNC"> 17937 : auto tail = child-&gt;getName();</span></span>
<span id="L378"><span class="lineNum"> 378</span> <span class="tlaGNC"> 17937 : edges.push_back({ head, tail });</span></span>
<span id="L379"><span class="lineNum"> 379</span> <span class="tlaGNC"> 17937 : }</span></span>
<span id="L380"><span class="lineNum"> 380</span> <span class="tlaGNC"> 10000 : }</span></span>
<span id="L381"><span class="lineNum"> 381</span> <span class="tlaGNC"> 684 : return edges;</span></span>
<span id="L382"><span class="lineNum"> 382</span> <span class="tlaUNC tlaBgUNC"> 0 : }</span></span>
<span id="L383"><span class="lineNum"> 383</span> <span class="tlaGNC tlaBgGNC"> 48 : int Network::getNumEdges() const</span></span>
<span id="L383"><span class="lineNum"> 383</span> <span class="tlaGNC tlaBgGNC"> 563 : int Network::getNumEdges() const</span></span>
<span id="L384"><span class="lineNum"> 384</span> : {</span>
<span id="L385"><span class="lineNum"> 385</span> <span class="tlaGNC"> 48 : return getEdges().size();</span></span>
<span id="L385"><span class="lineNum"> 385</span> <span class="tlaGNC"> 563 : return getEdges().size();</span></span>
<span id="L386"><span class="lineNum"> 386</span> : }</span>
<span id="L387"><span class="lineNum"> 387</span> <span class="tlaGNC"> 55 : std::vector&lt;std::string&gt; Network::topological_sort()</span></span>
<span id="L387"><span class="lineNum"> 387</span> <span class="tlaGNC"> 605 : std::vector&lt;std::string&gt; Network::topological_sort()</span></span>
<span id="L388"><span class="lineNum"> 388</span> : {</span>
<span id="L389"><span class="lineNum"> 389</span> : /* Check if al the fathers of every node are before the node */</span>
<span id="L390"><span class="lineNum"> 390</span> <span class="tlaGNC"> 55 : auto result = features;</span></span>
<span id="L391"><span class="lineNum"> 391</span> <span class="tlaGNC"> 55 : result.erase(remove(result.begin(), result.end(), className), result.end());</span></span>
<span id="L392"><span class="lineNum"> 392</span> <span class="tlaGNC"> 55 : bool ending{ false };</span></span>
<span id="L393"><span class="lineNum"> 393</span> <span class="tlaGNC"> 157 : while (!ending) {</span></span>
<span id="L394"><span class="lineNum"> 394</span> <span class="tlaGNC"> 102 : ending = true;</span></span>
<span id="L395"><span class="lineNum"> 395</span> <span class="tlaGNC"> 951 : for (auto feature : features) {</span></span>
<span id="L396"><span class="lineNum"> 396</span> <span class="tlaGNC"> 849 : auto fathers = nodes[feature]-&gt;getParents();</span></span>
<span id="L397"><span class="lineNum"> 397</span> <span class="tlaGNC"> 2250 : for (const auto&amp; father : fathers) {</span></span>
<span id="L398"><span class="lineNum"> 398</span> <span class="tlaGNC"> 1401 : auto fatherName = father-&gt;getName();</span></span>
<span id="L399"><span class="lineNum"> 399</span> <span class="tlaGNC"> 1401 : if (fatherName == className) {</span></span>
<span id="L400"><span class="lineNum"> 400</span> <span class="tlaGNC"> 745 : continue;</span></span>
<span id="L390"><span class="lineNum"> 390</span> <span class="tlaGNC"> 605 : auto result = features;</span></span>
<span id="L391"><span class="lineNum"> 391</span> <span class="tlaGNC"> 605 : result.erase(remove(result.begin(), result.end(), className), result.end());</span></span>
<span id="L392"><span class="lineNum"> 392</span> <span class="tlaGNC"> 605 : bool ending{ false };</span></span>
<span id="L393"><span class="lineNum"> 393</span> <span class="tlaGNC"> 1727 : while (!ending) {</span></span>
<span id="L394"><span class="lineNum"> 394</span> <span class="tlaGNC"> 1122 : ending = true;</span></span>
<span id="L395"><span class="lineNum"> 395</span> <span class="tlaGNC"> 10461 : for (auto feature : features) {</span></span>
<span id="L396"><span class="lineNum"> 396</span> <span class="tlaGNC"> 9339 : auto fathers = nodes[feature]-&gt;getParents();</span></span>
<span id="L397"><span class="lineNum"> 397</span> <span class="tlaGNC"> 24750 : for (const auto&amp; father : fathers) {</span></span>
<span id="L398"><span class="lineNum"> 398</span> <span class="tlaGNC"> 15411 : auto fatherName = father-&gt;getName();</span></span>
<span id="L399"><span class="lineNum"> 399</span> <span class="tlaGNC"> 15411 : if (fatherName == className) {</span></span>
<span id="L400"><span class="lineNum"> 400</span> <span class="tlaGNC"> 8195 : continue;</span></span>
<span id="L401"><span class="lineNum"> 401</span> : }</span>
<span id="L402"><span class="lineNum"> 402</span> : // Check if father is placed before the actual feature</span>
<span id="L403"><span class="lineNum"> 403</span> <span class="tlaGNC"> 656 : auto it = find(result.begin(), result.end(), fatherName);</span></span>
<span id="L404"><span class="lineNum"> 404</span> <span class="tlaGNC"> 656 : if (it != result.end()) {</span></span>
<span id="L405"><span class="lineNum"> 405</span> <span class="tlaGNC"> 656 : auto it2 = find(result.begin(), result.end(), feature);</span></span>
<span id="L406"><span class="lineNum"> 406</span> <span class="tlaGNC"> 656 : if (it2 != result.end()) {</span></span>
<span id="L407"><span class="lineNum"> 407</span> <span class="tlaGNC"> 656 : if (distance(it, it2) &lt; 0) {</span></span>
<span id="L403"><span class="lineNum"> 403</span> <span class="tlaGNC"> 7216 : auto it = find(result.begin(), result.end(), fatherName);</span></span>
<span id="L404"><span class="lineNum"> 404</span> <span class="tlaGNC"> 7216 : if (it != result.end()) {</span></span>
<span id="L405"><span class="lineNum"> 405</span> <span class="tlaGNC"> 7216 : auto it2 = find(result.begin(), result.end(), feature);</span></span>
<span id="L406"><span class="lineNum"> 406</span> <span class="tlaGNC"> 7216 : if (it2 != result.end()) {</span></span>
<span id="L407"><span class="lineNum"> 407</span> <span class="tlaGNC"> 7216 : if (distance(it, it2) &lt; 0) {</span></span>
<span id="L408"><span class="lineNum"> 408</span> : // if it is not, insert it before the feature</span>
<span id="L409"><span class="lineNum"> 409</span> <span class="tlaGNC"> 61 : result.erase(remove(result.begin(), result.end(), fatherName), result.end());</span></span>
<span id="L410"><span class="lineNum"> 410</span> <span class="tlaGNC"> 61 : result.insert(it2, fatherName);</span></span>
<span id="L411"><span class="lineNum"> 411</span> <span class="tlaGNC"> 61 : ending = false;</span></span>
<span id="L409"><span class="lineNum"> 409</span> <span class="tlaGNC"> 671 : result.erase(remove(result.begin(), result.end(), fatherName), result.end());</span></span>
<span id="L410"><span class="lineNum"> 410</span> <span class="tlaGNC"> 671 : result.insert(it2, fatherName);</span></span>
<span id="L411"><span class="lineNum"> 411</span> <span class="tlaGNC"> 671 : ending = false;</span></span>
<span id="L412"><span class="lineNum"> 412</span> : }</span>
<span id="L413"><span class="lineNum"> 413</span> : } else {</span>
<span id="L414"><span class="lineNum"> 414</span> <span class="tlaUNC tlaBgUNC"> 0 : throw std::logic_error(&quot;Error in topological sort because of node &quot; + feature + &quot; is not in result&quot;);</span></span>
@@ -478,20 +478,20 @@
<span id="L416"><span class="lineNum"> 416</span> : } else {</span>
<span id="L417"><span class="lineNum"> 417</span> <span class="tlaUNC"> 0 : throw std::logic_error(&quot;Error in topological sort because of node father &quot; + fatherName + &quot; is not in result&quot;);</span></span>
<span id="L418"><span class="lineNum"> 418</span> : }</span>
<span id="L419"><span class="lineNum"> 419</span> <span class="tlaGNC tlaBgGNC"> 1401 : }</span></span>
<span id="L420"><span class="lineNum"> 420</span> <span class="tlaGNC"> 849 : }</span></span>
<span id="L419"><span class="lineNum"> 419</span> <span class="tlaGNC tlaBgGNC"> 15411 : }</span></span>
<span id="L420"><span class="lineNum"> 420</span> <span class="tlaGNC"> 9339 : }</span></span>
<span id="L421"><span class="lineNum"> 421</span> : }</span>
<span id="L422"><span class="lineNum"> 422</span> <span class="tlaGNC"> 55 : return result;</span></span>
<span id="L422"><span class="lineNum"> 422</span> <span class="tlaGNC"> 605 : return result;</span></span>
<span id="L423"><span class="lineNum"> 423</span> <span class="tlaUNC tlaBgUNC"> 0 : }</span></span>
<span id="L424"><span class="lineNum"> 424</span> <span class="tlaGNC tlaBgGNC"> 2 : std::string Network::dump_cpt() const</span></span>
<span id="L424"><span class="lineNum"> 424</span> <span class="tlaGNC tlaBgGNC"> 22 : std::string Network::dump_cpt() const</span></span>
<span id="L425"><span class="lineNum"> 425</span> : {</span>
<span id="L426"><span class="lineNum"> 426</span> <span class="tlaGNC"> 2 : std::stringstream oss;</span></span>
<span id="L427"><span class="lineNum"> 427</span> <span class="tlaGNC"> 12 : for (auto&amp; node : nodes) {</span></span>
<span id="L428"><span class="lineNum"> 428</span> <span class="tlaGNC"> 10 : oss &lt;&lt; &quot;* &quot; &lt;&lt; node.first &lt;&lt; &quot;: (&quot; &lt;&lt; node.second-&gt;getNumStates() &lt;&lt; &quot;) : &quot; &lt;&lt; node.second-&gt;getCPT().sizes() &lt;&lt; std::endl;</span></span>
<span id="L429"><span class="lineNum"> 429</span> <span class="tlaGNC"> 10 : oss &lt;&lt; node.second-&gt;getCPT() &lt;&lt; std::endl;</span></span>
<span id="L426"><span class="lineNum"> 426</span> <span class="tlaGNC"> 22 : std::stringstream oss;</span></span>
<span id="L427"><span class="lineNum"> 427</span> <span class="tlaGNC"> 132 : for (auto&amp; node : nodes) {</span></span>
<span id="L428"><span class="lineNum"> 428</span> <span class="tlaGNC"> 110 : oss &lt;&lt; &quot;* &quot; &lt;&lt; node.first &lt;&lt; &quot;: (&quot; &lt;&lt; node.second-&gt;getNumStates() &lt;&lt; &quot;) : &quot; &lt;&lt; node.second-&gt;getCPT().sizes() &lt;&lt; std::endl;</span></span>
<span id="L429"><span class="lineNum"> 429</span> <span class="tlaGNC"> 110 : oss &lt;&lt; node.second-&gt;getCPT() &lt;&lt; std::endl;</span></span>
<span id="L430"><span class="lineNum"> 430</span> : }</span>
<span id="L431"><span class="lineNum"> 431</span> <span class="tlaGNC"> 4 : return oss.str();</span></span>
<span id="L432"><span class="lineNum"> 432</span> <span class="tlaGNC"> 2 : }</span></span>
<span id="L431"><span class="lineNum"> 431</span> <span class="tlaGNC"> 44 : return oss.str();</span></span>
<span id="L432"><span class="lineNum"> 432</span> <span class="tlaGNC"> 22 : }</span></span>
<span id="L433"><span class="lineNum"> 433</span> : }</span>
</pre>
</td>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -65,7 +65,7 @@
<tr>
<td class="coverFn"><a href="Network.h.gcov.html#L18">_ZN8bayesnet7NetworkD2Ev</a></td>
<td class="coverFnHi">711</td>
<td class="coverFnHi">647</td>
</tr>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -65,7 +65,7 @@
<tr>
<td class="coverFn"><a href="Network.h.gcov.html#L18">_ZN8bayesnet7NetworkD2Ev</a></td>
<td class="coverFnHi">711</td>
<td class="coverFnHi">647</td>
</tr>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -79,7 +79,7 @@
<span id="L17"><span class="lineNum"> 17</span> : Network();</span>
<span id="L18"><span class="lineNum"> 18</span> : explicit Network(float);</span>
<span id="L19"><span class="lineNum"> 19</span> : explicit Network(const Network&amp;);</span>
<span id="L20"><span class="lineNum"> 20</span> <span class="tlaGNC tlaBgGNC"> 711 : ~Network() = default;</span></span>
<span id="L20"><span class="lineNum"> 20</span> <span class="tlaGNC tlaBgGNC"> 647 : ~Network() = default;</span></span>
<span id="L21"><span class="lineNum"> 21</span> : torch::Tensor&amp; getSamples();</span>
<span id="L22"><span class="lineNum"> 22</span> : float getMaxThreads() const;</span>
<span id="L23"><span class="lineNum"> 23</span> : void addNode(const std::string&amp;);</span>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -65,140 +65,140 @@
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L13">_ZN8bayesnet4Node5clearEv</a></td>
<td class="coverFnHi">1</td>
<td class="coverFnHi">11</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L33">_ZN8bayesnet4Node11removeChildEPS0_</a></td>
<td class="coverFnHi">3</td>
<td class="coverFnHi">33</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L29">_ZN8bayesnet4Node12removeParentEPS0_</a></td>
<td class="coverFnHi">3</td>
<td class="coverFnHi">33</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L80">_ZN8bayesnet4Node12combinationsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE</a></td>
<td class="coverFnHi">5</td>
<td class="coverFnHi">55</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L68">_ZN8bayesnet4Node7minFillEv</a></td>
<td class="coverFnHi">5</td>
<td class="coverFnHi">55</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L57">_ZN8bayesnet4Node6getCPTEv</a></td>
<td class="coverFnHi">105</td>
<td class="coverFnHi">1155</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L131">_ZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">153</td>
<td class="coverFnHi">1683</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L136">_ZZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlRKT_E_clIPS0_EEDaSB_</a></td>
<td class="coverFnHi">241</td>
<td class="coverFnHi">2651</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L41">_ZN8bayesnet4Node10getParentsEv</a></td>
<td class="coverFnHi">1268</td>
<td class="coverFnHi">13948</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L9">_ZN8bayesnet4NodeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">8887</td>
<td class="coverFnHi">116977</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L91">_ZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L53">_ZN8bayesnet4Node12setNumStatesEi</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L25">_ZN8bayesnet4Node9addParentEPS0_</a></td>
<td class="coverFnHi">16951</td>
<td class="coverFnHi">224331</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L37">_ZN8bayesnet4Node8addChildEPS0_</a></td>
<td class="coverFnHi">16953</td>
<td class="coverFnHi">224353</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L96">_ZZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_ENKUlRKT_E_clIPS0_EEDaSI_</a></td>
<td class="coverFnHi">17649</td>
<td class="coverFnHi">232009</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L49">_ZNK8bayesnet4Node12getNumStatesEv</a></td>
<td class="coverFnHi">18032</td>
<td class="coverFnHi">236412</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L45">_ZN8bayesnet4Node11getChildrenEv</a></td>
<td class="coverFnHi">23263</td>
<td class="coverFnHi">306501</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L123">_ZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE</a></td>
<td class="coverFnHi">5647224</td>
<td class="coverFnHi">67302838</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L128">_ZZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKT_E_clIPS0_EEDaSI_</a></td>
<td class="coverFnHi">9977196</td>
<td class="coverFnHi">119110574</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L21">_ZNK8bayesnet4Node7getNameB5cxx11Ev</a></td>
<td class="coverFnHi">13264685</td>
<td class="coverFnHi">159096442</td>
</tr>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -65,140 +65,140 @@
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L91">_ZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L41">_ZN8bayesnet4Node10getParentsEv</a></td>
<td class="coverFnHi">1268</td>
<td class="coverFnHi">13948</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L45">_ZN8bayesnet4Node11getChildrenEv</a></td>
<td class="coverFnHi">23263</td>
<td class="coverFnHi">306501</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L33">_ZN8bayesnet4Node11removeChildEPS0_</a></td>
<td class="coverFnHi">3</td>
<td class="coverFnHi">33</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L80">_ZN8bayesnet4Node12combinationsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE</a></td>
<td class="coverFnHi">5</td>
<td class="coverFnHi">55</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L29">_ZN8bayesnet4Node12removeParentEPS0_</a></td>
<td class="coverFnHi">3</td>
<td class="coverFnHi">33</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L53">_ZN8bayesnet4Node12setNumStatesEi</a></td>
<td class="coverFnHi">9288</td>
<td class="coverFnHi">121388</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L123">_ZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEE</a></td>
<td class="coverFnHi">5647224</td>
<td class="coverFnHi">67302838</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L13">_ZN8bayesnet4Node5clearEv</a></td>
<td class="coverFnHi">1</td>
<td class="coverFnHi">11</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L131">_ZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">153</td>
<td class="coverFnHi">1683</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L57">_ZN8bayesnet4Node6getCPTEv</a></td>
<td class="coverFnHi">105</td>
<td class="coverFnHi">1155</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L68">_ZN8bayesnet4Node7minFillEv</a></td>
<td class="coverFnHi">5</td>
<td class="coverFnHi">55</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L37">_ZN8bayesnet4Node8addChildEPS0_</a></td>
<td class="coverFnHi">16953</td>
<td class="coverFnHi">224353</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L25">_ZN8bayesnet4Node9addParentEPS0_</a></td>
<td class="coverFnHi">16951</td>
<td class="coverFnHi">224331</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L9">_ZN8bayesnet4NodeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE</a></td>
<td class="coverFnHi">8887</td>
<td class="coverFnHi">116977</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L49">_ZNK8bayesnet4Node12getNumStatesEv</a></td>
<td class="coverFnHi">18032</td>
<td class="coverFnHi">236412</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L21">_ZNK8bayesnet4Node7getNameB5cxx11Ev</a></td>
<td class="coverFnHi">13264685</td>
<td class="coverFnHi">159096442</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L96">_ZZN8bayesnet4Node10computeCPTERKN2at6TensorERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEdS4_ENKUlRKT_E_clIPS0_EEDaSI_</a></td>
<td class="coverFnHi">17649</td>
<td class="coverFnHi">232009</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L128">_ZZN8bayesnet4Node14getFactorValueERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS7_ESaISt4pairIKS7_iEEEENKUlRKT_E_clIPS0_EEDaSI_</a></td>
<td class="coverFnHi">9977196</td>
<td class="coverFnHi">119110574</td>
</tr>
<tr>
<td class="coverFn"><a href="Node.cc.gcov.html#L136">_ZZN8bayesnet4Node5graphERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlRKT_E_clIPS0_EEDaSB_</a></td>
<td class="coverFnHi">241</td>
<td class="coverFnHi">2651</td>
</tr>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>
@@ -70,57 +70,57 @@
<span id="L8"><span class="lineNum"> 8</span> : </span>
<span id="L9"><span class="lineNum"> 9</span> : namespace bayesnet {</span>
<span id="L10"><span class="lineNum"> 10</span> : </span>
<span id="L11"><span class="lineNum"> 11</span> <span class="tlaGNC tlaBgGNC"> 8887 : Node::Node(const std::string&amp; name)</span></span>
<span id="L12"><span class="lineNum"> 12</span> <span class="tlaGNC"> 8887 : : name(name), numStates(0), cpTable(torch::Tensor()), parents(std::vector&lt;Node*&gt;()), children(std::vector&lt;Node*&gt;())</span></span>
<span id="L11"><span class="lineNum"> 11</span> <span class="tlaGNC tlaBgGNC"> 116977 : Node::Node(const std::string&amp; name)</span></span>
<span id="L12"><span class="lineNum"> 12</span> <span class="tlaGNC"> 116977 : : name(name), numStates(0), cpTable(torch::Tensor()), parents(std::vector&lt;Node*&gt;()), children(std::vector&lt;Node*&gt;())</span></span>
<span id="L13"><span class="lineNum"> 13</span> : {</span>
<span id="L14"><span class="lineNum"> 14</span> <span class="tlaGNC"> 8887 : }</span></span>
<span id="L15"><span class="lineNum"> 15</span> <span class="tlaGNC"> 1 : void Node::clear()</span></span>
<span id="L14"><span class="lineNum"> 14</span> <span class="tlaGNC"> 116977 : }</span></span>
<span id="L15"><span class="lineNum"> 15</span> <span class="tlaGNC"> 11 : void Node::clear()</span></span>
<span id="L16"><span class="lineNum"> 16</span> : {</span>
<span id="L17"><span class="lineNum"> 17</span> <span class="tlaGNC"> 1 : parents.clear();</span></span>
<span id="L18"><span class="lineNum"> 18</span> <span class="tlaGNC"> 1 : children.clear();</span></span>
<span id="L19"><span class="lineNum"> 19</span> <span class="tlaGNC"> 1 : cpTable = torch::Tensor();</span></span>
<span id="L20"><span class="lineNum"> 20</span> <span class="tlaGNC"> 1 : dimensions.clear();</span></span>
<span id="L21"><span class="lineNum"> 21</span> <span class="tlaGNC"> 1 : numStates = 0;</span></span>
<span id="L22"><span class="lineNum"> 22</span> <span class="tlaGNC"> 1 : }</span></span>
<span id="L23"><span class="lineNum"> 23</span> <span class="tlaGNC"> 13264685 : std::string Node::getName() const</span></span>
<span id="L17"><span class="lineNum"> 17</span> <span class="tlaGNC"> 11 : parents.clear();</span></span>
<span id="L18"><span class="lineNum"> 18</span> <span class="tlaGNC"> 11 : children.clear();</span></span>
<span id="L19"><span class="lineNum"> 19</span> <span class="tlaGNC"> 11 : cpTable = torch::Tensor();</span></span>
<span id="L20"><span class="lineNum"> 20</span> <span class="tlaGNC"> 11 : dimensions.clear();</span></span>
<span id="L21"><span class="lineNum"> 21</span> <span class="tlaGNC"> 11 : numStates = 0;</span></span>
<span id="L22"><span class="lineNum"> 22</span> <span class="tlaGNC"> 11 : }</span></span>
<span id="L23"><span class="lineNum"> 23</span> <span class="tlaGNC"> 159096442 : std::string Node::getName() const</span></span>
<span id="L24"><span class="lineNum"> 24</span> : {</span>
<span id="L25"><span class="lineNum"> 25</span> <span class="tlaGNC"> 13264685 : return name;</span></span>
<span id="L25"><span class="lineNum"> 25</span> <span class="tlaGNC"> 159096442 : return name;</span></span>
<span id="L26"><span class="lineNum"> 26</span> : }</span>
<span id="L27"><span class="lineNum"> 27</span> <span class="tlaGNC"> 16951 : void Node::addParent(Node* parent)</span></span>
<span id="L27"><span class="lineNum"> 27</span> <span class="tlaGNC"> 224331 : void Node::addParent(Node* parent)</span></span>
<span id="L28"><span class="lineNum"> 28</span> : {</span>
<span id="L29"><span class="lineNum"> 29</span> <span class="tlaGNC"> 16951 : parents.push_back(parent);</span></span>
<span id="L30"><span class="lineNum"> 30</span> <span class="tlaGNC"> 16951 : }</span></span>
<span id="L31"><span class="lineNum"> 31</span> <span class="tlaGNC"> 3 : void Node::removeParent(Node* parent)</span></span>
<span id="L29"><span class="lineNum"> 29</span> <span class="tlaGNC"> 224331 : parents.push_back(parent);</span></span>
<span id="L30"><span class="lineNum"> 30</span> <span class="tlaGNC"> 224331 : }</span></span>
<span id="L31"><span class="lineNum"> 31</span> <span class="tlaGNC"> 33 : void Node::removeParent(Node* parent)</span></span>
<span id="L32"><span class="lineNum"> 32</span> : {</span>
<span id="L33"><span class="lineNum"> 33</span> <span class="tlaGNC"> 3 : parents.erase(std::remove(parents.begin(), parents.end(), parent), parents.end());</span></span>
<span id="L34"><span class="lineNum"> 34</span> <span class="tlaGNC"> 3 : }</span></span>
<span id="L35"><span class="lineNum"> 35</span> <span class="tlaGNC"> 3 : void Node::removeChild(Node* child)</span></span>
<span id="L33"><span class="lineNum"> 33</span> <span class="tlaGNC"> 33 : parents.erase(std::remove(parents.begin(), parents.end(), parent), parents.end());</span></span>
<span id="L34"><span class="lineNum"> 34</span> <span class="tlaGNC"> 33 : }</span></span>
<span id="L35"><span class="lineNum"> 35</span> <span class="tlaGNC"> 33 : void Node::removeChild(Node* child)</span></span>
<span id="L36"><span class="lineNum"> 36</span> : {</span>
<span id="L37"><span class="lineNum"> 37</span> <span class="tlaGNC"> 3 : children.erase(std::remove(children.begin(), children.end(), child), children.end());</span></span>
<span id="L38"><span class="lineNum"> 38</span> <span class="tlaGNC"> 3 : }</span></span>
<span id="L39"><span class="lineNum"> 39</span> <span class="tlaGNC"> 16953 : void Node::addChild(Node* child)</span></span>
<span id="L37"><span class="lineNum"> 37</span> <span class="tlaGNC"> 33 : children.erase(std::remove(children.begin(), children.end(), child), children.end());</span></span>
<span id="L38"><span class="lineNum"> 38</span> <span class="tlaGNC"> 33 : }</span></span>
<span id="L39"><span class="lineNum"> 39</span> <span class="tlaGNC"> 224353 : void Node::addChild(Node* child)</span></span>
<span id="L40"><span class="lineNum"> 40</span> : {</span>
<span id="L41"><span class="lineNum"> 41</span> <span class="tlaGNC"> 16953 : children.push_back(child);</span></span>
<span id="L42"><span class="lineNum"> 42</span> <span class="tlaGNC"> 16953 : }</span></span>
<span id="L43"><span class="lineNum"> 43</span> <span class="tlaGNC"> 1268 : std::vector&lt;Node*&gt;&amp; Node::getParents()</span></span>
<span id="L41"><span class="lineNum"> 41</span> <span class="tlaGNC"> 224353 : children.push_back(child);</span></span>
<span id="L42"><span class="lineNum"> 42</span> <span class="tlaGNC"> 224353 : }</span></span>
<span id="L43"><span class="lineNum"> 43</span> <span class="tlaGNC"> 13948 : std::vector&lt;Node*&gt;&amp; Node::getParents()</span></span>
<span id="L44"><span class="lineNum"> 44</span> : {</span>
<span id="L45"><span class="lineNum"> 45</span> <span class="tlaGNC"> 1268 : return parents;</span></span>
<span id="L45"><span class="lineNum"> 45</span> <span class="tlaGNC"> 13948 : return parents;</span></span>
<span id="L46"><span class="lineNum"> 46</span> : }</span>
<span id="L47"><span class="lineNum"> 47</span> <span class="tlaGNC"> 23263 : std::vector&lt;Node*&gt;&amp; Node::getChildren()</span></span>
<span id="L47"><span class="lineNum"> 47</span> <span class="tlaGNC"> 306501 : std::vector&lt;Node*&gt;&amp; Node::getChildren()</span></span>
<span id="L48"><span class="lineNum"> 48</span> : {</span>
<span id="L49"><span class="lineNum"> 49</span> <span class="tlaGNC"> 23263 : return children;</span></span>
<span id="L49"><span class="lineNum"> 49</span> <span class="tlaGNC"> 306501 : return children;</span></span>
<span id="L50"><span class="lineNum"> 50</span> : }</span>
<span id="L51"><span class="lineNum"> 51</span> <span class="tlaGNC"> 18032 : int Node::getNumStates() const</span></span>
<span id="L51"><span class="lineNum"> 51</span> <span class="tlaGNC"> 236412 : int Node::getNumStates() const</span></span>
<span id="L52"><span class="lineNum"> 52</span> : {</span>
<span id="L53"><span class="lineNum"> 53</span> <span class="tlaGNC"> 18032 : return numStates;</span></span>
<span id="L53"><span class="lineNum"> 53</span> <span class="tlaGNC"> 236412 : return numStates;</span></span>
<span id="L54"><span class="lineNum"> 54</span> : }</span>
<span id="L55"><span class="lineNum"> 55</span> <span class="tlaGNC"> 9288 : void Node::setNumStates(int numStates)</span></span>
<span id="L55"><span class="lineNum"> 55</span> <span class="tlaGNC"> 121388 : void Node::setNumStates(int numStates)</span></span>
<span id="L56"><span class="lineNum"> 56</span> : {</span>
<span id="L57"><span class="lineNum"> 57</span> <span class="tlaGNC"> 9288 : this-&gt;numStates = numStates;</span></span>
<span id="L58"><span class="lineNum"> 58</span> <span class="tlaGNC"> 9288 : }</span></span>
<span id="L59"><span class="lineNum"> 59</span> <span class="tlaGNC"> 105 : torch::Tensor&amp; Node::getCPT()</span></span>
<span id="L57"><span class="lineNum"> 57</span> <span class="tlaGNC"> 121388 : this-&gt;numStates = numStates;</span></span>
<span id="L58"><span class="lineNum"> 58</span> <span class="tlaGNC"> 121388 : }</span></span>
<span id="L59"><span class="lineNum"> 59</span> <span class="tlaGNC"> 1155 : torch::Tensor&amp; Node::getCPT()</span></span>
<span id="L60"><span class="lineNum"> 60</span> : {</span>
<span id="L61"><span class="lineNum"> 61</span> <span class="tlaGNC"> 105 : return cpTable;</span></span>
<span id="L61"><span class="lineNum"> 61</span> <span class="tlaGNC"> 1155 : return cpTable;</span></span>
<span id="L62"><span class="lineNum"> 62</span> : }</span>
<span id="L63"><span class="lineNum"> 63</span> : /*</span>
<span id="L64"><span class="lineNum"> 64</span> : The MinFill criterion is a heuristic for variable elimination.</span>
@@ -129,76 +129,76 @@
<span id="L67"><span class="lineNum"> 67</span> : The variable with the minimum number of edges is chosen.</span>
<span id="L68"><span class="lineNum"> 68</span> : Here this is done computing the length of the combinations of the node neighbors taken 2 by 2.</span>
<span id="L69"><span class="lineNum"> 69</span> : */</span>
<span id="L70"><span class="lineNum"> 70</span> <span class="tlaGNC"> 5 : unsigned Node::minFill()</span></span>
<span id="L70"><span class="lineNum"> 70</span> <span class="tlaGNC"> 55 : unsigned Node::minFill()</span></span>
<span id="L71"><span class="lineNum"> 71</span> : {</span>
<span id="L72"><span class="lineNum"> 72</span> <span class="tlaGNC"> 5 : std::unordered_set&lt;std::string&gt; neighbors;</span></span>
<span id="L73"><span class="lineNum"> 73</span> <span class="tlaGNC"> 13 : for (auto child : children) {</span></span>
<span id="L74"><span class="lineNum"> 74</span> <span class="tlaGNC"> 8 : neighbors.emplace(child-&gt;getName());</span></span>
<span id="L72"><span class="lineNum"> 72</span> <span class="tlaGNC"> 55 : std::unordered_set&lt;std::string&gt; neighbors;</span></span>
<span id="L73"><span class="lineNum"> 73</span> <span class="tlaGNC"> 143 : for (auto child : children) {</span></span>
<span id="L74"><span class="lineNum"> 74</span> <span class="tlaGNC"> 88 : neighbors.emplace(child-&gt;getName());</span></span>
<span id="L75"><span class="lineNum"> 75</span> : }</span>
<span id="L76"><span class="lineNum"> 76</span> <span class="tlaGNC"> 12 : for (auto parent : parents) {</span></span>
<span id="L77"><span class="lineNum"> 77</span> <span class="tlaGNC"> 7 : neighbors.emplace(parent-&gt;getName());</span></span>
<span id="L76"><span class="lineNum"> 76</span> <span class="tlaGNC"> 132 : for (auto parent : parents) {</span></span>
<span id="L77"><span class="lineNum"> 77</span> <span class="tlaGNC"> 77 : neighbors.emplace(parent-&gt;getName());</span></span>
<span id="L78"><span class="lineNum"> 78</span> : }</span>
<span id="L79"><span class="lineNum"> 79</span> <span class="tlaGNC"> 5 : auto source = std::vector&lt;std::string&gt;(neighbors.begin(), neighbors.end());</span></span>
<span id="L80"><span class="lineNum"> 80</span> <span class="tlaGNC"> 10 : return combinations(source).size();</span></span>
<span id="L81"><span class="lineNum"> 81</span> <span class="tlaGNC"> 5 : }</span></span>
<span id="L82"><span class="lineNum"> 82</span> <span class="tlaGNC"> 5 : std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt; Node::combinations(const std::vector&lt;std::string&gt;&amp; source)</span></span>
<span id="L79"><span class="lineNum"> 79</span> <span class="tlaGNC"> 55 : auto source = std::vector&lt;std::string&gt;(neighbors.begin(), neighbors.end());</span></span>
<span id="L80"><span class="lineNum"> 80</span> <span class="tlaGNC"> 110 : return combinations(source).size();</span></span>
<span id="L81"><span class="lineNum"> 81</span> <span class="tlaGNC"> 55 : }</span></span>
<span id="L82"><span class="lineNum"> 82</span> <span class="tlaGNC"> 55 : std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt; Node::combinations(const std::vector&lt;std::string&gt;&amp; source)</span></span>
<span id="L83"><span class="lineNum"> 83</span> : {</span>
<span id="L84"><span class="lineNum"> 84</span> <span class="tlaGNC"> 5 : std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt; result;</span></span>
<span id="L85"><span class="lineNum"> 85</span> <span class="tlaGNC"> 20 : for (int i = 0; i &lt; source.size(); ++i) {</span></span>
<span id="L86"><span class="lineNum"> 86</span> <span class="tlaGNC"> 15 : std::string temp = source[i];</span></span>
<span id="L87"><span class="lineNum"> 87</span> <span class="tlaGNC"> 31 : for (int j = i + 1; j &lt; source.size(); ++j) {</span></span>
<span id="L88"><span class="lineNum"> 88</span> <span class="tlaGNC"> 16 : result.push_back({ temp, source[j] });</span></span>
<span id="L84"><span class="lineNum"> 84</span> <span class="tlaGNC"> 55 : std::vector&lt;std::pair&lt;std::string, std::string&gt;&gt; result;</span></span>
<span id="L85"><span class="lineNum"> 85</span> <span class="tlaGNC"> 220 : for (int i = 0; i &lt; source.size(); ++i) {</span></span>
<span id="L86"><span class="lineNum"> 86</span> <span class="tlaGNC"> 165 : std::string temp = source[i];</span></span>
<span id="L87"><span class="lineNum"> 87</span> <span class="tlaGNC"> 341 : for (int j = i + 1; j &lt; source.size(); ++j) {</span></span>
<span id="L88"><span class="lineNum"> 88</span> <span class="tlaGNC"> 176 : result.push_back({ temp, source[j] });</span></span>
<span id="L89"><span class="lineNum"> 89</span> : }</span>
<span id="L90"><span class="lineNum"> 90</span> <span class="tlaGNC"> 15 : }</span></span>
<span id="L91"><span class="lineNum"> 91</span> <span class="tlaGNC"> 5 : return result;</span></span>
<span id="L90"><span class="lineNum"> 90</span> <span class="tlaGNC"> 165 : }</span></span>
<span id="L91"><span class="lineNum"> 91</span> <span class="tlaGNC"> 55 : return result;</span></span>
<span id="L92"><span class="lineNum"> 92</span> <span class="tlaUNC tlaBgUNC"> 0 : }</span></span>
<span id="L93"><span class="lineNum"> 93</span> <span class="tlaGNC tlaBgGNC"> 9288 : void Node::computeCPT(const torch::Tensor&amp; dataset, const std::vector&lt;std::string&gt;&amp; features, const double laplaceSmoothing, const torch::Tensor&amp; weights)</span></span>
<span id="L93"><span class="lineNum"> 93</span> <span class="tlaGNC tlaBgGNC"> 121388 : void Node::computeCPT(const torch::Tensor&amp; dataset, const std::vector&lt;std::string&gt;&amp; features, const double laplaceSmoothing, const torch::Tensor&amp; weights)</span></span>
<span id="L94"><span class="lineNum"> 94</span> : {</span>
<span id="L95"><span class="lineNum"> 95</span> <span class="tlaGNC"> 9288 : dimensions.clear();</span></span>
<span id="L95"><span class="lineNum"> 95</span> <span class="tlaGNC"> 121388 : dimensions.clear();</span></span>
<span id="L96"><span class="lineNum"> 96</span> : // Get dimensions of the CPT</span>
<span id="L97"><span class="lineNum"> 97</span> <span class="tlaGNC"> 9288 : dimensions.push_back(numStates);</span></span>
<span id="L98"><span class="lineNum"> 98</span> <span class="tlaGNC"> 26937 : transform(parents.begin(), parents.end(), back_inserter(dimensions), [](const auto&amp; parent) { return parent-&gt;getNumStates(); });</span></span>
<span id="L97"><span class="lineNum"> 97</span> <span class="tlaGNC"> 121388 : dimensions.push_back(numStates);</span></span>
<span id="L98"><span class="lineNum"> 98</span> <span class="tlaGNC"> 353397 : transform(parents.begin(), parents.end(), back_inserter(dimensions), [](const auto&amp; parent) { return parent-&gt;getNumStates(); });</span></span>
<span id="L99"><span class="lineNum"> 99</span> : </span>
<span id="L100"><span class="lineNum"> 100</span> : // Create a tensor of zeros with the dimensions of the CPT</span>
<span id="L101"><span class="lineNum"> 101</span> <span class="tlaGNC"> 9288 : cpTable = torch::zeros(dimensions, torch::kFloat) + laplaceSmoothing;</span></span>
<span id="L101"><span class="lineNum"> 101</span> <span class="tlaGNC"> 121388 : cpTable = torch::zeros(dimensions, torch::kFloat) + laplaceSmoothing;</span></span>
<span id="L102"><span class="lineNum"> 102</span> : // Fill table with counts</span>
<span id="L103"><span class="lineNum"> 103</span> <span class="tlaGNC"> 9288 : auto pos = find(features.begin(), features.end(), name);</span></span>
<span id="L104"><span class="lineNum"> 104</span> <span class="tlaGNC"> 9288 : if (pos == features.end()) {</span></span>
<span id="L103"><span class="lineNum"> 103</span> <span class="tlaGNC"> 121388 : auto pos = find(features.begin(), features.end(), name);</span></span>
<span id="L104"><span class="lineNum"> 104</span> <span class="tlaGNC"> 121388 : if (pos == features.end()) {</span></span>
<span id="L105"><span class="lineNum"> 105</span> <span class="tlaUNC tlaBgUNC"> 0 : throw std::logic_error(&quot;Feature &quot; + name + &quot; not found in dataset&quot;);</span></span>
<span id="L106"><span class="lineNum"> 106</span> : }</span>
<span id="L107"><span class="lineNum"> 107</span> <span class="tlaGNC tlaBgGNC"> 9288 : int name_index = pos - features.begin();</span></span>
<span id="L108"><span class="lineNum"> 108</span> <span class="tlaGNC"> 1756738 : for (int n_sample = 0; n_sample &lt; dataset.size(1); ++n_sample) {</span></span>
<span id="L109"><span class="lineNum"> 109</span> <span class="tlaGNC"> 1747450 : c10::List&lt;c10::optional&lt;at::Tensor&gt;&gt; coordinates;</span></span>
<span id="L110"><span class="lineNum"> 110</span> <span class="tlaGNC"> 5242350 : coordinates.push_back(dataset.index({ name_index, n_sample }));</span></span>
<span id="L111"><span class="lineNum"> 111</span> <span class="tlaGNC"> 4997840 : for (auto parent : parents) {</span></span>
<span id="L112"><span class="lineNum"> 112</span> <span class="tlaGNC"> 3250390 : pos = find(features.begin(), features.end(), parent-&gt;getName());</span></span>
<span id="L113"><span class="lineNum"> 113</span> <span class="tlaGNC"> 3250390 : if (pos == features.end()) {</span></span>
<span id="L107"><span class="lineNum"> 107</span> <span class="tlaGNC tlaBgGNC"> 121388 : int name_index = pos - features.begin();</span></span>
<span id="L108"><span class="lineNum"> 108</span> <span class="tlaGNC"> 21284350 : for (int n_sample = 0; n_sample &lt; dataset.size(1); ++n_sample) {</span></span>
<span id="L109"><span class="lineNum"> 109</span> <span class="tlaGNC"> 21162962 : c10::List&lt;c10::optional&lt;at::Tensor&gt;&gt; coordinates;</span></span>
<span id="L110"><span class="lineNum"> 110</span> <span class="tlaGNC"> 63488886 : coordinates.push_back(dataset.index({ name_index, n_sample }));</span></span>
<span id="L111"><span class="lineNum"> 111</span> <span class="tlaGNC"> 60665104 : for (auto parent : parents) {</span></span>
<span id="L112"><span class="lineNum"> 112</span> <span class="tlaGNC"> 39502142 : pos = find(features.begin(), features.end(), parent-&gt;getName());</span></span>
<span id="L113"><span class="lineNum"> 113</span> <span class="tlaGNC"> 39502142 : if (pos == features.end()) {</span></span>
<span id="L114"><span class="lineNum"> 114</span> <span class="tlaUNC tlaBgUNC"> 0 : throw std::logic_error(&quot;Feature parent &quot; + parent-&gt;getName() + &quot; not found in dataset&quot;);</span></span>
<span id="L115"><span class="lineNum"> 115</span> : }</span>
<span id="L116"><span class="lineNum"> 116</span> <span class="tlaGNC tlaBgGNC"> 3250390 : int parent_index = pos - features.begin();</span></span>
<span id="L117"><span class="lineNum"> 117</span> <span class="tlaGNC"> 9751170 : coordinates.push_back(dataset.index({ parent_index, n_sample }));</span></span>
<span id="L116"><span class="lineNum"> 116</span> <span class="tlaGNC tlaBgGNC"> 39502142 : int parent_index = pos - features.begin();</span></span>
<span id="L117"><span class="lineNum"> 117</span> <span class="tlaGNC"> 118506426 : coordinates.push_back(dataset.index({ parent_index, n_sample }));</span></span>
<span id="L118"><span class="lineNum"> 118</span> : }</span>
<span id="L119"><span class="lineNum"> 119</span> : // Increment the count of the corresponding coordinate</span>
<span id="L120"><span class="lineNum"> 120</span> <span class="tlaGNC"> 3494900 : cpTable.index_put_({ coordinates }, cpTable.index({ coordinates }) + weights.index({ n_sample }).item&lt;double&gt;());</span></span>
<span id="L121"><span class="lineNum"> 121</span> <span class="tlaGNC"> 1747450 : }</span></span>
<span id="L120"><span class="lineNum"> 120</span> <span class="tlaGNC"> 42325924 : cpTable.index_put_({ coordinates }, cpTable.index({ coordinates }) + weights.index({ n_sample }).item&lt;double&gt;());</span></span>
<span id="L121"><span class="lineNum"> 121</span> <span class="tlaGNC"> 21162962 : }</span></span>
<span id="L122"><span class="lineNum"> 122</span> : // Normalize the counts</span>
<span id="L123"><span class="lineNum"> 123</span> <span class="tlaGNC"> 9288 : cpTable = cpTable / cpTable.sum(0);</span></span>
<span id="L124"><span class="lineNum"> 124</span> <span class="tlaGNC"> 6754578 : }</span></span>
<span id="L125"><span class="lineNum"> 125</span> <span class="tlaGNC"> 5647224 : float Node::getFactorValue(std::map&lt;std::string, int&gt;&amp; evidence)</span></span>
<span id="L123"><span class="lineNum"> 123</span> <span class="tlaGNC"> 121388 : cpTable = cpTable / cpTable.sum(0);</span></span>
<span id="L124"><span class="lineNum"> 124</span> <span class="tlaGNC"> 81949454 : }</span></span>
<span id="L125"><span class="lineNum"> 125</span> <span class="tlaGNC"> 67302838 : float Node::getFactorValue(std::map&lt;std::string, int&gt;&amp; evidence)</span></span>
<span id="L126"><span class="lineNum"> 126</span> : {</span>
<span id="L127"><span class="lineNum"> 127</span> <span class="tlaGNC"> 5647224 : c10::List&lt;c10::optional&lt;at::Tensor&gt;&gt; coordinates;</span></span>
<span id="L127"><span class="lineNum"> 127</span> <span class="tlaGNC"> 67302838 : c10::List&lt;c10::optional&lt;at::Tensor&gt;&gt; coordinates;</span></span>
<span id="L128"><span class="lineNum"> 128</span> : // following predetermined order of indices in the cpTable (see Node.h)</span>
<span id="L129"><span class="lineNum"> 129</span> <span class="tlaGNC"> 5647224 : coordinates.push_back(at::tensor(evidence[name]));</span></span>
<span id="L130"><span class="lineNum"> 130</span> <span class="tlaGNC"> 15624420 : transform(parents.begin(), parents.end(), std::back_inserter(coordinates), [&amp;evidence](const auto&amp; parent) { return at::tensor(evidence[parent-&gt;getName()]); });</span></span>
<span id="L131"><span class="lineNum"> 131</span> <span class="tlaGNC"> 11294448 : return cpTable.index({ coordinates }).item&lt;float&gt;();</span></span>
<span id="L132"><span class="lineNum"> 132</span> <span class="tlaGNC"> 5647224 : }</span></span>
<span id="L133"><span class="lineNum"> 133</span> <span class="tlaGNC"> 153 : std::vector&lt;std::string&gt; Node::graph(const std::string&amp; className)</span></span>
<span id="L129"><span class="lineNum"> 129</span> <span class="tlaGNC"> 67302838 : coordinates.push_back(at::tensor(evidence[name]));</span></span>
<span id="L130"><span class="lineNum"> 130</span> <span class="tlaGNC"> 186413412 : transform(parents.begin(), parents.end(), std::back_inserter(coordinates), [&amp;evidence](const auto&amp; parent) { return at::tensor(evidence[parent-&gt;getName()]); });</span></span>
<span id="L131"><span class="lineNum"> 131</span> <span class="tlaGNC"> 134605676 : return cpTable.index({ coordinates }).item&lt;float&gt;();</span></span>
<span id="L132"><span class="lineNum"> 132</span> <span class="tlaGNC"> 67302838 : }</span></span>
<span id="L133"><span class="lineNum"> 133</span> <span class="tlaGNC"> 1683 : std::vector&lt;std::string&gt; Node::graph(const std::string&amp; className)</span></span>
<span id="L134"><span class="lineNum"> 134</span> : {</span>
<span id="L135"><span class="lineNum"> 135</span> <span class="tlaGNC"> 153 : auto output = std::vector&lt;std::string&gt;();</span></span>
<span id="L136"><span class="lineNum"> 136</span> <span class="tlaGNC"> 153 : auto suffix = name == className ? &quot;, fontcolor=red, fillcolor=lightblue, style=filled &quot; : &quot;&quot;;</span></span>
<span id="L137"><span class="lineNum"> 137</span> <span class="tlaGNC"> 153 : output.push_back(name + &quot; [shape=circle&quot; + suffix + &quot;] \n&quot;);</span></span>
<span id="L138"><span class="lineNum"> 138</span> <span class="tlaGNC"> 394 : transform(children.begin(), children.end(), back_inserter(output), [this](const auto&amp; child) { return name + &quot; -&gt; &quot; + child-&gt;getName(); });</span></span>
<span id="L139"><span class="lineNum"> 139</span> <span class="tlaGNC"> 153 : return output;</span></span>
<span id="L135"><span class="lineNum"> 135</span> <span class="tlaGNC"> 1683 : auto output = std::vector&lt;std::string&gt;();</span></span>
<span id="L136"><span class="lineNum"> 136</span> <span class="tlaGNC"> 1683 : auto suffix = name == className ? &quot;, fontcolor=red, fillcolor=lightblue, style=filled &quot; : &quot;&quot;;</span></span>
<span id="L137"><span class="lineNum"> 137</span> <span class="tlaGNC"> 1683 : output.push_back(name + &quot; [shape=circle&quot; + suffix + &quot;] \n&quot;);</span></span>
<span id="L138"><span class="lineNum"> 138</span> <span class="tlaGNC"> 4334 : transform(children.begin(), children.end(), back_inserter(output), [this](const auto&amp; child) { return name + &quot; -&gt; &quot; + child-&gt;getName(); });</span></span>
<span id="L139"><span class="lineNum"> 139</span> <span class="tlaGNC"> 1683 : return output;</span></span>
<span id="L140"><span class="lineNum"> 140</span> <span class="tlaUNC tlaBgUNC"> 0 : }</span></span>
<span id="L141"><span class="lineNum"> 141</span> : }</span>
</pre>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>

View File

@@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Test Date:</td>
<td class="headerValue">2024-04-21 17:30:26</td>
<td class="headerValue">2024-04-29 20:48:03</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntryHi">100.0&nbsp;%</td>