diff --git a/assets/course_data_format.html b/assets/course_data_format.html index 686579221d16c611799f2d3d3de7034878947ae7..59a308599b718ef461a3a08c1d8b296d39541ac0 100644 --- a/assets/course_data_format.html +++ b/assets/course_data_format.html @@ -6,15 +6,20 @@ </head> <body> -<h1> What kind course_data_format.html of model, data, or instance can I upload ? </h1> +<h1> Data format requirements</h1> -<h2> What is the option to add information on model ? </h2> +<h2> An option to add information on model </h2> <h3> Why ? </h3> -<p> There is a switch button, you can use it when you want to attach the csv you trained your model on or a feature mapping. This is useful when you didn't dump the features names in your pkl of model but still wants them to show up, or when the values are categorical. +<p> There is a switch button, you can use it when you want to attach the csv you trained your model on or a feature mapping. This is useful when the values are categorical. </p> + <h3> How ? </h3> +<p> If you decide to upload the dataset, it should be a .csv. +If you decide to upload the feature mapping, it is a .txt file. +</p> + <h2> What kind of model can I upload ? </h2> <p> You can only import .pkl models.</p> diff --git a/callbacks.py b/callbacks.py index 18c46c5be617a681f43bb20e37006203dff82e5d..1ebc2a10a97e52ba95bcac967d0ac8ac2933cbf6 100644 --- a/callbacks.py +++ b/callbacks.py @@ -37,12 +37,31 @@ def register_callbacks(page_home, page_course, page_application, app): def update_ml_type_options(value_ml_model): model_application = page_application.model model_application.update_ml_model(value_ml_model) - return model_application.solvers, model_application.solvers[0], model_application.xtypes, [list(model_application.xtypes.keys())[0]] + return model_application.solvers, model_application.solvers[0], model_application.xtypes, [ + list(model_application.xtypes.keys())[0]] + + @app.callback(Output('pretrained_model_filename', 'children'), + Input('ml_pretrained_model_choice', 'filename'), + prevent_initial_call=True + ) + def update_model_prertrained_name(pretrained_model_filename): + return pretrained_model_filename + + @app.callback(Output('info_filename', 'children'), + Input('model_info_choice', 'filename'), + prevent_initial_call=True + ) + def update_model_info_filename(model_info_filename): + return model_info_filename + + @app.callback(Output('instance_filename', 'children'), + Input('ml_instance_choice', 'filename'), + prevent_initial_call=True + ) + def update_instance_filename(instance_filename): + return instance_filename @app.callback( - Output('pretrained_model_filename', 'children'), - Output('info_filename', 'children'), - Output('instance_filename', 'children'), Output('graph', 'children'), Output('explanation', 'children'), Input('ml_model_choice', 'value'), @@ -70,7 +89,7 @@ def register_callbacks(page_home, page_course, page_application, app): # Choice of model if ihm_id == 'ml_model_choice': model_application.update_ml_model(value_ml_model) - return None, None, None, None, None + return None, None # Choice of pkl pretrained model elif ihm_id == 'ml_pretrained_model_choice': @@ -80,17 +99,22 @@ def register_callbacks(page_home, page_course, page_application, app): model_application.update_pretrained_model(graph) if not model_application.add_info: model_application.update_pretrained_model_layout() - return pretrained_model_filename, None, None, model_application.component.network, None + return model_application.component.network, None else: - return pretrained_model_filename, None, None, None, None + if model_application.model_info is None: + raise PreventUpdate + model_application.update_pretrained_model_layout_with_info(model_application.model_info, + model_info_filename) + return model_application.component.network, None # Choice of information for the model elif ihm_id == 'model_info_choice': - if model_application.ml_model is None: - raise PreventUpdate model_info = parse_contents_data(model_info, model_info_filename) + model_application.model_info = model_info + if model_application.ml_model is None or model_application.pretrained_model is None: + raise PreventUpdate model_application.update_pretrained_model_layout_with_info(model_info, model_info_filename) - return pretrained_model_filename, model_info_filename, None, model_application.component.network, None + return model_application.component.network, None # Choice of instance to explain elif ihm_id == 'ml_instance_choice': @@ -98,50 +122,42 @@ def register_callbacks(page_home, page_course, page_application, app): raise PreventUpdate instance = parse_contents_instance(instance_contents, instance_filename) model_application.update_instance(instance) - return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation + return model_application.component.network, model_application.component.explanation - # Choice of number of expls + # Choice of number of expls elif ihm_id == 'number_explanations': - if model_application.ml_model is None or model_application.pretrained_model is None or len( - model_application.instance) == 0 or model_application.xtype is None: + if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.solver is None or model_application.xtype is None: raise PreventUpdate model_application.update_enum(enum) - return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation + return model_application.component.network, model_application.component.explanation - # Choice of AxP or CxP + # Choice of AxP or CxP elif ihm_id == 'explanation_type': - if model_application.ml_model is None or model_application.pretrained_model is None or len( - model_application.instance) == 0 or model_application.enum <= 0: + if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.solver is None: raise PreventUpdate model_application.update_xtype(xtype) - return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation + return model_application.component.network, model_application.component.explanation # Choice of solver elif ihm_id == 'solver_sat': - if model_application.ml_model is None or model_application.pretrained_model is None or len( - model_application.instance) == 0 or model_application.enum <= 0 or len( - model_application.xtype) == 0: + if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.xtype is None: raise PreventUpdate model_application.update_solver(solver) - return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation + return model_application.component.network, model_application.component.explanation - # Choice of AxP to draw + # Choice of AxP to draw elif ihm_id == 'expl_choice': - if model_application.ml_model is None or model_application.pretrained_model is None or len( - model_application.instance) == 0 or model_application.enum <= 0 or len( - model_application.xtype) == 0: + if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.xtype is None: raise PreventUpdate model_application.update_expl(expl_choice) - return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation + return model_application.component.network, model_application.component.explanation - # Choice of CxP to draw + # Choice of CxP to draw elif ihm_id == 'cont_expl_choice': - if model_application.ml_model is None or model_application.pretrained_model is None or len( - model_application.instance) == 0 or model_application.enum <= 0 or len( - model_application.xtype) == 0: + if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.xtype is None: raise PreventUpdate model_application.update_cont_expl(cont_expl_choice) - return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation + return model_application.component.network, model_application.component.explanation @app.callback( Output('explanation', 'hidden'), diff --git a/pages/application/DecisionTree/DecisionTreeComponent.py b/pages/application/DecisionTree/DecisionTreeComponent.py index c177652e7f2be781a7b1bdba4bccb94bec80e34d..edb89a4d4c0a863ee9cfe80c6a35b28745038eca 100644 --- a/pages/application/DecisionTree/DecisionTreeComponent.py +++ b/pages/application/DecisionTree/DecisionTreeComponent.py @@ -119,6 +119,7 @@ class DecisionTreeComponent(): instance_translated = self.translate_instance(instance) self.explanation = [] list_explanations_path = [] + list_contrastive_explanations_path = [] explanation = self.dt.explain(instance_translated, enum=enum, xtype=xtype, solver=solver) dot_source = visualize_instance(self.dt, instance_translated) diff --git a/pages/application/application.py b/pages/application/application.py index 84ffdd5b2db368a22794ba2be29a6bf6246ebc85..d08f756289f0ef0a550344be6efd0a42e1b679e7 100644 --- a/pages/application/application.py +++ b/pages/application/application.py @@ -18,31 +18,31 @@ class Model(): self.dic_xtypes = dic_xtypes self.ml_models = names_models - self.ml_model = '' + self.ml_model = None - self.pretrained_model = '' + self.pretrained_model = None self.add_info = False - self.model_info = '' + self.model_info = None self.enum = 1 self.xtypes = [] - self.xtype = "" + self.xtype = None self.solvers = [] - self.solver = "" + self.solver = None - self.instance = '' + self.instance = None self.list_expls = [] self.list_cont_expls = [] - self.expl = '' - self.cont_expl = '' + self.expl = None + self.cont_expl = None - self.component_class = '' - self.component = '' + self.component_class = None + self.component = None def update_ml_model(self, ml_model_update): self.ml_model = ml_model_update