|
19 | 19 |
|
20 | 20 | from Orange.widgets.utils.localization import pl |
21 | 21 | from orangewidget.utils.itemmodels import PyListModel |
| 22 | +from orangewidget.utils.signals import LazyValue |
22 | 23 |
|
23 | 24 | import Orange.data |
24 | 25 | from Orange.data.domain import filter_visible |
25 | 26 | from Orange.data import Domain, DiscreteVariable, ContinuousVariable, \ |
26 | | - StringVariable |
| 27 | + StringVariable, Table |
27 | 28 | import Orange.misc |
28 | 29 | from Orange.clustering.hierarchical import \ |
29 | 30 | postorder, preorder, Tree, tree_from_linkage, dist_matrix_linkage, \ |
|
32 | 33 |
|
33 | 34 | from Orange.widgets import widget, gui, settings |
34 | 35 | from Orange.widgets.utils import itemmodels, combobox |
35 | | -from Orange.widgets.utils.annotated_data import (create_annotated_table, |
36 | | - ANNOTATED_DATA_SIGNAL_NAME) |
| 36 | +from Orange.widgets.utils.annotated_data import (lazy_annotated_table, |
| 37 | + ANNOTATED_DATA_SIGNAL_NAME, |
| 38 | + domain_with_annotation_column, |
| 39 | + add_columns, |
| 40 | + create_annotated_table) |
37 | 41 | from Orange.widgets.utils.widgetpreview import WidgetPreview |
38 | 42 | from Orange.widgets.visualize.utils.plotutils import AxisItem |
39 | 43 | from Orange.widgets.widget import Input, Output, Msg |
@@ -776,71 +780,73 @@ def commit(self): |
776 | 780 | for node in selection] |
777 | 781 |
|
778 | 782 | selected_indices = list(chain(*maps)) |
779 | | - unselected_indices = sorted(set(range(self.root.value.last)) - |
780 | | - set(selected_indices)) |
781 | 783 |
|
782 | 784 | if not selected_indices: |
783 | 785 | self.Outputs.selected_data.send(None) |
784 | | - annotated_data = create_annotated_table(items, []) \ |
| 786 | + annotated_data = lazy_annotated_table(items, []) \ |
785 | 787 | if self.selection_method == 0 and self.matrix.axis else None |
786 | 788 | self.Outputs.annotated_data.send(annotated_data) |
787 | 789 | return |
788 | 790 |
|
789 | | - selected_data = None |
| 791 | + selected_data = annotated_data = None |
790 | 792 |
|
791 | 793 | if isinstance(items, Orange.data.Table) and self.matrix.axis == 1: |
792 | 794 | # Select rows |
793 | | - c = np.zeros(self.matrix.shape[0]) |
| 795 | + data, domain = items, items.domain |
794 | 796 |
|
| 797 | + c = np.full(self.matrix.shape[0], len(maps)) |
795 | 798 | for i, indices in enumerate(maps): |
796 | 799 | c[indices] = i |
797 | | - c[unselected_indices] = len(maps) |
798 | | - |
799 | | - mask = c != len(maps) |
800 | | - |
801 | | - data, domain = items, items.domain |
802 | | - attrs = domain.attributes |
803 | | - classes = domain.class_vars |
804 | | - metas = domain.metas |
805 | 800 |
|
806 | | - var_name = get_unique_names(domain, "Cluster") |
| 801 | + clust_name = get_unique_names(domain, "Cluster") |
807 | 802 | values = [f"C{i + 1}" for i in range(len(maps))] |
808 | 803 |
|
809 | | - clust_var = Orange.data.DiscreteVariable( |
810 | | - var_name, values=values + ["Other"]) |
811 | | - domain = Orange.data.Domain(attrs, classes, metas + (clust_var,)) |
812 | | - data = items.transform(domain) |
813 | | - with data.unlocked(data.metas): |
814 | | - data.set_column(clust_var, c) |
815 | | - |
816 | | - if selected_indices: |
817 | | - selected_data = data[mask] |
818 | | - clust_var = Orange.data.DiscreteVariable( |
819 | | - var_name, values=values) |
820 | | - selected_data.domain = Domain( |
821 | | - attrs, classes, metas + (clust_var, )) |
822 | | - |
823 | | - annotated_data = create_annotated_table(data, selected_indices) |
| 804 | + sel_clust_var = Orange.data.DiscreteVariable( |
| 805 | + name=clust_name, values=values) |
| 806 | + sel_domain = add_columns(domain, metas=(sel_clust_var,)) |
| 807 | + selected_data = LazyValue[Table]( |
| 808 | + lambda: items.add_column( |
| 809 | + sel_clust_var, c, to_metas=True)[c != len(maps)], |
| 810 | + domain=sel_domain, length=len(selected_indices)) |
| 811 | + |
| 812 | + ann_clust_var = Orange.data.DiscreteVariable( |
| 813 | + name=clust_name, values=values + ["Other"] |
| 814 | + ) |
| 815 | + ann_domain = add_columns( |
| 816 | + domain_with_annotation_column(data)[0], metas=(ann_clust_var, )) |
| 817 | + annotated_data = LazyValue[Table]( |
| 818 | + lambda: create_annotated_table( |
| 819 | + data=items.add_column(ann_clust_var, c, to_metas=True), |
| 820 | + selected_indices=selected_indices), |
| 821 | + domain=ann_domain, length=len(items) |
| 822 | + ) |
824 | 823 |
|
825 | 824 | elif isinstance(items, Orange.data.Table) and self.matrix.axis == 0: |
826 | 825 | # Select columns |
827 | 826 | attrs = [] |
| 827 | + unselected_indices = sorted(set(range(self.root.value.last)) - |
| 828 | + set(selected_indices)) |
828 | 829 | for clust, indices in chain(enumerate(maps, start=1), |
829 | 830 | [(0, unselected_indices)]): |
830 | 831 | for i in indices: |
831 | 832 | attr = items.domain[i].copy() |
832 | 833 | attr.attributes["cluster"] = clust |
833 | 834 | attrs.append(attr) |
834 | | - domain = Orange.data.Domain( |
| 835 | + all_domain = Orange.data.Domain( |
835 | 836 | # len(unselected_indices) can be 0 |
836 | 837 | attrs[:len(attrs) - len(unselected_indices)], |
837 | 838 | items.domain.class_vars, items.domain.metas) |
838 | | - selected_data = items.from_table(domain, items) |
839 | 839 |
|
840 | | - domain = Orange.data.Domain( |
| 840 | + selected_data = LazyValue[Table]( |
| 841 | + lambda: items.from_table(all_domain, items), |
| 842 | + domain=all_domain, length=len(items)) |
| 843 | + |
| 844 | + sel_domain = Orange.data.Domain( |
841 | 845 | attrs, |
842 | 846 | items.domain.class_vars, items.domain.metas) |
843 | | - annotated_data = items.from_table(domain, items) |
| 847 | + annotated_data = LazyValue[Table]( |
| 848 | + lambda: items.from_table(sel_domain, items), |
| 849 | + domain=sel_domain, length=len(items)) |
844 | 850 |
|
845 | 851 | self.Outputs.selected_data.send(selected_data) |
846 | 852 | self.Outputs.annotated_data.send(annotated_data) |
|
0 commit comments