{
    "file_diffs": [
        {
            "old_file_content": "from functools import reduce\n\nfrom AnyQt.QtCore import Qt\n\nimport Orange.data\nfrom Orange.util import Reprable\nfrom Orange.statistics import distribution\nfrom Orange.preprocess import Continuize, Normalize\nfrom Orange.preprocess.transformation import \\\n    Identity, Indicator, Indicator1, Normalizer\nfrom Orange.data.table import Table\nfrom Orange.widgets import gui, widget\nfrom Orange.widgets.settings import Setting\nfrom Orange.widgets.utils.sql import check_sql_input\nfrom Orange.widgets.utils.widgetpreview import WidgetPreview\nfrom Orange.widgets.widget import Input, Output\n\n\nclass OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.Outputs.data.send(None)\n        else:\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])\n\n\nclass WeightedIndicator(Indicator):\n    def __init__(self, variable, value, weight=1.0):\n        super().__init__(variable, value)\n        self.weight = weight\n\n    def transform(self, c):\n        t = super().transform(c) * self.weight\n        if self.weight != 1.0:\n            t *= self.weight\n        return t\n\n\nclass WeightedIndicator1(Indicator1):\n    def __init__(self, variable, value, weight=1.0):\n        super().__init__(variable, value)\n        self.weight = weight\n\n    def transform(self, c):\n        t = super().transform(c) * self.weight\n        if self.weight != 1.0:\n            t *= self.weight\n        return t\n\n\ndef make_indicator_var(source, value_ind, weight=None, zero_based=True):\n    if zero_based and weight is None:\n        indicator = Indicator(source, value=value_ind)\n    elif zero_based:\n        indicator = WeightedIndicator(source, value=value_ind, weight=weight)\n    elif weight is None:\n        indicator = Indicator1(source, value=value_ind)\n    else:\n        indicator = WeightedIndicator1(source, value=value_ind, weight=weight)\n    return Orange.data.ContinuousVariable(\n        \"{}={}\".format(source.name, source.values[value_ind]),\n        compute_value=indicator\n    )\n\n\ndef dummy_coding(var, base_value=0, zero_based=True):\n    N = len(var.values)\n    return [make_indicator_var(var, i, zero_based=zero_based)\n            for i in range(N) if i != base_value]\n\n\ndef one_hot_coding(var, zero_based=True):\n    N = len(var.values)\n    return [make_indicator_var(var, i, zero_based=zero_based)\n            for i in range(N)]\n\n\ndef continuize_domain(data_or_domain,\n                      multinomial_treatment=Continuize.Indicators,\n                      continuous_treatment=Continuize.Leave,\n                      class_treatment=Continuize.Leave,\n                      zero_based=True):\n\n    if isinstance(data_or_domain, Orange.data.Domain):\n        data, domain = None, data_or_domain\n    else:\n        data, domain = data_or_domain, data_or_domain.domain\n\n    def needs_dist(var, mtreat, ctreat):\n        \"Does the `var` need a distribution given specified flags\"\n        if var.is_discrete:\n            return mtreat == Continuize.FrequentAsBase\n        elif var.is_continuous:\n            return ctreat != Continuize.Leave\n        else:\n            raise ValueError\n\n    # Compute the column indices which need a distribution.\n    attr_needs_dist = [needs_dist(var, multinomial_treatment,\n                                  continuous_treatment)\n                       for var in domain.attributes]\n    cls_needs_dist = [needs_dist(var, class_treatment, Continuize.Leave)\n                      for var in domain.class_vars]\n\n    columns = [i for i, needs in enumerate(attr_needs_dist + cls_needs_dist)\n               if needs]\n\n    if columns:\n        if data is None:\n            raise TypeError(\"continuizer requires data\")\n        dist = distribution.get_distributions_for_columns(data, columns)\n    else:\n        dist = []\n\n    dist_iter = iter(dist)\n\n    newattrs = [continuize_var(var, next(dist_iter) if needs_dist else None,\n                               multinomial_treatment, continuous_treatment,\n                               zero_based)\n                for var, needs_dist in zip(domain.attributes, attr_needs_dist)]\n\n    newclass = [continuize_var(var,\n                               next(dist_iter) if needs_dist else None,\n                               class_treatment, Continuize.Remove,\n                               zero_based)\n                for var, needs_dist in zip(domain.class_vars, cls_needs_dist)]\n\n    newattrs = reduce(list.__iadd__, newattrs, [])\n    newclass = reduce(list.__iadd__, newclass, [])\n    return Orange.data.Domain(newattrs, newclass, domain.metas)\n\n\ndef continuize_var(var,\n                   data_or_dist=None,\n                   multinomial_treatment=Continuize.Indicators,\n                   continuous_treatment=Continuize.Leave,\n                   zero_based=True):\n\n    def continuize_continuous():\n        if continuous_treatment == Normalize.NormalizeBySpan:\n            return [normalize_by_span(var, data_or_dist, zero_based)]\n        elif continuous_treatment == Normalize.NormalizeBySD:\n            return [normalize_by_sd(var, data_or_dist)]\n        else:\n            return [var]\n\n    def continuize_discrete():\n        if len(var.values) > 2 and \\\n                multinomial_treatment == Continuize.ReportError:\n            raise ValueError(\"{0.name} is a multinomial variable\".format(var))\n        if len(var.values) < 2 or \\\n                multinomial_treatment == Continuize.Remove or \\\n                (multinomial_treatment == Continuize.RemoveMultinomial\n                 and len(var.values) > 2):\n            return []\n        elif multinomial_treatment == Continuize.AsOrdinal:\n            return [ordinal_to_continuous(var)]\n        elif multinomial_treatment == Continuize.AsNormalizedOrdinal:\n            return [ordinal_to_norm_continuous(var, zero_based)]\n        elif multinomial_treatment == Continuize.Indicators:\n            return one_hot_coding(var, zero_based)\n        elif multinomial_treatment in (\n                Continuize.FirstAsBase, Continuize.RemoveMultinomial):\n            return dummy_coding(var, zero_based=zero_based)\n        elif multinomial_treatment == Continuize.FrequentAsBase:\n            dist = _ensure_dist(var, data_or_dist)\n            modus = dist.modus()\n            return dummy_coding(var, base_value=modus, zero_based=zero_based)\n        elif multinomial_treatment == Continuize.Leave:\n            return [var]\n        raise ValueError(\"Invalid value of `multinomial_treatment`\")\n\n    if var.is_continuous:\n        return continuize_continuous()\n    elif var.is_discrete:\n        return continuize_discrete()\n    raise TypeError(\"Non-primitive variables cannot be continuized\")\n\n\ndef _ensure_dist(var, data_or_dist):\n    if isinstance(data_or_dist, distribution.Discrete):\n        if not var.is_discrete:\n            raise TypeError\n        return data_or_dist\n    elif isinstance(data_or_dist, distribution.Continuous):\n        if not var.is_continuous:\n            raise TypeError\n        return data_or_dist\n    elif isinstance(data_or_dist, Orange.data.Storage):\n        return distribution.get_distribution(data_or_dist, var)\n    else:\n        raise ValueError(\"Need a distribution or data.\")\n\n\ndef normalized_var(var, translate, scale):\n    return Orange.data.ContinuousVariable(var.name,\n                                          compute_value=Normalizer(var, translate, scale))\n\n\ndef ordinal_to_continuous(var):\n    return Orange.data.ContinuousVariable(var.name,\n                                          compute_value=Identity(var))\n\n\ndef ordinal_to_norm_continuous(var, zero_based=True):\n    n_values = len(var.values)\n    if zero_based:\n        return normalized_var(var, 0, 1 / (n_values - 1))\n    else:\n        return normalized_var(var, (n_values - 1) / 2, 2 / (n_values - 1))\n\n\ndef normalize_by_span(var, data_or_dist, zero_based=True):\n    dist = _ensure_dist(var, data_or_dist)\n    if dist.shape[1] > 0:\n        v_max, v_min = dist.max(), dist.min()\n    else:\n        v_max, v_min = 0, 0\n    span = (v_max - v_min)\n    if span < 1e-15:\n        span = 1\n\n    if zero_based:\n        return normalized_var(var, v_min, 1 / span)\n    else:\n        return normalized_var(var, (v_min + v_max) / 2, 2 / span)\n\n\ndef normalize_by_sd(var, data_or_dist):\n    dist = _ensure_dist(var, data_or_dist)\n    if dist.shape[1] > 0:\n        mean, sd = dist.mean(), dist.standard_deviation()\n    else:\n        mean, sd = 0, 1\n    sd = sd if sd > 1e-10 else 1\n    return normalized_var(var, mean, 1 / sd)\n\n\nclass DomainContinuizer(Reprable):\n    def __init__(self, zero_based=True,\n                 multinomial_treatment=Continuize.Indicators,\n                 continuous_treatment=Continuize.Leave,\n                 class_treatment=Continuize.Leave):\n        self.zero_based = zero_based\n        self.multinomial_treatment = multinomial_treatment\n        self.continuous_treatment = continuous_treatment\n        self.class_treatment = class_treatment\n\n    def __call__(self, data):\n        treat = self.multinomial_treatment\n        if isinstance(data, Orange.data.Domain):\n            domain, data = data, None\n        else:\n            domain = data.domain\n\n        if (treat == Continuize.ReportError and\n                any(var.is_discrete and len(var.values) > 2 for var in domain)):\n            raise ValueError(\"Domain has multinomial attributes\")\n\n        newdomain = continuize_domain(\n            data or domain,\n            self.multinomial_treatment,\n            self.continuous_treatment,\n            self.class_treatment,\n            self.zero_based\n        )\n        return newdomain\n\n\nif __name__ == \"__main__\":  # pragma: no cover\n    WidgetPreview(OWContinuize).run(Table(\"lenses\"))\n",
            "new_file_content": "from functools import reduce\n\nfrom AnyQt.QtCore import Qt\n\nimport Orange.data\nfrom Orange.util import Reprable\nfrom Orange.statistics import distribution\nfrom Orange.preprocess import Continuize, Normalize\nfrom Orange.preprocess.transformation import \\\n    Identity, Indicator, Indicator1, Normalizer\nfrom Orange.data.table import Table\nfrom Orange.widgets import gui, widget\nfrom Orange.widgets.settings import Setting\nfrom Orange.widgets.utils.sql import check_sql_input\nfrom Orange.widgets.utils.widgetpreview import WidgetPreview\nfrom Orange.widgets.widget import Input, Output\n\n\nclass OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])\n\n\nclass WeightedIndicator(Indicator):\n    def __init__(self, variable, value, weight=1.0):\n        super().__init__(variable, value)\n        self.weight = weight\n\n    def transform(self, c):\n        t = super().transform(c) * self.weight\n        if self.weight != 1.0:\n            t *= self.weight\n        return t\n\n\nclass WeightedIndicator1(Indicator1):\n    def __init__(self, variable, value, weight=1.0):\n        super().__init__(variable, value)\n        self.weight = weight\n\n    def transform(self, c):\n        t = super().transform(c) * self.weight\n        if self.weight != 1.0:\n            t *= self.weight\n        return t\n\n\ndef make_indicator_var(source, value_ind, weight=None, zero_based=True):\n    if zero_based and weight is None:\n        indicator = Indicator(source, value=value_ind)\n    elif zero_based:\n        indicator = WeightedIndicator(source, value=value_ind, weight=weight)\n    elif weight is None:\n        indicator = Indicator1(source, value=value_ind)\n    else:\n        indicator = WeightedIndicator1(source, value=value_ind, weight=weight)\n    return Orange.data.ContinuousVariable(\n        \"{}={}\".format(source.name, source.values[value_ind]),\n        compute_value=indicator\n    )\n\n\ndef dummy_coding(var, base_value=0, zero_based=True):\n    N = len(var.values)\n    return [make_indicator_var(var, i, zero_based=zero_based)\n            for i in range(N) if i != base_value]\n\n\ndef one_hot_coding(var, zero_based=True):\n    N = len(var.values)\n    return [make_indicator_var(var, i, zero_based=zero_based)\n            for i in range(N)]\n\n\ndef continuize_domain(data_or_domain,\n                      multinomial_treatment=Continuize.Indicators,\n                      continuous_treatment=Continuize.Leave,\n                      class_treatment=Continuize.Leave,\n                      zero_based=True):\n\n    if isinstance(data_or_domain, Orange.data.Domain):\n        data, domain = None, data_or_domain\n    else:\n        data, domain = data_or_domain, data_or_domain.domain\n\n    def needs_dist(var, mtreat, ctreat):\n        \"Does the `var` need a distribution given specified flags\"\n        if var.is_discrete:\n            return mtreat == Continuize.FrequentAsBase\n        elif var.is_continuous:\n            return ctreat != Continuize.Leave\n        else:\n            raise ValueError\n\n    # Compute the column indices which need a distribution.\n    attr_needs_dist = [needs_dist(var, multinomial_treatment,\n                                  continuous_treatment)\n                       for var in domain.attributes]\n    cls_needs_dist = [needs_dist(var, class_treatment, Continuize.Leave)\n                      for var in domain.class_vars]\n\n    columns = [i for i, needs in enumerate(attr_needs_dist + cls_needs_dist)\n               if needs]\n\n    if columns:\n        if data is None:\n            raise TypeError(\"continuizer requires data\")\n        dist = distribution.get_distributions_for_columns(data, columns)\n    else:\n        dist = []\n\n    dist_iter = iter(dist)\n\n    newattrs = [continuize_var(var, next(dist_iter) if needs_dist else None,\n                               multinomial_treatment, continuous_treatment,\n                               zero_based)\n                for var, needs_dist in zip(domain.attributes, attr_needs_dist)]\n\n    newclass = [continuize_var(var,\n                               next(dist_iter) if needs_dist else None,\n                               class_treatment, Continuize.Remove,\n                               zero_based)\n                for var, needs_dist in zip(domain.class_vars, cls_needs_dist)]\n\n    newattrs = reduce(list.__iadd__, newattrs, [])\n    newclass = reduce(list.__iadd__, newclass, [])\n    return Orange.data.Domain(newattrs, newclass, domain.metas)\n\n\ndef continuize_var(var,\n                   data_or_dist=None,\n                   multinomial_treatment=Continuize.Indicators,\n                   continuous_treatment=Continuize.Leave,\n                   zero_based=True):\n\n    def continuize_continuous():\n        if continuous_treatment == Normalize.NormalizeBySpan:\n            return [normalize_by_span(var, data_or_dist, zero_based)]\n        elif continuous_treatment == Normalize.NormalizeBySD:\n            return [normalize_by_sd(var, data_or_dist)]\n        else:\n            return [var]\n\n    def continuize_discrete():\n        if len(var.values) > 2 and \\\n                multinomial_treatment == Continuize.ReportError:\n            raise ValueError(\"{0.name} is a multinomial variable\".format(var))\n        if len(var.values) < 2 or \\\n                multinomial_treatment == Continuize.Remove or \\\n                (multinomial_treatment == Continuize.RemoveMultinomial\n                 and len(var.values) > 2):\n            return []\n        elif multinomial_treatment == Continuize.AsOrdinal:\n            return [ordinal_to_continuous(var)]\n        elif multinomial_treatment == Continuize.AsNormalizedOrdinal:\n            return [ordinal_to_norm_continuous(var, zero_based)]\n        elif multinomial_treatment == Continuize.Indicators:\n            return one_hot_coding(var, zero_based)\n        elif multinomial_treatment in (\n                Continuize.FirstAsBase, Continuize.RemoveMultinomial):\n            return dummy_coding(var, zero_based=zero_based)\n        elif multinomial_treatment == Continuize.FrequentAsBase:\n            dist = _ensure_dist(var, data_or_dist)\n            modus = dist.modus()\n            return dummy_coding(var, base_value=modus, zero_based=zero_based)\n        elif multinomial_treatment == Continuize.Leave:\n            return [var]\n        raise ValueError(\"Invalid value of `multinomial_treatment`\")\n\n    if var.is_continuous:\n        return continuize_continuous()\n    elif var.is_discrete:\n        return continuize_discrete()\n    raise TypeError(\"Non-primitive variables cannot be continuized\")\n\n\ndef _ensure_dist(var, data_or_dist):\n    if isinstance(data_or_dist, distribution.Discrete):\n        if not var.is_discrete:\n            raise TypeError\n        return data_or_dist\n    elif isinstance(data_or_dist, distribution.Continuous):\n        if not var.is_continuous:\n            raise TypeError\n        return data_or_dist\n    elif isinstance(data_or_dist, Orange.data.Storage):\n        return distribution.get_distribution(data_or_dist, var)\n    else:\n        raise ValueError(\"Need a distribution or data.\")\n\n\ndef normalized_var(var, translate, scale):\n    return Orange.data.ContinuousVariable(var.name,\n                                          compute_value=Normalizer(var, translate, scale))\n\n\ndef ordinal_to_continuous(var):\n    return Orange.data.ContinuousVariable(var.name,\n                                          compute_value=Identity(var))\n\n\ndef ordinal_to_norm_continuous(var, zero_based=True):\n    n_values = len(var.values)\n    if zero_based:\n        return normalized_var(var, 0, 1 / (n_values - 1))\n    else:\n        return normalized_var(var, (n_values - 1) / 2, 2 / (n_values - 1))\n\n\ndef normalize_by_span(var, data_or_dist, zero_based=True):\n    dist = _ensure_dist(var, data_or_dist)\n    if dist.shape[1] > 0:\n        v_max, v_min = dist.max(), dist.min()\n    else:\n        v_max, v_min = 0, 0\n    span = (v_max - v_min)\n    if span < 1e-15:\n        span = 1\n\n    if zero_based:\n        return normalized_var(var, v_min, 1 / span)\n    else:\n        return normalized_var(var, (v_min + v_max) / 2, 2 / span)\n\n\ndef normalize_by_sd(var, data_or_dist):\n    dist = _ensure_dist(var, data_or_dist)\n    if dist.shape[1] > 0:\n        mean, sd = dist.mean(), dist.standard_deviation()\n    else:\n        mean, sd = 0, 1\n    sd = sd if sd > 1e-10 else 1\n    return normalized_var(var, mean, 1 / sd)\n\n\nclass DomainContinuizer(Reprable):\n    def __init__(self, zero_based=True,\n                 multinomial_treatment=Continuize.Indicators,\n                 continuous_treatment=Continuize.Leave,\n                 class_treatment=Continuize.Leave):\n        self.zero_based = zero_based\n        self.multinomial_treatment = multinomial_treatment\n        self.continuous_treatment = continuous_treatment\n        self.class_treatment = class_treatment\n\n    def __call__(self, data):\n        treat = self.multinomial_treatment\n        if isinstance(data, Orange.data.Domain):\n            domain, data = data, None\n        else:\n            domain = data.domain\n\n        if (treat == Continuize.ReportError and\n                any(var.is_discrete and len(var.values) > 2 for var in domain)):\n            raise ValueError(\"Domain has multinomial attributes\")\n\n        newdomain = continuize_domain(\n            data or domain,\n            self.multinomial_treatment,\n            self.continuous_treatment,\n            self.class_treatment,\n            self.zero_based\n        )\n        return newdomain\n\n\nif __name__ == \"__main__\":  # pragma: no cover\n    WidgetPreview(OWContinuize).run(Table(\"iris\"))\n",
            "header": {
                "file": {
                    "path": "Orange/widgets/data/owcontinuize.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "c054daab2",
                "new_commit_hash": "3c52148af",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/widgets/data/owcontinuize.py"
            },
            "plus_file": {
                "path": "b/Orange/widgets/data/owcontinuize.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 97,
                            "length": 6
                        },
                        "new_range": {
                            "start": 97,
                            "length": 8
                        },
                        "section": "class OWContinuize(widget.OWWidget):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        self.data = None",
                                "type": "context"
                            },
                            {
                                "content": "        self.info.set_input_summary(self.info.NoInput)",
                                "type": "added"
                            },
                            {
                                "content": "        self.info.set_output_summary(self.info.NoOutput)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def settings_changed(self):",
                                "type": "context"
                            },
                            {
                                "content": "        self.commit()",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "class",
                            "name": "OWContinuize",
                            "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 19,
                            "end_lineno": 154,
                            "parent": null
                        },
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "method",
                            "name": "OWContinuize.__init__",
                            "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 69,
                            "end_lineno": 101,
                            "parent": {
                                "file_name": "Orange/widgets/data/owcontinuize.py",
                                "type": "class",
                                "name": "OWContinuize",
                                "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 19,
                                "end_lineno": 154,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 106,
                            "length": 8
                        },
                        "new_range": {
                            "start": 108,
                            "length": 11
                        },
                        "section": "class OWContinuize(widget.OWWidget):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "    def setData(self, data):",
                                "type": "context"
                            },
                            {
                                "content": "        self.data = data",
                                "type": "context"
                            },
                            {
                                "content": "        if data is None:",
                                "type": "context"
                            },
                            {
                                "content": "            self.info.set_input_summary(self.info.NoInput)",
                                "type": "added"
                            },
                            {
                                "content": "            self.info.set_output_summary(self.info.NoOutput)",
                                "type": "added"
                            },
                            {
                                "content": "            self.Outputs.data.send(None)",
                                "type": "context"
                            },
                            {
                                "content": "        else:",
                                "type": "context"
                            },
                            {
                                "content": "            self.info.set_input_summary(len(data))",
                                "type": "added"
                            },
                            {
                                "content": "            self.unconditional_commit()",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def constructContinuizer(self):",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "class",
                            "name": "OWContinuize",
                            "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 19,
                            "end_lineno": 154,
                            "parent": null
                        },
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "method",
                            "name": "OWContinuize.setData",
                            "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 108,
                            "end_lineno": 116,
                            "parent": {
                                "file_name": "Orange/widgets/data/owcontinuize.py",
                                "type": "class",
                                "name": "OWContinuize",
                                "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 19,
                                "end_lineno": 154,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 133,
                            "length": 9
                        },
                        "new_range": {
                            "start": 138,
                            "length": 11
                        },
                        "section": "class OWContinuize(widget.OWWidget):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "            domain = continuizer(self.data)",
                                "type": "context"
                            },
                            {
                                "content": "            data = self.data.transform(domain)",
                                "type": "context"
                            },
                            {
                                "content": "            self.Outputs.data.send(data)",
                                "type": "context"
                            },
                            {
                                "content": "            self.info.set_output_summary(len(data))",
                                "type": "added"
                            },
                            {
                                "content": "        else:",
                                "type": "context"
                            },
                            {
                                "content": "            self.Outputs.data.send(self.data)  # None or empty data",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def send_report(self):",
                                "type": "context"
                            },
                            {
                                "content": "        self.report_items(",
                                "type": "context"
                            },
                            {
                                "content": "            \"Settings\",",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "class",
                            "name": "OWContinuize",
                            "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 19,
                            "end_lineno": 154,
                            "parent": null
                        },
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "method",
                            "name": "OWContinuize.commit",
                            "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 135,
                            "end_lineno": 143,
                            "parent": {
                                "file_name": "Orange/widgets/data/owcontinuize.py",
                                "type": "class",
                                "name": "OWContinuize",
                                "content": "class OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n        self.info.set_input_summary(self.info.NoInput)\n        self.info.set_output_summary(self.info.NoOutput)\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.info.set_input_summary(self.info.NoInput)\n            self.info.set_output_summary(self.info.NoOutput)\n            self.Outputs.data.send(None)\n        else:\n            self.info.set_input_summary(len(data))\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n            self.info.set_output_summary(len(data))\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 19,
                                "end_lineno": 154,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 391,
                            "length": 4
                        },
                        "new_range": {
                            "start": 398,
                            "length": 4
                        },
                        "section": "class DomainContinuizer(Reprable):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "if __name__ == \"__main__\":  # pragma: no cover",
                                "type": "context"
                            },
                            {
                                "content": "    WidgetPreview(OWContinuize).run(Table(\"lenses\"))",
                                "type": "deleted"
                            },
                            {
                                "content": "    WidgetPreview(OWContinuize).run(Table(\"iris\"))",
                                "type": "added"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "statement",
                            "name": "",
                            "content": "if __name__ == \"__main__\":  # pragma: no cover\n    WidgetPreview(OWContinuize).run(Table(\"iris\"))",
                            "ast_type_str": "If",
                            "start_lineno": 400,
                            "end_lineno": 401,
                            "parent": null
                        }
                    ],
                    "deleted_entities": [
                        {
                            "file_name": "Orange/widgets/data/owcontinuize.py",
                            "type": "statement",
                            "name": "",
                            "content": "if __name__ == \"__main__\":  # pragma: no cover\n    WidgetPreview(OWContinuize).run(Table(\"lenses\"))",
                            "ast_type_str": "If",
                            "start_lineno": 393,
                            "end_lineno": 394,
                            "parent": null
                        }
                    ]
                }
            ]
        },
        {
            "old_file_content": "# Test methods with long descriptive names can omit docstrings\n# pylint: disable=missing-docstring\nimport unittest\n\nimport numpy as np\n\nfrom Orange.data import Table, DiscreteVariable\nfrom Orange.preprocess import transformation\nfrom Orange.widgets.data import owcontinuize\nfrom Orange.widgets.data.owcontinuize import OWContinuize\nfrom Orange.widgets.tests.base import WidgetTest\n\n\nclass TestOWContinuize(WidgetTest):\n    def setUp(self):\n        self.widget = self.create_widget(OWContinuize)\n\n    def test_empty_data(self):\n        \"\"\"No crash on empty data\"\"\"\n        data = Table(\"iris\")\n        widget = self.widget\n        widget.multinomial_treatment = 1\n\n        self.send_signal(self.widget.Inputs.data, data)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        np.testing.assert_equal(imp_data.X, data.X)\n        np.testing.assert_equal(imp_data.Y, data.Y)\n\n        widget.continuous_treatment = 1\n        self.send_signal(self.widget.Inputs.data,\n                         Table.from_domain(data.domain))\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertEqual(len(imp_data), 0)\n\n        self.send_signal(self.widget.Inputs.data, None)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertIsNone(imp_data)\n\n    def test_one_column_equal_values(self):\n        \"\"\"\n        No crash on a column with equal values and with selected option\n        normalize by standard deviation.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table = table[:, 1]\n        table[:] = 42.0\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n\n    def test_one_column_nan_values_normalize_sd(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by standard deviation (Not the same issue which is\n        tested above).\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\n    def test_one_column_nan_values_normalize_span(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by span.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySpan\n        self.widget.continuous_treatment = 1\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\nclass TestOWContinuizeUtils(unittest.TestCase):\n    def test_dummy_coding_zero_based(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        varb, varc = owcontinuize.dummy_coding(var)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertIs(varb.compute_value.variable, var)\n\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n        self.assertIs(varc.compute_value.variable, var)\n\n        varb, varc = owcontinuize.dummy_coding(var, zero_based=False)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator1)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertIs(varb.compute_value.variable, var)\n\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator1)\n        self.assertEqual(varc.compute_value.value, 2)\n        self.assertIs(varb.compute_value.variable, var)\n\n    def test_dummy_coding_base_value(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        varb, varc = owcontinuize.dummy_coding(var, base_value=0)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n\n        varb, varc = owcontinuize.dummy_coding(var, base_value=1)\n\n        self.assertEqual(varb.name, \"foo=a\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 0)\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n\n    def test_one_hot_coding(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        vars = owcontinuize.one_hot_coding(var)\n        for i, (c, nvar) in enumerate(zip(\"abc\", vars)):\n            self.assertEqual(nvar.name, f\"foo={c}\")\n            self.assertIsInstance(nvar.compute_value, transformation.Indicator)\n            self.assertEqual(nvar.compute_value.value, i)\n            self.assertIs(nvar.compute_value.variable, var)\n\n        vars = owcontinuize.one_hot_coding(var, zero_based=False)\n        for i, (c, nvar) in enumerate(zip(\"abc\", vars)):\n            self.assertEqual(nvar.name, f\"foo={c}\")\n            self.assertIsInstance(nvar.compute_value, transformation.Indicator1)\n            self.assertEqual(nvar.compute_value.value, i)\n            self.assertIs(nvar.compute_value.variable, var)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n",
            "new_file_content": "# Test methods with long descriptive names can omit docstrings\n# pylint: disable=missing-docstring,unsubscriptable-object\nimport unittest\nfrom unittest.mock import Mock\n\nimport numpy as np\n\nfrom Orange.data import Table, DiscreteVariable\nfrom Orange.preprocess import transformation\nfrom Orange.widgets.data import owcontinuize\nfrom Orange.widgets.data.owcontinuize import OWContinuize\nfrom Orange.widgets.tests.base import WidgetTest\nfrom orangewidget.widget import StateInfo\n\n\nclass TestOWContinuize(WidgetTest):\n    def setUp(self):\n        self.widget = self.create_widget(OWContinuize)\n\n    def test_empty_data(self):\n        \"\"\"No crash on empty data\"\"\"\n        data = Table(\"iris\")\n        widget = self.widget\n        widget.multinomial_treatment = 1\n\n        self.send_signal(self.widget.Inputs.data, data)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        np.testing.assert_equal(imp_data.X, data.X)\n        np.testing.assert_equal(imp_data.Y, data.Y)\n\n        widget.continuous_treatment = 1\n        self.send_signal(self.widget.Inputs.data,\n                         Table.from_domain(data.domain))\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertEqual(len(imp_data), 0)\n\n        self.send_signal(self.widget.Inputs.data, None)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertIsNone(imp_data)\n\n    def test_summary(self):\n        \"\"\"Check if status bar is updated when data is received\"\"\"\n        data = Table(\"iris\")\n        input_sum = self.widget.info.set_input_summary = Mock()\n        output_sum = self.widget.info.set_output_summary = Mock()\n\n        self.send_signal(self.widget.Inputs.data, data)\n        input_sum.assert_called_with(int(StateInfo.format_number(len(data))))\n        output = self.get_output(self.widget.Outputs.data)\n        output_sum.assert_called_with(int(StateInfo.format_number(len(output))))\n\n        input_sum.reset_mock()\n        output_sum.reset_mock()\n        self.send_signal(self.widget.Inputs.data, None)\n        input_sum.assert_called_once()\n        self.assertEqual(input_sum.call_args[0][0].brief, \"\")\n        output_sum.assert_called_once()\n        self.assertEqual(output_sum.call_args[0][0].brief, \"\")\n\n    def test_one_column_equal_values(self):\n        \"\"\"\n        No crash on a column with equal values and with selected option\n        normalize by standard deviation.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table = table[:, 1]\n        table[:] = 42.0\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n\n    def test_one_column_nan_values_normalize_sd(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by standard deviation (Not the same issue which is\n        tested above).\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\n    def test_one_column_nan_values_normalize_span(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by span.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySpan\n        self.widget.continuous_treatment = 1\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\nclass TestOWContinuizeUtils(unittest.TestCase):\n    def test_dummy_coding_zero_based(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        varb, varc = owcontinuize.dummy_coding(var)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertIs(varb.compute_value.variable, var)\n\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n        self.assertIs(varc.compute_value.variable, var)\n\n        varb, varc = owcontinuize.dummy_coding(var, zero_based=False)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator1)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertIs(varb.compute_value.variable, var)\n\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator1)\n        self.assertEqual(varc.compute_value.value, 2)\n        self.assertIs(varb.compute_value.variable, var)\n\n    def test_dummy_coding_base_value(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        varb, varc = owcontinuize.dummy_coding(var, base_value=0)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n\n        varb, varc = owcontinuize.dummy_coding(var, base_value=1)\n\n        self.assertEqual(varb.name, \"foo=a\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 0)\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n\n    def test_one_hot_coding(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        vars = owcontinuize.one_hot_coding(var)\n        for i, (c, nvar) in enumerate(zip(\"abc\", vars)):\n            self.assertEqual(nvar.name, f\"foo={c}\")\n            self.assertIsInstance(nvar.compute_value, transformation.Indicator)\n            self.assertEqual(nvar.compute_value.value, i)\n            self.assertIs(nvar.compute_value.variable, var)\n\n        vars = owcontinuize.one_hot_coding(var, zero_based=False)\n        for i, (c, nvar) in enumerate(zip(\"abc\", vars)):\n            self.assertEqual(nvar.name, f\"foo={c}\")\n            self.assertIsInstance(nvar.compute_value, transformation.Indicator1)\n            self.assertEqual(nvar.compute_value.value, i)\n            self.assertIs(nvar.compute_value.variable, var)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n",
            "header": {
                "file": {
                    "path": "Orange/widgets/data/tests/test_owcontinuize.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "ccac541d8",
                "new_commit_hash": "b7cb8a929",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/widgets/data/tests/test_owcontinuize.py"
            },
            "plus_file": {
                "path": "b/Orange/widgets/data/tests/test_owcontinuize.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1,
                            "length": 7
                        },
                        "section": ""
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "# Test methods with long descriptive names can omit docstrings",
                                "type": "context"
                            },
                            {
                                "content": "# pylint: disable=missing-docstring",
                                "type": "deleted"
                            },
                            {
                                "content": "# pylint: disable=missing-docstring,unsubscriptable-object",
                                "type": "added"
                            },
                            {
                                "content": "import unittest",
                                "type": "context"
                            },
                            {
                                "content": "from unittest.mock import Mock",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "import numpy as np",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [
                        {
                            "file_name": "Orange/widgets/data/tests/test_owcontinuize.py",
                            "type": "statement",
                            "name": "",
                            "content": "from unittest.mock import Mock",
                            "ast_type_str": "ImportFrom",
                            "start_lineno": 4,
                            "end_lineno": 4,
                            "parent": null
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 9,
                            "length": 6
                        },
                        "new_range": {
                            "start": 10,
                            "length": 7
                        },
                        "section": "from Orange.preprocess import transformation"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "from Orange.widgets.data import owcontinuize",
                                "type": "context"
                            },
                            {
                                "content": "from Orange.widgets.data.owcontinuize import OWContinuize",
                                "type": "context"
                            },
                            {
                                "content": "from Orange.widgets.tests.base import WidgetTest",
                                "type": "context"
                            },
                            {
                                "content": "from orangewidget.widget import StateInfo",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "class TestOWContinuize(WidgetTest):",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [
                        {
                            "file_name": "Orange/widgets/data/tests/test_owcontinuize.py",
                            "type": "statement",
                            "name": "",
                            "content": "from orangewidget.widget import StateInfo",
                            "ast_type_str": "ImportFrom",
                            "start_lineno": 13,
                            "end_lineno": 13,
                            "parent": null
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 39,
                            "length": 6
                        },
                        "new_range": {
                            "start": 41,
                            "length": 25
                        },
                        "section": "class TestOWContinuize(WidgetTest):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        imp_data = self.get_output(self.widget.Outputs.data)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertIsNone(imp_data)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_summary(self):",
                                "type": "added"
                            },
                            {
                                "content": "        \"\"\"Check if status bar is updated when data is received\"\"\"",
                                "type": "added"
                            },
                            {
                                "content": "        data = Table(\"iris\")",
                                "type": "added"
                            },
                            {
                                "content": "        input_sum = self.widget.info.set_input_summary = Mock()",
                                "type": "added"
                            },
                            {
                                "content": "        output_sum = self.widget.info.set_output_summary = Mock()",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        self.send_signal(self.widget.Inputs.data, data)",
                                "type": "added"
                            },
                            {
                                "content": "        input_sum.assert_called_with(int(StateInfo.format_number(len(data))))",
                                "type": "added"
                            },
                            {
                                "content": "        output = self.get_output(self.widget.Outputs.data)",
                                "type": "added"
                            },
                            {
                                "content": "        output_sum.assert_called_with(int(StateInfo.format_number(len(output))))",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        input_sum.reset_mock()",
                                "type": "added"
                            },
                            {
                                "content": "        output_sum.reset_mock()",
                                "type": "added"
                            },
                            {
                                "content": "        self.send_signal(self.widget.Inputs.data, None)",
                                "type": "added"
                            },
                            {
                                "content": "        input_sum.assert_called_once()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(input_sum.call_args[0][0].brief, \"\")",
                                "type": "added"
                            },
                            {
                                "content": "        output_sum.assert_called_once()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(output_sum.call_args[0][0].brief, \"\")",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_one_column_equal_values(self):",
                                "type": "context"
                            },
                            {
                                "content": "        \"\"\"",
                                "type": "context"
                            },
                            {
                                "content": "        No crash on a column with equal values and with selected option",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/data/tests/test_owcontinuize.py",
                            "type": "class",
                            "name": "TestOWContinuize",
                            "content": "class TestOWContinuize(WidgetTest):\n    def setUp(self):\n        self.widget = self.create_widget(OWContinuize)\n\n    def test_empty_data(self):\n        \"\"\"No crash on empty data\"\"\"\n        data = Table(\"iris\")\n        widget = self.widget\n        widget.multinomial_treatment = 1\n\n        self.send_signal(self.widget.Inputs.data, data)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        np.testing.assert_equal(imp_data.X, data.X)\n        np.testing.assert_equal(imp_data.Y, data.Y)\n\n        widget.continuous_treatment = 1\n        self.send_signal(self.widget.Inputs.data,\n                         Table.from_domain(data.domain))\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertEqual(len(imp_data), 0)\n\n        self.send_signal(self.widget.Inputs.data, None)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertIsNone(imp_data)\n\n    def test_summary(self):\n        \"\"\"Check if status bar is updated when data is received\"\"\"\n        data = Table(\"iris\")\n        input_sum = self.widget.info.set_input_summary = Mock()\n        output_sum = self.widget.info.set_output_summary = Mock()\n\n        self.send_signal(self.widget.Inputs.data, data)\n        input_sum.assert_called_with(int(StateInfo.format_number(len(data))))\n        output = self.get_output(self.widget.Outputs.data)\n        output_sum.assert_called_with(int(StateInfo.format_number(len(output))))\n\n        input_sum.reset_mock()\n        output_sum.reset_mock()\n        self.send_signal(self.widget.Inputs.data, None)\n        input_sum.assert_called_once()\n        self.assertEqual(input_sum.call_args[0][0].brief, \"\")\n        output_sum.assert_called_once()\n        self.assertEqual(output_sum.call_args[0][0].brief, \"\")\n\n    def test_one_column_equal_values(self):\n        \"\"\"\n        No crash on a column with equal values and with selected option\n        normalize by standard deviation.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table = table[:, 1]\n        table[:] = 42.0\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n\n    def test_one_column_nan_values_normalize_sd(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by standard deviation (Not the same issue which is\n        tested above).\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\n    def test_one_column_nan_values_normalize_span(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by span.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySpan\n        self.widget.continuous_treatment = 1\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 16,
                            "end_lineno": 111,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "Orange/widgets/data/tests/test_owcontinuize.py",
                            "type": "method",
                            "name": "TestOWContinuize.test_summary",
                            "content": "class TestOWContinuize(WidgetTest):\n    def setUp(self):\n        self.widget = self.create_widget(OWContinuize)\n\n    def test_empty_data(self):\n        \"\"\"No crash on empty data\"\"\"\n        data = Table(\"iris\")\n        widget = self.widget\n        widget.multinomial_treatment = 1\n\n        self.send_signal(self.widget.Inputs.data, data)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        np.testing.assert_equal(imp_data.X, data.X)\n        np.testing.assert_equal(imp_data.Y, data.Y)\n\n        widget.continuous_treatment = 1\n        self.send_signal(self.widget.Inputs.data,\n                         Table.from_domain(data.domain))\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertEqual(len(imp_data), 0)\n\n        self.send_signal(self.widget.Inputs.data, None)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertIsNone(imp_data)\n\n    def test_summary(self):\n        \"\"\"Check if status bar is updated when data is received\"\"\"\n        data = Table(\"iris\")\n        input_sum = self.widget.info.set_input_summary = Mock()\n        output_sum = self.widget.info.set_output_summary = Mock()\n\n        self.send_signal(self.widget.Inputs.data, data)\n        input_sum.assert_called_with(int(StateInfo.format_number(len(data))))\n        output = self.get_output(self.widget.Outputs.data)\n        output_sum.assert_called_with(int(StateInfo.format_number(len(output))))\n\n        input_sum.reset_mock()\n        output_sum.reset_mock()\n        self.send_signal(self.widget.Inputs.data, None)\n        input_sum.assert_called_once()\n        self.assertEqual(input_sum.call_args[0][0].brief, \"\")\n        output_sum.assert_called_once()\n        self.assertEqual(output_sum.call_args[0][0].brief, \"\")\n\n    def test_one_column_equal_values(self):\n        \"\"\"\n        No crash on a column with equal values and with selected option\n        normalize by standard deviation.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table = table[:, 1]\n        table[:] = 42.0\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n\n    def test_one_column_nan_values_normalize_sd(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by standard deviation (Not the same issue which is\n        tested above).\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\n    def test_one_column_nan_values_normalize_span(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by span.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySpan\n        self.widget.continuous_treatment = 1\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 44,
                            "end_lineno": 61,
                            "parent": {
                                "file_name": "Orange/widgets/data/tests/test_owcontinuize.py",
                                "type": "class",
                                "name": "TestOWContinuize",
                                "content": "class TestOWContinuize(WidgetTest):\n    def setUp(self):\n        self.widget = self.create_widget(OWContinuize)\n\n    def test_empty_data(self):\n        \"\"\"No crash on empty data\"\"\"\n        data = Table(\"iris\")\n        widget = self.widget\n        widget.multinomial_treatment = 1\n\n        self.send_signal(self.widget.Inputs.data, data)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        np.testing.assert_equal(imp_data.X, data.X)\n        np.testing.assert_equal(imp_data.Y, data.Y)\n\n        widget.continuous_treatment = 1\n        self.send_signal(self.widget.Inputs.data,\n                         Table.from_domain(data.domain))\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertEqual(len(imp_data), 0)\n\n        self.send_signal(self.widget.Inputs.data, None)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertIsNone(imp_data)\n\n    def test_summary(self):\n        \"\"\"Check if status bar is updated when data is received\"\"\"\n        data = Table(\"iris\")\n        input_sum = self.widget.info.set_input_summary = Mock()\n        output_sum = self.widget.info.set_output_summary = Mock()\n\n        self.send_signal(self.widget.Inputs.data, data)\n        input_sum.assert_called_with(int(StateInfo.format_number(len(data))))\n        output = self.get_output(self.widget.Outputs.data)\n        output_sum.assert_called_with(int(StateInfo.format_number(len(output))))\n\n        input_sum.reset_mock()\n        output_sum.reset_mock()\n        self.send_signal(self.widget.Inputs.data, None)\n        input_sum.assert_called_once()\n        self.assertEqual(input_sum.call_args[0][0].brief, \"\")\n        output_sum.assert_called_once()\n        self.assertEqual(output_sum.call_args[0][0].brief, \"\")\n\n    def test_one_column_equal_values(self):\n        \"\"\"\n        No crash on a column with equal values and with selected option\n        normalize by standard deviation.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table = table[:, 1]\n        table[:] = 42.0\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n\n    def test_one_column_nan_values_normalize_sd(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by standard deviation (Not the same issue which is\n        tested above).\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\n    def test_one_column_nan_values_normalize_span(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by span.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySpan\n        self.widget.continuous_treatment = 1\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 16,
                                "end_lineno": 111,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "cf41738ec5e4f15ee9439de16f0e396b175359f6^",
    "new_commit_hash": "cf41738ec5e4f15ee9439de16f0e396b175359f6",
    "commit_message": "OWContinuize: data info displayed in status bar",
    "commit_date": "2020-01-15T20:44:25+01:00",
    "metadata": {}
}
{
    "repo_name": "orange3",
    "new_commit_hash": "cf41738ec5e4f15ee9439de16f0e396b175359f6",
    "test_file_codes": [
        "# Test methods with long descriptive names can omit docstrings\n# pylint: disable=missing-docstring,unsubscriptable-object\nimport unittest\nfrom unittest.mock import Mock\n\nimport numpy as np\n\nfrom Orange.data import Table, DiscreteVariable\nfrom Orange.preprocess import transformation\nfrom Orange.widgets.data import owcontinuize\nfrom Orange.widgets.data.owcontinuize import OWContinuize\nfrom Orange.widgets.tests.base import WidgetTest\nfrom orangewidget.widget import StateInfo\n\n\nclass TestOWContinuize(WidgetTest):\n    def setUp(self):\n        self.widget = self.create_widget(OWContinuize)\n\n    def test_empty_data(self):\n        \"\"\"No crash on empty data\"\"\"\n        data = Table(\"iris\")\n        widget = self.widget\n        widget.multinomial_treatment = 1\n\n        self.send_signal(self.widget.Inputs.data, data)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        np.testing.assert_equal(imp_data.X, data.X)\n        np.testing.assert_equal(imp_data.Y, data.Y)\n\n        widget.continuous_treatment = 1\n        self.send_signal(self.widget.Inputs.data,\n                         Table.from_domain(data.domain))\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertEqual(len(imp_data), 0)\n\n        self.send_signal(self.widget.Inputs.data, None)\n        widget.unconditional_commit()\n        imp_data = self.get_output(self.widget.Outputs.data)\n        self.assertIsNone(imp_data)\n\n    def test_summary(self):\n        \"\"\"Check if status bar is updated when data is received\"\"\"\n        data = Table(\"iris\")\n        input_sum = self.widget.info.set_input_summary = Mock()\n        output_sum = self.widget.info.set_output_summary = Mock()\n\n        self.send_signal(self.widget.Inputs.data, data)\n        input_sum.assert_called_with(int(StateInfo.format_number(len(data))))\n        output = self.get_output(self.widget.Outputs.data)\n        output_sum.assert_called_with(int(StateInfo.format_number(len(output))))\n\n        input_sum.reset_mock()\n        output_sum.reset_mock()\n        self.send_signal(self.widget.Inputs.data, None)\n        input_sum.assert_called_once()\n        self.assertEqual(input_sum.call_args[0][0].brief, \"\")\n        output_sum.assert_called_once()\n        self.assertEqual(output_sum.call_args[0][0].brief, \"\")\n\n    def test_one_column_equal_values(self):\n        \"\"\"\n        No crash on a column with equal values and with selected option\n        normalize by standard deviation.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table = table[:, 1]\n        table[:] = 42.0\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n\n    def test_one_column_nan_values_normalize_sd(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by standard deviation (Not the same issue which is\n        tested above).\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySD\n        self.widget.continuous_treatment = 2\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\n    def test_one_column_nan_values_normalize_span(self):\n        \"\"\"\n        No crash on a column with NaN values and with selected option\n        normalize by span.\n        GH-2144\n        \"\"\"\n        table = Table(\"iris\")\n        table[:, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        # Normalize.NormalizeBySpan\n        self.widget.continuous_treatment = 1\n        self.widget.unconditional_commit()\n        table = Table(\"iris\")\n        table[1, 2] = np.NaN\n        self.send_signal(self.widget.Inputs.data, table)\n        self.widget.unconditional_commit()\n\n\nclass TestOWContinuizeUtils(unittest.TestCase):\n    def test_dummy_coding_zero_based(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        varb, varc = owcontinuize.dummy_coding(var)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertIs(varb.compute_value.variable, var)\n\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n        self.assertIs(varc.compute_value.variable, var)\n\n        varb, varc = owcontinuize.dummy_coding(var, zero_based=False)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator1)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertIs(varb.compute_value.variable, var)\n\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator1)\n        self.assertEqual(varc.compute_value.value, 2)\n        self.assertIs(varb.compute_value.variable, var)\n\n    def test_dummy_coding_base_value(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        varb, varc = owcontinuize.dummy_coding(var, base_value=0)\n\n        self.assertEqual(varb.name, \"foo=b\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 1)\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n\n        varb, varc = owcontinuize.dummy_coding(var, base_value=1)\n\n        self.assertEqual(varb.name, \"foo=a\")\n        self.assertIsInstance(varb.compute_value, transformation.Indicator)\n        self.assertEqual(varb.compute_value.value, 0)\n        self.assertEqual(varc.name, \"foo=c\")\n        self.assertIsInstance(varc.compute_value, transformation.Indicator)\n        self.assertEqual(varc.compute_value.value, 2)\n\n    def test_one_hot_coding(self):\n        var = DiscreteVariable(\"foo\", values=list(\"abc\"))\n\n        vars = owcontinuize.one_hot_coding(var)\n        for i, (c, nvar) in enumerate(zip(\"abc\", vars)):\n            self.assertEqual(nvar.name, f\"foo={c}\")\n            self.assertIsInstance(nvar.compute_value, transformation.Indicator)\n            self.assertEqual(nvar.compute_value.value, i)\n            self.assertIs(nvar.compute_value.variable, var)\n\n        vars = owcontinuize.one_hot_coding(var, zero_based=False)\n        for i, (c, nvar) in enumerate(zip(\"abc\", vars)):\n            self.assertEqual(nvar.name, f\"foo={c}\")\n            self.assertIsInstance(nvar.compute_value, transformation.Indicator1)\n            self.assertEqual(nvar.compute_value.value, i)\n            self.assertIs(nvar.compute_value.variable, var)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "Starting Orange installation attempts...\nAttempting installation with Python 3.7...\nrunning build_ext\nrunning build_src\nbuild_src\nbuilding extension \"Orange.classification._simple_tree\" sources\nbuilding extension \"Orange.classification._tree_scorers\" sources\nbuilding extension \"Orange.data._valuecount\" sources\nbuilding extension \"Orange.data._contingency\" sources\nbuilding extension \"Orange.data._io\" sources\nbuilding extension \"Orange.data._variable\" sources\nbuilding extension \"Orange.distance._distance\" sources\nbuilding extension \"Orange.preprocess._discretize\" sources\nbuilding extension \"Orange.preprocess._relieff\" sources\nbuilding extension \"Orange.projection._som\" sources\nbuilding extension \"Orange.widgets.utils._grid_density\" sources\nbuild_src: building npy-pkg config files\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmpqin9jsjp/tmp\ncreating /tmp/tmpqin9jsjp/tmp/tmpqin9jsjp\ncompile options: '-MMD -MF /tmp/tmpqin9jsjp/file.c.d -c'\ncc: /tmp/tmpqin9jsjp/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/tmpv08k23zx/tmp\ncreating /tmp/tmpv08k23zx/tmp/tmpv08k23zx\ncompile options: '-MMD -MF /tmp/tmpv08k23zx/file.c.d -c'\ncc: /tmp/tmpv08k23zx/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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\nc++: Orange/preprocess/_relieff.cpp\nc++ -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/preprocess/_relieff.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/preprocess/_relieff.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.projection._som' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/projection\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/projection/_som.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/projection/_som.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/projection/_som.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.widgets.utils._grid_density' extension\ncompiling C++ sources\nC compiler: c++ -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/widgets\ncreating build/temp.linux-x86_64-3.7/Orange/widgets/utils\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\nc++: Orange/widgets/utils/_grid_density.cpp\nc++ -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/widgets/utils/_grid_density.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/widgets/utils/_grid_density.cpython-37m-x86_64-linux-gnu.so\nrunning develop\nrunning build_scripts\nrunning egg_info\nrunning build_src\nbuild_src\nbuilding extension \"Orange.classification._simple_tree\" sources\nbuilding extension \"Orange.classification._tree_scorers\" sources\nbuilding extension \"Orange.data._valuecount\" sources\nbuilding extension \"Orange.data._contingency\" sources\nbuilding extension \"Orange.data._io\" sources\nbuilding extension \"Orange.data._variable\" sources\nbuilding extension \"Orange.distance._distance\" sources\nbuilding extension \"Orange.preprocess._discretize\" sources\nbuilding extension \"Orange.preprocess._relieff\" sources\nbuilding extension \"Orange.projection._som\" sources\nbuilding extension \"Orange.widgets.utils._grid_density\" sources\nbuild_src: building npy-pkg config files\ncreating Orange3.egg-info\nwriting Orange3.egg-info/PKG-INFO\nwriting dependency_links to Orange3.egg-info/dependency_links.txt\nwriting entry points to Orange3.egg-info/entry_points.txt\nwriting requirements to Orange3.egg-info/requires.txt\nwriting top-level names to Orange3.egg-info/top_level.txt\nwriting manifest file 'Orange3.egg-info/SOURCES.txt'\nreading manifest file 'Orange3.egg-info/SOURCES.txt'\nreading manifest template 'MANIFEST.in'\nwarning: no files found matching 'README*' under directory 'Orange'\nwarning: no files found matching 'LICENSE' under directory 'Orange'\nwarning: no files found matching '*.basket' under directory 'Orange/datasets'\nwarning: no files found matching '*.js' under directory 'Orange/widgets'\nwarning: no files found matching '*.css' under directory 'Orange/widgets'\nwarning: no files found matching '*.html' under directory 'Orange/widgets'\nwarning: no files found matching 'COPYING'\nadding license file 'LICENSE'\nwriting manifest file 'Orange3.egg-info/SOURCES.txt'\nrunning build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmp47vz1g64/tmp\ncreating /tmp/tmp47vz1g64/tmp/tmp47vz1g64\ncompile options: '-MMD -MF /tmp/tmp47vz1g64/file.c.d -c'\ncc: /tmp/tmp47vz1g64/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/tmp3n3zox92/tmp\ncreating /tmp/tmp3n3zox92/tmp/tmp3n3zox92\ncompile options: '-MMD -MF /tmp/tmp3n3zox92/file.c.d -c'\ncc: /tmp/tmp3n3zox92/file.c\ncustomize UnixCCompiler using build_ext\nCreating /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/Orange3.egg-link (link to .)\nAdding Orange3 3.25.0.dev0+cf41738 to easy-install.pth file\nInstalling orange-canvas script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nInstalled /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6\nProcessing dependencies for Orange3==3.25.0.dev0+cf41738\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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages\nSearching for PyYAML==6.0.1\nBest match: PyYAML 6.0.1\nAdding PyYAML 6.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling pip3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling pip3.10 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages\nSearching for orange-widget-base==4.22.0\nBest match: orange-widget-base 4.22.0\nAdding orange-widget-base 4.22.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages\nSearching for openpyxl==3.1.3\nBest match: openpyxl 3.1.3\nAdding openpyxl 3.1.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling f2py3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling f2py3.7 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages\nSearching for et-xmlfile==1.1.0\nBest match: et-xmlfile 1.1.0\nAdding et-xmlfile 1.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling pyftmerge script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling pyftsubset script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\nInstalling ttx script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages\nFinished processing dependencies for Orange3==3.25.0.dev0+cf41738\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 174ms\nPrepared 18 packages in 2ms\nInstalled 18 packages in 101ms\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 40 packages in 191ms\nInstalled 35 packages in 866ms\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 + et-xmlfile==1.1.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 + openpyxl==3.1.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 + pyyaml==6.0.1\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 200ms\nInstalled 19 packages in 428ms\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.22.0\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 6ms\n + psycopg2==2.9.9\n + pymssql==2.3.2\nAudited 1 package in 32ms\nAudited 2 packages in 1ms\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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/data/_contingency.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/distance/_distance.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/projection/_som.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_5update_hex’:\nOrange/projection/_som.c:3655:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3655 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:3654:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3654 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_7get_winners_sparse’:\nOrange/projection/_som.c:4547:223: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4547 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_39, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_y;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:4114:7: note: ‘__pyx_v_win_y’ was declared here\n 4114 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:4536:223: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4536 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_37, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_x;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:4113:7: note: ‘__pyx_v_win_x’ was declared here\n 4113 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pf_6Orange_10projection_4_som_8update_sparse.constprop’:\nOrange/projection/_som.c:4746:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4746 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:4745:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4745 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_3update’:\nOrange/projection/_som.c:3141:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3141 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_1get_winners’:\nOrange/projection/_som.c:2964:223: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2964 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_27, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_28, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_y;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:2665:7: note: ‘__pyx_v_win_y’ was declared here\n 2665 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:2953:223: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2953 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_x;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:2664:7: note: ‘__pyx_v_win_x’ was declared here\n 2664 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pf_6Orange_10projection_4_som_10update_sparse_hex.constprop’:\nOrange/projection/_som.c:5515:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 5515 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:5514:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 5514 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6/.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_cf41738ec5e4f15ee9439de16f0e396b175359f6\ncollected 14 items\n\nr2e_tests/test_1.py sss...........                                       [100%]\n\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_empty_data\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_image_export\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_minimum_size\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_msg_base_class\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_one_column_equal_values\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_one_column_nan_values_normalize_sd\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_one_column_nan_values_normalize_span\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_summary\nPASSED r2e_tests/test_1.py::TestOWContinuizeUtils::test_dummy_coding_base_value\nPASSED r2e_tests/test_1.py::TestOWContinuizeUtils::test_dummy_coding_zero_based\nPASSED r2e_tests/test_1.py::TestOWContinuizeUtils::test_one_hot_coding\nSKIPPED [1] .venv/lib/python3.7/site-packages/orangewidget/tests/base.py:244: image exporting not tested as .widget was not set\nSKIPPED [1] .venv/lib/python3.7/site-packages/orangewidget/tests/base.py:238: minimum size not tested as .widget was not set\nSKIPPED [1] .venv/lib/python3.7/site-packages/orangewidget/tests/base.py:250: msg base class not tested as .widget was not set\n======================== 11 passed, 3 skipped in 3.49s =========================\nWidgets left: 0    Max widgets: 512 \n\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_cf41738ec5e4f15ee9439de16f0e396b175359f6\ncollected 14 items\n\nr2e_tests/test_1.py sss.......F...                                       [100%]\n\n=================================== FAILURES ===================================\n________________________ TestOWContinuize.test_summary _________________________\n\nself = <r2e_tests.test_1.TestOWContinuize testMethod=test_summary>\n\n    def test_summary(self):\n        \"\"\"Check if status bar is updated when data is received\"\"\"\n        data = Table(\"iris\")\n        input_sum = self.widget.info.set_input_summary = Mock()\n        output_sum = self.widget.info.set_output_summary = Mock()\n    \n        self.send_signal(self.widget.Inputs.data, data)\n>       input_sum.assert_called_with(int(StateInfo.format_number(len(data))))\n\nr2e_tests/test_1.py:51: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n_mock_self = <Mock id='129724883918800'>, args = (150,), kwargs = {}\nexpected = 'mock(150)'\n\n    def assert_called_with(_mock_self, *args, **kwargs):\n        \"\"\"assert that the mock was called with the specified arguments.\n    \n        Raises an AssertionError if the args and keyword args passed in are\n        different to the last call to the mock.\"\"\"\n        self = _mock_self\n        if self.call_args is None:\n            expected = self._format_mock_call_signature(args, kwargs)\n>           raise AssertionError('Expected call: %s\\nNot called' % (expected,))\nE           AssertionError: Expected call: mock(150)\nE           Not called\n\n../../../../.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib/python3.7/unittest/mock.py:869: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_empty_data\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_image_export\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_minimum_size\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_msg_base_class\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_one_column_equal_values\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_one_column_nan_values_normalize_sd\nPASSED r2e_tests/test_1.py::TestOWContinuize::test_one_column_nan_values_normalize_span\nPASSED r2e_tests/test_1.py::TestOWContinuizeUtils::test_dummy_coding_base_value\nPASSED r2e_tests/test_1.py::TestOWContinuizeUtils::test_dummy_coding_zero_based\nPASSED r2e_tests/test_1.py::TestOWContinuizeUtils::test_one_hot_coding\nSKIPPED [1] .venv/lib/python3.7/site-packages/orangewidget/tests/base.py:244: image exporting not tested as .widget was not set\nSKIPPED [1] .venv/lib/python3.7/site-packages/orangewidget/tests/base.py:238: minimum size not tested as .widget was not set\nSKIPPED [1] .venv/lib/python3.7/site-packages/orangewidget/tests/base.py:250: msg base class not tested as .widget was not set\nFAILED r2e_tests/test_1.py::TestOWContinuize::test_summary - AssertionError: ...\n=================== 1 failed, 10 passed, 3 skipped in 2.15s ====================\nWidgets left: 0    Max widgets: 512 \n\n",
    "old_commit_res_stderr": ""
}
Orange/widgets/data/owcontinuize.py Orange/widgets/data/tests/test_owcontinuize.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
**Title**: Status Bar Does Not Reset Summaries When Input Data Is Cleared

**Description**:
When the input data is set to `None`, the status bar fails to update the input and output summaries, leaving outdated information displayed.

**Example Code**:
```python
data = Table("iris")
# Initially setting data, summaries should display the number of data instances
widget.info.set_input_summary(len(data))
widget.info.set_output_summary(len(data))

# Clearing the data
widget.setData(None)
```

**Expected Behavior**:
After clearing the input data, the status bar should display "No Input" and "No Output" summaries to reflect the absence of data.

**Actual Behavior**:
The status bar continues to show the previous input and output summaries instead of resetting them, leading to confusion about the current state of the data.

[/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/data/owcontinuize.py
from functools import reduce

from AnyQt.QtCore import Qt

import Orange.data
from Orange.util import Reprable
from Orange.statistics import distribution
from Orange.preprocess import Continuize, Normalize
from Orange.preprocess.transformation import \
    Identity, Indicator, Indicator1, Normalizer
from Orange.data.table import Table
from Orange.widgets import gui, widget
from Orange.widgets.settings import Setting
from Orange.widgets.utils.sql import check_sql_input
from Orange.widgets.utils.widgetpreview import WidgetPreview
from Orange.widgets.widget import Input, Output


class OWContinuize(widget.OWWidget):
    name = "Continuize"
    description = ("Transform categorical attributes into numeric and, " +
                   "optionally, normalize numeric values.")
    icon = "icons/Continuize.svg"
    category = "Data"
    keywords = []

    class Inputs:
        data = Input("Data", Orange.data.Table)

    class Outputs:
        data = Output("Data", Orange.data.Table)

    want_main_area = False
    buttons_area_orientation = Qt.Vertical
    resizing_enabled = False

    multinomial_treatment = Setting(0)
    zero_based = Setting(1)
    continuous_treatment = Setting(0)
    class_treatment = Setting(0)

    transform_class = Setting(False)

    autosend = Setting(True)

    multinomial_treats = (
        ("First value as base", Continuize.FirstAsBase),
        ("Most frequent value as base", Continuize.FrequentAsBase),
        ("One attribute per value", Continuize.Indicators),
        ("Ignore multinomial attributes", Continuize.RemoveMultinomial),
        ("Remove categorical attributes", Continuize.Remove),
        ("Treat as ordinal", Continuize.AsOrdinal),
        ("Divide by number of values", Continuize.AsNormalizedOrdinal))

    continuous_treats = (
        ("Leave them as they are", Continuize.Leave),
        ("Normalize by span", Normalize.NormalizeBySpan),
        ("Normalize by standard deviation", Normalize.NormalizeBySD))

    class_treats = (
        ("Leave it as it is", Continuize.Leave),
        ("Treat as ordinal", Continuize.AsOrdinal),
        ("Divide by number of values", Continuize.AsNormalizedOrdinal),
        ("One class per value", Continuize.Indicators),
    )

    value_ranges = ["From -1 to 1", "From 0 to 1"]

    def __init__(self):
        super().__init__()

        box = gui.vBox(self.controlArea, "Categorical Features")
        gui.radioButtonsInBox(
            box, self, "multinomial_treatment",
            btnLabels=[x[0] for x in self.multinomial_treats],
            callback=self.settings_changed)

        box = gui.vBox(self.controlArea, "Numeric Features")
        gui.radioButtonsInBox(
            box, self, "continuous_treatment",
            btnLabels=[x[0] for x in self.continuous_treats],
            callback=self.settings_changed)

        box = gui.vBox(self.controlArea, "Categorical Outcomes")
        gui.radioButtonsInBox(
            box, self, "class_treatment",
            btnLabels=[t[0] for t in self.class_treats],
            callback=self.settings_changed)

        zbbox = gui.vBox(self.controlArea, "Value Range")

        gui.radioButtonsInBox(
            zbbox, self, "zero_based",
            btnLabels=self.value_ranges,
            callback=self.settings_changed)

        gui.auto_apply(self.buttonsArea, self, "autosend", box=False)

        self.data = None

    def settings_changed(self):
        self.commit()

    @Inputs.data
    @check_sql_input
    def setData(self, data):
        self.data = data
        if data is None:
            self.Outputs.data.send(None)
        else:
            self.unconditional_commit()

    def constructContinuizer(self):
        conzer = DomainContinuizer(
            zero_based=self.zero_based,
            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],
            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],
            class_treatment=self.class_treats[self.class_treatment][1]
        )
        return conzer

    # def sendPreprocessor(self):
    #     continuizer = self.constructContinuizer()
    #     self.send("Preprocessor", PreprocessedLearner(
    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):
    #             Table(continuizer(data, weightId, tc)
    #                 if data.domain.has_discrete_class
    #                 else continuizer(data, weightId), data)))

    def commit(self):
        continuizer = self.constructContinuizer()
        if self.data:
            domain = continuizer(self.data)
            data = self.data.transform(domain)
            self.Outputs.data.send(data)
        else:
            self.Outputs.data.send(self.data)  # None or empty data

    def send_report(self):
        self.report_items(
            "Settings",
            [("Categorical features",
              self.multinomial_treats[self.multinomial_treatment][0]),
             ("Numeric features",
              self.continuous_treats[self.continuous_treatment][0]),
             ("Class", self.class_treats[self.class_treatment][0]),
             ("Value range", self.value_ranges[self.zero_based])])


class WeightedIndicator(Indicator):
    def __init__(self, variable, value, weight=1.0):
        super().__init__(variable, value)
        self.weight = weight

    def transform(self, c):
        t = super().transform(c) * self.weight
        if self.weight != 1.0:
            t *= self.weight
        return t


class WeightedIndicator1(Indicator1):
    def __init__(self, variable, value, weight=1.0):
        super().__init__(variable, value)
        self.weight = weight

    def transform(self, c):
        t = super().transform(c) * self.weight
        if self.weight != 1.0:
            t *= self.weight
        return t


def make_indicator_var(source, value_ind, weight=None, zero_based=True):
    if zero_based and weight is None:
        indicator = Indicator(source, value=value_ind)
    elif zero_based:
        indicator = WeightedIndicator(source, value=value_ind, weight=weight)
    elif weight is None:
        indicator = Indicator1(source, value=value_ind)
    else:
        indicator = WeightedIndicator1(source, value=value_ind, weight=weight)
    return Orange.data.ContinuousVariable(
        "{}={}".format(source.name, source.values[value_ind]),
        compute_value=indicator
    )


def dummy_coding(var, base_value=0, zero_based=True):
    N = len(var.values)
    return [make_indicator_var(var, i, zero_based=zero_based)
            for i in range(N) if i != base_value]


def one_hot_coding(var, zero_based=True):
    N = len(var.values)
    return [make_indicator_var(var, i, zero_based=zero_based)
            for i in range(N)]


def continuize_domain(data_or_domain,
                      multinomial_treatment=Continuize.Indicators,
                      continuous_treatment=Continuize.Leave,
                      class_treatment=Continuize.Leave,
                      zero_based=True):

    if isinstance(data_or_domain, Orange.data.Domain):
        data, domain = None, data_or_domain
    else:
        data, domain = data_or_domain, data_or_domain.domain

    def needs_dist(var, mtreat, ctreat):
        "Does the `var` need a distribution given specified flags"
        if var.is_discrete:
            return mtreat == Continuize.FrequentAsBase
        elif var.is_continuous:
            return ctreat != Continuize.Leave
        else:
            raise ValueError

    # Compute the column indices which need a distribution.
    attr_needs_dist = [needs_dist(var, multinomial_treatment,
                                  continuous_treatment)
                       for var in domain.attributes]
    cls_needs_dist = [needs_dist(var, class_treatment, Continuize.Leave)
                      for var in domain.class_vars]

    columns = [i for i, needs in enumerate(attr_needs_dist + cls_needs_dist)
               if needs]

    if columns:
        if data is None:
            raise TypeError("continuizer requires data")
        dist = distribution.get_distributions_for_columns(data, columns)
    else:
        dist = []

    dist_iter = iter(dist)

    newattrs = [continuize_var(var, next(dist_iter) if needs_dist else None,
                               multinomial_treatment, continuous_treatment,
                               zero_based)
                for var, needs_dist in zip(domain.attributes, attr_needs_dist)]

    newclass = [continuize_var(var,
                               next(dist_iter) if needs_dist else None,
                               class_treatment, Continuize.Remove,
                               zero_based)
                for var, needs_dist in zip(domain.class_vars, cls_needs_dist)]

    newattrs = reduce(list.__iadd__, newattrs, [])
    newclass = reduce(list.__iadd__, newclass, [])
    return Orange.data.Domain(newattrs, newclass, domain.metas)


def continuize_var(var,
                   data_or_dist=None,
                   multinomial_treatment=Continuize.Indicators,
                   continuous_treatment=Continuize.Leave,
                   zero_based=True):

    def continuize_continuous():
        if continuous_treatment == Normalize.NormalizeBySpan:
            return [normalize_by_span(var, data_or_dist, zero_based)]
        elif continuous_treatment == Normalize.NormalizeBySD:
            return [normalize_by_sd(var, data_or_dist)]
        else:
            return [var]

    def continuize_discrete():
        if len(var.values) > 2 and \
                multinomial_treatment == Continuize.ReportError:
            raise ValueError("{0.name} is a multinomial variable".format(var))
        if len(var.values) < 2 or \
                multinomial_treatment == Continuize.Remove or \
                (multinomial_treatment == Continuize.RemoveMultinomial
                 and len(var.values) > 2):
            return []
        elif multinomial_treatment == Continuize.AsOrdinal:
            return [ordinal_to_continuous(var)]
        elif multinomial_treatment == Continuize.AsNormalizedOrdinal:
            return [ordinal_to_norm_continuous(var, zero_based)]
        elif multinomial_treatment == Continuize.Indicators:
            return one_hot_coding(var, zero_based)
        elif multinomial_treatment in (
                Continuize.FirstAsBase, Continuize.RemoveMultinomial):
            return dummy_coding(var, zero_based=zero_based)
        elif multinomial_treatment == Continuize.FrequentAsBase:
            dist = _ensure_dist(var, data_or_dist)
            modus = dist.modus()
            return dummy_coding(var, base_value=modus, zero_based=zero_based)
        elif multinomial_treatment == Continuize.Leave:
            return [var]
        raise ValueError("Invalid value of `multinomial_treatment`")

    if var.is_continuous:
        return continuize_continuous()
    elif var.is_discrete:
        return continuize_discrete()
    raise TypeError("Non-primitive variables cannot be continuized")


def _ensure_dist(var, data_or_dist):
    if isinstance(data_or_dist, distribution.Discrete):
        if not var.is_discrete:
            raise TypeError
        return data_or_dist
    elif isinstance(data_or_dist, distribution.Continuous):
        if not var.is_continuous:
            raise TypeError
        return data_or_dist
    elif isinstance(data_or_dist, Orange.data.Storage):
        return distribution.get_distribution(data_or_dist, var)
    else:
        raise ValueError("Need a distribution or data.")


def normalized_var(var, translate, scale):
    return Orange.data.ContinuousVariable(var.name,
                                          compute_value=Normalizer(var, translate, scale))


def ordinal_to_continuous(var):
    return Orange.data.ContinuousVariable(var.name,
                                          compute_value=Identity(var))


def ordinal_to_norm_continuous(var, zero_based=True):
    n_values = len(var.values)
    if zero_based:
        return normalized_var(var, 0, 1 / (n_values - 1))
    else:
        return normalized_var(var, (n_values - 1) / 2, 2 / (n_values - 1))


def normalize_by_span(var, data_or_dist, zero_based=True):
    dist = _ensure_dist(var, data_or_dist)
    if dist.shape[1] > 0:
        v_max, v_min = dist.max(), dist.min()
    else:
        v_max, v_min = 0, 0
    span = (v_max - v_min)
    if span < 1e-15:
        span = 1

    if zero_based:
        return normalized_var(var, v_min, 1 / span)
    else:
        return normalized_var(var, (v_min + v_max) / 2, 2 / span)


def normalize_by_sd(var, data_or_dist):
    dist = _ensure_dist(var, data_or_dist)
    if dist.shape[1] > 0:
        mean, sd = dist.mean(), dist.standard_deviation()
    else:
        mean, sd = 0, 1
    sd = sd if sd > 1e-10 else 1
    return normalized_var(var, mean, 1 / sd)


class DomainContinuizer(Reprable):
    def __init__(self, zero_based=True,
                 multinomial_treatment=Continuize.Indicators,
                 continuous_treatment=Continuize.Leave,
                 class_treatment=Continuize.Leave):
        self.zero_based = zero_based
        self.multinomial_treatment = multinomial_treatment
        self.continuous_treatment = continuous_treatment
        self.class_treatment = class_treatment

    def __call__(self, data):
        treat = self.multinomial_treatment
        if isinstance(data, Orange.data.Domain):
            domain, data = data, None
        else:
            domain = data.domain

        if (treat == Continuize.ReportError and
                any(var.is_discrete and len(var.values) > 2 for var in domain)):
            raise ValueError("Domain has multinomial attributes")

        newdomain = continuize_domain(
            data or domain,
            self.multinomial_treatment,
            self.continuous_treatment,
            self.class_treatment,
            self.zero_based
        )
        return newdomain


if __name__ == "__main__":  # pragma: no cover
    WidgetPreview(OWContinuize).run(Table("lenses"))

```
--- 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**: Status Bar Does Not Reset Summaries When Input Data Is Cleared

**Description**:
When the input data is set to `None`, the status bar fails to update the input and output summaries, leaving outdated information displayed.

**Example Code**:
```python
data = Table("iris")
# Initially setting data, summaries should display the number of data instances
widget.info.set_input_summary(len(data))
widget.info.set_output_summary(len(data))

# Clearing the data
widget.setData(None)
```

**Expected Behavior**:
After clearing the input data, the status bar should display "No Input" and "No Output" summaries to reflect the absence of data.

**Actual Behavior**:
The status bar continues to show the previous input and output summaries instead of resetting them, leading to confusion about the current state of the data.

[/ISSUE]
{
    "TestOWContinuize.test_empty_data": "PASSED",
    "TestOWContinuize.test_image_export": "PASSED",
    "TestOWContinuize.test_minimum_size": "PASSED",
    "TestOWContinuize.test_msg_base_class": "PASSED",
    "TestOWContinuize.test_one_column_equal_values": "PASSED",
    "TestOWContinuize.test_one_column_nan_values_normalize_sd": "PASSED",
    "TestOWContinuize.test_one_column_nan_values_normalize_span": "PASSED",
    "TestOWContinuize.test_summary": "PASSED",
    "TestOWContinuizeUtils.test_dummy_coding_base_value": "PASSED",
    "TestOWContinuizeUtils.test_dummy_coding_zero_based": "PASSED",
    "TestOWContinuizeUtils.test_one_hot_coding": "PASSED"
}
diff --git a/Orange/widgets/data/owcontinuize.py b/Orange/widgets/data/owcontinuize.py
index c054daab2..3c52148af 100644
--- a/Orange/widgets/data/owcontinuize.py
+++ b/Orange/widgets/data/owcontinuize.py
@@ -97,6 +97,8 @@ class OWContinuize(widget.OWWidget):
         gui.auto_apply(self.buttonsArea, self, "autosend", box=False)
 
         self.data = None
+        self.info.set_input_summary(self.info.NoInput)
+        self.info.set_output_summary(self.info.NoOutput)
 
     def settings_changed(self):
         self.commit()
@@ -106,8 +108,11 @@ class OWContinuize(widget.OWWidget):
     def setData(self, data):
         self.data = data
         if data is None:
+            self.info.set_input_summary(self.info.NoInput)
+            self.info.set_output_summary(self.info.NoOutput)
             self.Outputs.data.send(None)
         else:
+            self.info.set_input_summary(len(data))
             self.unconditional_commit()
 
     def constructContinuizer(self):
@@ -133,9 +138,11 @@ class OWContinuize(widget.OWWidget):
             domain = continuizer(self.data)
             data = self.data.transform(domain)
             self.Outputs.data.send(data)
+            self.info.set_output_summary(len(data))
         else:
             self.Outputs.data.send(self.data)  # None or empty data
 
+
     def send_report(self):
         self.report_items(
             "Settings",
@@ -391,4 +398,4 @@ class DomainContinuizer(Reprable):
 
 
 if __name__ == "__main__":  # pragma: no cover
-    WidgetPreview(OWContinuize).run(Table("lenses"))
+    WidgetPreview(OWContinuize).run(Table("iris"))

{"Orange/widgets/data/owcontinuize.py": "from functools import reduce\n\nfrom AnyQt.QtCore import Qt\n\nimport Orange.data\nfrom Orange.util import Reprable\nfrom Orange.statistics import distribution\nfrom Orange.preprocess import Continuize, Normalize\nfrom Orange.preprocess.transformation import \\\n    Identity, Indicator, Indicator1, Normalizer\nfrom Orange.data.table import Table\nfrom Orange.widgets import gui, widget\nfrom Orange.widgets.settings import Setting\nfrom Orange.widgets.utils.sql import check_sql_input\nfrom Orange.widgets.utils.widgetpreview import WidgetPreview\nfrom Orange.widgets.widget import Input, Output\n\n\nclass OWContinuize(widget.OWWidget):\n    name = \"Continuize\"\n    description = (\"Transform categorical attributes into numeric and, \" +\n                   \"optionally, normalize numeric values.\")\n    icon = \"icons/Continuize.svg\"\n    category = \"Data\"\n    keywords = []\n\n    class Inputs:\n        data = Input(\"Data\", Orange.data.Table)\n\n    class Outputs:\n        data = Output(\"Data\", Orange.data.Table)\n\n    want_main_area = False\n    buttons_area_orientation = Qt.Vertical\n    resizing_enabled = False\n\n    multinomial_treatment = Setting(0)\n    zero_based = Setting(1)\n    continuous_treatment = Setting(0)\n    class_treatment = Setting(0)\n\n    transform_class = Setting(False)\n\n    autosend = Setting(True)\n\n    multinomial_treats = (\n        (\"First value as base\", Continuize.FirstAsBase),\n        (\"Most frequent value as base\", Continuize.FrequentAsBase),\n        (\"One attribute per value\", Continuize.Indicators),\n        (\"Ignore multinomial attributes\", Continuize.RemoveMultinomial),\n        (\"Remove categorical attributes\", Continuize.Remove),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal))\n\n    continuous_treats = (\n        (\"Leave them as they are\", Continuize.Leave),\n        (\"Normalize by span\", Normalize.NormalizeBySpan),\n        (\"Normalize by standard deviation\", Normalize.NormalizeBySD))\n\n    class_treats = (\n        (\"Leave it as it is\", Continuize.Leave),\n        (\"Treat as ordinal\", Continuize.AsOrdinal),\n        (\"Divide by number of values\", Continuize.AsNormalizedOrdinal),\n        (\"One class per value\", Continuize.Indicators),\n    )\n\n    value_ranges = [\"From -1 to 1\", \"From 0 to 1\"]\n\n    def __init__(self):\n        super().__init__()\n\n        box = gui.vBox(self.controlArea, \"Categorical Features\")\n        gui.radioButtonsInBox(\n            box, self, \"multinomial_treatment\",\n            btnLabels=[x[0] for x in self.multinomial_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Numeric Features\")\n        gui.radioButtonsInBox(\n            box, self, \"continuous_treatment\",\n            btnLabels=[x[0] for x in self.continuous_treats],\n            callback=self.settings_changed)\n\n        box = gui.vBox(self.controlArea, \"Categorical Outcomes\")\n        gui.radioButtonsInBox(\n            box, self, \"class_treatment\",\n            btnLabels=[t[0] for t in self.class_treats],\n            callback=self.settings_changed)\n\n        zbbox = gui.vBox(self.controlArea, \"Value Range\")\n\n        gui.radioButtonsInBox(\n            zbbox, self, \"zero_based\",\n            btnLabels=self.value_ranges,\n            callback=self.settings_changed)\n\n        gui.auto_apply(self.buttonsArea, self, \"autosend\", box=False)\n\n        self.data = None\n\n    def settings_changed(self):\n        self.commit()\n\n    @Inputs.data\n    @check_sql_input\n    def setData(self, data):\n        self.data = data\n        if data is None:\n            self.Outputs.data.send(None)\n        else:\n            self.unconditional_commit()\n\n    def constructContinuizer(self):\n        conzer = DomainContinuizer(\n            zero_based=self.zero_based,\n            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],\n            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],\n            class_treatment=self.class_treats[self.class_treatment][1]\n        )\n        return conzer\n\n    # def sendPreprocessor(self):\n    #     continuizer = self.constructContinuizer()\n    #     self.send(\"Preprocessor\", PreprocessedLearner(\n    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):\n    #             Table(continuizer(data, weightId, tc)\n    #                 if data.domain.has_discrete_class\n    #                 else continuizer(data, weightId), data)))\n\n    def commit(self):\n        continuizer = self.constructContinuizer()\n        if self.data:\n            domain = continuizer(self.data)\n            data = self.data.transform(domain)\n            self.Outputs.data.send(data)\n        else:\n            self.Outputs.data.send(self.data)  # None or empty data\n\n    def send_report(self):\n        self.report_items(\n            \"Settings\",\n            [(\"Categorical features\",\n              self.multinomial_treats[self.multinomial_treatment][0]),\n             (\"Numeric features\",\n              self.continuous_treats[self.continuous_treatment][0]),\n             (\"Class\", self.class_treats[self.class_treatment][0]),\n             (\"Value range\", self.value_ranges[self.zero_based])])\n\n\nclass WeightedIndicator(Indicator):\n    def __init__(self, variable, value, weight=1.0):\n        super().__init__(variable, value)\n        self.weight = weight\n\n    def transform(self, c):\n        t = super().transform(c) * self.weight\n        if self.weight != 1.0:\n            t *= self.weight\n        return t\n\n\nclass WeightedIndicator1(Indicator1):\n    def __init__(self, variable, value, weight=1.0):\n        super().__init__(variable, value)\n        self.weight = weight\n\n    def transform(self, c):\n        t = super().transform(c) * self.weight\n        if self.weight != 1.0:\n            t *= self.weight\n        return t\n\n\ndef make_indicator_var(source, value_ind, weight=None, zero_based=True):\n    if zero_based and weight is None:\n        indicator = Indicator(source, value=value_ind)\n    elif zero_based:\n        indicator = WeightedIndicator(source, value=value_ind, weight=weight)\n    elif weight is None:\n        indicator = Indicator1(source, value=value_ind)\n    else:\n        indicator = WeightedIndicator1(source, value=value_ind, weight=weight)\n    return Orange.data.ContinuousVariable(\n        \"{}={}\".format(source.name, source.values[value_ind]),\n        compute_value=indicator\n    )\n\n\ndef dummy_coding(var, base_value=0, zero_based=True):\n    N = len(var.values)\n    return [make_indicator_var(var, i, zero_based=zero_based)\n            for i in range(N) if i != base_value]\n\n\ndef one_hot_coding(var, zero_based=True):\n    N = len(var.values)\n    return [make_indicator_var(var, i, zero_based=zero_based)\n            for i in range(N)]\n\n\ndef continuize_domain(data_or_domain,\n                      multinomial_treatment=Continuize.Indicators,\n                      continuous_treatment=Continuize.Leave,\n                      class_treatment=Continuize.Leave,\n                      zero_based=True):\n\n    if isinstance(data_or_domain, Orange.data.Domain):\n        data, domain = None, data_or_domain\n    else:\n        data, domain = data_or_domain, data_or_domain.domain\n\n    def needs_dist(var, mtreat, ctreat):\n        \"Does the `var` need a distribution given specified flags\"\n        if var.is_discrete:\n            return mtreat == Continuize.FrequentAsBase\n        elif var.is_continuous:\n            return ctreat != Continuize.Leave\n        else:\n            raise ValueError\n\n    # Compute the column indices which need a distribution.\n    attr_needs_dist = [needs_dist(var, multinomial_treatment,\n                                  continuous_treatment)\n                       for var in domain.attributes]\n    cls_needs_dist = [needs_dist(var, class_treatment, Continuize.Leave)\n                      for var in domain.class_vars]\n\n    columns = [i for i, needs in enumerate(attr_needs_dist + cls_needs_dist)\n               if needs]\n\n    if columns:\n        if data is None:\n            raise TypeError(\"continuizer requires data\")\n        dist = distribution.get_distributions_for_columns(data, columns)\n    else:\n        dist = []\n\n    dist_iter = iter(dist)\n\n    newattrs = [continuize_var(var, next(dist_iter) if needs_dist else None,\n                               multinomial_treatment, continuous_treatment,\n                               zero_based)\n                for var, needs_dist in zip(domain.attributes, attr_needs_dist)]\n\n    newclass = [continuize_var(var,\n                               next(dist_iter) if needs_dist else None,\n                               class_treatment, Continuize.Remove,\n                               zero_based)\n                for var, needs_dist in zip(domain.class_vars, cls_needs_dist)]\n\n    newattrs = reduce(list.__iadd__, newattrs, [])\n    newclass = reduce(list.__iadd__, newclass, [])\n    return Orange.data.Domain(newattrs, newclass, domain.metas)\n\n\ndef continuize_var(var,\n                   data_or_dist=None,\n                   multinomial_treatment=Continuize.Indicators,\n                   continuous_treatment=Continuize.Leave,\n                   zero_based=True):\n\n    def continuize_continuous():\n        if continuous_treatment == Normalize.NormalizeBySpan:\n            return [normalize_by_span(var, data_or_dist, zero_based)]\n        elif continuous_treatment == Normalize.NormalizeBySD:\n            return [normalize_by_sd(var, data_or_dist)]\n        else:\n            return [var]\n\n    def continuize_discrete():\n        if len(var.values) > 2 and \\\n                multinomial_treatment == Continuize.ReportError:\n            raise ValueError(\"{0.name} is a multinomial variable\".format(var))\n        if len(var.values) < 2 or \\\n                multinomial_treatment == Continuize.Remove or \\\n                (multinomial_treatment == Continuize.RemoveMultinomial\n                 and len(var.values) > 2):\n            return []\n        elif multinomial_treatment == Continuize.AsOrdinal:\n            return [ordinal_to_continuous(var)]\n        elif multinomial_treatment == Continuize.AsNormalizedOrdinal:\n            return [ordinal_to_norm_continuous(var, zero_based)]\n        elif multinomial_treatment == Continuize.Indicators:\n            return one_hot_coding(var, zero_based)\n        elif multinomial_treatment in (\n                Continuize.FirstAsBase, Continuize.RemoveMultinomial):\n            return dummy_coding(var, zero_based=zero_based)\n        elif multinomial_treatment == Continuize.FrequentAsBase:\n            dist = _ensure_dist(var, data_or_dist)\n            modus = dist.modus()\n            return dummy_coding(var, base_value=modus, zero_based=zero_based)\n        elif multinomial_treatment == Continuize.Leave:\n            return [var]\n        raise ValueError(\"Invalid value of `multinomial_treatment`\")\n\n    if var.is_continuous:\n        return continuize_continuous()\n    elif var.is_discrete:\n        return continuize_discrete()\n    raise TypeError(\"Non-primitive variables cannot be continuized\")\n\n\ndef _ensure_dist(var, data_or_dist):\n    if isinstance(data_or_dist, distribution.Discrete):\n        if not var.is_discrete:\n            raise TypeError\n        return data_or_dist\n    elif isinstance(data_or_dist, distribution.Continuous):\n        if not var.is_continuous:\n            raise TypeError\n        return data_or_dist\n    elif isinstance(data_or_dist, Orange.data.Storage):\n        return distribution.get_distribution(data_or_dist, var)\n    else:\n        raise ValueError(\"Need a distribution or data.\")\n\n\ndef normalized_var(var, translate, scale):\n    return Orange.data.ContinuousVariable(var.name,\n                                          compute_value=Normalizer(var, translate, scale))\n\n\ndef ordinal_to_continuous(var):\n    return Orange.data.ContinuousVariable(var.name,\n                                          compute_value=Identity(var))\n\n\ndef ordinal_to_norm_continuous(var, zero_based=True):\n    n_values = len(var.values)\n    if zero_based:\n        return normalized_var(var, 0, 1 / (n_values - 1))\n    else:\n        return normalized_var(var, (n_values - 1) / 2, 2 / (n_values - 1))\n\n\ndef normalize_by_span(var, data_or_dist, zero_based=True):\n    dist = _ensure_dist(var, data_or_dist)\n    if dist.shape[1] > 0:\n        v_max, v_min = dist.max(), dist.min()\n    else:\n        v_max, v_min = 0, 0\n    span = (v_max - v_min)\n    if span < 1e-15:\n        span = 1\n\n    if zero_based:\n        return normalized_var(var, v_min, 1 / span)\n    else:\n        return normalized_var(var, (v_min + v_max) / 2, 2 / span)\n\n\ndef normalize_by_sd(var, data_or_dist):\n    dist = _ensure_dist(var, data_or_dist)\n    if dist.shape[1] > 0:\n        mean, sd = dist.mean(), dist.standard_deviation()\n    else:\n        mean, sd = 0, 1\n    sd = sd if sd > 1e-10 else 1\n    return normalized_var(var, mean, 1 / sd)\n\n\nclass DomainContinuizer(Reprable):\n    def __init__(self, zero_based=True,\n                 multinomial_treatment=Continuize.Indicators,\n                 continuous_treatment=Continuize.Leave,\n                 class_treatment=Continuize.Leave):\n        self.zero_based = zero_based\n        self.multinomial_treatment = multinomial_treatment\n        self.continuous_treatment = continuous_treatment\n        self.class_treatment = class_treatment\n\n    def __call__(self, data):\n        treat = self.multinomial_treatment\n        if isinstance(data, Orange.data.Domain):\n            domain, data = data, None\n        else:\n            domain = data.domain\n\n        if (treat == Continuize.ReportError and\n                any(var.is_discrete and len(var.values) > 2 for var in domain)):\n            raise ValueError(\"Domain has multinomial attributes\")\n\n        newdomain = continuize_domain(\n            data or domain,\n            self.multinomial_treatment,\n            self.continuous_treatment,\n            self.class_treatment,\n            self.zero_based\n        )\n        return newdomain\n\n\nif __name__ == \"__main__\":  # pragma: no cover\n    WidgetPreview(OWContinuize).run(Table(\"lenses\"))\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**: Status Bar Does Not Reset Summaries When Input Data Is Cleared

**Description**:
When the input data is set to `None`, the status bar fails to update the input and output summaries, leaving outdated information displayed.

**Example Code**:
```python
data = Table("iris")
# Initially setting data, summaries should display the number of data instances
widget.info.set_input_summary(len(data))
widget.info.set_output_summary(len(data))

# Clearing the data
widget.setData(None)
```

**Expected Behavior**:
After clearing the input data, the status bar should display "No Input" and "No Output" summaries to reflect the absence of data.

**Actual Behavior**:
The status bar continues to show the previous input and output summaries instead of resetting them, leading to confusion about the current state of the data.

[/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/data/owcontinuize.py
from functools import reduce

from AnyQt.QtCore import Qt

import Orange.data
from Orange.util import Reprable
from Orange.statistics import distribution
from Orange.preprocess import Continuize, Normalize
from Orange.preprocess.transformation import \
    Identity, Indicator, Indicator1, Normalizer
from Orange.data.table import Table
from Orange.widgets import gui, widget
from Orange.widgets.settings import Setting
from Orange.widgets.utils.sql import check_sql_input
from Orange.widgets.utils.widgetpreview import WidgetPreview
from Orange.widgets.widget import Input, Output


class OWContinuize(widget.OWWidget):
    name = "Continuize"
    description = ("Transform categorical attributes into numeric and, " +
                   "optionally, normalize numeric values.")
    icon = "icons/Continuize.svg"
    category = "Data"
    keywords = []

    class Inputs:
        data = Input("Data", Orange.data.Table)

    class Outputs:
        data = Output("Data", Orange.data.Table)

    want_main_area = False
    buttons_area_orientation = Qt.Vertical
    resizing_enabled = False

    multinomial_treatment = Setting(0)
    zero_based = Setting(1)
    continuous_treatment = Setting(0)
    class_treatment = Setting(0)

    transform_class = Setting(False)

    autosend = Setting(True)

    multinomial_treats = (
        ("First value as base", Continuize.FirstAsBase),
        ("Most frequent value as base", Continuize.FrequentAsBase),
        ("One attribute per value", Continuize.Indicators),
        ("Ignore multinomial attributes", Continuize.RemoveMultinomial),
        ("Remove categorical attributes", Continuize.Remove),
        ("Treat as ordinal", Continuize.AsOrdinal),
        ("Divide by number of values", Continuize.AsNormalizedOrdinal))

    continuous_treats = (
        ("Leave them as they are", Continuize.Leave),
        ("Normalize by span", Normalize.NormalizeBySpan),
        ("Normalize by standard deviation", Normalize.NormalizeBySD))

    class_treats = (
        ("Leave it as it is", Continuize.Leave),
        ("Treat as ordinal", Continuize.AsOrdinal),
        ("Divide by number of values", Continuize.AsNormalizedOrdinal),
        ("One class per value", Continuize.Indicators),
    )

    value_ranges = ["From -1 to 1", "From 0 to 1"]

    def __init__(self):
        super().__init__()

        box = gui.vBox(self.controlArea, "Categorical Features")
        gui.radioButtonsInBox(
            box, self, "multinomial_treatment",
            btnLabels=[x[0] for x in self.multinomial_treats],
            callback=self.settings_changed)

        box = gui.vBox(self.controlArea, "Numeric Features")
        gui.radioButtonsInBox(
            box, self, "continuous_treatment",
            btnLabels=[x[0] for x in self.continuous_treats],
            callback=self.settings_changed)

        box = gui.vBox(self.controlArea, "Categorical Outcomes")
        gui.radioButtonsInBox(
            box, self, "class_treatment",
            btnLabels=[t[0] for t in self.class_treats],
            callback=self.settings_changed)

        zbbox = gui.vBox(self.controlArea, "Value Range")

        gui.radioButtonsInBox(
            zbbox, self, "zero_based",
            btnLabels=self.value_ranges,
            callback=self.settings_changed)

        gui.auto_apply(self.buttonsArea, self, "autosend", box=False)

        self.data = None

    def settings_changed(self):
        self.commit()

    @Inputs.data
    @check_sql_input
    def setData(self, data):
        self.data = data
        if data is None:
            self.Outputs.data.send(None)
        else:
            self.unconditional_commit()

    def constructContinuizer(self):
        conzer = DomainContinuizer(
            zero_based=self.zero_based,
            multinomial_treatment=self.multinomial_treats[self.multinomial_treatment][1],
            continuous_treatment=self.continuous_treats[self.continuous_treatment][1],
            class_treatment=self.class_treats[self.class_treatment][1]
        )
        return conzer

    # def sendPreprocessor(self):
    #     continuizer = self.constructContinuizer()
    #     self.send("Preprocessor", PreprocessedLearner(
    #         lambda data, weightId=0, tc=(self.targetValue if self.classTreatment else -1):
    #             Table(continuizer(data, weightId, tc)
    #                 if data.domain.has_discrete_class
    #                 else continuizer(data, weightId), data)))

    def commit(self):
        continuizer = self.constructContinuizer()
        if self.data:
            domain = continuizer(self.data)
            data = self.data.transform(domain)
            self.Outputs.data.send(data)
        else:
            self.Outputs.data.send(self.data)  # None or empty data

    def send_report(self):
        self.report_items(
            "Settings",
            [("Categorical features",
              self.multinomial_treats[self.multinomial_treatment][0]),
             ("Numeric features",
              self.continuous_treats[self.continuous_treatment][0]),
             ("Class", self.class_treats[self.class_treatment][0]),
             ("Value range", self.value_ranges[self.zero_based])])


class WeightedIndicator(Indicator):
    def __init__(self, variable, value, weight=1.0):
        super().__init__(variable, value)
        self.weight = weight

    def transform(self, c):
        t = super().transform(c) * self.weight
        if self.weight != 1.0:
            t *= self.weight
        return t


class WeightedIndicator1(Indicator1):
    def __init__(self, variable, value, weight=1.0):
        super().__init__(variable, value)
        self.weight = weight

    def transform(self, c):
        t = super().transform(c) * self.weight
        if self.weight != 1.0:
            t *= self.weight
        return t


def make_indicator_var(source, value_ind, weight=None, zero_based=True):
    if zero_based and weight is None:
        indicator = Indicator(source, value=value_ind)
    elif zero_based:
        indicator = WeightedIndicator(source, value=value_ind, weight=weight)
    elif weight is None:
        indicator = Indicator1(source, value=value_ind)
    else:
        indicator = WeightedIndicator1(source, value=value_ind, weight=weight)
    return Orange.data.ContinuousVariable(
        "{}={}".format(source.name, source.values[value_ind]),
        compute_value=indicator
    )


def dummy_coding(var, base_value=0, zero_based=True):
    N = len(var.values)
    return [make_indicator_var(var, i, zero_based=zero_based)
            for i in range(N) if i != base_value]


def one_hot_coding(var, zero_based=True):
    N = len(var.values)
    return [make_indicator_var(var, i, zero_based=zero_based)
            for i in range(N)]


def continuize_domain(data_or_domain,
                      multinomial_treatment=Continuize.Indicators,
                      continuous_treatment=Continuize.Leave,
                      class_treatment=Continuize.Leave,
                      zero_based=True):

    if isinstance(data_or_domain, Orange.data.Domain):
        data, domain = None, data_or_domain
    else:
        data, domain = data_or_domain, data_or_domain.domain

    def needs_dist(var, mtreat, ctreat):
        "Does the `var` need a distribution given specified flags"
        if var.is_discrete:
            return mtreat == Continuize.FrequentAsBase
        elif var.is_continuous:
            return ctreat != Continuize.Leave
        else:
            raise ValueError

    # Compute the column indices which need a distribution.
    attr_needs_dist = [needs_dist(var, multinomial_treatment,
                                  continuous_treatment)
                       for var in domain.attributes]
    cls_needs_dist = [needs_dist(var, class_treatment, Continuize.Leave)
                      for var in domain.class_vars]

    columns = [i for i, needs in enumerate(attr_needs_dist + cls_needs_dist)
               if needs]

    if columns:
        if data is None:
            raise TypeError("continuizer requires data")
        dist = distribution.get_distributions_for_columns(data, columns)
    else:
        dist = []

    dist_iter = iter(dist)

    newattrs = [continuize_var(var, next(dist_iter) if needs_dist else None,
                               multinomial_treatment, continuous_treatment,
                               zero_based)
                for var, needs_dist in zip(domain.attributes, attr_needs_dist)]

    newclass = [continuize_var(var,
                               next(dist_iter) if needs_dist else None,
                               class_treatment, Continuize.Remove,
                               zero_based)
                for var, needs_dist in zip(domain.class_vars, cls_needs_dist)]

    newattrs = reduce(list.__iadd__, newattrs, [])
    newclass = reduce(list.__iadd__, newclass, [])
    return Orange.data.Domain(newattrs, newclass, domain.metas)


def continuize_var(var,
                   data_or_dist=None,
                   multinomial_treatment=Continuize.Indicators,
                   continuous_treatment=Continuize.Leave,
                   zero_based=True):

    def continuize_continuous():
        if continuous_treatment == Normalize.NormalizeBySpan:
            return [normalize_by_span(var, data_or_dist, zero_based)]
        elif continuous_treatment == Normalize.NormalizeBySD:
            return [normalize_by_sd(var, data_or_dist)]
        else:
            return [var]

    def continuize_discrete():
        if len(var.values) > 2 and \
                multinomial_treatment == Continuize.ReportError:
            raise ValueError("{0.name} is a multinomial variable".format(var))
        if len(var.values) < 2 or \
                multinomial_treatment == Continuize.Remove or \
                (multinomial_treatment == Continuize.RemoveMultinomial
                 and len(var.values) > 2):
            return []
        elif multinomial_treatment == Continuize.AsOrdinal:
            return [ordinal_to_continuous(var)]
        elif multinomial_treatment == Continuize.AsNormalizedOrdinal:
            return [ordinal_to_norm_continuous(var, zero_based)]
        elif multinomial_treatment == Continuize.Indicators:
            return one_hot_coding(var, zero_based)
        elif multinomial_treatment in (
                Continuize.FirstAsBase, Continuize.RemoveMultinomial):
            return dummy_coding(var, zero_based=zero_based)
        elif multinomial_treatment == Continuize.FrequentAsBase:
            dist = _ensure_dist(var, data_or_dist)
            modus = dist.modus()
            return dummy_coding(var, base_value=modus, zero_based=zero_based)
        elif multinomial_treatment == Continuize.Leave:
            return [var]
        raise ValueError("Invalid value of `multinomial_treatment`")

    if var.is_continuous:
        return continuize_continuous()
    elif var.is_discrete:
        return continuize_discrete()
    raise TypeError("Non-primitive variables cannot be continuized")


def _ensure_dist(var, data_or_dist):
    if isinstance(data_or_dist, distribution.Discrete):
        if not var.is_discrete:
            raise TypeError
        return data_or_dist
    elif isinstance(data_or_dist, distribution.Continuous):
        if not var.is_continuous:
            raise TypeError
        return data_or_dist
    elif isinstance(data_or_dist, Orange.data.Storage):
        return distribution.get_distribution(data_or_dist, var)
    else:
        raise ValueError("Need a distribution or data.")


def normalized_var(var, translate, scale):
    return Orange.data.ContinuousVariable(var.name,
                                          compute_value=Normalizer(var, translate, scale))


def ordinal_to_continuous(var):
    return Orange.data.ContinuousVariable(var.name,
                                          compute_value=Identity(var))


def ordinal_to_norm_continuous(var, zero_based=True):
    n_values = len(var.values)
    if zero_based:
        return normalized_var(var, 0, 1 / (n_values - 1))
    else:
        return normalized_var(var, (n_values - 1) / 2, 2 / (n_values - 1))


def normalize_by_span(var, data_or_dist, zero_based=True):
    dist = _ensure_dist(var, data_or_dist)
    if dist.shape[1] > 0:
        v_max, v_min = dist.max(), dist.min()
    else:
        v_max, v_min = 0, 0
    span = (v_max - v_min)
    if span < 1e-15:
        span = 1

    if zero_based:
        return normalized_var(var, v_min, 1 / span)
    else:
        return normalized_var(var, (v_min + v_max) / 2, 2 / span)


def normalize_by_sd(var, data_or_dist):
    dist = _ensure_dist(var, data_or_dist)
    if dist.shape[1] > 0:
        mean, sd = dist.mean(), dist.standard_deviation()
    else:
        mean, sd = 0, 1
    sd = sd if sd > 1e-10 else 1
    return normalized_var(var, mean, 1 / sd)


class DomainContinuizer(Reprable):
    def __init__(self, zero_based=True,
                 multinomial_treatment=Continuize.Indicators,
                 continuous_treatment=Continuize.Leave,
                 class_treatment=Continuize.Leave):
        self.zero_based = zero_based
        self.multinomial_treatment = multinomial_treatment
        self.continuous_treatment = continuous_treatment
        self.class_treatment = class_treatment

    def __call__(self, data):
        treat = self.multinomial_treatment
        if isinstance(data, Orange.data.Domain):
            domain, data = data, None
        else:
            domain = data.domain

        if (treat == Continuize.ReportError and
                any(var.is_discrete and len(var.values) > 2 for var in domain)):
            raise ValueError("Domain has multinomial attributes")

        newdomain = continuize_domain(
            data or domain,
            self.multinomial_treatment,
            self.continuous_treatment,
            self.class_treatment,
            self.zero_based
        )
        return newdomain


if __name__ == "__main__":  # pragma: no cover
    WidgetPreview(OWContinuize).run(Table("lenses"))

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