From 1aa13a644d540098cefb581d41aae73d766207e1 Mon Sep 17 00:00:00 2001 From: Ali Abid Date: Thu, 11 Jun 2020 08:02:37 -0700 Subject: [PATCH] multiple io/fn --- build/lib/gradio/interface.py | 4 ++++ build/lib/gradio/networking.py | 12 ++++++++---- build/lib/gradio/static/css/gradio.css | 15 +++++++++------ build/lib/gradio/static/js/load_interfaces.js | 3 +++ demo/flip_image.py | 11 +++++++++-- dist/gradio-0.9.0-py3.7.egg | Bin 1769284 -> 1769549 bytes gradio/interface.py | 4 ++++ gradio/networking.py | 12 ++++++++---- gradio/static/css/gradio.css | 15 +++++++++------ gradio/static/js/load_interfaces.js | 3 +++ 10 files changed, 57 insertions(+), 22 deletions(-) diff --git a/build/lib/gradio/interface.py b/build/lib/gradio/interface.py index 4a06b54fc9..4e625bd903 100644 --- a/build/lib/gradio/interface.py +++ b/build/lib/gradio/interface.py @@ -58,6 +58,9 @@ class Interface: self.output_interfaces = [get_output_instance(i) for i in outputs] else: self.output_interfaces = [get_output_instance(outputs)] + if not isinstance(fn, list): + fn = [fn] + self.output_interfaces *= len(fn) self.predict = fn self.verbose = verbose self.status = "OFF" @@ -71,6 +74,7 @@ class Interface: config = { "input_interfaces": [iface.__class__.__name__.lower() for iface in self.input_interfaces], "output_interfaces": [iface.__class__.__name__.lower() for iface in self.output_interfaces], + "function_count": len(self.predict), "live": self.live, "show_input": self.show_input, "show_output": self.show_output, diff --git a/build/lib/gradio/networking.py b/build/lib/gradio/networking.py index b6f3353d5d..c833c957ba 100644 --- a/build/lib/gradio/networking.py +++ b/build/lib/gradio/networking.py @@ -137,10 +137,14 @@ def serve_files_in_background(interface, port, directory_to_serve=None): msg = json.loads(data_string) raw_input = msg["data"] processed_input = [input_interface.preprocess(raw_input[i]) for i, input_interface in enumerate(interface.input_interfaces)] - prediction = interface.predict(*processed_input) - if len(interface.input_interfaces) == 1: - prediction = [prediction] - processed_output = [output_interface.postprocess(prediction[i]) for i, output_interface in enumerate(interface.output_interfaces)] + predictions = [] + for predict_fn in interface.predict: + prediction = predict_fn(*processed_input) + if len(interface.output_interfaces) == 1: + prediction = [prediction] + predictions.extend(prediction) + print(predictions) + processed_output = [output_interface.postprocess(predictions[i]) for i, output_interface in enumerate(interface.output_interfaces)] output = {"action": "output", "data": processed_output} if interface.saliency is not None: import numpy as np diff --git a/build/lib/gradio/static/css/gradio.css b/build/lib/gradio/static/css/gradio.css index 64119993f2..872608f9f9 100644 --- a/build/lib/gradio/static/css/gradio.css +++ b/build/lib/gradio/static/css/gradio.css @@ -12,15 +12,17 @@ text-transform: uppercase; font-family: Arial; color: #888; - padding: 6px; + padding: 6px 6px 0; font-size: 14px; font-weight: bold; display: flex; } +.input_interfaces, .output_interfaces { + margin-bottom: 16px; +} .interface { height: 360px; - margin-bottom: 16px; - padding: 0 6px 6px; + padding: 8px; display: flex; flex-flow: column; } @@ -33,6 +35,10 @@ } .panel_buttons { display: flex; + margin-left: -8px; +} +.panel_buttons > * { + margin-left: 8px; } .submit { display: none; @@ -58,9 +64,6 @@ padding: 8px !important; background-color: #EEEEEE !important; } -.clear, .flag { - margin-left: 8px; -} .upload_zone { font-weight: bold; diff --git a/build/lib/gradio/static/js/load_interfaces.js b/build/lib/gradio/static/js/load_interfaces.js index 66e04e8df7..181fba8818 100644 --- a/build/lib/gradio/static/js/load_interfaces.js +++ b/build/lib/gradio/static/js/load_interfaces.js @@ -41,6 +41,9 @@ $.getJSON("static/config.json", function(data) { _id++; } for (let i = 0; i < config["output_interfaces"].length; i++) { + if (i != 0 && i % (config["output_interfaces"].length / config.function_count) == 0) { + $(".output_interfaces").append("
"); + } output_interface = Object.create(output_to_object_map[ config["output_interfaces"][i]]); $(".output_interfaces").append(` diff --git a/demo/flip_image.py b/demo/flip_image.py index fc0beae0d8..78a0a7d669 100644 --- a/demo/flip_image.py +++ b/demo/flip_image.py @@ -1,7 +1,14 @@ import gradio as gr import numpy as np +from time import time def flip(image): - return np.flipud(image) + start = time() + return np.flipud(image), time() - start -gr.Interface(flip, "imagein", "image").launch() \ No newline at end of file +def flip2(image): + start = time() + return np.fliplr(image), time() - start + + +gr.Interface([flip, flip2], "imagein", ["image", "textbox"]).launch() \ No newline at end of file diff --git a/dist/gradio-0.9.0-py3.7.egg b/dist/gradio-0.9.0-py3.7.egg index 9f0b99790ac2d34bb1f95c8c15714fe031887c0b..c7cd52296317902d5c2890a0490fe7b77353c564 100644 GIT binary patch delta 17358 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 diff --git a/gradio/interface.py b/gradio/interface.py index 4a06b54fc9..4e625bd903 100644 --- a/gradio/interface.py +++ b/gradio/interface.py @@ -58,6 +58,9 @@ class Interface: self.output_interfaces = [get_output_instance(i) for i in outputs] else: self.output_interfaces = [get_output_instance(outputs)] + if not isinstance(fn, list): + fn = [fn] + self.output_interfaces *= len(fn) self.predict = fn self.verbose = verbose self.status = "OFF" @@ -71,6 +74,7 @@ class Interface: config = { "input_interfaces": [iface.__class__.__name__.lower() for iface in self.input_interfaces], "output_interfaces": [iface.__class__.__name__.lower() for iface in self.output_interfaces], + "function_count": len(self.predict), "live": self.live, "show_input": self.show_input, "show_output": self.show_output, diff --git a/gradio/networking.py b/gradio/networking.py index b6f3353d5d..c833c957ba 100644 --- a/gradio/networking.py +++ b/gradio/networking.py @@ -137,10 +137,14 @@ def serve_files_in_background(interface, port, directory_to_serve=None): msg = json.loads(data_string) raw_input = msg["data"] processed_input = [input_interface.preprocess(raw_input[i]) for i, input_interface in enumerate(interface.input_interfaces)] - prediction = interface.predict(*processed_input) - if len(interface.input_interfaces) == 1: - prediction = [prediction] - processed_output = [output_interface.postprocess(prediction[i]) for i, output_interface in enumerate(interface.output_interfaces)] + predictions = [] + for predict_fn in interface.predict: + prediction = predict_fn(*processed_input) + if len(interface.output_interfaces) == 1: + prediction = [prediction] + predictions.extend(prediction) + print(predictions) + processed_output = [output_interface.postprocess(predictions[i]) for i, output_interface in enumerate(interface.output_interfaces)] output = {"action": "output", "data": processed_output} if interface.saliency is not None: import numpy as np diff --git a/gradio/static/css/gradio.css b/gradio/static/css/gradio.css index 64119993f2..872608f9f9 100644 --- a/gradio/static/css/gradio.css +++ b/gradio/static/css/gradio.css @@ -12,15 +12,17 @@ text-transform: uppercase; font-family: Arial; color: #888; - padding: 6px; + padding: 6px 6px 0; font-size: 14px; font-weight: bold; display: flex; } +.input_interfaces, .output_interfaces { + margin-bottom: 16px; +} .interface { height: 360px; - margin-bottom: 16px; - padding: 0 6px 6px; + padding: 8px; display: flex; flex-flow: column; } @@ -33,6 +35,10 @@ } .panel_buttons { display: flex; + margin-left: -8px; +} +.panel_buttons > * { + margin-left: 8px; } .submit { display: none; @@ -58,9 +64,6 @@ padding: 8px !important; background-color: #EEEEEE !important; } -.clear, .flag { - margin-left: 8px; -} .upload_zone { font-weight: bold; diff --git a/gradio/static/js/load_interfaces.js b/gradio/static/js/load_interfaces.js index 66e04e8df7..181fba8818 100644 --- a/gradio/static/js/load_interfaces.js +++ b/gradio/static/js/load_interfaces.js @@ -41,6 +41,9 @@ $.getJSON("static/config.json", function(data) { _id++; } for (let i = 0; i < config["output_interfaces"].length; i++) { + if (i != 0 && i % (config["output_interfaces"].length / config.function_count) == 0) { + $(".output_interfaces").append("
"); + } output_interface = Object.create(output_to_object_map[ config["output_interfaces"][i]]); $(".output_interfaces").append(`