Skip to content
Snippets Groups Projects
Commit 468a8b64 authored by Caroline DE POURTALES's avatar Caroline DE POURTALES
Browse files

changing for uploading file

parent 023d2ef5
No related branches found
No related tags found
No related merge requests found
Showing
with 62 additions and 68 deletions
......@@ -4,10 +4,16 @@ import dash
import json
from dash import dcc
from dash import html
from dash import dcc, html, Input, Output
from dash import dcc, html, Input, Output, State
import dash_bootstrap_components as dbc
from dash.exceptions import PreventUpdate
from pages.application.layout_application import Model, View
from utils import parse_contents_instance, parse_contents_tree, extract_data
import base64
import io
import pandas as pd
'''
Loading data
......@@ -18,13 +24,11 @@ data = json.load(models_data)["data"]
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
'''
Construction of the layout
'''
model = Model(data)
names_models, dict_components = extract_data(data)
model = Model(names_models, dict_components)
view = View(model)
tabs = dcc.Tabs([
dcc.Tab(label='Course on Explainable AI', children=[]),
......@@ -36,48 +40,66 @@ app.layout = html.Div([
tabs])
'''
Callback for the app
'''
@app.callback(
Output('ml_datasets_choice', 'options'),
Output('ml_instances_choice', 'options'),
Output('tree_filename', 'children'),
Output('instance_filename', 'children'),
Output('graph', 'children'),
Output('explanation', 'children'),
Input('ml_model_choice', 'value'),
Input('ml_datasets_choice', 'value'),
Input('ml_instances_choice', 'value'),
Input('ml_dataset_choice', 'contents'),
Input('ml_instance_choice', 'contents'),
Input('number_explanations', 'value'),
Input('explanation_type', 'value'),
Input('solver_sat', 'value'),
State('ml_dataset_choice', 'filename'),
State('ml_instance_choice', 'filename'),
prevent_initial_call=True
)
def update_ml_type(value_ml_model, value_dataset, value_instance):
def update_ml_type(value_ml_model, dataset_contents, instance_contents, enum, xtype, solver, dataset_filename, instance_filename):
ctx = dash.callback_context
if ctx.triggered:
dropdown_id = ctx.triggered[0]['prop_id'].split('.')[0]
if dropdown_id == 'ml_model_choice' :
ihm_id = ctx.triggered[0]['prop_id'].split('.')[0]
if ihm_id == 'ml_model_choice' :
model.update_ml_model(value_ml_model)
return model.datasets, [], "", ""
elif dropdown_id == 'ml_datasets_choice':
model.update_dataset(value_dataset)
view.update_dataset()
return model.datasets, model.instances, view.component.network, ""
elif dropdown_id == 'ml_instances_choice' :
model.update_instance(value_instance)
view.update_instance()
return model.datasets, model.instances, view.component.network, view.component.explanation
return dataset_filename, instance_filename, "", ""
elif ihm_id == 'ml_dataset_choice':
if value_ml_model == None :
raise PreventUpdate
tree = parse_contents_tree(dataset_contents, dataset_filename)
model.update_dataset(tree)
return dataset_filename, instance_filename, model.component.network, ""
elif ihm_id == 'ml_instance_choice' :
if value_ml_model == None or dataset_contents == None or enum == None or xtype==None:
raise PreventUpdate
instance = parse_contents_instance(instance_contents, instance_filename)
model.update_instance(instance, enum, xtype)
return dataset_filename, instance_filename, model.component.network, model.component.explanation
elif ihm_id == 'number_explanations' :
if value_ml_model == None or dataset_contents == None or instance_contents == None or xtype==None:
raise PreventUpdate
instance = parse_contents_instance(instance_contents, instance_filename)
model.update_instance(instance, enum, xtype)
return dataset_filename, instance_filename, model.component.network, model.component.explanation
elif ihm_id == 'explanation_type' :
if value_ml_model == None or dataset_contents == None or instance_contents == None or enum == None :
raise PreventUpdate
instance = parse_contents_instance(instance_contents, instance_filename)
model.update_instance(instance, enum, xtype)
return dataset_filename, instance_filename, model.component.network, model.component.explanation
elif ihm_id == 'solver_sat' :
if value_ml_model == None or dataset_contents == None or instance_contents == None or enum == None or xtype == None:
raise PreventUpdate
instance = parse_contents_instance(instance_contents, instance_filename)
model.update_instance(instance, enum, xtype, solver=solver)
return dataset_filename, instance_filename, model.component.network, model.component.explanation
......
......@@ -3,16 +3,10 @@
[
{
"ml_type" : "DecisionTree",
"trained_models" : "pages/application/DecisionTree/trained_models",
"instances" : "pages/application/DecisionTree/instances/",
"map" : "pages/application/DecisionTree/map/",
"component" : "DecisionTreeComponent"
},
{
"ml_type" : "NaiveBayes",
"trained_models" : "pages/application/NaiveBayes/trained_models",
"instances" : "pages/application/NaiveBayes/instances/",
"map" : "pages/application/NaiveBayes/map/",
"component" : "NaiveBayesComponent"
}
]
......
......@@ -8,13 +8,9 @@ from os import path
class DecisionTreeComponent():
def __init__(self, dataset):
def __init__(self, tree):
map = "pages/application/DecisionTree/map/"+ dataset + "/" + dataset + ".map"
if path.exists(map) :
self.dt = DecisionTree(from_file = "pages/application/DecisionTree/trained_models/"+dataset+'/'+dataset+".dt", mapfile = map)
else :
self.dt = DecisionTree(from_file = "pages/application/DecisionTree/trained_models/"+dataset+'/'+dataset+".dt")
self.dt = DecisionTree(from_string = tree)
dot_source = visualize(self.dt)
......@@ -29,13 +25,12 @@ class DecisionTreeComponent():
"background-color": "#f8f9fa",
})
def update_with_explicability(self, dataset, instance) :
instance = open("pages/application/DecisionTree/instances/"+ dataset + "/" + instance, "r")
instance = str(instance.read()).strip().split(',')
def update_with_explicability(self, instance, enum, xtype, solver) :
instance = str(instance).strip().split(',')
dot_source = visualize_instance(self.dt, instance)
self.network = dash_interactive_graphviz.DashInteractiveGraphviz(
dot_source=dot_source
)
self.explanation.value = self.dt.explain(instance)
self.explanation.value = self.dt.explain(instance, enum=enum, xtype = xtype, solver=solver)
1,77,125,5,1,11,215,1,1,19,1,1,259,31
\ No newline at end of file
1,93,207,1,23,11,159,0,0,11,1,1,119,57
\ No newline at end of file
0,19,407,1,3,1,79,1,1,41,0,1,119,107
\ No newline at end of file
1,277,205,1,11,11,39,0,1,25,1,1,109,313
\ No newline at end of file
1,693,183,1,19,9,169,0,1,25,0,1,163,127
\ No newline at end of file
1,367,397,1,1,11,67,0,0,11,1,1,27,325
\ No newline at end of file
0,601,19,5,21,13,21,0,0,11,1,1,101,459
\ No newline at end of file
1,587,407,1,23,13,131,1,1,23,0,1,119,479
\ No newline at end of file
1,559,327,1,23,11,49,1,0,11,0,1,213,325
\ No newline at end of file
1,603,47,1,21,11,35,0,0,11,1,1,59,423
\ No newline at end of file
1,403,205,5,1,11,61,0,0,11,1,1,327,325
\ No newline at end of file
0,389,205,1,25,13,239,1,1,25,0,1,239,185
\ No newline at end of file
1,501,225,1,9,11,123,1,1,41,0,1,251,51
\ No newline at end of file
0,505,293,5,13,11,203,0,0,11,0,1,97,325
\ No newline at end of file
1,221,65,1,1,11,159,1,0,11,1,1,251,325
\ No newline at end of file
1,39,253,1,7,11,195,0,0,11,0,1,27,325
\ No newline at end of file
1,417,119,1,3,1,79,0,0,11,0,1,119,35
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment