{
    "file_diffs": [
        {
            "old_file_content": "import numpy as np\nimport sklearn.linear_model as skl_linear_model\n\nfrom Orange.classification import SklLearner, SklModel\nfrom Orange.preprocess import Normalize\nfrom Orange.preprocess.score import LearnerScorer\nfrom Orange.data import Variable, DiscreteVariable\n\n__all__ = [\"LogisticRegressionLearner\"]\n\n\nclass _FeatureScorerMixin(LearnerScorer):\n    feature_type = Variable\n    class_type = DiscreteVariable\n\n    def score(self, data):\n        data = Normalize()(data)\n        model = self(data)\n        return np.abs(model.coefficients), model.domain.attributes\n\n\nclass LogisticRegressionClassifier(SklModel):\n    @property\n    def intercept(self):\n        return self.skl_model.intercept_\n\n    @property\n    def coefficients(self):\n        return self.skl_model.coef_\n\n\nclass LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"lbfgs\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()\n",
            "new_file_content": "import numpy as np\nimport sklearn.linear_model as skl_linear_model\n\nfrom Orange.classification import SklLearner, SklModel\nfrom Orange.preprocess import Normalize\nfrom Orange.preprocess.score import LearnerScorer\nfrom Orange.data import Variable, DiscreteVariable\n\n__all__ = [\"LogisticRegressionLearner\"]\n\n\nclass _FeatureScorerMixin(LearnerScorer):\n    feature_type = Variable\n    class_type = DiscreteVariable\n\n    def score(self, data):\n        data = Normalize()(data)\n        model = self(data)\n        return np.abs(model.coefficients), model.domain.attributes\n\n\nclass LogisticRegressionClassifier(SklModel):\n    @property\n    def intercept(self):\n        return self.skl_model.intercept_\n\n    @property\n    def coefficients(self):\n        return self.skl_model.coef_\n\n\nclass LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"auto\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()\n\n    def _initialize_wrapped(self):\n        params = self.params.copy()\n        # The default scikit-learn solver `lbfgs` (v0.22) does not support the\n        # l1 penalty.\n        solver, penalty = params.pop(\"solver\"), params.get(\"penalty\")\n        if solver == \"auto\":\n            if penalty == \"l1\":\n                solver = \"liblinear\"\n            else:\n                solver = \"lbfgs\"\n        params[\"solver\"] = solver\n\n        return self.__wraps__(**params)\n\n",
            "header": {
                "file": {
                    "path": "Orange/classification/logistic_regression.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "f41c47fe3",
                "new_commit_hash": "aeb4fbfc1",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/classification/logistic_regression.py"
            },
            "plus_file": {
                "path": "b/Orange/classification/logistic_regression.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 36,
                            "length": 7
                        },
                        "new_range": {
                            "start": 36,
                            "length": 22
                        },
                        "section": "class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,",
                                "type": "context"
                            },
                            {
                                "content": "                 fit_intercept=True, intercept_scaling=1, class_weight=None,",
                                "type": "context"
                            },
                            {
                                "content": "                 random_state=None, solver=\"lbfgs\", max_iter=100,",
                                "type": "deleted"
                            },
                            {
                                "content": "                 random_state=None, solver=\"auto\", max_iter=100,",
                                "type": "added"
                            },
                            {
                                "content": "                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):",
                                "type": "context"
                            },
                            {
                                "content": "        super().__init__(preprocessors=preprocessors)",
                                "type": "context"
                            },
                            {
                                "content": "        self.params = vars()",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def _initialize_wrapped(self):",
                                "type": "added"
                            },
                            {
                                "content": "        params = self.params.copy()",
                                "type": "added"
                            },
                            {
                                "content": "        # The default scikit-learn solver `lbfgs` (v0.22) does not support the",
                                "type": "added"
                            },
                            {
                                "content": "        # l1 penalty.",
                                "type": "added"
                            },
                            {
                                "content": "        solver, penalty = params.pop(\"solver\"), params.get(\"penalty\")",
                                "type": "added"
                            },
                            {
                                "content": "        if solver == \"auto\":",
                                "type": "added"
                            },
                            {
                                "content": "            if penalty == \"l1\":",
                                "type": "added"
                            },
                            {
                                "content": "                solver = \"liblinear\"",
                                "type": "added"
                            },
                            {
                                "content": "            else:",
                                "type": "added"
                            },
                            {
                                "content": "                solver = \"lbfgs\"",
                                "type": "added"
                            },
                            {
                                "content": "        params[\"solver\"] = solver",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        return self.__wraps__(**params)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/classification/logistic_regression.py",
                            "type": "method",
                            "name": "LogisticRegressionLearner.__init__",
                            "content": "class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"lbfgs\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 37,
                            "end_lineno": 42,
                            "parent": {
                                "file_name": "Orange/classification/logistic_regression.py",
                                "type": "class",
                                "name": "LogisticRegressionLearner",
                                "content": "class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"lbfgs\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 32,
                                "end_lineno": 42,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/classification/logistic_regression.py",
                            "type": "class",
                            "name": "LogisticRegressionLearner",
                            "content": "class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"lbfgs\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 32,
                            "end_lineno": 42,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "Orange/classification/logistic_regression.py",
                            "type": "method",
                            "name": "LogisticRegressionLearner._initialize_wrapped",
                            "content": "class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"auto\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()\n\n    def _initialize_wrapped(self):\n        params = self.params.copy()\n        # The default scikit-learn solver `lbfgs` (v0.22) does not support the\n        # l1 penalty.\n        solver, penalty = params.pop(\"solver\"), params.get(\"penalty\")\n        if solver == \"auto\":\n            if penalty == \"l1\":\n                solver = \"liblinear\"\n            else:\n                solver = \"lbfgs\"\n        params[\"solver\"] = solver\n\n        return self.__wraps__(**params)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 44,
                            "end_lineno": 56,
                            "parent": {
                                "file_name": "Orange/classification/logistic_regression.py",
                                "type": "class",
                                "name": "LogisticRegressionLearner",
                                "content": "class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"auto\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()\n\n    def _initialize_wrapped(self):\n        params = self.params.copy()\n        # The default scikit-learn solver `lbfgs` (v0.22) does not support the\n        # l1 penalty.\n        solver, penalty = params.pop(\"solver\"), params.get(\"penalty\")\n        if solver == \"auto\":\n            if penalty == \"l1\":\n                solver = \"liblinear\"\n            else:\n                solver = \"lbfgs\"\n        params[\"solver\"] = solver\n\n        return self.__wraps__(**params)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 32,
                                "end_lineno": 56,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "# Test methods with long descriptive names can omit docstrings\n# pylint: disable=missing-docstring\n\nimport unittest\n\nimport numpy as np\nimport sklearn\n\nfrom Orange.data import Table, ContinuousVariable, Domain\nfrom Orange.classification import LogisticRegressionLearner, Model\nfrom Orange.evaluation import CrossValidation, CA\n\n\nclass TestLogisticRegressionLearner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        cls.iris = Table('iris')\n        cls.heart_disease = Table('heart_disease.tab')\n        cls.zoo = Table('zoo')\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n        ca = CA(results)\n        self.assertGreater(ca, 0.8)\n        self.assertLess(ca, 1.0)\n\n    @unittest.skip(\"Re-enable when Logistic regression supports normalization.\")\n    def test_LogisticRegressionNormalization(self):\n        np.random.seed(42)\n        new_attrs = (ContinuousVariable('c0'),) + self.iris.domain.attributes\n        new_domain = Domain(new_attrs,\n                            self.iris.domain.class_vars,\n                            self.iris.domain.metas)\n        new_table = np.hstack((\n            1000000 * np.random.random((self.iris.X.shape[0], 1)),\n            self.iris))\n        table = self.iris.from_numpy(new_domain, new_table)\n        lr = LogisticRegressionLearner(normalize=False)\n        lr_norm = LogisticRegressionLearner(normalize=True)\n\n        # check that normalization produces better results\n        cv = CrossValidation(k=3)\n        results = cv(table, [lr_norm, lr])\n        ca = CA(results)\n        self.assertGreater(ca[0], ca[1])\n\n        # check that coefficients are properly scaled back to unnormalized data\n        model = lr_norm(table)\n        y = np.argmax(np.dot(table.X, model.coefficients.T) + model.intercept,\n                      axis=1)\n        np.testing.assert_array_equal(model(table), y)\n\n    def test_LogisticRegressionNormalization_todo(self):\n        with self.assertRaises(TypeError):\n            lr = LogisticRegressionLearner(normalize=True)\n            # Do not skip the above test when this is implemented\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n        clf = learn(self.iris[:100])\n        p = clf(self.iris[100:], ret=Model.Probs)\n        self.assertLess(abs(p.sum(axis=1) - 1).all(), 1e-6)\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n                         self.heart_disease.domain.attributes[np.argmax(scores)].name)\n        self.assertEqual(scores.shape, (1, len(self.heart_disease.domain.attributes)))\n\n    def test_learner_scorer_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        for i, attr in enumerate(self.heart_disease.domain.attributes):\n            score = learner.score_data(self.heart_disease, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_learner_scorer_previous_transformation(self):\n        learner = LogisticRegressionLearner()\n        from Orange.preprocess import Discretize\n        data = Discretize()(self.iris)\n        scores = learner.score_data(data)\n        # scores should be defined and positive\n        self.assertTrue(np.all(scores > 0))\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\n        self.assertEqual('feathers', attr[np.argmax(scores[1])].name)  # bird\n        self.assertEqual('fins', attr[np.argmax(scores[2])].name)  # fish\n        self.assertEqual('legs', attr[np.argmax(scores[3])].name)  # insect\n        self.assertEqual('backbone', attr[np.argmax(scores[4])].name)  # invertebrate\n        self.assertEqual('milk', attr[np.argmax(scores[5])].name)  # mammal\n        self.assertEqual('hair', attr[np.argmax(scores[6])].name)  # reptile\n        self.assertEqual(scores.shape,\n                         (len(self.zoo.domain.class_var.values), len(attr)))\n\n    def test_learner_scorer_multiclass_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        for i, attr in enumerate(self.zoo.domain.attributes):\n            score = learner.score_data(self.zoo, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n        model = learn(self.heart_disease)\n        coef = model.coefficients\n        self.assertEqual(len(coef[0]), len(model.domain.attributes))\n\n    def test_predict_on_instance(self):\n        lr = LogisticRegressionLearner()\n        m = lr(self.zoo)\n        probs = m(self.zoo[50], m.Probs)\n        probs2 = m(self.zoo[50, :], m.Probs)\n        np.testing.assert_almost_equal(probs, probs2[0])\n\n    def test_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        learn = LogisticRegressionLearner()\n        with self.assertRaises(ValueError):\n            learn(t)\n\n    def test_sklearn_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        lr = sklearn.linear_model.LogisticRegression()\n        self.assertRaises(ValueError, lr.fit, t.X, t.Y)\n",
            "new_file_content": "# Test methods with long descriptive names can omit docstrings\n# pylint: disable=missing-docstring\n\nimport unittest\n\nimport numpy as np\nimport sklearn\n\nfrom Orange.data import Table, ContinuousVariable, Domain\nfrom Orange.classification import LogisticRegressionLearner, Model\nfrom Orange.evaluation import CrossValidation, CA\n\n\nclass TestLogisticRegressionLearner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        cls.iris = Table('iris')\n        cls.heart_disease = Table('heart_disease.tab')\n        cls.zoo = Table('zoo')\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n        ca = CA(results)\n        self.assertGreater(ca, 0.8)\n        self.assertLess(ca, 1.0)\n\n    @unittest.skip(\"Re-enable when Logistic regression supports normalization.\")\n    def test_LogisticRegressionNormalization(self):\n        np.random.seed(42)\n        new_attrs = (ContinuousVariable('c0'),) + self.iris.domain.attributes\n        new_domain = Domain(new_attrs,\n                            self.iris.domain.class_vars,\n                            self.iris.domain.metas)\n        new_table = np.hstack((\n            1000000 * np.random.random((self.iris.X.shape[0], 1)),\n            self.iris))\n        table = self.iris.from_numpy(new_domain, new_table)\n        lr = LogisticRegressionLearner(normalize=False)\n        lr_norm = LogisticRegressionLearner(normalize=True)\n\n        # check that normalization produces better results\n        cv = CrossValidation(k=3)\n        results = cv(table, [lr_norm, lr])\n        ca = CA(results)\n        self.assertGreater(ca[0], ca[1])\n\n        # check that coefficients are properly scaled back to unnormalized data\n        model = lr_norm(table)\n        y = np.argmax(np.dot(table.X, model.coefficients.T) + model.intercept,\n                      axis=1)\n        np.testing.assert_array_equal(model(table), y)\n\n    def test_LogisticRegressionNormalization_todo(self):\n        with self.assertRaises(TypeError):\n            lr = LogisticRegressionLearner(normalize=True)\n            # Do not skip the above test when this is implemented\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n        clf = learn(self.iris[:100])\n        p = clf(self.iris[100:], ret=Model.Probs)\n        self.assertLess(abs(p.sum(axis=1) - 1).all(), 1e-6)\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n                         self.heart_disease.domain.attributes[np.argmax(scores)].name)\n        self.assertEqual(scores.shape, (1, len(self.heart_disease.domain.attributes)))\n\n    def test_learner_scorer_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        for i, attr in enumerate(self.heart_disease.domain.attributes):\n            score = learner.score_data(self.heart_disease, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_learner_scorer_previous_transformation(self):\n        learner = LogisticRegressionLearner()\n        from Orange.preprocess import Discretize\n        data = Discretize()(self.iris)\n        scores = learner.score_data(data)\n        # scores should be defined and positive\n        self.assertTrue(np.all(scores > 0))\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\n        self.assertEqual('feathers', attr[np.argmax(scores[1])].name)  # bird\n        self.assertEqual('fins', attr[np.argmax(scores[2])].name)  # fish\n        self.assertEqual('legs', attr[np.argmax(scores[3])].name)  # insect\n        self.assertEqual('backbone', attr[np.argmax(scores[4])].name)  # invertebrate\n        self.assertEqual('milk', attr[np.argmax(scores[5])].name)  # mammal\n        self.assertEqual('hair', attr[np.argmax(scores[6])].name)  # reptile\n        self.assertEqual(scores.shape,\n                         (len(self.zoo.domain.class_var.values), len(attr)))\n\n    def test_learner_scorer_multiclass_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        for i, attr in enumerate(self.zoo.domain.attributes):\n            score = learner.score_data(self.zoo, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n        model = learn(self.heart_disease)\n        coef = model.coefficients\n        self.assertEqual(len(coef[0]), len(model.domain.attributes))\n\n    def test_predict_on_instance(self):\n        lr = LogisticRegressionLearner()\n        m = lr(self.zoo)\n        probs = m(self.zoo[50], m.Probs)\n        probs2 = m(self.zoo[50, :], m.Probs)\n        np.testing.assert_almost_equal(probs, probs2[0])\n\n    def test_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        learn = LogisticRegressionLearner()\n        with self.assertRaises(ValueError):\n            learn(t)\n\n    def test_sklearn_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        lr = sklearn.linear_model.LogisticRegression()\n        self.assertRaises(ValueError, lr.fit, t.X, t.Y)\n\n    def test_auto_solver(self):\n        # These defaults are valid as of sklearn v0.23.0\n        # lbfgs is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, \"l2\")\n\n        # lbfgs is default for no penalty\n        lr = LogisticRegressionLearner(penalty=None, solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, None)\n\n        # liblinear is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l1\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"liblinear\")\n        self.assertEqual(skl_clf.penalty, \"l1\")\n",
            "header": {
                "file": {
                    "path": "Orange/tests/test_logistic_regression.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "68c49dc67",
                "new_commit_hash": "d38d0ddd1",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/tests/test_logistic_regression.py"
            },
            "plus_file": {
                "path": "b/Orange/tests/test_logistic_regression.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 131,
                            "length": 3
                        },
                        "new_range": {
                            "start": 131,
                            "length": 23
                        },
                        "section": "class TestLogisticRegressionLearner(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(len(np.unique(t.Y)), 1)",
                                "type": "context"
                            },
                            {
                                "content": "        lr = sklearn.linear_model.LogisticRegression()",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, lr.fit, t.X, t.Y)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_auto_solver(self):",
                                "type": "added"
                            },
                            {
                                "content": "        # These defaults are valid as of sklearn v0.23.0",
                                "type": "added"
                            },
                            {
                                "content": "        # lbfgs is default for l2 penalty",
                                "type": "added"
                            },
                            {
                                "content": "        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")",
                                "type": "added"
                            },
                            {
                                "content": "        skl_clf = lr._initialize_wrapped()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(skl_clf.solver, \"lbfgs\")",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(skl_clf.penalty, \"l2\")",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        # lbfgs is default for no penalty",
                                "type": "added"
                            },
                            {
                                "content": "        lr = LogisticRegressionLearner(penalty=None, solver=\"auto\")",
                                "type": "added"
                            },
                            {
                                "content": "        skl_clf = lr._initialize_wrapped()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(skl_clf.solver, \"lbfgs\")",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(skl_clf.penalty, None)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        # liblinear is default for l2 penalty",
                                "type": "added"
                            },
                            {
                                "content": "        lr = LogisticRegressionLearner(penalty=\"l1\", solver=\"auto\")",
                                "type": "added"
                            },
                            {
                                "content": "        skl_clf = lr._initialize_wrapped()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(skl_clf.solver, \"liblinear\")",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(skl_clf.penalty, \"l1\")",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/tests/test_logistic_regression.py",
                            "type": "class",
                            "name": "TestLogisticRegressionLearner",
                            "content": "class TestLogisticRegressionLearner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        cls.iris = Table('iris')\n        cls.heart_disease = Table('heart_disease.tab')\n        cls.zoo = Table('zoo')\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n        ca = CA(results)\n        self.assertGreater(ca, 0.8)\n        self.assertLess(ca, 1.0)\n\n    @unittest.skip(\"Re-enable when Logistic regression supports normalization.\")\n    def test_LogisticRegressionNormalization(self):\n        np.random.seed(42)\n        new_attrs = (ContinuousVariable('c0'),) + self.iris.domain.attributes\n        new_domain = Domain(new_attrs,\n                            self.iris.domain.class_vars,\n                            self.iris.domain.metas)\n        new_table = np.hstack((\n            1000000 * np.random.random((self.iris.X.shape[0], 1)),\n            self.iris))\n        table = self.iris.from_numpy(new_domain, new_table)\n        lr = LogisticRegressionLearner(normalize=False)\n        lr_norm = LogisticRegressionLearner(normalize=True)\n\n        # check that normalization produces better results\n        cv = CrossValidation(k=3)\n        results = cv(table, [lr_norm, lr])\n        ca = CA(results)\n        self.assertGreater(ca[0], ca[1])\n\n        # check that coefficients are properly scaled back to unnormalized data\n        model = lr_norm(table)\n        y = np.argmax(np.dot(table.X, model.coefficients.T) + model.intercept,\n                      axis=1)\n        np.testing.assert_array_equal(model(table), y)\n\n    def test_LogisticRegressionNormalization_todo(self):\n        with self.assertRaises(TypeError):\n            lr = LogisticRegressionLearner(normalize=True)\n            # Do not skip the above test when this is implemented\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n        clf = learn(self.iris[:100])\n        p = clf(self.iris[100:], ret=Model.Probs)\n        self.assertLess(abs(p.sum(axis=1) - 1).all(), 1e-6)\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n                         self.heart_disease.domain.attributes[np.argmax(scores)].name)\n        self.assertEqual(scores.shape, (1, len(self.heart_disease.domain.attributes)))\n\n    def test_learner_scorer_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        for i, attr in enumerate(self.heart_disease.domain.attributes):\n            score = learner.score_data(self.heart_disease, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_learner_scorer_previous_transformation(self):\n        learner = LogisticRegressionLearner()\n        from Orange.preprocess import Discretize\n        data = Discretize()(self.iris)\n        scores = learner.score_data(data)\n        # scores should be defined and positive\n        self.assertTrue(np.all(scores > 0))\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\n        self.assertEqual('feathers', attr[np.argmax(scores[1])].name)  # bird\n        self.assertEqual('fins', attr[np.argmax(scores[2])].name)  # fish\n        self.assertEqual('legs', attr[np.argmax(scores[3])].name)  # insect\n        self.assertEqual('backbone', attr[np.argmax(scores[4])].name)  # invertebrate\n        self.assertEqual('milk', attr[np.argmax(scores[5])].name)  # mammal\n        self.assertEqual('hair', attr[np.argmax(scores[6])].name)  # reptile\n        self.assertEqual(scores.shape,\n                         (len(self.zoo.domain.class_var.values), len(attr)))\n\n    def test_learner_scorer_multiclass_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        for i, attr in enumerate(self.zoo.domain.attributes):\n            score = learner.score_data(self.zoo, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n        model = learn(self.heart_disease)\n        coef = model.coefficients\n        self.assertEqual(len(coef[0]), len(model.domain.attributes))\n\n    def test_predict_on_instance(self):\n        lr = LogisticRegressionLearner()\n        m = lr(self.zoo)\n        probs = m(self.zoo[50], m.Probs)\n        probs2 = m(self.zoo[50, :], m.Probs)\n        np.testing.assert_almost_equal(probs, probs2[0])\n\n    def test_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        learn = LogisticRegressionLearner()\n        with self.assertRaises(ValueError):\n            learn(t)\n\n    def test_sklearn_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        lr = sklearn.linear_model.LogisticRegression()\n        self.assertRaises(ValueError, lr.fit, t.X, t.Y)\n\n    def test_auto_solver(self):\n        # These defaults are valid as of sklearn v0.23.0\n        # lbfgs is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, \"l2\")\n\n        # lbfgs is default for no penalty\n        lr = LogisticRegressionLearner(penalty=None, solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, None)\n\n        # liblinear is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l1\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"liblinear\")\n        self.assertEqual(skl_clf.penalty, \"l1\")",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 14,
                            "end_lineno": 153,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "Orange/tests/test_logistic_regression.py",
                            "type": "method",
                            "name": "TestLogisticRegressionLearner.test_auto_solver",
                            "content": "class TestLogisticRegressionLearner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        cls.iris = Table('iris')\n        cls.heart_disease = Table('heart_disease.tab')\n        cls.zoo = Table('zoo')\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n        ca = CA(results)\n        self.assertGreater(ca, 0.8)\n        self.assertLess(ca, 1.0)\n\n    @unittest.skip(\"Re-enable when Logistic regression supports normalization.\")\n    def test_LogisticRegressionNormalization(self):\n        np.random.seed(42)\n        new_attrs = (ContinuousVariable('c0'),) + self.iris.domain.attributes\n        new_domain = Domain(new_attrs,\n                            self.iris.domain.class_vars,\n                            self.iris.domain.metas)\n        new_table = np.hstack((\n            1000000 * np.random.random((self.iris.X.shape[0], 1)),\n            self.iris))\n        table = self.iris.from_numpy(new_domain, new_table)\n        lr = LogisticRegressionLearner(normalize=False)\n        lr_norm = LogisticRegressionLearner(normalize=True)\n\n        # check that normalization produces better results\n        cv = CrossValidation(k=3)\n        results = cv(table, [lr_norm, lr])\n        ca = CA(results)\n        self.assertGreater(ca[0], ca[1])\n\n        # check that coefficients are properly scaled back to unnormalized data\n        model = lr_norm(table)\n        y = np.argmax(np.dot(table.X, model.coefficients.T) + model.intercept,\n                      axis=1)\n        np.testing.assert_array_equal(model(table), y)\n\n    def test_LogisticRegressionNormalization_todo(self):\n        with self.assertRaises(TypeError):\n            lr = LogisticRegressionLearner(normalize=True)\n            # Do not skip the above test when this is implemented\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n        clf = learn(self.iris[:100])\n        p = clf(self.iris[100:], ret=Model.Probs)\n        self.assertLess(abs(p.sum(axis=1) - 1).all(), 1e-6)\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n                         self.heart_disease.domain.attributes[np.argmax(scores)].name)\n        self.assertEqual(scores.shape, (1, len(self.heart_disease.domain.attributes)))\n\n    def test_learner_scorer_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        for i, attr in enumerate(self.heart_disease.domain.attributes):\n            score = learner.score_data(self.heart_disease, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_learner_scorer_previous_transformation(self):\n        learner = LogisticRegressionLearner()\n        from Orange.preprocess import Discretize\n        data = Discretize()(self.iris)\n        scores = learner.score_data(data)\n        # scores should be defined and positive\n        self.assertTrue(np.all(scores > 0))\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\n        self.assertEqual('feathers', attr[np.argmax(scores[1])].name)  # bird\n        self.assertEqual('fins', attr[np.argmax(scores[2])].name)  # fish\n        self.assertEqual('legs', attr[np.argmax(scores[3])].name)  # insect\n        self.assertEqual('backbone', attr[np.argmax(scores[4])].name)  # invertebrate\n        self.assertEqual('milk', attr[np.argmax(scores[5])].name)  # mammal\n        self.assertEqual('hair', attr[np.argmax(scores[6])].name)  # reptile\n        self.assertEqual(scores.shape,\n                         (len(self.zoo.domain.class_var.values), len(attr)))\n\n    def test_learner_scorer_multiclass_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        for i, attr in enumerate(self.zoo.domain.attributes):\n            score = learner.score_data(self.zoo, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n        model = learn(self.heart_disease)\n        coef = model.coefficients\n        self.assertEqual(len(coef[0]), len(model.domain.attributes))\n\n    def test_predict_on_instance(self):\n        lr = LogisticRegressionLearner()\n        m = lr(self.zoo)\n        probs = m(self.zoo[50], m.Probs)\n        probs2 = m(self.zoo[50, :], m.Probs)\n        np.testing.assert_almost_equal(probs, probs2[0])\n\n    def test_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        learn = LogisticRegressionLearner()\n        with self.assertRaises(ValueError):\n            learn(t)\n\n    def test_sklearn_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        lr = sklearn.linear_model.LogisticRegression()\n        self.assertRaises(ValueError, lr.fit, t.X, t.Y)\n\n    def test_auto_solver(self):\n        # These defaults are valid as of sklearn v0.23.0\n        # lbfgs is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, \"l2\")\n\n        # lbfgs is default for no penalty\n        lr = LogisticRegressionLearner(penalty=None, solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, None)\n\n        # liblinear is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l1\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"liblinear\")\n        self.assertEqual(skl_clf.penalty, \"l1\")",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 135,
                            "end_lineno": 153,
                            "parent": {
                                "file_name": "Orange/tests/test_logistic_regression.py",
                                "type": "class",
                                "name": "TestLogisticRegressionLearner",
                                "content": "class TestLogisticRegressionLearner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        cls.iris = Table('iris')\n        cls.heart_disease = Table('heart_disease.tab')\n        cls.zoo = Table('zoo')\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n        ca = CA(results)\n        self.assertGreater(ca, 0.8)\n        self.assertLess(ca, 1.0)\n\n    @unittest.skip(\"Re-enable when Logistic regression supports normalization.\")\n    def test_LogisticRegressionNormalization(self):\n        np.random.seed(42)\n        new_attrs = (ContinuousVariable('c0'),) + self.iris.domain.attributes\n        new_domain = Domain(new_attrs,\n                            self.iris.domain.class_vars,\n                            self.iris.domain.metas)\n        new_table = np.hstack((\n            1000000 * np.random.random((self.iris.X.shape[0], 1)),\n            self.iris))\n        table = self.iris.from_numpy(new_domain, new_table)\n        lr = LogisticRegressionLearner(normalize=False)\n        lr_norm = LogisticRegressionLearner(normalize=True)\n\n        # check that normalization produces better results\n        cv = CrossValidation(k=3)\n        results = cv(table, [lr_norm, lr])\n        ca = CA(results)\n        self.assertGreater(ca[0], ca[1])\n\n        # check that coefficients are properly scaled back to unnormalized data\n        model = lr_norm(table)\n        y = np.argmax(np.dot(table.X, model.coefficients.T) + model.intercept,\n                      axis=1)\n        np.testing.assert_array_equal(model(table), y)\n\n    def test_LogisticRegressionNormalization_todo(self):\n        with self.assertRaises(TypeError):\n            lr = LogisticRegressionLearner(normalize=True)\n            # Do not skip the above test when this is implemented\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n        clf = learn(self.iris[:100])\n        p = clf(self.iris[100:], ret=Model.Probs)\n        self.assertLess(abs(p.sum(axis=1) - 1).all(), 1e-6)\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n                         self.heart_disease.domain.attributes[np.argmax(scores)].name)\n        self.assertEqual(scores.shape, (1, len(self.heart_disease.domain.attributes)))\n\n    def test_learner_scorer_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        for i, attr in enumerate(self.heart_disease.domain.attributes):\n            score = learner.score_data(self.heart_disease, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_learner_scorer_previous_transformation(self):\n        learner = LogisticRegressionLearner()\n        from Orange.preprocess import Discretize\n        data = Discretize()(self.iris)\n        scores = learner.score_data(data)\n        # scores should be defined and positive\n        self.assertTrue(np.all(scores > 0))\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\n        self.assertEqual('feathers', attr[np.argmax(scores[1])].name)  # bird\n        self.assertEqual('fins', attr[np.argmax(scores[2])].name)  # fish\n        self.assertEqual('legs', attr[np.argmax(scores[3])].name)  # insect\n        self.assertEqual('backbone', attr[np.argmax(scores[4])].name)  # invertebrate\n        self.assertEqual('milk', attr[np.argmax(scores[5])].name)  # mammal\n        self.assertEqual('hair', attr[np.argmax(scores[6])].name)  # reptile\n        self.assertEqual(scores.shape,\n                         (len(self.zoo.domain.class_var.values), len(attr)))\n\n    def test_learner_scorer_multiclass_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        for i, attr in enumerate(self.zoo.domain.attributes):\n            score = learner.score_data(self.zoo, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n        model = learn(self.heart_disease)\n        coef = model.coefficients\n        self.assertEqual(len(coef[0]), len(model.domain.attributes))\n\n    def test_predict_on_instance(self):\n        lr = LogisticRegressionLearner()\n        m = lr(self.zoo)\n        probs = m(self.zoo[50], m.Probs)\n        probs2 = m(self.zoo[50, :], m.Probs)\n        np.testing.assert_almost_equal(probs, probs2[0])\n\n    def test_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        learn = LogisticRegressionLearner()\n        with self.assertRaises(ValueError):\n            learn(t)\n\n    def test_sklearn_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        lr = sklearn.linear_model.LogisticRegression()\n        self.assertRaises(ValueError, lr.fit, t.X, t.Y)\n\n    def test_auto_solver(self):\n        # These defaults are valid as of sklearn v0.23.0\n        # lbfgs is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, \"l2\")\n\n        # lbfgs is default for no penalty\n        lr = LogisticRegressionLearner(penalty=None, solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, None)\n\n        # liblinear is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l1\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"liblinear\")\n        self.assertEqual(skl_clf.penalty, \"l1\")",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 14,
                                "end_lineno": 153,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "9b5494e26f407b75e79699c9d40be6df1d80a040^",
    "new_commit_hash": "9b5494e26f407b75e79699c9d40be6df1d80a040",
    "commit_message": "logistic regression: set solver=\"auto\" to handle l1 loss",
    "commit_date": "2020-05-22T11:19:06+02:00",
    "metadata": {}
}
{
    "repo_name": "orange3",
    "new_commit_hash": "9b5494e26f407b75e79699c9d40be6df1d80a040",
    "test_file_codes": [
        "# Test methods with long descriptive names can omit docstrings\n# pylint: disable=missing-docstring\n\nimport unittest\n\nimport numpy as np\nimport sklearn\n\nfrom Orange.data import Table, ContinuousVariable, Domain\nfrom Orange.classification import LogisticRegressionLearner, Model\nfrom Orange.evaluation import CrossValidation, CA\n\n\nclass TestLogisticRegressionLearner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        cls.iris = Table('iris')\n        cls.heart_disease = Table('heart_disease.tab')\n        cls.zoo = Table('zoo')\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n        ca = CA(results)\n        self.assertGreater(ca, 0.8)\n        self.assertLess(ca, 1.0)\n\n    @unittest.skip(\"Re-enable when Logistic regression supports normalization.\")\n    def test_LogisticRegressionNormalization(self):\n        np.random.seed(42)\n        new_attrs = (ContinuousVariable('c0'),) + self.iris.domain.attributes\n        new_domain = Domain(new_attrs,\n                            self.iris.domain.class_vars,\n                            self.iris.domain.metas)\n        new_table = np.hstack((\n            1000000 * np.random.random((self.iris.X.shape[0], 1)),\n            self.iris))\n        table = self.iris.from_numpy(new_domain, new_table)\n        lr = LogisticRegressionLearner(normalize=False)\n        lr_norm = LogisticRegressionLearner(normalize=True)\n\n        # check that normalization produces better results\n        cv = CrossValidation(k=3)\n        results = cv(table, [lr_norm, lr])\n        ca = CA(results)\n        self.assertGreater(ca[0], ca[1])\n\n        # check that coefficients are properly scaled back to unnormalized data\n        model = lr_norm(table)\n        y = np.argmax(np.dot(table.X, model.coefficients.T) + model.intercept,\n                      axis=1)\n        np.testing.assert_array_equal(model(table), y)\n\n    def test_LogisticRegressionNormalization_todo(self):\n        with self.assertRaises(TypeError):\n            lr = LogisticRegressionLearner(normalize=True)\n            # Do not skip the above test when this is implemented\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n        clf = learn(self.iris[:100])\n        p = clf(self.iris[100:], ret=Model.Probs)\n        self.assertLess(abs(p.sum(axis=1) - 1).all(), 1e-6)\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n                         self.heart_disease.domain.attributes[np.argmax(scores)].name)\n        self.assertEqual(scores.shape, (1, len(self.heart_disease.domain.attributes)))\n\n    def test_learner_scorer_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        for i, attr in enumerate(self.heart_disease.domain.attributes):\n            score = learner.score_data(self.heart_disease, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_learner_scorer_previous_transformation(self):\n        learner = LogisticRegressionLearner()\n        from Orange.preprocess import Discretize\n        data = Discretize()(self.iris)\n        scores = learner.score_data(data)\n        # scores should be defined and positive\n        self.assertTrue(np.all(scores > 0))\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\n        self.assertEqual('feathers', attr[np.argmax(scores[1])].name)  # bird\n        self.assertEqual('fins', attr[np.argmax(scores[2])].name)  # fish\n        self.assertEqual('legs', attr[np.argmax(scores[3])].name)  # insect\n        self.assertEqual('backbone', attr[np.argmax(scores[4])].name)  # invertebrate\n        self.assertEqual('milk', attr[np.argmax(scores[5])].name)  # mammal\n        self.assertEqual('hair', attr[np.argmax(scores[6])].name)  # reptile\n        self.assertEqual(scores.shape,\n                         (len(self.zoo.domain.class_var.values), len(attr)))\n\n    def test_learner_scorer_multiclass_feature(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n        for i, attr in enumerate(self.zoo.domain.attributes):\n            score = learner.score_data(self.zoo, attr)\n            np.testing.assert_array_almost_equal(score, scores[:, i])\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n        model = learn(self.heart_disease)\n        coef = model.coefficients\n        self.assertEqual(len(coef[0]), len(model.domain.attributes))\n\n    def test_predict_on_instance(self):\n        lr = LogisticRegressionLearner()\n        m = lr(self.zoo)\n        probs = m(self.zoo[50], m.Probs)\n        probs2 = m(self.zoo[50, :], m.Probs)\n        np.testing.assert_almost_equal(probs, probs2[0])\n\n    def test_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        learn = LogisticRegressionLearner()\n        with self.assertRaises(ValueError):\n            learn(t)\n\n    def test_sklearn_single_class(self):\n        t = self.iris[60:90]\n        self.assertEqual(len(np.unique(t.Y)), 1)\n        lr = sklearn.linear_model.LogisticRegression()\n        self.assertRaises(ValueError, lr.fit, t.X, t.Y)\n\n    def test_auto_solver(self):\n        # These defaults are valid as of sklearn v0.23.0\n        # lbfgs is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, \"l2\")\n\n        # lbfgs is default for no penalty\n        lr = LogisticRegressionLearner(penalty=None, solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"lbfgs\")\n        self.assertEqual(skl_clf.penalty, None)\n\n        # liblinear is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l1\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n        self.assertEqual(skl_clf.solver, \"liblinear\")\n        self.assertEqual(skl_clf.penalty, \"l1\")\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "Starting Orange installation attempts...\nAttempting installation with Python 3.7...\nrunning build_ext\nrunning build_src\nbuild_src\nbuilding extension \"Orange.classification._simple_tree\" sources\nbuilding extension \"Orange.classification._tree_scorers\" sources\nbuilding extension \"Orange.data._valuecount\" sources\nbuilding extension \"Orange.data._contingency\" sources\nbuilding extension \"Orange.data._io\" sources\nbuilding extension \"Orange.data._variable\" sources\nbuilding extension \"Orange.distance._distance\" sources\nbuilding extension \"Orange.preprocess._discretize\" sources\nbuilding extension \"Orange.preprocess._relieff\" sources\nbuilding extension \"Orange.projection._som\" sources\nbuilding extension \"Orange.widgets.utils._grid_density\" sources\nbuild_src: building npy-pkg config files\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmp0400zvnk/tmp\ncreating /tmp/tmp0400zvnk/tmp/tmp0400zvnk\ncompile options: '-MMD -MF /tmp/tmp0400zvnk/file.c.d -c'\ncc: /tmp/tmp0400zvnk/file.c\ncustomize UnixCCompiler using build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmp_4nwvv37/tmp\ncreating /tmp/tmp_4nwvv37/tmp/tmp_4nwvv37\ncompile options: '-MMD -MF /tmp/tmp_4nwvv37/file.c.d -c'\ncc: /tmp/tmp_4nwvv37/file.c\ncustomize UnixCCompiler using build_ext\nbuilding 'Orange.classification._simple_tree' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange\ncreating build/temp.linux-x86_64-3.7/Orange/classification\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/classification/_simple_tree.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/classification/_simple_tree.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/classification/_simple_tree.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.classification._tree_scorers' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/classification/_tree_scorers.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/classification/_tree_scorers.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/classification/_tree_scorers.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._valuecount' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/data\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_valuecount.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_valuecount.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_valuecount.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._contingency' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_contingency.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_contingency.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_contingency.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._io' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_io.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_io.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_io.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._variable' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_variable.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_variable.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_variable.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.distance._distance' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/distance\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/distance/_distance.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/distance/_distance.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/distance/_distance.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.preprocess._discretize' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/preprocess\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/preprocess/_discretize.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/preprocess/_discretize.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/preprocess/_discretize.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.preprocess._relieff' extension\ncompiling C++ sources\nC compiler: c++ -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\nc++: Orange/preprocess/_relieff.cpp\nc++ -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/preprocess/_relieff.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/preprocess/_relieff.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.projection._som' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/projection\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/projection/_som.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/projection/_som.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/projection/_som.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.widgets.utils._grid_density' extension\ncompiling C++ sources\nC compiler: c++ -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/widgets\ncreating build/temp.linux-x86_64-3.7/Orange/widgets/utils\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\nc++: Orange/widgets/utils/_grid_density.cpp\nc++ -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/widgets/utils/_grid_density.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/widgets/utils/_grid_density.cpython-37m-x86_64-linux-gnu.so\nrunning develop\nrunning build_scripts\nrunning egg_info\nrunning build_src\nbuild_src\nbuilding extension \"Orange.classification._simple_tree\" sources\nbuilding extension \"Orange.classification._tree_scorers\" sources\nbuilding extension \"Orange.data._valuecount\" sources\nbuilding extension \"Orange.data._contingency\" sources\nbuilding extension \"Orange.data._io\" sources\nbuilding extension \"Orange.data._variable\" sources\nbuilding extension \"Orange.distance._distance\" sources\nbuilding extension \"Orange.preprocess._discretize\" sources\nbuilding extension \"Orange.preprocess._relieff\" sources\nbuilding extension \"Orange.projection._som\" sources\nbuilding extension \"Orange.widgets.utils._grid_density\" sources\nbuild_src: building npy-pkg config files\ncreating Orange3.egg-info\nwriting Orange3.egg-info/PKG-INFO\nwriting dependency_links to Orange3.egg-info/dependency_links.txt\nwriting entry points to Orange3.egg-info/entry_points.txt\nwriting requirements to Orange3.egg-info/requires.txt\nwriting top-level names to Orange3.egg-info/top_level.txt\nwriting manifest file 'Orange3.egg-info/SOURCES.txt'\nreading manifest file 'Orange3.egg-info/SOURCES.txt'\nreading manifest template 'MANIFEST.in'\nwarning: no files found matching 'README*' under directory 'Orange'\nwarning: no files found matching 'LICENSE' under directory 'Orange'\nwarning: no files found matching '*.basket' under directory 'Orange/datasets'\nwarning: no files found matching '*.js' under directory 'Orange/widgets'\nwarning: no files found matching '*.css' under directory 'Orange/widgets'\nwarning: no files found matching '*.html' under directory 'Orange/widgets'\nwarning: no files found matching 'COPYING'\nadding license file 'LICENSE'\nwriting manifest file 'Orange3.egg-info/SOURCES.txt'\nrunning build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmpjoide__q/tmp\ncreating /tmp/tmpjoide__q/tmp/tmpjoide__q\ncompile options: '-MMD -MF /tmp/tmpjoide__q/file.c.d -c'\ncc: /tmp/tmpjoide__q/file.c\ncustomize UnixCCompiler using build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmpk60jj5fk/tmp\ncreating /tmp/tmpk60jj5fk/tmp/tmpk60jj5fk\ncompile options: '-MMD -MF /tmp/tmpk60jj5fk/file.c.d -c'\ncc: /tmp/tmpk60jj5fk/file.c\ncustomize UnixCCompiler using build_ext\nCreating /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/Orange3.egg-link (link to .)\nAdding Orange3 3.26.0.dev0+9b5494e to easy-install.pth file\nInstalling orange-canvas script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nInstalled /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040\nProcessing dependencies for Orange3==3.26.0.dev0+9b5494e\nSearching for XlsxWriter==3.2.0\nBest match: XlsxWriter 3.2.0\nAdding XlsxWriter 3.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for xlrd==2.0.1\nBest match: xlrd 2.0.1\nAdding xlrd 2.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for setuptools==59.8.0\nBest match: setuptools 59.8.0\nAdding setuptools 59.8.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for serverfiles==0.3.1\nBest match: serverfiles 0.3.1\nAdding serverfiles 0.3.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for scipy==1.7.3\nBest match: scipy 1.7.3\nAdding scipy 1.7.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for scikit-learn==0.22.2.post1\nBest match: scikit-learn 0.22.2.post1\nAdding scikit-learn 0.22.2.post1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for requests==2.31.0\nBest match: requests 2.31.0\nAdding requests 2.31.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for PyYAML==6.0.1\nBest match: PyYAML 6.0.1\nAdding PyYAML 6.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for python-louvain==0.16\nBest match: python-louvain 0.16\nAdding python-louvain 0.16 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for pyqtgraph==0.12.4\nBest match: pyqtgraph 0.12.4\nAdding pyqtgraph 0.12.4 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for pip==24.0\nBest match: pip 24.0\nAdding pip 24.0 to easy-install.pth file\nInstalling pip script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling pip3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling pip3.10 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for pandas==1.3.5\nBest match: pandas 1.3.5\nAdding pandas 1.3.5 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for orange-widget-base==4.22.0\nBest match: orange-widget-base 4.22.0\nAdding orange-widget-base 4.22.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for orange-canvas-core==0.1.35\nBest match: orange-canvas-core 0.1.35\nAdding orange-canvas-core 0.1.35 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for openpyxl==3.1.3\nBest match: openpyxl 3.1.3\nAdding openpyxl 3.1.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for openTSNE==1.0.1\nBest match: openTSNE 1.0.1\nAdding openTSNE 1.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for numpy==1.17.5\nBest match: numpy 1.17.5\nAdding numpy 1.17.5 to easy-install.pth file\nInstalling f2py script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling f2py3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling f2py3.7 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for networkx==2.6.3\nBest match: networkx 2.6.3\nAdding networkx 2.6.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for matplotlib==3.5.3\nBest match: matplotlib 3.5.3\nAdding matplotlib 3.5.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for keyrings.alt==4.2.0\nBest match: keyrings.alt 4.2.0\nAdding keyrings.alt 4.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for keyring==24.1.1\nBest match: keyring 24.1.1\nAdding keyring 24.1.1 to easy-install.pth file\nInstalling keyring script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for joblib==1.3.2\nBest match: joblib 1.3.2\nAdding joblib 1.3.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for httpx==0.24.1\nBest match: httpx 0.24.1\nAdding httpx 0.24.1 to easy-install.pth file\nInstalling httpx script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for docutils==0.20.1\nBest match: docutils 0.20.1\nAdding docutils 0.20.1 to easy-install.pth file\nInstalling docutils script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for chardet==5.2.0\nBest match: chardet 5.2.0\nAdding chardet 5.2.0 to easy-install.pth file\nInstalling chardetect script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for Bottleneck==1.4.0\nBest match: Bottleneck 1.4.0\nAdding Bottleneck 1.4.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for baycomp==1.0.3\nBest match: baycomp 1.0.3\nAdding baycomp 1.0.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for AnyQt==0.2.0\nBest match: AnyQt 0.2.0\nAdding AnyQt 0.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for urllib3==2.0.7\nBest match: urllib3 2.0.7\nAdding urllib3 2.0.7 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for certifi==2024.12.14\nBest match: certifi 2024.12.14\nAdding certifi 2024.12.14 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for charset-normalizer==3.4.1\nBest match: charset-normalizer 3.4.1\nAdding charset-normalizer 3.4.1 to easy-install.pth file\nInstalling normalizer script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for idna==3.10\nBest match: idna 3.10\nAdding idna 3.10 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for pytz==2024.2\nBest match: pytz 2024.2\nAdding pytz 2024.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for python-dateutil==2.9.0.post0\nBest match: python-dateutil 2.9.0.post0\nAdding python-dateutil 2.9.0.post0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for typing-extensions==4.7.1\nBest match: typing-extensions 4.7.1\nAdding typing-extensions 4.7.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for packaging==24.0\nBest match: packaging 24.0\nAdding packaging 24.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for commonmark==0.9.1\nBest match: commonmark 0.9.1\nAdding commonmark 0.9.1 to easy-install.pth file\nInstalling cmark script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for dictdiffer==0.9.0\nBest match: dictdiffer 0.9.0\nAdding dictdiffer 0.9.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for importlib-metadata==6.7.0\nBest match: importlib-metadata 6.7.0\nAdding importlib-metadata 6.7.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for qasync==0.25.0\nBest match: qasync 0.25.0\nAdding qasync 0.25.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for requests-cache==1.1.1\nBest match: requests-cache 1.1.1\nAdding requests-cache 1.1.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for et-xmlfile==1.1.0\nBest match: et-xmlfile 1.1.0\nAdding et-xmlfile 1.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for cycler==0.11.0\nBest match: cycler 0.11.0\nAdding cycler 0.11.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for Pillow==9.5.0\nBest match: Pillow 9.5.0\nAdding Pillow 9.5.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for fonttools==4.38.0\nBest match: fonttools 4.38.0\nAdding fonttools 4.38.0 to easy-install.pth file\nInstalling fonttools script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling pyftmerge script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling pyftsubset script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\nInstalling ttx script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for pyparsing==3.1.4\nBest match: pyparsing 3.1.4\nAdding pyparsing 3.1.4 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for kiwisolver==1.4.5\nBest match: kiwisolver 1.4.5\nAdding kiwisolver 1.4.5 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for jaraco.classes==3.2.3\nBest match: jaraco.classes 3.2.3\nAdding jaraco.classes 3.2.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for importlib-resources==5.12.0\nBest match: importlib-resources 5.12.0\nAdding importlib-resources 5.12.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for jeepney==0.8.0\nBest match: jeepney 0.8.0\nAdding jeepney 0.8.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for SecretStorage==3.3.3\nBest match: SecretStorage 3.3.3\nAdding SecretStorage 3.3.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for sniffio==1.3.1\nBest match: sniffio 1.3.1\nAdding sniffio 1.3.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for httpcore==0.17.3\nBest match: httpcore 0.17.3\nAdding httpcore 0.17.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for six==1.17.0\nBest match: six 1.17.0\nAdding six 1.17.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for zipp==3.15.0\nBest match: zipp 3.15.0\nAdding zipp 3.15.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for platformdirs==4.0.0\nBest match: platformdirs 4.0.0\nAdding platformdirs 4.0.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for cattrs==23.1.2\nBest match: cattrs 23.1.2\nAdding cattrs 23.1.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for attrs==24.2.0\nBest match: attrs 24.2.0\nAdding attrs 24.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for url-normalize==1.4.3\nBest match: url-normalize 1.4.3\nAdding url-normalize 1.4.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for more-itertools==9.1.0\nBest match: more-itertools 9.1.0\nAdding more-itertools 9.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for cryptography==44.0.0\nBest match: cryptography 44.0.0\nAdding cryptography 44.0.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for h11==0.14.0\nBest match: h11 0.14.0\nAdding h11 0.14.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for anyio==3.7.1\nBest match: anyio 3.7.1\nAdding anyio 3.7.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for exceptiongroup==1.2.2\nBest match: exceptiongroup 1.2.2\nAdding exceptiongroup 1.2.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for cffi==1.15.1\nBest match: cffi 1.15.1\nAdding cffi 1.15.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nSearching for pycparser==2.21\nBest match: pycparser 2.21\nAdding pycparser 2.21 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages\nFinished processing dependencies for Orange3==3.26.0.dev0+9b5494e\nVerifying Orange installation...\n✅ Orange installation successful!\nSuccessfully installed orange using Python 3.7\n",
    "setup_res_stderr": "Using CPython 3.7.9\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\nResolved 18 packages in 187ms\nPrepared 18 packages in 2ms\nInstalled 18 packages in 160ms\n + cython==0.29.37\n + exceptiongroup==1.2.2\n + importlib-metadata==6.7.0\n + iniconfig==2.0.0\n + numpy==1.17.5\n + packaging==24.0\n + pluggy==1.2.0\n + pyqt5==5.15.10\n + pyqt5-qt5==5.15.16\n + pyqt5-sip==12.13.0\n + pyqtwebengine==5.15.6\n + pyqtwebengine-qt5==5.15.16\n + pytest==7.4.4\n + setuptools==59.8.0\n + tomli==2.0.1\n + typing-extensions==4.7.1\n + wheel==0.42.0\n + zipp==3.15.0\nResolved 53 packages in 452ms\nInstalled 46 packages in 643ms\n + anyio==3.7.1\n + baycomp==1.0.3\n + bottleneck==1.4.0\n + certifi==2024.12.14\n + cffi==1.15.1\n + chardet==5.2.0\n + charset-normalizer==3.4.1\n + cryptography==44.0.0\n + cycler==0.11.0\n + et-xmlfile==1.1.0\n + fonttools==4.38.0\n + h11==0.14.0\n + httpcore==0.17.3\n + httpx==0.24.1\n + idna==3.10\n + importlib-resources==5.12.0\n + jaraco-classes==3.2.3\n + jeepney==0.8.0\n + joblib==1.3.2\n + keyring==24.1.1\n + keyrings-alt==4.2.0\n + kiwisolver==1.4.5\n + matplotlib==3.5.3\n + more-itertools==9.1.0\n + networkx==2.6.3\n + openpyxl==3.1.3\n + opentsne==1.0.1\n + pandas==1.3.5\n + pillow==9.5.0\n + pip==24.0\n + pycparser==2.21\n + pyparsing==3.1.4\n + python-dateutil==2.9.0.post0\n + python-louvain==0.16\n + pytz==2024.2\n + pyyaml==6.0.1\n + requests==2.31.0\n + scikit-learn==0.22.2.post1\n + scipy==1.7.3\n + secretstorage==3.3.3\n + serverfiles==0.3.1\n + six==1.17.0\n + sniffio==1.3.1\n + urllib3==2.0.7\n + xlrd==2.0.1\n + xlsxwriter==3.2.0\nResolved 34 packages in 130ms\nInstalled 13 packages in 271ms\n + anyqt==0.2.0\n + attrs==24.2.0\n + cattrs==23.1.2\n + commonmark==0.9.1\n + dictdiffer==0.9.0\n + docutils==0.20.1\n + orange-canvas-core==0.1.35\n + orange-widget-base==4.22.0\n + platformdirs==4.0.0\n + pyqtgraph==0.12.4\n + qasync==0.25.0\n + requests-cache==1.1.1\n + url-normalize==1.4.3\nResolved 2 packages in 3ms\nInstalled 2 packages in 30ms\n + psycopg2==2.9.9\n + pymssql==2.3.2\nAudited 1 package in 72ms\nAudited 2 packages in 16ms\nOrange/classification/_simple_tree.c: In function ‘gain_ratio_c’:\nOrange/classification/_simple_tree.c:63:9: warning: implicit declaration of function ‘qsort_r’; did you mean ‘qsort’? [-Wimplicit-function-declaration]\n   63 |         qsort_r(base, nel, size, compar, thunk)\n      |         ^~~~~~~\nOrange/classification/_simple_tree.c:147:9: note: in expansion of macro ‘QSORT_R_FUNC’\n  147 |         QSORT_R_FUNC(examples, size, sizeof(struct Example), (void*) &compar_attr, compar_examples);\n      |         ^~~~~~~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/classification/_tree_scorers.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_2find_threshold_entropy’:\nOrange/classification/_tree_scorers.c:3115:27: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 3115 |   __pyx_t_7 = ((__pyx_v_N <= __pyx_v_min_leaf) != 0);\n      |                           ^~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_6find_threshold_MSE’:\nOrange/classification/_tree_scorers.c:4619:27: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 4619 |   __pyx_t_1 = ((__pyx_v_N <= __pyx_v_min_leaf) != 0);\n      |                           ^~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_8find_binarization_MSE’:\nOrange/classification/_tree_scorers.c:5396:43: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 5396 |           for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) {\n      |                                           ^\nOrange/classification/_tree_scorers.c:5517:39: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 5517 |           __pyx_t_27 = ((__pyx_v_left >= __pyx_v_min_leaf) != 0);\n      |                                       ^~\nOrange/classification/_tree_scorers.c:5523:53: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 5523 |           __pyx_t_27 = (((__pyx_v_N - __pyx_v_left) >= __pyx_v_min_leaf) != 0);\n      |                                                     ^~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_14compute_predictions_csr’:\nOrange/classification/_tree_scorers.c:7051:41: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 7051 |         for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {\n      |                                         ^\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_16compute_predictions_csc’:\nOrange/classification/_tree_scorers.c:7741:41: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 7741 |         for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {\n      |                                         ^\nOrange/classification/_tree_scorers.c:7801:143: warning: comparison of integer expressions of different signedness: ‘__pyx_t_5numpy_int32_t’ {aka ‘int’} and ‘unsigned int’ [-Wsign-compare]\n 7801 |               __pyx_t_17 = (((*((__pyx_t_5numpy_int32_t *) ( /* dim=0 */ (__pyx_v_indices.data + __pyx_t_18 * __pyx_v_indices.strides[0]) ))) != __pyx_v_i) != 0);\n      |                                                                                                                                               ^~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/data/_valuecount.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/data/_contingency.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/data/_io.c: In function ‘__pyx_pf_6Orange_4data_3_io_sparse_read_float.constprop’:\nOrange/data/_io.c:3881:24: warning: ‘__pyx_v_decs’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3881 |           __pyx_v_decs = (__pyx_v_decs / 10.0);\n      |           ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~\nOrange/data/_io.c:4070:24: warning: ‘__pyx_v_value’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4070 |           __pyx_t_10 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 221, __pyx_L5_error)\n      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nOrange/data/_io.c:480:40: warning: ‘__pyx_v_attr_index’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n  480 |   #define PyInt_FromLong               PyLong_FromLong\n      |                                        ^~~~~~~~~~~~~~~\nOrange/data/_io.c:1301:7: note: ‘__pyx_v_attr_index’ was declared here\n 1301 |   int __pyx_v_attr_index;\n      |       ^~~~~~~~~~~~~~~~~~\nOrange/data/_io.c:2935:25: warning: ‘__pyx_v_atomp’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2935 |           __pyx_v_atomp = (__pyx_v_atomp + 1);\n      |           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/distance/_distance.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/preprocess/_discretize.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/preprocess/_relieff.cpp:627:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/projection/_som.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_5update_hex’:\nOrange/projection/_som.c:3655:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3655 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:3654:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3654 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_7get_winners_sparse’:\nOrange/projection/_som.c:4547:223: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4547 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_39, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_y;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:4114:7: note: ‘__pyx_v_win_y’ was declared here\n 4114 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:4536:223: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4536 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_37, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_x;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:4113:7: note: ‘__pyx_v_win_x’ was declared here\n 4113 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pf_6Orange_10projection_4_som_8update_sparse.constprop’:\nOrange/projection/_som.c:4746:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4746 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:4745:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4745 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_3update’:\nOrange/projection/_som.c:3141:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3141 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_1get_winners’:\nOrange/projection/_som.c:2964:223: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2964 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_27, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_28, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_y;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:2665:7: note: ‘__pyx_v_win_y’ was declared here\n 2665 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:2953:223: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2953 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_x;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:2664:7: note: ‘__pyx_v_win_x’ was declared here\n 2664 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pf_6Orange_10projection_4_som_10update_sparse_hex.constprop’:\nOrange/projection/_som.c:5515:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 5515 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:5514:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 5514 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.\n  setuptools.SetuptoolsDeprecationWarning,\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/setuptools/command/easy_install.py:159: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools.\n  EasyInstallDeprecationWarning,\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.\n  setuptools.SetuptoolsDeprecationWarning,\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040/.venv/lib/python3.7/site-packages/setuptools/command/egg_info.py:628: SetuptoolsDeprecationWarning: Custom 'build_py' does not implement 'get_data_files_without_manifest'.\nPlease extend command classes from setuptools instead of distutils.\n  SetuptoolsDeprecationWarning\n",
    "new_commit_res_code": 1,
    "new_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.7.9, pytest-7.4.4, pluggy-1.2.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040\nplugins: anyio-3.7.1\ncollected 14 items\n\nr2e_tests/test_1.py Fs..FF.F......                                       [100%]\n\n=================================== FAILURES ===================================\n____________ TestLogisticRegressionLearner.test_LogisticRegression _____________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_LogisticRegression>\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n>       ca = CA(results)\n\nr2e_tests/test_1.py:25: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nOrange/evaluation/scoring.py:73: in __new__\n    return self(results, **kwargs)\nOrange/evaluation/scoring.py:82: in __call__\n    return self.compute_score(results, **kwargs)\nOrange/evaluation/scoring.py:104: in compute_score\n    return self.from_predicted(results, wraps)\nOrange/evaluation/scoring.py:113: in from_predicted\n    dtype=np.float64, count=len(results.predicted))\nOrange/evaluation/scoring.py:112: in <genexpr>\n    for predicted in results.predicted),\n.venv/lib/python3.7/site-packages/sklearn/metrics/_classification.py:185: in accuracy_score\n    y_type, y_true, y_pred = _check_targets(y_true, y_pred)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ny_true = array([1., 1., 0., 1., 1., 0., 0., 0., 0., 0., 1., 0., 1., 1., 0., 1., 0.,\n       0., 1., 1., 0., 1., 0., 0., 1., 1., ...1., 0., 1., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1.,\n       0., 0., 1., 0., 0., 1., 1., 0., 1., 1., 1., 1., 1., 1.])\ny_pred = array([ 6.26965706e-310,  6.26965706e-310,  1.83460171e-316,\n        1.83460171e-316,  9.08902875e-001,  7.24611759e-0...    -3.54944204e-001, -1.79275635e-002, -1.43082619e-002,\n        3.38717616e-001,  2.06867997e-001,  2.67216800e-002])\n\n    def _check_targets(y_true, y_pred):\n        \"\"\"Check that y_true and y_pred belong to the same classification task\n    \n        This converts multiclass or binary types to a common shape, and raises a\n        ValueError for a mix of multilabel and multiclass targets, a mix of\n        multilabel formats, for the presence of continuous-valued or multioutput\n        targets, or for targets of different lengths.\n    \n        Column vectors are squeezed to 1d, while multilabel formats are returned\n        as CSR sparse label indicators.\n    \n        Parameters\n        ----------\n        y_true : array-like\n    \n        y_pred : array-like\n    \n        Returns\n        -------\n        type_true : one of {'multilabel-indicator', 'multiclass', 'binary'}\n            The type of the true target data, as output by\n            ``utils.multiclass.type_of_target``\n    \n        y_true : array or indicator matrix\n    \n        y_pred : array or indicator matrix\n        \"\"\"\n        check_consistent_length(y_true, y_pred)\n        type_true = type_of_target(y_true)\n        type_pred = type_of_target(y_pred)\n    \n        y_type = {type_true, type_pred}\n        if y_type == {\"binary\", \"multiclass\"}:\n            y_type = {\"multiclass\"}\n    \n        if len(y_type) > 1:\n            raise ValueError(\"Classification metrics can't handle a mix of {0} \"\n>                            \"and {1} targets\".format(type_true, type_pred))\nE           ValueError: Classification metrics can't handle a mix of binary and continuous targets\n\n.venv/lib/python3.7/site-packages/sklearn/metrics/_classification.py:90: ValueError\n_______________ TestLogisticRegressionLearner.test_coefficients ________________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_coefficients>\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n>       model = learn(self.heart_disease)\n\nr2e_tests/test_1.py:111: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nOrange/base.py:543: in __call__\n    m = super().__call__(data, progress_callback)\nOrange/base.py:136: in __call__\n    model = self._fit_model(data)\nOrange/base.py:151: in _fit_model\n    return self.fit(X, Y, W)\nOrange/base.py:554: in fit\n    return self.__returns__(clf.fit(X, Y))\n.venv/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:1601: in fit\n    for class_, warm_start_coef_ in zip(classes_, warm_start_coef))\n.venv/lib/python3.7/site-packages/joblib/parallel.py:1863: in __call__\n    return output if self.return_generator else list(output)\n.venv/lib/python3.7/site-packages/joblib/parallel.py:1792: in _get_sequential_output\n    res = func(*args, **kwargs)\n.venv/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:940: in _logistic_regression_path\n    extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsolver = 'lbfgs'\nresult =       fun: 101.6457776342771\n hess_inv: <26x26 LbfgsInvHessProduct with dtype=float64>\n      jac: array([-3.95628563e+... -0.42348148,  0.46103241,\n       -0.09307215,  1.175625  , -0.60337832,  0.69570565, -0.22218477,\n       -0.05453703])\nmax_iter = 100\nextra_warning_msg = 'Please also refer to the documentation for alternative solver options:\\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression'\n\n    def _check_optimize_result(solver, result, max_iter=None,\n                               extra_warning_msg=None):\n        \"\"\"Check the OptimizeResult for successful convergence\n    \n        Parameters\n        ----------\n        solver: str\n           solver name. Currently only `lbfgs` is supported.\n        result: OptimizeResult\n           result of the scipy.optimize.minimize function\n        max_iter: {int, None}\n           expected maximum number of iterations\n    \n        Returns\n        -------\n        n_iter: int\n           number of iterations\n        \"\"\"\n        # handle both scipy and scikit-learn solver names\n        if solver == \"lbfgs\":\n            if result.status != 0:\n                warning_msg = (\n                    \"{} failed to converge (status={}):\\n{}.\\n\\n\"\n                    \"Increase the number of iterations (max_iter) \"\n                    \"or scale the data as shown in:\\n\"\n                    \"    https://scikit-learn.org/stable/modules/\"\n                    \"preprocessing.html\"\n>               ).format(solver, result.status, result.message.decode(\"latin1\"))\nE               AttributeError: 'str' object has no attribute 'decode'\n\n.venv/lib/python3.7/site-packages/sklearn/utils/optimize.py:243: AttributeError\n______________ TestLogisticRegressionLearner.test_learner_scorer _______________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_learner_scorer>\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n>                        self.heart_disease.domain.attributes[np.argmax(scores)].name)\nE       AssertionError: 'major vessels colored' != 'chest pain'\nE       - major vessels colored\nE       + chest pain\n\nr2e_tests/test_1.py:70: AssertionError\n_________ TestLogisticRegressionLearner.test_learner_scorer_multiclass _________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_learner_scorer_multiclass>\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n>       self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\nE       AssertionError: 'aquatic' != 'legs'\nE       - aquatic\nE       + legs\n\nr2e_tests/test_1.py:92: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_LogisticRegressionNormalization_todo\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_auto_solver\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_feature\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_multiclass_feature\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_previous_transformation\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_predict_on_instance\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_probability\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_single_class\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_sklearn_single_class\nSKIPPED [1] r2e_tests/test_1.py:29: Re-enable when Logistic regression supports normalization.\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_LogisticRegression\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_coefficients\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_multiclass\n==================== 4 failed, 9 passed, 1 skipped in 3.79s ====================\n",
    "new_commit_res_stderr": "",
    "old_commit_res_code": 1,
    "old_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.7.9, pytest-7.4.4, pluggy-1.2.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_9b5494e26f407b75e79699c9d40be6df1d80a040\nplugins: anyio-3.7.1\ncollected 14 items\n\nr2e_tests/test_1.py Fs.FFF.F...F..                                       [100%]\n\n=================================== FAILURES ===================================\n____________ TestLogisticRegressionLearner.test_LogisticRegression _____________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_LogisticRegression>\n\n    def test_LogisticRegression(self):\n        learn = LogisticRegressionLearner()\n        cv = CrossValidation(k=2)\n        results = cv(self.heart_disease, [learn])\n>       ca = CA(results)\n\nr2e_tests/test_1.py:25: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nOrange/evaluation/scoring.py:73: in __new__\n    return self(results, **kwargs)\nOrange/evaluation/scoring.py:82: in __call__\n    return self.compute_score(results, **kwargs)\nOrange/evaluation/scoring.py:104: in compute_score\n    return self.from_predicted(results, wraps)\nOrange/evaluation/scoring.py:113: in from_predicted\n    dtype=np.float64, count=len(results.predicted))\nOrange/evaluation/scoring.py:112: in <genexpr>\n    for predicted in results.predicted),\n.venv/lib/python3.7/site-packages/sklearn/metrics/_classification.py:185: in accuracy_score\n    y_type, y_true, y_pred = _check_targets(y_true, y_pred)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ny_true = array([1., 1., 0., 1., 1., 0., 0., 0., 0., 0., 1., 0., 1., 1., 0., 1., 0.,\n       0., 1., 1., 0., 1., 0., 0., 1., 1., ...1., 0., 1., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1.,\n       0., 0., 1., 0., 0., 1., 1., 0., 1., 1., 1., 1., 1., 1.])\ny_pred = array([ 6.92620556e-310,  6.92620556e-310,  1.76537244e-316,\n        1.76537244e-316,  2.30031199e+000,  9.67454118e-0...     6.45055796e-001,  9.82072436e-001,  9.85691738e-001,\n        6.61282384e-001,  7.93132003e-001,  9.73278320e-001])\n\n    def _check_targets(y_true, y_pred):\n        \"\"\"Check that y_true and y_pred belong to the same classification task\n    \n        This converts multiclass or binary types to a common shape, and raises a\n        ValueError for a mix of multilabel and multiclass targets, a mix of\n        multilabel formats, for the presence of continuous-valued or multioutput\n        targets, or for targets of different lengths.\n    \n        Column vectors are squeezed to 1d, while multilabel formats are returned\n        as CSR sparse label indicators.\n    \n        Parameters\n        ----------\n        y_true : array-like\n    \n        y_pred : array-like\n    \n        Returns\n        -------\n        type_true : one of {'multilabel-indicator', 'multiclass', 'binary'}\n            The type of the true target data, as output by\n            ``utils.multiclass.type_of_target``\n    \n        y_true : array or indicator matrix\n    \n        y_pred : array or indicator matrix\n        \"\"\"\n        check_consistent_length(y_true, y_pred)\n        type_true = type_of_target(y_true)\n        type_pred = type_of_target(y_pred)\n    \n        y_type = {type_true, type_pred}\n        if y_type == {\"binary\", \"multiclass\"}:\n            y_type = {\"multiclass\"}\n    \n        if len(y_type) > 1:\n            raise ValueError(\"Classification metrics can't handle a mix of {0} \"\n>                            \"and {1} targets\".format(type_true, type_pred))\nE           ValueError: Classification metrics can't handle a mix of binary and continuous targets\n\n.venv/lib/python3.7/site-packages/sklearn/metrics/_classification.py:90: ValueError\n________________ TestLogisticRegressionLearner.test_auto_solver ________________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_auto_solver>\n\n    def test_auto_solver(self):\n        # These defaults are valid as of sklearn v0.23.0\n        # lbfgs is default for l2 penalty\n        lr = LogisticRegressionLearner(penalty=\"l2\", solver=\"auto\")\n        skl_clf = lr._initialize_wrapped()\n>       self.assertEqual(skl_clf.solver, \"lbfgs\")\nE       AssertionError: 'auto' != 'lbfgs'\nE       - auto\nE       + lbfgs\n\nr2e_tests/test_1.py:140: AssertionError\n_______________ TestLogisticRegressionLearner.test_coefficients ________________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_coefficients>\n\n    def test_coefficients(self):\n        learn = LogisticRegressionLearner()\n>       model = learn(self.heart_disease)\n\nr2e_tests/test_1.py:111: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nOrange/base.py:543: in __call__\n    m = super().__call__(data, progress_callback)\nOrange/base.py:136: in __call__\n    model = self._fit_model(data)\nOrange/base.py:151: in _fit_model\n    return self.fit(X, Y, W)\nOrange/base.py:554: in fit\n    return self.__returns__(clf.fit(X, Y))\n.venv/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:1601: in fit\n    for class_, warm_start_coef_ in zip(classes_, warm_start_coef))\n.venv/lib/python3.7/site-packages/joblib/parallel.py:1863: in __call__\n    return output if self.return_generator else list(output)\n.venv/lib/python3.7/site-packages/joblib/parallel.py:1792: in _get_sequential_output\n    res = func(*args, **kwargs)\n.venv/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:940: in _logistic_regression_path\n    extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsolver = 'lbfgs'\nresult =       fun: 101.6457776342771\n hess_inv: <26x26 LbfgsInvHessProduct with dtype=float64>\n      jac: array([-3.95628563e+... -0.42348148,  0.46103241,\n       -0.09307215,  1.175625  , -0.60337832,  0.69570565, -0.22218477,\n       -0.05453703])\nmax_iter = 100\nextra_warning_msg = 'Please also refer to the documentation for alternative solver options:\\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression'\n\n    def _check_optimize_result(solver, result, max_iter=None,\n                               extra_warning_msg=None):\n        \"\"\"Check the OptimizeResult for successful convergence\n    \n        Parameters\n        ----------\n        solver: str\n           solver name. Currently only `lbfgs` is supported.\n        result: OptimizeResult\n           result of the scipy.optimize.minimize function\n        max_iter: {int, None}\n           expected maximum number of iterations\n    \n        Returns\n        -------\n        n_iter: int\n           number of iterations\n        \"\"\"\n        # handle both scipy and scikit-learn solver names\n        if solver == \"lbfgs\":\n            if result.status != 0:\n                warning_msg = (\n                    \"{} failed to converge (status={}):\\n{}.\\n\\n\"\n                    \"Increase the number of iterations (max_iter) \"\n                    \"or scale the data as shown in:\\n\"\n                    \"    https://scikit-learn.org/stable/modules/\"\n                    \"preprocessing.html\"\n>               ).format(solver, result.status, result.message.decode(\"latin1\"))\nE               AttributeError: 'str' object has no attribute 'decode'\n\n.venv/lib/python3.7/site-packages/sklearn/utils/optimize.py:243: AttributeError\n______________ TestLogisticRegressionLearner.test_learner_scorer _______________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_learner_scorer>\n\n    def test_learner_scorer(self):\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.heart_disease)\n        self.assertEqual('major vessels colored',\n>                        self.heart_disease.domain.attributes[np.argmax(scores)].name)\nE       AssertionError: 'major vessels colored' != 'chest pain'\nE       - major vessels colored\nE       + chest pain\n\nr2e_tests/test_1.py:70: AssertionError\n_________ TestLogisticRegressionLearner.test_learner_scorer_multiclass _________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_learner_scorer_multiclass>\n\n    def test_learner_scorer_multiclass(self):\n        attr = self.zoo.domain.attributes\n        learner = LogisticRegressionLearner()\n        scores = learner.score_data(self.zoo)\n>       self.assertEqual('aquatic', attr[np.argmax(scores[0])].name)  # amphibian\nE       AssertionError: 'aquatic' != 'legs'\nE       - aquatic\nE       + legs\n\nr2e_tests/test_1.py:92: AssertionError\n________________ TestLogisticRegressionLearner.test_probability ________________\n\nself = <r2e_tests.test_1.TestLogisticRegressionLearner testMethod=test_probability>\n\n    def test_probability(self):\n        learn = LogisticRegressionLearner(penalty='l1')\n>       clf = learn(self.iris[:100])\n\nr2e_tests/test_1.py:62: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nOrange/base.py:543: in __call__\n    m = super().__call__(data, progress_callback)\nOrange/base.py:136: in __call__\n    model = self._fit_model(data)\nOrange/base.py:151: in _fit_model\n    return self.fit(X, Y, W)\nOrange/base.py:554: in fit\n    return self.__returns__(clf.fit(X, Y))\n.venv/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:1488: in fit\n    solver = _check_solver(self.solver, self.penalty, self.dual)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsolver = 'lbfgs', penalty = 'l1', dual = False\n\n    def _check_solver(solver, penalty, dual):\n        all_solvers = ['liblinear', 'newton-cg', 'lbfgs', 'sag', 'saga']\n        if solver not in all_solvers:\n            raise ValueError(\"Logistic Regression supports only solvers in %s, got\"\n                             \" %s.\" % (all_solvers, solver))\n    \n        all_penalties = ['l1', 'l2', 'elasticnet', 'none']\n        if penalty not in all_penalties:\n            raise ValueError(\"Logistic Regression supports only penalties in %s,\"\n                             \" got %s.\" % (all_penalties, penalty))\n    \n        if solver not in ['liblinear', 'saga'] and penalty not in ('l2', 'none'):\n            raise ValueError(\"Solver %s supports only 'l2' or 'none' penalties, \"\n>                            \"got %s penalty.\" % (solver, penalty))\nE           ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.\n\n.venv/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:445: ValueError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_LogisticRegressionNormalization_todo\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_feature\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_multiclass_feature\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_previous_transformation\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_predict_on_instance\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_single_class\nPASSED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_sklearn_single_class\nSKIPPED [1] r2e_tests/test_1.py:29: Re-enable when Logistic regression supports normalization.\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_LogisticRegression\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_auto_solver\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_coefficients\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_learner_scorer_multiclass\nFAILED r2e_tests/test_1.py::TestLogisticRegressionLearner::test_probability\n==================== 6 failed, 7 passed, 1 skipped in 3.81s ====================\n",
    "old_commit_res_stderr": ""
}
Orange/classification/logistic_regression.py Orange/tests/test_logistic_regression.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
### Error When Using L1 Penalty with LogisticRegressionLearner

When configuring `LogisticRegressionLearner` with `penalty='l1'`, an error is raised because the solver does not support the L1 penalty.

**Example Code:**
```python
learn = LogisticRegressionLearner(penalty='l1')
model = learn(iris_data)
```

**Error Message:**
```
ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.
```

**Expected Behavior:**
The learner should automatically select a solver that supports the specified penalty, allowing the use of `penalty='l1'` without errors.
[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### Orange/classification/logistic_regression.py
import numpy as np
import sklearn.linear_model as skl_linear_model

from Orange.classification import SklLearner, SklModel
from Orange.preprocess import Normalize
from Orange.preprocess.score import LearnerScorer
from Orange.data import Variable, DiscreteVariable

__all__ = ["LogisticRegressionLearner"]


class _FeatureScorerMixin(LearnerScorer):
    feature_type = Variable
    class_type = DiscreteVariable

    def score(self, data):
        data = Normalize()(data)
        model = self(data)
        return np.abs(model.coefficients), model.domain.attributes


class LogisticRegressionClassifier(SklModel):
    @property
    def intercept(self):
        return self.skl_model.intercept_

    @property
    def coefficients(self):
        return self.skl_model.coef_


class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):
    __wraps__ = skl_linear_model.LogisticRegression
    __returns__ = LogisticRegressionClassifier
    preprocessors = SklLearner.preprocessors

    def __init__(self, penalty="l2", dual=False, tol=0.0001, C=1.0,
                 fit_intercept=True, intercept_scaling=1, class_weight=None,
                 random_state=None, solver="lbfgs", max_iter=100,
                 multi_class="auto", verbose=0, n_jobs=1, preprocessors=None):
        super().__init__(preprocessors=preprocessors)
        self.params = vars()

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
[ISSUE]
### Error When Using L1 Penalty with LogisticRegressionLearner

When configuring `LogisticRegressionLearner` with `penalty='l1'`, an error is raised because the solver does not support the L1 penalty.

**Example Code:**
```python
learn = LogisticRegressionLearner(penalty='l1')
model = learn(iris_data)
```

**Error Message:**
```
ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.
```

**Expected Behavior:**
The learner should automatically select a solver that supports the specified penalty, allowing the use of `penalty='l1'` without errors.
[/ISSUE]
{
    "TestLogisticRegressionLearner.test_LogisticRegressionNormalization_todo": "PASSED",
    "TestLogisticRegressionLearner.test_auto_solver": "PASSED",
    "TestLogisticRegressionLearner.test_learner_scorer_feature": "PASSED",
    "TestLogisticRegressionLearner.test_learner_scorer_multiclass_feature": "PASSED",
    "TestLogisticRegressionLearner.test_learner_scorer_previous_transformation": "PASSED",
    "TestLogisticRegressionLearner.test_predict_on_instance": "PASSED",
    "TestLogisticRegressionLearner.test_probability": "PASSED",
    "TestLogisticRegressionLearner.test_single_class": "PASSED",
    "TestLogisticRegressionLearner.test_sklearn_single_class": "PASSED",
    "TestLogisticRegressionLearner.test_LogisticRegression": "FAILED",
    "TestLogisticRegressionLearner.test_coefficients": "FAILED",
    "TestLogisticRegressionLearner.test_learner_scorer": "FAILED",
    "TestLogisticRegressionLearner.test_learner_scorer_multiclass": "FAILED"
}
diff --git a/Orange/classification/logistic_regression.py b/Orange/classification/logistic_regression.py
index f41c47fe3..aeb4fbfc1 100644
--- a/Orange/classification/logistic_regression.py
+++ b/Orange/classification/logistic_regression.py
@@ -36,7 +36,22 @@ class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):
 
     def __init__(self, penalty="l2", dual=False, tol=0.0001, C=1.0,
                  fit_intercept=True, intercept_scaling=1, class_weight=None,
-                 random_state=None, solver="lbfgs", max_iter=100,
+                 random_state=None, solver="auto", max_iter=100,
                  multi_class="auto", verbose=0, n_jobs=1, preprocessors=None):
         super().__init__(preprocessors=preprocessors)
         self.params = vars()
+
+    def _initialize_wrapped(self):
+        params = self.params.copy()
+        # The default scikit-learn solver `lbfgs` (v0.22) does not support the
+        # l1 penalty.
+        solver, penalty = params.pop("solver"), params.get("penalty")
+        if solver == "auto":
+            if penalty == "l1":
+                solver = "liblinear"
+            else:
+                solver = "lbfgs"
+        params["solver"] = solver
+
+        return self.__wraps__(**params)
+

{"Orange/classification/logistic_regression.py": "import numpy as np\nimport sklearn.linear_model as skl_linear_model\n\nfrom Orange.classification import SklLearner, SklModel\nfrom Orange.preprocess import Normalize\nfrom Orange.preprocess.score import LearnerScorer\nfrom Orange.data import Variable, DiscreteVariable\n\n__all__ = [\"LogisticRegressionLearner\"]\n\n\nclass _FeatureScorerMixin(LearnerScorer):\n    feature_type = Variable\n    class_type = DiscreteVariable\n\n    def score(self, data):\n        data = Normalize()(data)\n        model = self(data)\n        return np.abs(model.coefficients), model.domain.attributes\n\n\nclass LogisticRegressionClassifier(SklModel):\n    @property\n    def intercept(self):\n        return self.skl_model.intercept_\n\n    @property\n    def coefficients(self):\n        return self.skl_model.coef_\n\n\nclass LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):\n    __wraps__ = skl_linear_model.LogisticRegression\n    __returns__ = LogisticRegressionClassifier\n    preprocessors = SklLearner.preprocessors\n\n    def __init__(self, penalty=\"l2\", dual=False, tol=0.0001, C=1.0,\n                 fit_intercept=True, intercept_scaling=1, class_weight=None,\n                 random_state=None, solver=\"lbfgs\", max_iter=100,\n                 multi_class=\"auto\", verbose=0, n_jobs=1, preprocessors=None):\n        super().__init__(preprocessors=preprocessors)\n        self.params = vars()\n"}
A user will ask you to solve a task. You should first draft your thinking process (inner monologue). Then, generate the solution.

Your response format must follow the template below:
<think>
Your thoughts or/and draft, like working through an exercise on scratch paper. Be as casual and as long as you want until you are confident to generate a correct solution.
</think>
<solution>
Final solution presented to the user.
</solution>
system
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
### Error When Using L1 Penalty with LogisticRegressionLearner

When configuring `LogisticRegressionLearner` with `penalty='l1'`, an error is raised because the solver does not support the L1 penalty.

**Example Code:**
```python
learn = LogisticRegressionLearner(penalty='l1')
model = learn(iris_data)
```

**Error Message:**
```
ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.
```

**Expected Behavior:**
The learner should automatically select a solver that supports the specified penalty, allowing the use of `penalty='l1'` without errors.
[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### Orange/classification/logistic_regression.py
import numpy as np
import sklearn.linear_model as skl_linear_model

from Orange.classification import SklLearner, SklModel
from Orange.preprocess import Normalize
from Orange.preprocess.score import LearnerScorer
from Orange.data import Variable, DiscreteVariable

__all__ = ["LogisticRegressionLearner"]


class _FeatureScorerMixin(LearnerScorer):
    feature_type = Variable
    class_type = DiscreteVariable

    def score(self, data):
        data = Normalize()(data)
        model = self(data)
        return np.abs(model.coefficients), model.domain.attributes


class LogisticRegressionClassifier(SklModel):
    @property
    def intercept(self):
        return self.skl_model.intercept_

    @property
    def coefficients(self):
        return self.skl_model.coef_


class LogisticRegressionLearner(SklLearner, _FeatureScorerMixin):
    __wraps__ = skl_linear_model.LogisticRegression
    __returns__ = LogisticRegressionClassifier
    preprocessors = SklLearner.preprocessors

    def __init__(self, penalty="l2", dual=False, tol=0.0001, C=1.0,
                 fit_intercept=True, intercept_scaling=1, class_weight=None,
                 random_state=None, solver="lbfgs", max_iter=100,
                 multi_class="auto", verbose=0, n_jobs=1, preprocessors=None):
        super().__init__(preprocessors=preprocessors)
        self.params = vars()

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
user