From db8a87049599fb8ae3ddd4c437c8568f1313aeb2 Mon Sep 17 00:00:00 2001
From: Mirko Bunse <mirko.bunse@cs.tu-dortmund.de>
Date: Tue, 17 Sep 2024 10:48:53 +0200
Subject: [PATCH] Instruct the user how to install qunfold in the case of an
 unsuccessful import

---
 quapy/method/composable.py | 90 +++++++++++++++++++++-----------------
 1 file changed, 51 insertions(+), 39 deletions(-)

diff --git a/quapy/method/composable.py b/quapy/method/composable.py
index aa00be4..5d40aad 100644
--- a/quapy/method/composable.py
+++ b/quapy/method/composable.py
@@ -1,45 +1,57 @@
 """This module allows the composition of quantification methods from loss functions and feature transformations. This functionality is realized through an integration of the qunfold package: https://github.com/mirkobunse/qunfold."""
 
-import qunfold
-from qunfold.quapy import QuaPyWrapper
-from qunfold.sklearn import CVClassifier
-from qunfold import (
-    LeastSquaresLoss, # losses
-    BlobelLoss,
-    EnergyLoss,
-    HellingerSurrogateLoss,
-    CombinedLoss,
-    TikhonovRegularization,
-    TikhonovRegularized,
-    ClassTransformer, # transformers
-    HistogramTransformer,
-    DistanceTransformer,
-    KernelTransformer,
-    EnergyKernelTransformer,
-    LaplacianKernelTransformer,
-    GaussianKernelTransformer,
-    GaussianRFFKernelTransformer,
-)
+_import_error_message = """qunfold, the back-end of quapy.method.composable, is not properly installed.
 
-__all__ = [ # control public members, e.g., for auto-documentation in sphinx; omit QuaPyWrapper
-    "ComposableQuantifier",
-    "CVClassifier",
-    "LeastSquaresLoss",
-    "BlobelLoss",
-    "EnergyLoss",
-    "HellingerSurrogateLoss",
-    "CombinedLoss",
-    "TikhonovRegularization",
-    "TikhonovRegularized",
-    "ClassTransformer",
-    "HistogramTransformer",
-    "DistanceTransformer",
-    "KernelTransformer",
-    "EnergyKernelTransformer",
-    "LaplacianKernelTransformer",
-    "GaussianKernelTransformer",
-    "GaussianRFFKernelTransformer",
-]
+To fix this error, call:
+
+    pip install --upgrade pip setuptools wheel
+    pip install "jax[cpu]"
+    pip install "qunfold @ git+https://github.com/mirkobunse/qunfold@v0.1.4"
+"""
+
+try:
+    import qunfold
+    from qunfold.quapy import QuaPyWrapper
+    from qunfold.sklearn import CVClassifier
+    from qunfold import (
+        LeastSquaresLoss, # losses
+        BlobelLoss,
+        EnergyLoss,
+        HellingerSurrogateLoss,
+        CombinedLoss,
+        TikhonovRegularization,
+        TikhonovRegularized,
+        ClassTransformer, # transformers
+        HistogramTransformer,
+        DistanceTransformer,
+        KernelTransformer,
+        EnergyKernelTransformer,
+        LaplacianKernelTransformer,
+        GaussianKernelTransformer,
+        GaussianRFFKernelTransformer,
+    )
+
+    __all__ = [ # control public members, e.g., for auto-documentation in sphinx; omit QuaPyWrapper
+        "ComposableQuantifier",
+        "CVClassifier",
+        "LeastSquaresLoss",
+        "BlobelLoss",
+        "EnergyLoss",
+        "HellingerSurrogateLoss",
+        "CombinedLoss",
+        "TikhonovRegularization",
+        "TikhonovRegularized",
+        "ClassTransformer",
+        "HistogramTransformer",
+        "DistanceTransformer",
+        "KernelTransformer",
+        "EnergyKernelTransformer",
+        "LaplacianKernelTransformer",
+        "GaussianKernelTransformer",
+        "GaussianRFFKernelTransformer",
+    ]
+except ImportError as e:
+    raise ImportError(_import_error_message) from e
 
 def ComposableQuantifier(loss, transformer, **kwargs):
     """A generic quantification / unfolding method that solves a linear system of equations.