From 2fa284547c98c1e93e8fd39c87c9adee3c480962 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Sun, 22 Jun 2025 09:28:05 +0200 Subject: [PATCH 1/3] [TMVA] Re-enable many tutorials for which we lost test coverage In PR https://github.com/root-project/root/pull/17098, the check in `tutorials/CMakeLists.txt` if ROOT is built with PyMVA was accidentally corrupted by also renaming the build option from `tmva-pymva` to `machine_learning-pymva`. This resulted in the dependencies of the PyMVA, SOFIE, and RBatchGenerator tutorials never being looked for, and then the tutorials were always vetoed because the dependencies were not found. Meaning, we didn't run these tutorials since November last year. This commit fixes that by always checking for the Python modules. --- tutorials/CMakeLists.txt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tutorials/CMakeLists.txt b/tutorials/CMakeLists.txt index 4c6d0a28c5201..f5060dd32b0d2 100644 --- a/tutorials/CMakeLists.txt +++ b/tutorials/CMakeLists.txt @@ -311,13 +311,11 @@ else() list(APPEND tmva_veto machine_learning/envelope/classification.C) endif() #these depends on external packages - if (machine_learning-pymva) - ROOT_FIND_PYTHON_MODULE(torch QUIET) - ROOT_FIND_PYTHON_MODULE(keras QUIET) - ROOT_FIND_PYTHON_MODULE(sonnet QUIET) - ROOT_FIND_PYTHON_MODULE(graph_nets QUIET) - ROOT_FIND_PYTHON_MODULE(sklearn QUIET) - endif() + ROOT_FIND_PYTHON_MODULE(torch QUIET) + ROOT_FIND_PYTHON_MODULE(keras QUIET) + ROOT_FIND_PYTHON_MODULE(sonnet QUIET) + ROOT_FIND_PYTHON_MODULE(graph_nets QUIET) + ROOT_FIND_PYTHON_MODULE(sklearn QUIET) if (NOT BLAS_FOUND) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_GNN_Application.C) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_RDataFrame.C) From 5ab9ea4f3f11201775f1974b670668be427a1ca9 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Sun, 22 Jun 2025 11:09:42 +0200 Subject: [PATCH 2/3] [TMVA] Fix path to `Higgs_data.root` in some SOFIE tutorials --- tutorials/machine_learning/TMVA_SOFIE_Models.py | 2 +- tutorials/machine_learning/TMVA_SOFIE_RDataFrame.C | 2 +- tutorials/machine_learning/TMVA_SOFIE_RDataFrame.py | 2 +- tutorials/machine_learning/TMVA_SOFIE_RDataFrame_JIT.C | 2 +- tutorials/machine_learning/TMVA_SOFIE_RSofieReader.C | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tutorials/machine_learning/TMVA_SOFIE_Models.py b/tutorials/machine_learning/TMVA_SOFIE_Models.py index 5925ea497360d..469e22940c77c 100644 --- a/tutorials/machine_learning/TMVA_SOFIE_Models.py +++ b/tutorials/machine_learning/TMVA_SOFIE_Models.py @@ -41,7 +41,7 @@ def CreateModel(nlayers = 4, nunits = 64): def PrepareData() : #get the input data - inputFile = str(ROOT.gROOT.GetTutorialDir()) + "machine_learning/data/Higgs_data.root" + inputFile = str(ROOT.gROOT.GetTutorialDir()) + "/machine_learning/data/Higgs_data.root" df1 = ROOT.RDataFrame("sig_tree", inputFile) sigData = df1.AsNumpy(columns=['m_jj', 'm_jjj', 'm_lv', 'm_jlv', 'm_bb', 'm_wbb', 'm_wwbb']) diff --git a/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.C b/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.C index 0753e35d83c45..4f6a731c22966 100644 --- a/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.C +++ b/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.C @@ -34,7 +34,7 @@ using namespace TMVA::Experimental; void TMVA_SOFIE_RDataFrame(int nthreads = 2){ std::string inputFileName = "Higgs_data.root"; - std::string inputFile = gROOT->GetTutorialDir() + "/machine_learning/data/" + inputFileName; + std::string inputFile = std::string{gROOT->GetTutorialDir()} + "/machine_learning/data/" + inputFileName; ROOT::EnableImplicitMT(nthreads); diff --git a/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.py b/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.py index 1b23d0b7d607c..6185684f31b66 100644 --- a/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.py +++ b/tutorials/machine_learning/TMVA_SOFIE_RDataFrame.py @@ -37,7 +37,7 @@ ROOT.gInterpreter.Declare('auto sofie_functor = TMVA::Experimental::SofieFunctor<7,TMVA_SOFIE_'+modelName+'::Session>(0,"Higgs_trained_model_generated.dat");') # run inference over input data -inputFile = str(ROOT.gROOT.GetTutorialDir()) + "machine_learning/data/Higgs_data.root" +inputFile = str(ROOT.gROOT.GetTutorialDir()) + "/machine_learning/data/Higgs_data.root" df1 = ROOT.RDataFrame("sig_tree", inputFile) h1 = df1.Define("DNN_Value", "sofie_functor(rdfslot_,m_jj, m_jjj, m_lv, m_jlv, m_bb, m_wbb, m_wwbb)").Histo1D(("h_sig", "", 100, 0, 1),"DNN_Value") diff --git a/tutorials/machine_learning/TMVA_SOFIE_RDataFrame_JIT.C b/tutorials/machine_learning/TMVA_SOFIE_RDataFrame_JIT.C index 5a1326c1d83aa..0969f5f33b4ea 100644 --- a/tutorials/machine_learning/TMVA_SOFIE_RDataFrame_JIT.C +++ b/tutorials/machine_learning/TMVA_SOFIE_RDataFrame_JIT.C @@ -68,7 +68,7 @@ void TMVA_SOFIE_RDataFrame_JIT(std::string modelFile = "Higgs_trained_model.h5") CompileModelForRDF(modelHeaderFile,7); std::string inputFileName = "Higgs_data.root"; - std::string inputFile = gROOT->GetTutorialDir() + "/machine_learning/data/" + inputFileName; + std::string inputFile = std::string{gROOT->GetTutorialDir()} + "/machine_learning/data/" + inputFileName; ROOT::RDataFrame df1("sig_tree", inputFile); auto h1 = df1.Define("DNN_Value", "sofie_functor(rdfslot_,m_jj, m_jjj, m_lv, m_jlv, m_bb, m_wbb, m_wwbb)") diff --git a/tutorials/machine_learning/TMVA_SOFIE_RSofieReader.C b/tutorials/machine_learning/TMVA_SOFIE_RSofieReader.C index 3fcbf372c36f0..46763fae5e153 100644 --- a/tutorials/machine_learning/TMVA_SOFIE_RSofieReader.C +++ b/tutorials/machine_learning/TMVA_SOFIE_RSofieReader.C @@ -39,7 +39,7 @@ void TMVA_SOFIE_RSofieReader(){ // predict model now on a input file using RDataFrame std::string inputFileName = "Higgs_data.root"; - std::string inputFile = gROOT->GetTutorialDir() + "/machine_learning/data/" + inputFileName; + std::string inputFile = std::string{gROOT->GetTutorialDir()} + "/machine_learning/data/" + inputFileName; ROOT::RDataFrame df1("sig_tree", inputFile); From 40dd0fed58530b88fe61e85c6400d2693d76f15a Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Sun, 22 Jun 2025 12:18:02 +0200 Subject: [PATCH 3/3] Use intended mechanism for Python deps of RBatchGenerator tutorials This makes the configuration less error prone. --- tutorials/CMakeLists.txt | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tutorials/CMakeLists.txt b/tutorials/CMakeLists.txt index f5060dd32b0d2..d5c2530ea8c06 100644 --- a/tutorials/CMakeLists.txt +++ b/tutorials/CMakeLists.txt @@ -330,14 +330,12 @@ else() list(APPEND tmva_veto machine_learning/TMVA_SOFIE_Models.py) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_Inference.py) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_RSofieReader.C) - list(APPEND tmva_veto machine_learning/RBatchGenerator_TensorFlow.py) endif() if (NOT ROOT_SKLEARN_FOUND) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_Models.py roofit/roofit/rf617_simulation_based_inference_multidimensional.py) endif() if (NOT ROOT_TORCH_FOUND) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_PyTorch.C) - list(APPEND tmva_veto machine_learning/RBatchGenerator_PyTorch.py) endif() #veto this tutorial since it is added directly list(APPEND tmva_veto machine_learning/TMVA_SOFIE_GNN_Parser.py) @@ -929,10 +927,25 @@ if(ROOT_pyroot_FOUND) analysis/dataframe/df035_RDFFromPandas.py roofit/roofit/rf409_NumPyPandasToRooFit.py) file(GLOB requires_keras RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} machine_learning/keras/*.py) - file(GLOB requires_torch RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} machine_learning/pytorch/*.py) + file(GLOB requires_torch RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + machine_learning/pytorch/*.py + machine_learning/RBatchGenerator_PyTorch.py + ) file(GLOB requires_xgboost RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} machine_learning/tmva10*.py) file(GLOB requires_sklearn RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} roofit/roofit/rf617*.py) - set(fixtureLists requires_numpy requires_numba requires_pandas requires_keras requires_xgboost requires_torch requires_sklearn) + file(GLOB requires_tensorflow RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + machine_learning/RBatchGenerator_TensorFlow.py + ) + set(fixtureLists + requires_keras + requires_numba + requires_numpy + requires_pandas + requires_sklearn + requires_tensorflow + requires_torch + requires_xgboost + ) # Now set up all the tests foreach(t ${pytutorials})