1import sys
2
3from AnyQt.QtWidgets import QSizePolicy
4
5from orangecontrib.datafusion.models import Relation
6from Orange.widgets import widget, gui, settings
7from Orange.widgets.widget import OWWidget, Input, Output
8from orangecontrib.datafusion import movielens
9
10from skfusion import fusion
11
12
13class OWIMDbActors(OWWidget):
14    name = "IMDb Actors"
15    description = "Construct a movie-actor and actor-actor relation matrix."
16    priority = 80000
17    icon = "icons/IMDbActors.svg"
18    want_main_area = False
19    resizing_enabled = False
20
21    class Inputs:
22        filter = Input("Filter", Relation)
23
24    class Outputs:
25        movie_actors = Output("Movie Actors", Relation)
26        actors_actors = Output("Costarring Actors", Relation)
27
28    percent = settings.Setting(10)
29
30    def __init__(self):
31        super().__init__()
32        self.movies = None
33        self.infobox = gui.widgetBox(self.controlArea, "Select Actors")
34
35        percent = gui.hSlider(
36            gui.indentedBox(self.infobox), self, "percent",
37            minValue=1, maxValue=100, step=1, ticks=10, labelFormat="%d %%")
38
39        gui.button(self.controlArea, self, "&Apply",
40                   callback=self.send_output, default=True)
41
42        self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
43
44        self.setMinimumWidth(250)
45        self.setMaximumWidth(250)
46
47        self.movies = None
48
49    @Inputs.filter
50    def set_data(self, relation):
51        if relation is not None:
52            assert isinstance(relation, Relation)
53            if relation.col_type == movielens.ObjectType.Movies:
54                self.movies = relation.relation.col_names
55            elif relation.row_type == movielens.ObjectType.Movies:
56                self.movies = relation.relation.row_names
57            else:
58                self.error(1, "Only relations with ObjectType Movies can be used to filter actors.")
59
60            self.send_output()
61
62    def send_output(self):
63        if self.movies is not None:
64            movie_actor_mat, actors = movielens.movie_concept_matrix(self.movies, concept="actor",
65                                                                     actors=self.percent)
66            actor_actor_mat = movielens.actor_matrix(movie_actor_mat)
67
68            movies_actors = fusion.Relation(movie_actor_mat.T, name='play in',
69                                            row_type=movielens.ObjectType.Actors, row_names=actors,
70                                            col_type=movielens.ObjectType.Movies, col_names=self.movies)
71            self.Outputs.movie_actors.send(Relation(movies_actors))
72
73            actors_actors = fusion.Relation(actor_actor_mat, name='costar with',
74                                            row_type=movielens.ObjectType.Actors, row_names=actors,
75                                            col_type=movielens.ObjectType.Actors, col_names=actors)
76            self.Outputs.actors_actors.send(Relation(actors_actors))
77
78
79if __name__ == "__main__":
80    from AnyQt.QtWidgets import QApplication
81    app = QApplication(sys.argv)
82    ow = OWIMDbActors()
83    # ow.set_data(movies_users)
84    ow.show()
85    app.exec_()
86