{
    "file_diffs": [
        {
            "old_file_content": "import numpy as np\nfrom Orange.data import Domain, DiscreteVariable\nfrom Orange.data.util import get_unique_names\n\nANNOTATED_DATA_SIGNAL_NAME = \"Data\"\nANNOTATED_DATA_FEATURE_NAME = \"Selected\"\n\n\ndef add_columns(domain, attributes=(), class_vars=(), metas=()):\n    \"\"\"Construct a new domain with new columns added to the specified place\n\n    Parameters\n    ----------\n    domain : Domain\n        source domain\n    attributes\n        list of variables to append to attributes from source domain\n    class_vars\n        list of variables to append to class_vars from source domain\n    metas\n        list of variables to append to metas from source domain\n\n    Returns\n    -------\n    Domain\n    \"\"\"\n    attributes = domain.attributes + tuple(attributes)\n    class_vars = domain.class_vars + tuple(class_vars)\n    metas = domain.metas + tuple(metas)\n    return Domain(attributes, class_vars, metas)\n\n\ndef _table_with_annotation_column(data, values, column_data, var_name):\n    var = DiscreteVariable(get_unique_names(data.domain, var_name), values)\n    class_vars, metas = data.domain.class_vars, data.domain.metas\n    if not data.domain.class_vars:\n        class_vars += (var, )\n    else:\n        metas += (var, )\n    domain = Domain(data.domain.attributes, class_vars, metas)\n    table = data.transform(domain)\n    table[:, var] = column_data.reshape((len(data), 1))\n    return table\n\n\ndef create_annotated_table(data, selected_indices):\n    \"\"\"\n    Returns data with concatenated flag column. Flag column represents\n    whether data instance has been selected (Yes) or not (No), which is\n    determined in selected_indices parameter.\n\n    :param data: Table\n    :param selected_indices: list or ndarray\n    :return: Table\n    \"\"\"\n    if data is None:\n        return None\n    annotated = np.zeros((len(data), 1))\n    if selected_indices is not None:\n        annotated[selected_indices] = 1\n    return _table_with_annotation_column(\n        data, (\"No\", \"Yes\"), annotated, ANNOTATED_DATA_FEATURE_NAME)\n\n\ndef create_groups_table(data, selection,\n                        include_unselected=True,\n                        var_name=ANNOTATED_DATA_FEATURE_NAME):\n    if data is None:\n        return None\n    max_sel = np.max(selection)\n    values = [\"G{}\".format(i + 1) for i in range(max_sel)]\n    if include_unselected:\n        # Place Unselected instances in the \"last group\", so that the group\n        # colors and scatter diagram marker colors will match\n        values.append(\"Unselected\")\n        mask = (selection != 0)\n        selection = selection.copy()\n        selection[mask] = selection[mask] - 1\n        selection[~mask] = selection[~mask] = max_sel\n    else:\n        mask = np.flatnonzero(selection)\n        data = data[mask]\n        selection = selection[mask] - 1\n    return _table_with_annotation_column(data, values, selection, var_name)\n",
            "new_file_content": "import numpy as np\nfrom Orange.data import Domain, DiscreteVariable\nfrom Orange.data.util import get_unique_names\n\nANNOTATED_DATA_SIGNAL_NAME = \"Data\"\nANNOTATED_DATA_FEATURE_NAME = \"Selected\"\n\n\ndef add_columns(domain, attributes=(), class_vars=(), metas=()):\n    \"\"\"Construct a new domain with new columns added to the specified place\n\n    Parameters\n    ----------\n    domain : Domain\n        source domain\n    attributes\n        list of variables to append to attributes from source domain\n    class_vars\n        list of variables to append to class_vars from source domain\n    metas\n        list of variables to append to metas from source domain\n\n    Returns\n    -------\n    Domain\n    \"\"\"\n    attributes = domain.attributes + tuple(attributes)\n    class_vars = domain.class_vars + tuple(class_vars)\n    metas = domain.metas + tuple(metas)\n    return Domain(attributes, class_vars, metas)\n\n\ndef _table_with_annotation_column(data, values, column_data, var_name):\n    var = DiscreteVariable(get_unique_names(data.domain, var_name), values)\n    class_vars, metas = data.domain.class_vars, data.domain.metas\n    if not data.domain.class_vars:\n        class_vars += (var, )\n    else:\n        metas += (var, )\n    domain = Domain(data.domain.attributes, class_vars, metas)\n    table = data.transform(domain)\n    table[:, var] = column_data.reshape((len(data), 1))\n    return table\n\n\ndef create_annotated_table(data, selected_indices):\n    \"\"\"\n    Returns data with concatenated flag column. Flag column represents\n    whether data instance has been selected (Yes) or not (No), which is\n    determined in selected_indices parameter.\n\n    :param data: Table\n    :param selected_indices: list or ndarray\n    :return: Table\n    \"\"\"\n    if data is None:\n        return None\n    annotated = np.zeros((len(data), 1))\n    if selected_indices is not None:\n        annotated[selected_indices] = 1\n    return _table_with_annotation_column(\n        data, (\"No\", \"Yes\"), annotated, ANNOTATED_DATA_FEATURE_NAME)\n\n\ndef create_groups_table(data, selection,\n                        include_unselected=True,\n                        var_name=ANNOTATED_DATA_FEATURE_NAME,\n                        values=None):\n    if data is None:\n        return None\n    max_sel = np.max(selection)\n    if values is None:\n        values = [\"G{}\".format(i + 1) for i in range(max_sel)]\n        if include_unselected:\n            values.append(\"Unselected\")\n    if include_unselected:\n        # Place Unselected instances in the \"last group\", so that the group\n        # colors and scatter diagram marker colors will match\n        mask = (selection != 0)\n        selection = selection.copy()\n        selection[mask] = selection[mask] - 1\n        selection[~mask] = selection[~mask] = max_sel\n    else:\n        mask = np.flatnonzero(selection)\n        data = data[mask]\n        selection = selection[mask] - 1\n    return _table_with_annotation_column(data, values, selection, var_name)\n",
            "header": {
                "file": {
                    "path": "Orange/widgets/utils/annotated_data.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "93f91bd27",
                "new_commit_hash": "fea91dae7",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/widgets/utils/annotated_data.py"
            },
            "plus_file": {
                "path": "b/Orange/widgets/utils/annotated_data.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 64,
                            "length": 15
                        },
                        "new_range": {
                            "start": 64,
                            "length": 18
                        },
                        "section": "def create_annotated_table(data, selected_indices):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "def create_groups_table(data, selection,",
                                "type": "context"
                            },
                            {
                                "content": "                        include_unselected=True,",
                                "type": "context"
                            },
                            {
                                "content": "                        var_name=ANNOTATED_DATA_FEATURE_NAME):",
                                "type": "deleted"
                            },
                            {
                                "content": "                        var_name=ANNOTATED_DATA_FEATURE_NAME,",
                                "type": "added"
                            },
                            {
                                "content": "                        values=None):",
                                "type": "added"
                            },
                            {
                                "content": "    if data is None:",
                                "type": "context"
                            },
                            {
                                "content": "        return None",
                                "type": "context"
                            },
                            {
                                "content": "    max_sel = np.max(selection)",
                                "type": "context"
                            },
                            {
                                "content": "    values = [\"G{}\".format(i + 1) for i in range(max_sel)]",
                                "type": "deleted"
                            },
                            {
                                "content": "    if values is None:",
                                "type": "added"
                            },
                            {
                                "content": "        values = [\"G{}\".format(i + 1) for i in range(max_sel)]",
                                "type": "added"
                            },
                            {
                                "content": "        if include_unselected:",
                                "type": "added"
                            },
                            {
                                "content": "            values.append(\"Unselected\")",
                                "type": "added"
                            },
                            {
                                "content": "    if include_unselected:",
                                "type": "context"
                            },
                            {
                                "content": "        # Place Unselected instances in the \"last group\", so that the group",
                                "type": "context"
                            },
                            {
                                "content": "        # colors and scatter diagram marker colors will match",
                                "type": "context"
                            },
                            {
                                "content": "        values.append(\"Unselected\")",
                                "type": "deleted"
                            },
                            {
                                "content": "        mask = (selection != 0)",
                                "type": "context"
                            },
                            {
                                "content": "        selection = selection.copy()",
                                "type": "context"
                            },
                            {
                                "content": "        selection[mask] = selection[mask] - 1",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/annotated_data.py",
                            "type": "function",
                            "name": "create_groups_table",
                            "content": "def create_groups_table(data, selection,\n                        include_unselected=True,\n                        var_name=ANNOTATED_DATA_FEATURE_NAME):\n    if data is None:\n        return None\n    max_sel = np.max(selection)\n    values = [\"G{}\".format(i + 1) for i in range(max_sel)]\n    if include_unselected:\n        # Place Unselected instances in the \"last group\", so that the group\n        # colors and scatter diagram marker colors will match\n        values.append(\"Unselected\")\n        mask = (selection != 0)\n        selection = selection.copy()\n        selection[mask] = selection[mask] - 1\n        selection[~mask] = selection[~mask] = max_sel\n    else:\n        mask = np.flatnonzero(selection)\n        data = data[mask]\n        selection = selection[mask] - 1\n    return _table_with_annotation_column(data, values, selection, var_name)",
                            "ast_type_str": "FunctionDef",
                            "start_lineno": 65,
                            "end_lineno": 84,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import random\nimport unittest\n\nimport numpy as np\n\nfrom Orange.data import Table, Variable\nfrom Orange.data.filter import SameValue\nfrom Orange.widgets.utils.annotated_data import (\n    create_annotated_table, create_groups_table, ANNOTATED_DATA_FEATURE_NAME\n)\n\n\nclass TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        self.assertEqual(\n            len(SameValue(table.domain[\"Selected\"], \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )\n",
            "new_file_content": "import random\nimport unittest\n\nimport numpy as np\n\nfrom Orange.data import Table, Variable\nfrom Orange.data.filter import SameValue\nfrom Orange.widgets.utils.annotated_data import (\n    create_annotated_table, create_groups_table, ANNOTATED_DATA_FEATURE_NAME\n)\n\n\nclass TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        selvar = table.domain[\"Selected\"]\n        self.assertEqual(\n            len(SameValue(selvar, \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )\n        self.assertEqual(selvar.values, [\"G1\", \"G2\", \"Unselected\"])\n\n    def test_create_groups_table_set_values(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        values = (\"this\", \"that\", \"rest\")\n        table = create_groups_table(self.zoo, selection, values=values)\n        self.assertEqual(tuple(table.domain[\"Selected\"].values), values)\n",
            "header": {
                "file": {
                    "path": "Orange/widgets/utils/tests/test_annotated_data.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "160a6a043",
                "new_commit_hash": "7f893c1d7",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/widgets/utils/tests/test_annotated_data.py"
            },
            "plus_file": {
                "path": "b/Orange/widgets/utils/tests/test_annotated_data.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 109,
                            "length": 7
                        },
                        "new_range": {
                            "start": 109,
                            "length": 18
                        },
                        "section": "class TestAnnotatedData(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        selection[group_indices[:10]] = 1",
                                "type": "context"
                            },
                            {
                                "content": "        selection[group_indices[10:]] = 2",
                                "type": "context"
                            },
                            {
                                "content": "        table = create_groups_table(self.zoo, selection)",
                                "type": "context"
                            },
                            {
                                "content": "        selvar = table.domain[\"Selected\"]",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(",
                                "type": "context"
                            },
                            {
                                "content": "            len(SameValue(table.domain[\"Selected\"], \"Unselected\")(table)),",
                                "type": "deleted"
                            },
                            {
                                "content": "            len(SameValue(selvar, \"Unselected\")(table)),",
                                "type": "added"
                            },
                            {
                                "content": "            len(self.zoo) - len(group_indices)",
                                "type": "context"
                            },
                            {
                                "content": "        )",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(selvar.values, [\"G1\", \"G2\", \"Unselected\"])",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_create_groups_table_set_values(self):",
                                "type": "added"
                            },
                            {
                                "content": "        group_indices = random.sample(range(0, len(self.zoo)), 20)",
                                "type": "added"
                            },
                            {
                                "content": "        selection = np.zeros(len(self.zoo), dtype=np.uint8)",
                                "type": "added"
                            },
                            {
                                "content": "        selection[group_indices[:10]] = 1",
                                "type": "added"
                            },
                            {
                                "content": "        selection[group_indices[10:]] = 2",
                                "type": "added"
                            },
                            {
                                "content": "        values = (\"this\", \"that\", \"rest\")",
                                "type": "added"
                            },
                            {
                                "content": "        table = create_groups_table(self.zoo, selection, values=values)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(tuple(table.domain[\"Selected\"].values), values)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_annotated_data.py",
                            "type": "class",
                            "name": "TestAnnotatedData",
                            "content": "class TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        self.assertEqual(\n            len(SameValue(table.domain[\"Selected\"], \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 13,
                            "end_lineno": 115,
                            "parent": null
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_annotated_data.py",
                            "type": "method",
                            "name": "TestAnnotatedData.test_create_groups_table_include_unselected",
                            "content": "class TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        self.assertEqual(\n            len(SameValue(table.domain[\"Selected\"], \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 106,
                            "end_lineno": 115,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_annotated_data.py",
                                "type": "class",
                                "name": "TestAnnotatedData",
                                "content": "class TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        self.assertEqual(\n            len(SameValue(table.domain[\"Selected\"], \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 13,
                                "end_lineno": 115,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_annotated_data.py",
                            "type": "method",
                            "name": "TestAnnotatedData.test_create_groups_table_set_values",
                            "content": "class TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        selvar = table.domain[\"Selected\"]\n        self.assertEqual(\n            len(SameValue(selvar, \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )\n        self.assertEqual(selvar.values, [\"G1\", \"G2\", \"Unselected\"])\n\n    def test_create_groups_table_set_values(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        values = (\"this\", \"that\", \"rest\")\n        table = create_groups_table(self.zoo, selection, values=values)\n        self.assertEqual(tuple(table.domain[\"Selected\"].values), values)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 119,
                            "end_lineno": 126,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_annotated_data.py",
                                "type": "class",
                                "name": "TestAnnotatedData",
                                "content": "class TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        selvar = table.domain[\"Selected\"]\n        self.assertEqual(\n            len(SameValue(selvar, \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )\n        self.assertEqual(selvar.values, [\"G1\", \"G2\", \"Unselected\"])\n\n    def test_create_groups_table_set_values(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        values = (\"this\", \"that\", \"rest\")\n        table = create_groups_table(self.zoo, selection, values=values)\n        self.assertEqual(tuple(table.domain[\"Selected\"].values), values)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 13,
                                "end_lineno": 126,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "7c74e8a72032a42b2113d89d72d477974bd0dea2^",
    "new_commit_hash": "7c74e8a72032a42b2113d89d72d477974bd0dea2",
    "commit_message": "annotated_data.create_groups_table: Allow changing the default names of values",
    "commit_date": "2019-07-11T17:56:15+02:00",
    "metadata": {}
}
{
    "repo_name": "orange3",
    "new_commit_hash": "7c74e8a72032a42b2113d89d72d477974bd0dea2",
    "test_file_codes": [
        "import random\nimport unittest\n\nimport numpy as np\n\nfrom Orange.data import Table, Variable\nfrom Orange.data.filter import SameValue\nfrom Orange.widgets.utils.annotated_data import (\n    create_annotated_table, create_groups_table, ANNOTATED_DATA_FEATURE_NAME\n)\n\n\nclass TestAnnotatedData(unittest.TestCase):\n    def setUp(self):\n        Variable._clear_all_caches()  # pylint: disable=protected-access\n        random.seed(42)\n        self.zoo = Table(\"zoo\")\n\n    def test_create_annotated_table(self):\n        annotated = create_annotated_table(self.zoo, list(range(10)))\n\n        # check annotated table domain\n        self.assertEqual(annotated.domain.variables, self.zoo.domain.variables)\n        self.assertEqual(2, len(annotated.domain.metas))\n        self.assertIn(self.zoo.domain.metas[0], annotated.domain.metas)\n        self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                      [m.name for m in annotated.domain.metas])\n\n        # check annotated table data\n        np.testing.assert_array_equal(annotated.X, self.zoo.X)\n        np.testing.assert_array_equal(annotated.Y, self.zoo.Y)\n        np.testing.assert_array_equal(annotated.metas[:, 0].ravel(),\n                                      self.zoo.metas.ravel())\n        self.assertEqual(\n            10, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_selected(self):\n        # check annotated column for no selected indices\n        annotated = create_annotated_table(self.zoo, [])\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n        # check annotated column fol all selectes indices\n        annotated = create_annotated_table(self.zoo, list(range(len(self.zoo))))\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            len(self.zoo),\n            np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_create_annotated_table_none_data(self):\n        self.assertIsNone(create_annotated_table(None, None))\n\n    def test_create_annotated_table_none_indices(self):\n        annotated = create_annotated_table(self.zoo, None)\n        self.assertEqual(len(annotated), len(self.zoo))\n        self.assertEqual(\n            0, np.sum([i[ANNOTATED_DATA_FEATURE_NAME] for i in annotated]))\n\n    def test_cascade_annotated_tables(self):\n        # check cascade of annotated tables\n        data = self.zoo\n        data.domain.metas[0].name = ANNOTATED_DATA_FEATURE_NAME\n        for i in range(5):\n            data = create_annotated_table(\n                data, random.sample(range(0, len(self.zoo)), 20))\n            self.assertEqual(2 + i, len(data.domain.metas))\n            self.assertIn(self.zoo.domain.metas[0], data.domain.metas)\n            self.assertIn(ANNOTATED_DATA_FEATURE_NAME,\n                          [m.name for m in data.domain.metas])\n            for j in range(1, i + 2):\n                self.assertIn(\"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, j),\n                              [m.name for m in data.domain.metas])\n\n    def test_cascade_annotated_tables_with_missing_middle_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.attributes[0].name = ANNOTATED_DATA_FEATURE_NAME\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.attributes[0].name,\n                         ANNOTATED_DATA_FEATURE_NAME)\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_cascade_annotated_tables_with_missing_annotated_feature(self):\n        # check table for domain [..., \"Feature\", \"Selected (3)] ->\n        # [..., \"Feature\", \"Selected (3), \"Selected (4)\"]\n        data = self.zoo\n        data.domain.metas[0].name = \"{} ({})\".format(\n            ANNOTATED_DATA_FEATURE_NAME, 3)\n        data = create_annotated_table(\n            data, random.sample(range(0, len(self.zoo)), 20))\n        self.assertEqual(2, len(data.domain.metas))\n        self.assertEqual(data.domain.metas[0].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 3))\n        self.assertEqual(data.domain.metas[1].name,\n                         \"{} ({})\".format(ANNOTATED_DATA_FEATURE_NAME, 4))\n\n    def test_create_groups_table_include_unselected(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        table = create_groups_table(self.zoo, selection)\n        selvar = table.domain[\"Selected\"]\n        self.assertEqual(\n            len(SameValue(selvar, \"Unselected\")(table)),\n            len(self.zoo) - len(group_indices)\n        )\n        self.assertEqual(selvar.values, [\"G1\", \"G2\", \"Unselected\"])\n\n    def test_create_groups_table_set_values(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        values = (\"this\", \"that\", \"rest\")\n        table = create_groups_table(self.zoo, selection, values=values)\n        self.assertEqual(tuple(table.domain[\"Selected\"].values), values)\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "Starting Orange installation attempts...\nAttempting installation with Python 3.7...\nWarning: 'keywords' should be a list, got type 'tuple'\nWarning: 'classifiers' should be a list, got type 'tuple'\nWarning: 'keywords' should be a list, got type 'tuple'\nWarning: 'classifiers' should be a list, got type 'tuple'\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.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/tmptgb61e6i/tmp\ncreating /tmp/tmptgb61e6i/tmp/tmptgb61e6i\ncompile options: '-MMD -MF /tmp/tmptgb61e6i/file.c.d -c'\ncc: /tmp/tmptgb61e6i/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/tmpiq9gk9h8/tmp\ncreating /tmp/tmpiq9gk9h8/tmp/tmpiq9gk9h8\ncompile options: '-MMD -MF /tmp/tmpiq9gk9h8/file.c.d -c'\ncc: /tmp/tmpiq9gk9h8/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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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\nWarning: 'keywords' should be a list, got type 'tuple'\nWarning: 'classifiers' should be a list, got type 'tuple'\nWarning: 'keywords' should be a list, got type 'tuple'\nWarning: 'classifiers' should be a list, got type 'tuple'\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.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/tmp8h20by3x/tmp\ncreating /tmp/tmp8h20by3x/tmp/tmp8h20by3x\ncompile options: '-MMD -MF /tmp/tmp8h20by3x/file.c.d -c'\ncc: /tmp/tmp8h20by3x/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/tmpvujbmwuo/tmp\ncreating /tmp/tmpvujbmwuo/tmp/tmpvujbmwuo\ncompile options: '-MMD -MF /tmp/tmpvujbmwuo/file.c.d -c'\ncc: /tmp/tmpvujbmwuo/file.c\ncustomize UnixCCompiler using build_ext\nCreating /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/Orange3.egg-link (link to .)\nAdding Orange3 3.23.0.dev0+7c74e8a to easy-install.pth file\nInstalling orange-canvas script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nInstalled /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2\nProcessing dependencies for Orange3==3.23.0.dev0+7c74e8a\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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages\nSearching for scikit-learn==1.0.2\nBest match: scikit-learn 1.0.2\nAdding scikit-learn 1.0.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling pip3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling pip3.10 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages\nSearching for orange-widget-base==4.0.1\nBest match: orange-widget-base 4.0.1\nAdding orange-widget-base 4.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling f2py3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling f2py3.7 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages\nSearching for threadpoolctl==3.1.0\nBest match: threadpoolctl 3.1.0\nAdding threadpoolctl 3.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling pyftmerge script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling pyftsubset script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\nInstalling ttx script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages\nFinished processing dependencies for Orange3==3.23.0.dev0+7c74e8a\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 89ms\nPrepared 18 packages in 5ms\nInstalled 18 packages in 135ms\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 37 packages in 353ms\nInstalled 32 packages in 732ms\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 + 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 + more-itertools==9.1.0\n + networkx==2.6.3\n + opentsne==1.0.1\n + pandas==1.3.5\n + pip==24.0\n + pycparser==2.21\n + python-dateutil==2.9.0.post0\n + python-louvain==0.16\n + pytz==2024.2\n + requests==2.31.0\n + scikit-learn==1.0.2\n + scipy==1.7.3\n + secretstorage==3.3.3\n + serverfiles==0.3.1\n + six==1.17.0\n + threadpoolctl==3.1.0\n + urllib3==2.0.7\n + xlrd==2.0.1\n + xlsxwriter==3.2.0\nResolved 34 packages in 139ms\nInstalled 19 packages in 224ms\n + anyqt==0.2.0\n + attrs==24.2.0\n + cattrs==23.1.2\n + commonmark==0.9.1\n + cycler==0.11.0\n + dictdiffer==0.9.0\n + docutils==0.20.1\n + fonttools==4.38.0\n + kiwisolver==1.4.5\n + matplotlib==3.5.3\n + orange-canvas-core==0.1.35\n + orange-widget-base==4.0.1\n + pillow==9.5.0\n + platformdirs==4.0.0\n + pyparsing==3.1.4\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 29ms\n + psycopg2==2.9.9\n + pymssql==2.3.2\nAudited 1 package in 14ms\nAudited 2 packages in 2ms\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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/data/_contingency.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/distance/_distance.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/preprocess/_relieff.cpp:581:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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      |  ^~~~~~~\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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_7c74e8a72032a42b2113d89d72d477974bd0dea2/.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": 0,
    "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_7c74e8a72032a42b2113d89d72d477974bd0dea2\ncollected 9 items\n\nr2e_tests/test_1.py .........                                            [100%]\n\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_cascade_annotated_tables\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_cascade_annotated_tables_with_missing_annotated_feature\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_cascade_annotated_tables_with_missing_middle_feature\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table_none_data\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table_none_indices\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table_selected\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_groups_table_include_unselected\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_groups_table_set_values\n============================== 9 passed in 1.04s ===============================\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_7c74e8a72032a42b2113d89d72d477974bd0dea2\ncollected 9 items\n\nr2e_tests/test_1.py ........F                                            [100%]\n\n=================================== FAILURES ===================================\n____________ TestAnnotatedData.test_create_groups_table_set_values _____________\n\nself = <r2e_tests.test_1.TestAnnotatedData testMethod=test_create_groups_table_set_values>\n\n    def test_create_groups_table_set_values(self):\n        group_indices = random.sample(range(0, len(self.zoo)), 20)\n        selection = np.zeros(len(self.zoo), dtype=np.uint8)\n        selection[group_indices[:10]] = 1\n        selection[group_indices[10:]] = 2\n        values = (\"this\", \"that\", \"rest\")\n>       table = create_groups_table(self.zoo, selection, values=values)\nE       TypeError: create_groups_table() got an unexpected keyword argument 'values'\n\nr2e_tests/test_1.py:125: TypeError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_cascade_annotated_tables\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_cascade_annotated_tables_with_missing_annotated_feature\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_cascade_annotated_tables_with_missing_middle_feature\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table_none_data\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table_none_indices\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_annotated_table_selected\nPASSED r2e_tests/test_1.py::TestAnnotatedData::test_create_groups_table_include_unselected\nFAILED r2e_tests/test_1.py::TestAnnotatedData::test_create_groups_table_set_values\n========================= 1 failed, 8 passed in 1.37s ==========================\n",
    "old_commit_res_stderr": ""
}
Orange/widgets/utils/annotated_data.py Orange/widgets/utils/tests/test_annotated_data.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]

**Title:** TypeError When Passing 'values' Argument to `create_groups_table`

**Description:**
When attempting to customize group names by providing the `values` parameter to the `create_groups_table` function, a `TypeError` is raised. This prevents users from setting meaningful names for their groups, forcing them to rely on default naming conventions.

**Example Code:**
```python
import numpy as np
import random
from Orange.widgets.utils.annotated_data import create_groups_table, ANNOTATED_DATA_FEATURE_NAME
from Orange.data import Table

# Sample data setup
zoo = Table('zoo')
group_indices = random.sample(range(0, len(zoo)), 20)
selection = np.zeros(len(zoo), dtype=np.uint8)
selection[group_indices[:10]] = 1
selection[group_indices[10:]] = 2
values = ("this", "that", "rest")

# Attempt to create groups table with custom values
table = create_groups_table(zoo, selection, values=values)
```

**Expected Behavior:**
The `create_groups_table` function should accept the `values` parameter and use the provided tuple `("this", "that", "rest")` as the names for the groups in the resulting table.

**Actual Behavior:**
A `TypeError` is thrown:
```
TypeError: create_groups_table() got an unexpected keyword argument 'values'
```

This error prevents the customization of group names, limiting functionality for users who need descriptive group identifiers.

[/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/widgets/utils/annotated_data.py
import numpy as np
from Orange.data import Domain, DiscreteVariable
from Orange.data.util import get_unique_names

ANNOTATED_DATA_SIGNAL_NAME = "Data"
ANNOTATED_DATA_FEATURE_NAME = "Selected"


def add_columns(domain, attributes=(), class_vars=(), metas=()):
    """Construct a new domain with new columns added to the specified place

    Parameters
    ----------
    domain : Domain
        source domain
    attributes
        list of variables to append to attributes from source domain
    class_vars
        list of variables to append to class_vars from source domain
    metas
        list of variables to append to metas from source domain

    Returns
    -------
    Domain
    """
    attributes = domain.attributes + tuple(attributes)
    class_vars = domain.class_vars + tuple(class_vars)
    metas = domain.metas + tuple(metas)
    return Domain(attributes, class_vars, metas)


def _table_with_annotation_column(data, values, column_data, var_name):
    var = DiscreteVariable(get_unique_names(data.domain, var_name), values)
    class_vars, metas = data.domain.class_vars, data.domain.metas
    if not data.domain.class_vars:
        class_vars += (var, )
    else:
        metas += (var, )
    domain = Domain(data.domain.attributes, class_vars, metas)
    table = data.transform(domain)
    table[:, var] = column_data.reshape((len(data), 1))
    return table


def create_annotated_table(data, selected_indices):
    """
    Returns data with concatenated flag column. Flag column represents
    whether data instance has been selected (Yes) or not (No), which is
    determined in selected_indices parameter.

    :param data: Table
    :param selected_indices: list or ndarray
    :return: Table
    """
    if data is None:
        return None
    annotated = np.zeros((len(data), 1))
    if selected_indices is not None:
        annotated[selected_indices] = 1
    return _table_with_annotation_column(
        data, ("No", "Yes"), annotated, ANNOTATED_DATA_FEATURE_NAME)


def create_groups_table(data, selection,
                        include_unselected=True,
                        var_name=ANNOTATED_DATA_FEATURE_NAME):
    if data is None:
        return None
    max_sel = np.max(selection)
    values = ["G{}".format(i + 1) for i in range(max_sel)]
    if include_unselected:
        # Place Unselected instances in the "last group", so that the group
        # colors and scatter diagram marker colors will match
        values.append("Unselected")
        mask = (selection != 0)
        selection = selection.copy()
        selection[mask] = selection[mask] - 1
        selection[~mask] = selection[~mask] = max_sel
    else:
        mask = np.flatnonzero(selection)
        data = data[mask]
        selection = selection[mask] - 1
    return _table_with_annotation_column(data, values, selection, var_name)

```
--- 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]

**Title:** TypeError When Passing 'values' Argument to `create_groups_table`

**Description:**
When attempting to customize group names by providing the `values` parameter to the `create_groups_table` function, a `TypeError` is raised. This prevents users from setting meaningful names for their groups, forcing them to rely on default naming conventions.

**Example Code:**
```python
import numpy as np
import random
from Orange.widgets.utils.annotated_data import create_groups_table, ANNOTATED_DATA_FEATURE_NAME
from Orange.data import Table

# Sample data setup
zoo = Table('zoo')
group_indices = random.sample(range(0, len(zoo)), 20)
selection = np.zeros(len(zoo), dtype=np.uint8)
selection[group_indices[:10]] = 1
selection[group_indices[10:]] = 2
values = ("this", "that", "rest")

# Attempt to create groups table with custom values
table = create_groups_table(zoo, selection, values=values)
```

**Expected Behavior:**
The `create_groups_table` function should accept the `values` parameter and use the provided tuple `("this", "that", "rest")` as the names for the groups in the resulting table.

**Actual Behavior:**
A `TypeError` is thrown:
```
TypeError: create_groups_table() got an unexpected keyword argument 'values'
```

This error prevents the customization of group names, limiting functionality for users who need descriptive group identifiers.

[/ISSUE]
{
    "TestAnnotatedData.test_cascade_annotated_tables": "PASSED",
    "TestAnnotatedData.test_cascade_annotated_tables_with_missing_annotated_feature": "PASSED",
    "TestAnnotatedData.test_cascade_annotated_tables_with_missing_middle_feature": "PASSED",
    "TestAnnotatedData.test_create_annotated_table": "PASSED",
    "TestAnnotatedData.test_create_annotated_table_none_data": "PASSED",
    "TestAnnotatedData.test_create_annotated_table_none_indices": "PASSED",
    "TestAnnotatedData.test_create_annotated_table_selected": "PASSED",
    "TestAnnotatedData.test_create_groups_table_include_unselected": "PASSED",
    "TestAnnotatedData.test_create_groups_table_set_values": "PASSED"
}
diff --git a/Orange/widgets/utils/annotated_data.py b/Orange/widgets/utils/annotated_data.py
index 93f91bd27..fea91dae7 100644
--- a/Orange/widgets/utils/annotated_data.py
+++ b/Orange/widgets/utils/annotated_data.py
@@ -64,15 +64,18 @@ def create_annotated_table(data, selected_indices):
 
 def create_groups_table(data, selection,
                         include_unselected=True,
-                        var_name=ANNOTATED_DATA_FEATURE_NAME):
+                        var_name=ANNOTATED_DATA_FEATURE_NAME,
+                        values=None):
     if data is None:
         return None
     max_sel = np.max(selection)
-    values = ["G{}".format(i + 1) for i in range(max_sel)]
+    if values is None:
+        values = ["G{}".format(i + 1) for i in range(max_sel)]
+        if include_unselected:
+            values.append("Unselected")
     if include_unselected:
         # Place Unselected instances in the "last group", so that the group
         # colors and scatter diagram marker colors will match
-        values.append("Unselected")
         mask = (selection != 0)
         selection = selection.copy()
         selection[mask] = selection[mask] - 1

{"Orange/widgets/utils/annotated_data.py": "import numpy as np\nfrom Orange.data import Domain, DiscreteVariable\nfrom Orange.data.util import get_unique_names\n\nANNOTATED_DATA_SIGNAL_NAME = \"Data\"\nANNOTATED_DATA_FEATURE_NAME = \"Selected\"\n\n\ndef add_columns(domain, attributes=(), class_vars=(), metas=()):\n    \"\"\"Construct a new domain with new columns added to the specified place\n\n    Parameters\n    ----------\n    domain : Domain\n        source domain\n    attributes\n        list of variables to append to attributes from source domain\n    class_vars\n        list of variables to append to class_vars from source domain\n    metas\n        list of variables to append to metas from source domain\n\n    Returns\n    -------\n    Domain\n    \"\"\"\n    attributes = domain.attributes + tuple(attributes)\n    class_vars = domain.class_vars + tuple(class_vars)\n    metas = domain.metas + tuple(metas)\n    return Domain(attributes, class_vars, metas)\n\n\ndef _table_with_annotation_column(data, values, column_data, var_name):\n    var = DiscreteVariable(get_unique_names(data.domain, var_name), values)\n    class_vars, metas = data.domain.class_vars, data.domain.metas\n    if not data.domain.class_vars:\n        class_vars += (var, )\n    else:\n        metas += (var, )\n    domain = Domain(data.domain.attributes, class_vars, metas)\n    table = data.transform(domain)\n    table[:, var] = column_data.reshape((len(data), 1))\n    return table\n\n\ndef create_annotated_table(data, selected_indices):\n    \"\"\"\n    Returns data with concatenated flag column. Flag column represents\n    whether data instance has been selected (Yes) or not (No), which is\n    determined in selected_indices parameter.\n\n    :param data: Table\n    :param selected_indices: list or ndarray\n    :return: Table\n    \"\"\"\n    if data is None:\n        return None\n    annotated = np.zeros((len(data), 1))\n    if selected_indices is not None:\n        annotated[selected_indices] = 1\n    return _table_with_annotation_column(\n        data, (\"No\", \"Yes\"), annotated, ANNOTATED_DATA_FEATURE_NAME)\n\n\ndef create_groups_table(data, selection,\n                        include_unselected=True,\n                        var_name=ANNOTATED_DATA_FEATURE_NAME):\n    if data is None:\n        return None\n    max_sel = np.max(selection)\n    values = [\"G{}\".format(i + 1) for i in range(max_sel)]\n    if include_unselected:\n        # Place Unselected instances in the \"last group\", so that the group\n        # colors and scatter diagram marker colors will match\n        values.append(\"Unselected\")\n        mask = (selection != 0)\n        selection = selection.copy()\n        selection[mask] = selection[mask] - 1\n        selection[~mask] = selection[~mask] = max_sel\n    else:\n        mask = np.flatnonzero(selection)\n        data = data[mask]\n        selection = selection[mask] - 1\n    return _table_with_annotation_column(data, values, selection, var_name)\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]

**Title:** TypeError When Passing 'values' Argument to `create_groups_table`

**Description:**
When attempting to customize group names by providing the `values` parameter to the `create_groups_table` function, a `TypeError` is raised. This prevents users from setting meaningful names for their groups, forcing them to rely on default naming conventions.

**Example Code:**
```python
import numpy as np
import random
from Orange.widgets.utils.annotated_data import create_groups_table, ANNOTATED_DATA_FEATURE_NAME
from Orange.data import Table

# Sample data setup
zoo = Table('zoo')
group_indices = random.sample(range(0, len(zoo)), 20)
selection = np.zeros(len(zoo), dtype=np.uint8)
selection[group_indices[:10]] = 1
selection[group_indices[10:]] = 2
values = ("this", "that", "rest")

# Attempt to create groups table with custom values
table = create_groups_table(zoo, selection, values=values)
```

**Expected Behavior:**
The `create_groups_table` function should accept the `values` parameter and use the provided tuple `("this", "that", "rest")` as the names for the groups in the resulting table.

**Actual Behavior:**
A `TypeError` is thrown:
```
TypeError: create_groups_table() got an unexpected keyword argument 'values'
```

This error prevents the customization of group names, limiting functionality for users who need descriptive group identifiers.

[/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/widgets/utils/annotated_data.py
import numpy as np
from Orange.data import Domain, DiscreteVariable
from Orange.data.util import get_unique_names

ANNOTATED_DATA_SIGNAL_NAME = "Data"
ANNOTATED_DATA_FEATURE_NAME = "Selected"


def add_columns(domain, attributes=(), class_vars=(), metas=()):
    """Construct a new domain with new columns added to the specified place

    Parameters
    ----------
    domain : Domain
        source domain
    attributes
        list of variables to append to attributes from source domain
    class_vars
        list of variables to append to class_vars from source domain
    metas
        list of variables to append to metas from source domain

    Returns
    -------
    Domain
    """
    attributes = domain.attributes + tuple(attributes)
    class_vars = domain.class_vars + tuple(class_vars)
    metas = domain.metas + tuple(metas)
    return Domain(attributes, class_vars, metas)


def _table_with_annotation_column(data, values, column_data, var_name):
    var = DiscreteVariable(get_unique_names(data.domain, var_name), values)
    class_vars, metas = data.domain.class_vars, data.domain.metas
    if not data.domain.class_vars:
        class_vars += (var, )
    else:
        metas += (var, )
    domain = Domain(data.domain.attributes, class_vars, metas)
    table = data.transform(domain)
    table[:, var] = column_data.reshape((len(data), 1))
    return table


def create_annotated_table(data, selected_indices):
    """
    Returns data with concatenated flag column. Flag column represents
    whether data instance has been selected (Yes) or not (No), which is
    determined in selected_indices parameter.

    :param data: Table
    :param selected_indices: list or ndarray
    :return: Table
    """
    if data is None:
        return None
    annotated = np.zeros((len(data), 1))
    if selected_indices is not None:
        annotated[selected_indices] = 1
    return _table_with_annotation_column(
        data, ("No", "Yes"), annotated, ANNOTATED_DATA_FEATURE_NAME)


def create_groups_table(data, selection,
                        include_unselected=True,
                        var_name=ANNOTATED_DATA_FEATURE_NAME):
    if data is None:
        return None
    max_sel = np.max(selection)
    values = ["G{}".format(i + 1) for i in range(max_sel)]
    if include_unselected:
        # Place Unselected instances in the "last group", so that the group
        # colors and scatter diagram marker colors will match
        values.append("Unselected")
        mask = (selection != 0)
        selection = selection.copy()
        selection[mask] = selection[mask] - 1
        selection[~mask] = selection[~mask] = max_sel
    else:
        mask = np.flatnonzero(selection)
        data = data[mask]
        selection = selection[mask] - 1
    return _table_with_annotation_column(data, values, selection, var_name)

```
--- 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