2024-04-21 14:44:35 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< title > LCOV - coverage.info - bayesnet/classifiers/Proposal.cc< / title >
< link rel = "stylesheet" type = "text/css" href = "../../gcov.css" >
< / head >
< body >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "title" > LCOV - code coverage report< / td > < / tr >
< tr > < td class = "ruler" > < img src = "../../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr >
< td width = "100%" >
< table cellpadding = 1 border = 0 width = "100%" >
< tr >
< td width = "10%" class = "headerItem" > Current view:< / td >
< td width = "10%" class = "headerValue" > < a href = "../../index.html" > top level< / a > - < a href = "index.html" > bayesnet/classifiers< / a > - Proposal.cc< span style = "font-size: 80%;" > (source / < a href = "Proposal.cc.func-c.html" > functions< / a > )< / span > < / td >
< td width = "5%" > < / td >
< td width = "5%" > < / td >
< td width = "5%" class = "headerCovTableHead" > Coverage< / td >
< td width = "5%" class = "headerCovTableHead" title = "Covered + Uncovered code" > Total< / td >
< td width = "5%" class = "headerCovTableHead" title = "Exercised code only" > Hit< / td >
< / tr >
< tr >
< td class = "headerItem" > Test:< / td >
< td class = "headerValue" > coverage.info< / td >
< td > < / td >
< td class = "headerItem" > Lines:< / td >
< td class = "headerCovTableEntryHi" > 97.7 %< / td >
< td class = "headerCovTableEntry" > 86< / td >
< td class = "headerCovTableEntry" > 84< / td >
< / tr >
< tr >
< td class = "headerItem" > Test Date:< / td >
2024-04-30 12:00:24 +00:00
< td class = "headerValue" > 2024-04-30 13:59:18< / td >
2024-04-21 14:44:35 +00:00
< td > < / td >
< td class = "headerItem" > Functions:< / td >
2024-04-30 12:00:24 +00:00
< td class = "headerCovTableEntryHi" > 100.0 %< / td >
< td class = "headerCovTableEntry" > 8< / td >
2024-04-21 14:44:35 +00:00
< td class = "headerCovTableEntry" > 8< / td >
< / tr >
< tr > < td > < img src = "../../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< / td >
< / tr >
< tr > < td class = "ruler" > < img src = "../../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< table cellpadding = 0 cellspacing = 0 border = 0 >
< tr >
< td > < br > < / td >
< / tr >
< tr >
< td >
< pre class = "sourceHeading" > Line data Source code< / pre >
< pre class = "source" >
< span id = "L1" > < span class = "lineNum" > 1< / span > : // ***************************************************************< / span >
< span id = "L2" > < span class = "lineNum" > 2< / span > : // SPDX-FileCopyrightText: Copyright 2024 Ricardo Montañana Gómez< / span >
< span id = "L3" > < span class = "lineNum" > 3< / span > : // SPDX-FileType: SOURCE< / span >
< span id = "L4" > < span class = "lineNum" > 4< / span > : // SPDX-License-Identifier: MIT< / span >
< span id = "L5" > < span class = "lineNum" > 5< / span > : // ***************************************************************< / span >
< span id = "L6" > < span class = "lineNum" > 6< / span > : < / span >
< span id = "L7" > < span class = "lineNum" > 7< / span > : #include < ArffFiles.h> < / span >
< span id = "L8" > < span class = "lineNum" > 8< / span > : #include " Proposal.h" < / span >
< span id = "L9" > < span class = "lineNum" > 9< / span > : < / span >
< span id = "L10" > < span class = "lineNum" > 10< / span > : namespace bayesnet {< / span >
2024-04-30 12:00:24 +00:00
< span id = "L11" > < span class = "lineNum" > 11< / span > < span class = "tlaGNC tlaBgGNC" > 636 : Proposal::Proposal(torch::Tensor& dataset_, std::vector< std::string> & features_, std::string& className_) : pDataset(dataset_), pFeatures(features_), pClassName(className_) {}< / span > < / span >
< span id = "L12" > < span class = "lineNum" > 12< / span > < span class = "tlaGNC" > 300 : Proposal::~Proposal()< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L13" > < span class = "lineNum" > 13< / span > : {< / span >
2024-04-30 12:00:24 +00:00
< span id = "L14" > < span class = "lineNum" > 14< / span > < span class = "tlaGNC" > 2844 : for (auto& [key, value] : discretizers) {< / span > < / span >
< span id = "L15" > < span class = "lineNum" > 15< / span > < span class = "tlaGNC" > 2544 : delete value;< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L16" > < span class = "lineNum" > 16< / span > : }< / span >
2024-04-30 12:00:24 +00:00
< span id = "L17" > < span class = "lineNum" > 17< / span > < span class = "tlaGNC" > 300 : }< / span > < / span >
< span id = "L18" > < span class = "lineNum" > 18< / span > < span class = "tlaGNC" > 342 : void Proposal::checkInput(const torch::Tensor& X, const torch::Tensor& y)< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L19" > < span class = "lineNum" > 19< / span > : {< / span >
2024-04-30 12:00:24 +00:00
< span id = "L20" > < span class = "lineNum" > 20< / span > < span class = "tlaGNC" > 342 : if (!torch::is_floating_point(X)) {< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L21" > < span class = "lineNum" > 21< / span > < span class = "tlaUNC tlaBgUNC" > 0 : throw std::invalid_argument(" X must be a floating point tensor" );< / span > < / span >
< span id = "L22" > < span class = "lineNum" > 22< / span > : }< / span >
2024-04-30 12:00:24 +00:00
< span id = "L23" > < span class = "lineNum" > 23< / span > < span class = "tlaGNC tlaBgGNC" > 342 : if (torch::is_floating_point(y)) {< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L24" > < span class = "lineNum" > 24< / span > < span class = "tlaUNC tlaBgUNC" > 0 : throw std::invalid_argument(" y must be an integer tensor" );< / span > < / span >
< span id = "L25" > < span class = "lineNum" > 25< / span > : }< / span >
2024-04-30 12:00:24 +00:00
< span id = "L26" > < span class = "lineNum" > 26< / span > < span class = "tlaGNC tlaBgGNC" > 342 : }< / span > < / span >
< span id = "L27" > < span class = "lineNum" > 27< / span > < span class = "tlaGNC" > 318 : map< std::string, std::vector< int> > Proposal::localDiscretizationProposal(const map< std::string, std::vector< int> > & oldStates, Network& model)< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L28" > < span class = "lineNum" > 28< / span > : {< / span >
< span id = "L29" > < span class = "lineNum" > 29< / span > : // order of local discretization is important. no good 0, 1, 2...< / span >
< span id = "L30" > < span class = "lineNum" > 30< / span > : // although we rediscretize features after the local discretization of every feature< / span >
2024-04-30 12:00:24 +00:00
< span id = "L31" > < span class = "lineNum" > 31< / span > < span class = "tlaGNC" > 318 : auto order = model.topological_sort();< / span > < / span >
< span id = "L32" > < span class = "lineNum" > 32< / span > < span class = "tlaGNC" > 318 : auto& nodes = model.getNodes();< / span > < / span >
< span id = "L33" > < span class = "lineNum" > 33< / span > < span class = "tlaGNC" > 318 : map< std::string, std::vector< int> > states = oldStates;< / span > < / span >
< span id = "L34" > < span class = "lineNum" > 34< / span > < span class = "tlaGNC" > 318 : std::vector< int> indicesToReDiscretize;< / span > < / span >
< span id = "L35" > < span class = "lineNum" > 35< / span > < span class = "tlaGNC" > 318 : bool upgrade = false; // Flag to check if we need to upgrade the model< / span > < / span >
< span id = "L36" > < span class = "lineNum" > 36< / span > < span class = "tlaGNC" > 2664 : for (auto feature : order) {< / span > < / span >
< span id = "L37" > < span class = "lineNum" > 37< / span > < span class = "tlaGNC" > 2346 : auto nodeParents = nodes[feature]-> getParents();< / span > < / span >
< span id = "L38" > < span class = "lineNum" > 38< / span > < span class = "tlaGNC" > 2346 : if (nodeParents.size() < 2) continue; // Only has class as parent< / span > < / span >
< span id = "L39" > < span class = "lineNum" > 39< / span > < span class = "tlaGNC" > 1986 : upgrade = true;< / span > < / span >
< span id = "L40" > < span class = "lineNum" > 40< / span > < span class = "tlaGNC" > 1986 : int index = find(pFeatures.begin(), pFeatures.end(), feature) - pFeatures.begin();< / span > < / span >
< span id = "L41" > < span class = "lineNum" > 41< / span > < span class = "tlaGNC" > 1986 : indicesToReDiscretize.push_back(index); // We need to re-discretize this feature< / span > < / span >
< span id = "L42" > < span class = "lineNum" > 42< / span > < span class = "tlaGNC" > 1986 : std::vector< std::string> parents;< / span > < / span >
< span id = "L43" > < span class = "lineNum" > 43< / span > < span class = "tlaGNC" > 6030 : transform(nodeParents.begin(), nodeParents.end(), back_inserter(parents), [](const auto& p) { return p-> getName(); });< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L44" > < span class = "lineNum" > 44< / span > : // Remove class as parent as it will be added later< / span >
2024-04-30 12:00:24 +00:00
< span id = "L45" > < span class = "lineNum" > 45< / span > < span class = "tlaGNC" > 1986 : parents.erase(remove(parents.begin(), parents.end(), pClassName), parents.end());< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L46" > < span class = "lineNum" > 46< / span > : // Get the indices of the parents< / span >
2024-04-30 12:00:24 +00:00
< span id = "L47" > < span class = "lineNum" > 47< / span > < span class = "tlaGNC" > 1986 : std::vector< int> indices;< / span > < / span >
< span id = "L48" > < span class = "lineNum" > 48< / span > < span class = "tlaGNC" > 1986 : indices.push_back(-1); // Add class index< / span > < / span >
< span id = "L49" > < span class = "lineNum" > 49< / span > < span class = "tlaGNC" > 4044 : transform(parents.begin(), parents.end(), back_inserter(indices), [& ](const auto& p) {return find(pFeatures.begin(), pFeatures.end(), p) - pFeatures.begin(); });< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L50" > < span class = "lineNum" > 50< / span > : // Now we fit the discretizer of the feature, conditioned on its parents and the class i.e. discretizer.fit(X[index], X[indices] + y)< / span >
2024-04-30 12:00:24 +00:00
< span id = "L51" > < span class = "lineNum" > 51< / span > < span class = "tlaGNC" > 1986 : std::vector< std::string> yJoinParents(Xf.size(1));< / span > < / span >
< span id = "L52" > < span class = "lineNum" > 52< / span > < span class = "tlaGNC" > 6030 : for (auto idx : indices) {< / span > < / span >
< span id = "L53" > < span class = "lineNum" > 53< / span > < span class = "tlaGNC" > 1437960 : for (int i = 0; i < Xf.size(1); ++i) {< / span > < / span >
< span id = "L54" > < span class = "lineNum" > 54< / span > < span class = "tlaGNC" > 4301748 : yJoinParents[i] += to_string(pDataset.index({ idx, i }).item< int> ());< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L55" > < span class = "lineNum" > 55< / span > : }< / span >
< span id = "L56" > < span class = "lineNum" > 56< / span > : }< / span >
2024-04-30 12:00:24 +00:00
< span id = "L57" > < span class = "lineNum" > 57< / span > < span class = "tlaGNC" > 1986 : auto arff = ArffFiles();< / span > < / span >
< span id = "L58" > < span class = "lineNum" > 58< / span > < span class = "tlaGNC" > 1986 : auto yxv = arff.factorize(yJoinParents);< / span > < / span >
< span id = "L59" > < span class = "lineNum" > 59< / span > < span class = "tlaGNC" > 3972 : auto xvf_ptr = Xf.index({ index }).data_ptr< float> ();< / span > < / span >
< span id = "L60" > < span class = "lineNum" > 60< / span > < span class = "tlaGNC" > 1986 : auto xvf = std::vector< mdlp::precision_t> (xvf_ptr, xvf_ptr + Xf.size(1));< / span > < / span >
< span id = "L61" > < span class = "lineNum" > 61< / span > < span class = "tlaGNC" > 1986 : discretizers[feature]-> fit(xvf, yxv);< / span > < / span >
< span id = "L62" > < span class = "lineNum" > 62< / span > < span class = "tlaGNC" > 2706 : }< / span > < / span >
< span id = "L63" > < span class = "lineNum" > 63< / span > < span class = "tlaGNC" > 318 : if (upgrade) {< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L64" > < span class = "lineNum" > 64< / span > : // Discretize again X (only the affected indices) with the new fitted discretizers< / span >
2024-04-30 12:00:24 +00:00
< span id = "L65" > < span class = "lineNum" > 65< / span > < span class = "tlaGNC" > 2304 : for (auto index : indicesToReDiscretize) {< / span > < / span >
< span id = "L66" > < span class = "lineNum" > 66< / span > < span class = "tlaGNC" > 3972 : auto Xt_ptr = Xf.index({ index }).data_ptr< float> ();< / span > < / span >
< span id = "L67" > < span class = "lineNum" > 67< / span > < span class = "tlaGNC" > 1986 : auto Xt = std::vector< float> (Xt_ptr, Xt_ptr + Xf.size(1));< / span > < / span >
< span id = "L68" > < span class = "lineNum" > 68< / span > < span class = "tlaGNC" > 7944 : pDataset.index_put_({ index, " ..." }, torch::tensor(discretizers[pFeatures[index]]-> transform(Xt)));< / span > < / span >
< span id = "L69" > < span class = "lineNum" > 69< / span > < span class = "tlaGNC" > 1986 : auto xStates = std::vector< int> (discretizers[pFeatures[index]]-> getCutPoints().size() + 1);< / span > < / span >
< span id = "L70" > < span class = "lineNum" > 70< / span > < span class = "tlaGNC" > 1986 : iota(xStates.begin(), xStates.end(), 0);< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L71" > < span class = "lineNum" > 71< / span > : //Update new states of the feature/node< / span >
2024-04-30 12:00:24 +00:00
< span id = "L72" > < span class = "lineNum" > 72< / span > < span class = "tlaGNC" > 1986 : states[pFeatures[index]] = xStates;< / span > < / span >
< span id = "L73" > < span class = "lineNum" > 73< / span > < span class = "tlaGNC" > 1986 : }< / span > < / span >
< span id = "L74" > < span class = "lineNum" > 74< / span > < span class = "tlaGNC" > 318 : const torch::Tensor weights = torch::full({ pDataset.size(1) }, 1.0 / pDataset.size(1), torch::kDouble);< / span > < / span >
< span id = "L75" > < span class = "lineNum" > 75< / span > < span class = "tlaGNC" > 318 : model.fit(pDataset, weights, pFeatures, pClassName, states);< / span > < / span >
< span id = "L76" > < span class = "lineNum" > 76< / span > < span class = "tlaGNC" > 318 : }< / span > < / span >
< span id = "L77" > < span class = "lineNum" > 77< / span > < span class = "tlaGNC" > 636 : return states;< / span > < / span >
< span id = "L78" > < span class = "lineNum" > 78< / span > < span class = "tlaGNC" > 1440192 : }< / span > < / span >
< span id = "L79" > < span class = "lineNum" > 79< / span > < span class = "tlaGNC" > 348 : map< std::string, std::vector< int> > Proposal::fit_local_discretization(const torch::Tensor& y)< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L80" > < span class = "lineNum" > 80< / span > : {< / span >
< span id = "L81" > < span class = "lineNum" > 81< / span > : // Discretize the continuous input data and build pDataset (Classifier::dataset)< / span >
2024-04-30 12:00:24 +00:00
< span id = "L82" > < span class = "lineNum" > 82< / span > < span class = "tlaGNC" > 348 : int m = Xf.size(1);< / span > < / span >
< span id = "L83" > < span class = "lineNum" > 83< / span > < span class = "tlaGNC" > 348 : int n = Xf.size(0);< / span > < / span >
< span id = "L84" > < span class = "lineNum" > 84< / span > < span class = "tlaGNC" > 348 : map< std::string, std::vector< int> > states;< / span > < / span >
< span id = "L85" > < span class = "lineNum" > 85< / span > < span class = "tlaGNC" > 348 : pDataset = torch::zeros({ n + 1, m }, torch::kInt32);< / span > < / span >
< span id = "L86" > < span class = "lineNum" > 86< / span > < span class = "tlaGNC" > 348 : auto yv = std::vector< int> (y.data_ptr< int> (), y.data_ptr< int> () + y.size(0));< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L87" > < span class = "lineNum" > 87< / span > : // discretize input data by feature(row)< / span >
2024-04-30 12:00:24 +00:00
< span id = "L88" > < span class = "lineNum" > 88< / span > < span class = "tlaGNC" > 2916 : for (auto i = 0; i < pFeatures.size(); ++i) {< / span > < / span >
< span id = "L89" > < span class = "lineNum" > 89< / span > < span class = "tlaGNC" > 2568 : auto* discretizer = new mdlp::CPPFImdlp();< / span > < / span >
< span id = "L90" > < span class = "lineNum" > 90< / span > < span class = "tlaGNC" > 5136 : auto Xt_ptr = Xf.index({ i }).data_ptr< float> ();< / span > < / span >
< span id = "L91" > < span class = "lineNum" > 91< / span > < span class = "tlaGNC" > 2568 : auto Xt = std::vector< float> (Xt_ptr, Xt_ptr + Xf.size(1));< / span > < / span >
< span id = "L92" > < span class = "lineNum" > 92< / span > < span class = "tlaGNC" > 2568 : discretizer-> fit(Xt, yv);< / span > < / span >
< span id = "L93" > < span class = "lineNum" > 93< / span > < span class = "tlaGNC" > 10272 : pDataset.index_put_({ i, " ..." }, torch::tensor(discretizer-> transform(Xt)));< / span > < / span >
< span id = "L94" > < span class = "lineNum" > 94< / span > < span class = "tlaGNC" > 2568 : auto xStates = std::vector< int> (discretizer-> getCutPoints().size() + 1);< / span > < / span >
< span id = "L95" > < span class = "lineNum" > 95< / span > < span class = "tlaGNC" > 2568 : iota(xStates.begin(), xStates.end(), 0);< / span > < / span >
< span id = "L96" > < span class = "lineNum" > 96< / span > < span class = "tlaGNC" > 2568 : states[pFeatures[i]] = xStates;< / span > < / span >
< span id = "L97" > < span class = "lineNum" > 97< / span > < span class = "tlaGNC" > 2568 : discretizers[pFeatures[i]] = discretizer;< / span > < / span >
< span id = "L98" > < span class = "lineNum" > 98< / span > < span class = "tlaGNC" > 2568 : }< / span > < / span >
< span id = "L99" > < span class = "lineNum" > 99< / span > < span class = "tlaGNC" > 348 : int n_classes = torch::max(y).item< int> () + 1;< / span > < / span >
< span id = "L100" > < span class = "lineNum" > 100< / span > < span class = "tlaGNC" > 348 : auto yStates = std::vector< int> (n_classes);< / span > < / span >
< span id = "L101" > < span class = "lineNum" > 101< / span > < span class = "tlaGNC" > 348 : iota(yStates.begin(), yStates.end(), 0);< / span > < / span >
< span id = "L102" > < span class = "lineNum" > 102< / span > < span class = "tlaGNC" > 348 : states[pClassName] = yStates;< / span > < / span >
< span id = "L103" > < span class = "lineNum" > 103< / span > < span class = "tlaGNC" > 1044 : pDataset.index_put_({ n, " ..." }, y);< / span > < / span >
< span id = "L104" > < span class = "lineNum" > 104< / span > < span class = "tlaGNC" > 696 : return states;< / span > < / span >
< span id = "L105" > < span class = "lineNum" > 105< / span > < span class = "tlaGNC" > 5832 : }< / span > < / span >
< span id = "L106" > < span class = "lineNum" > 106< / span > < span class = "tlaGNC" > 252 : torch::Tensor Proposal::prepareX(torch::Tensor& X)< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L107" > < span class = "lineNum" > 107< / span > : {< / span >
2024-04-30 12:00:24 +00:00
< span id = "L108" > < span class = "lineNum" > 108< / span > < span class = "tlaGNC" > 252 : auto Xtd = torch::zeros_like(X, torch::kInt32);< / span > < / span >
< span id = "L109" > < span class = "lineNum" > 109< / span > < span class = "tlaGNC" > 2064 : for (int i = 0; i < X.size(0); ++i) {< / span > < / span >
< span id = "L110" > < span class = "lineNum" > 110< / span > < span class = "tlaGNC" > 1812 : auto Xt = std::vector< float> (X[i].data_ptr< float> (), X[i].data_ptr< float> () + X.size(1));< / span > < / span >
< span id = "L111" > < span class = "lineNum" > 111< / span > < span class = "tlaGNC" > 1812 : auto Xd = discretizers[pFeatures[i]]-> transform(Xt);< / span > < / span >
< span id = "L112" > < span class = "lineNum" > 112< / span > < span class = "tlaGNC" > 5436 : Xtd.index_put_({ i }, torch::tensor(Xd, torch::kInt32));< / span > < / span >
< span id = "L113" > < span class = "lineNum" > 113< / span > < span class = "tlaGNC" > 1812 : }< / span > < / span >
< span id = "L114" > < span class = "lineNum" > 114< / span > < span class = "tlaGNC" > 252 : return Xtd;< / span > < / span >
< span id = "L115" > < span class = "lineNum" > 115< / span > < span class = "tlaGNC" > 1812 : }< / span > < / span >
2024-04-21 14:44:35 +00:00
< span id = "L116" > < span class = "lineNum" > 116< / span > : }< / span >
< / pre >
< / td >
< / tr >
< / table >
< br >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "ruler" > < img src = "../../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr > < td class = "versionInfo" > Generated by: < a href = "https://github.com//linux-test-project/lcov" target = "_parent" > LCOV version 2.0-1< / a > < / td > < / tr >
< / table >
< br >
< / body >
< / html >