Example #1
0
    def __init__(self,
                 movie_dict=None,
                 act_set=None,
                 slot_set=None,
                 start_set=None,
                 params=None):
        """ Constructor shared by all user simulators """

        self.movie_dict = movie_dict
        self.act_set = act_set
        self.slot_set = slot_set
        self.start_set = start_set

        self.max_turn = params['max_turn']
        self.slot_err_probability = params['slot_err_probability']
        self.slot_err_mode = params['slot_err_mode']
        self.intent_err_probability = params['intent_err_probability']

        self.simulator_run_mode = params['simulator_run_mode']
        self.simulator_act_level = params['simulator_act_level']

        self.learning_phase = params['learning_phase']

        #TODO: Initialize custom testbed
        self.test_bed = TestBed()
Example #2
0
def test_load_yaml():
    fp = "./cde465.yaml"
    tb = TestBed()
    conf_dict = tb.load(fp)
    # for key, value in conf_dict.items():
    #     print("%s : %s" % (key, value))
    # print(conf_dict)

    # print(json.dumps(conf_dict,sort_keys=True,indent=4))
    rtn_lst = tb.parse_to_json_tree(conf_dict)
    print(rtn_lst)
Example #3
0
    def setup(self, window_size=20, t_in=2, w=10, h=10, d=1, t_out=1, hidden_layers_sizes=[100], pretrain_step=1):
        self.bed = TestBed(window_size=window_size, t_in=t_in, w=w, h=h, d=d, t_out=t_out, hidden_layers_sizes=hidden_layers_sizes)
        self.gen = SinGenerator(w=w, h=h, d=1)
        # self.gen = RadarGenerator('../data/radar', w=w, h=h, left=0, top=80)
        self.vis = Visualizer(w=w, h=h, t_out=t_out)
        self.pretrain_step = pretrain_step

        # fill the window with data
        for i in xrange(window_size):
            y = self.gen.next()
            self.bed.supply(y)
Example #4
0
class Worker(QtCore.QThread):

    started = QtCore.Signal()
    updated = QtCore.Signal(numpy.ndarray, numpy.ndarray)
    stopped = QtCore.Signal()

    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)
        self.bed = None
        self.gen = None

        self.delay = 1.0
        self.stop_flg = False
        self.mutex = QtCore.QMutex()

    def setup(self, window_size=20, t_in=2, w=10, h=10, d=1, t_out=1, hidden_layers_sizes=[100], pretrain_step=1):
        self.bed = TestBed(window_size=window_size, t_in=t_in, w=w, h=h, d=d, t_out=t_out, hidden_layers_sizes=hidden_layers_sizes)
        self.gen = SinGenerator(w=w, h=h, d=1)
        # self.gen = RadarGenerator('../data/radar', w=w, h=h, left=0, top=80)
        self.vis = Visualizer(w=w, h=h, t_out=t_out)
        self.pretrain_step = pretrain_step

        # fill the window with data
        for i in xrange(window_size):
            y = self.gen.next()
            self.bed.supply(y)

    def setGeneratorParams(self, k, n):
        pass

    def setDelay(self, delay):
        self.delay = delay

    def setLearningParams(self, params):
        self.finetune_epochs = params['finetune_epochs']
        self.finetune_lr = params['finetune_lr']
        self.finetune_batch_size = params['finetune_batch_size']
        self.pretrain_epochs = params['pretrain_epochs']
        self.pretrain_lr = params['pretrain_lr']
        self.pretrain_batch_size = params['pretrain_batch_size']

    def stop(self):
        with QtCore.QMutexLocker(self.mutex):
            self.stop_flg = True

    def run(self):
        print("Worker: started")
        with QtCore.QMutexLocker(self.mutex):
            self.stop_flg = False
        self.started.emit()

        for i,yt in enumerate(self.gen):
            # predict
            y_preds = self.bed.predict()
            print("{0}: yt={1}, y_pred={2}".format(i, yt, y_preds))

            self.bed.supply(yt)
            self.vis.append_data(yt, y_preds)

            if i % self.pretrain_step == 0 and 0 < self.pretrain_epochs:
                # pretrain
                avg_cost = self.bed.pretrain(self.pretrain_epochs, learning_rate=self.pretrain_lr, batch_size=self.pretrain_batch_size)
                print("   pretrain cost: {0}".format(avg_cost))
                pass

            # finetune
            costs = self.bed.finetune(self.finetune_epochs, learning_rate=self.finetune_lr, batch_size=self.finetune_batch_size)
            train_cost, valid_cost, test_cost = costs
            print("   train cost: {0}".format(train_cost))

            self.vis.append_cost(train_cost, valid_cost, test_cost)

            self.updated.emit(yt, y_preds)

            time.sleep(self.delay)

            if self.stop_flg:
                print(' --- iteration end ---')
                break

        self.stopped.emit()
def run_and_log(benchmark, case_params):
    dump_file = '%s/dump-%d.pkl' % (benchmark.trace_dir, os.getpid())
    test = TestBed(dump_file, benchmark.tunings, custom_tunings=case_params)
    test.run(benchmark.rand_poses,
             benchmark.rand_velocities)
Example #6
0
class RuleSimulator(UserSimulator):
    """ GLEN FUNCTIONS FOR CHANGING USER GOAL RANDOMLY """

    test_bed = 0
    """ A rule-based user simulator for testing dialog policy """
    def __init__(self,
                 movie_dict=None,
                 act_set=None,
                 slot_set=None,
                 start_set=None,
                 params=None):
        """ Constructor shared by all user simulators """

        self.movie_dict = movie_dict
        self.act_set = act_set
        self.slot_set = slot_set
        self.start_set = start_set

        self.max_turn = params['max_turn']
        self.slot_err_probability = params['slot_err_probability']
        self.slot_err_mode = params['slot_err_mode']
        self.intent_err_probability = params['intent_err_probability']

        self.simulator_run_mode = params['simulator_run_mode']
        self.simulator_act_level = params['simulator_act_level']

        self.learning_phase = params['learning_phase']

        #TODO: Initialize custom testbed
        self.test_bed = TestBed()

    def initialize_episode(self):
        """ Initialize a new episode (dialog)
        state['history_slots']: keeps all the informed_slots
        state['rest_slots']: keep all the slots (which is still in the stack yet)
        """

        self.state = {}
        self.state['history_slots'] = {}
        self.state['inform_slots'] = {}
        self.state['request_slots'] = {}
        self.state['rest_slots'] = []
        self.state['turn'] = 0

        self.episode_over = False
        self.dialog_status = dialog_config.NO_OUTCOME_YET

        ##### testbed setup ####
        # self.test_bed.init_stats_dict(3) #--setup in run.py
        self.test_bed.collect_stats_flag = True
        self.test_bed.goal_change_prob = 0.1
        self.test_bed.build_goal_dict(self.start_set)

        self.goal = self._sample_goal(self.start_set)
        self.goal['request_slots']['ticket'] = 'UNK'
        self.constraint_check = dialog_config.CONSTRAINT_CHECK_FAILURE
        """ Debug: build a fake goal mannually """
        #self.debug_falk_goal()
        #TODO: What probability we will randomly change goal

        # sample first action
        user_action = self._sample_action()
        assert (self.episode_over != 1), ' but we just started'
        return user_action

    def _sample_action(self):
        """ randomly sample a start action based on user goal """

        self.state['diaact'] = random.choice(
            dialog_config.start_dia_acts.keys())

        # "sample" informed slots
        if len(self.goal['inform_slots']) > 0:
            known_slot = random.choice(self.goal['inform_slots'].keys())
            self.state['inform_slots'][known_slot] = self.goal['inform_slots'][
                known_slot]

            if 'moviename' in self.goal['inform_slots'].keys(
            ):  # 'moviename' must appear in the first user turn
                self.state['inform_slots']['moviename'] = self.goal[
                    'inform_slots']['moviename']

            for slot in self.goal['inform_slots'].keys():
                if known_slot == slot or slot == 'moviename': continue
                self.state['rest_slots'].append(slot)

        self.state['rest_slots'].extend(self.goal['request_slots'].keys())

        # "sample" a requested slot
        request_slot_set = list(self.goal['request_slots'].keys())
        request_slot_set.remove('ticket')
        if len(request_slot_set) > 0:
            request_slot = random.choice(request_slot_set)
        else:
            request_slot = 'ticket'
        self.state['request_slots'][request_slot] = 'UNK'

        if len(self.state['request_slots']) == 0:
            self.state['diaact'] = 'inform'

        if (self.state['diaact'] in ['thanks', 'closing']):
            self.episode_over = True  #episode_over = True
        else:
            self.episode_over = False  #episode_over = False

        sample_action = {}
        sample_action['diaact'] = self.state['diaact']
        sample_action['inform_slots'] = self.state['inform_slots']
        sample_action['request_slots'] = self.state['request_slots']
        sample_action['turn'] = self.state['turn']

        self.add_nl_to_action(sample_action)
        return sample_action

    def _sample_goal(self, goal_set):
        """ sample a user goal  """

        sample_goal = random.choice(self.start_set[self.learning_phase])
        return sample_goal

    def corrupt(self, user_action):
        """ Randomly corrupt an action with error probs (slot_err_probability and slot_err_mode) on Slot and Intent (intent_err_probability). """

        for slot in user_action['inform_slots'].keys():
            slot_err_prob_sample = random.random()
            if slot_err_prob_sample < self.slot_err_probability:  # add noise for slot level
                if self.slot_err_mode == 0:  # replace the slot_value only
                    if slot in self.movie_dict.keys():
                        user_action['inform_slots'][slot] = random.choice(
                            self.movie_dict[slot])
                elif self.slot_err_mode == 1:  # combined
                    slot_err_random = random.random()
                    if slot_err_random <= 0.33:
                        if slot in self.movie_dict.keys():
                            user_action['inform_slots'][slot] = random.choice(
                                self.movie_dict[slot])
                    elif slot_err_random > 0.33 and slot_err_random <= 0.66:
                        del user_action['inform_slots'][slot]
                        random_slot = random.choice(self.movie_dict.keys())
                        user_action[random_slot] = random.choice(
                            self.movie_dict[random_slot])
                    else:
                        del user_action['inform_slots'][slot]
                elif self.slot_err_mode == 2:  #replace slot and its values
                    del user_action['inform_slots'][slot]
                    random_slot = random.choice(self.movie_dict.keys())
                    user_action[random_slot] = random.choice(
                        self.movie_dict[random_slot])
                elif self.slot_err_mode == 3:  # delete the slot
                    del user_action['inform_slots'][slot]

        intent_err_sample = random.random()
        if intent_err_sample < self.intent_err_probability:  # add noise for intent level
            user_action['diaact'] = random.choice(self.act_set.keys())

    def debug_falk_goal(self):
        """ Debug function: build a fake goal mannually (Can be moved in future) """

        self.goal['inform_slots'].clear()
        #self.goal['inform_slots']['city'] = 'seattle'
        self.goal['inform_slots']['numberofpeople'] = '2'
        #self.goal['inform_slots']['theater'] = 'amc pacific place 11 theater'
        #self.goal['inform_slots']['starttime'] = '10:00 pm'
        #self.goal['inform_slots']['date'] = 'tomorrow'
        self.goal['inform_slots']['moviename'] = 'zoology'
        self.goal['inform_slots']['distanceconstraints'] = 'close to 95833'
        self.goal['request_slots'].clear()
        self.goal['request_slots']['ticket'] = 'UNK'
        self.goal['request_slots']['theater'] = 'UNK'
        self.goal['request_slots']['starttime'] = 'UNK'
        self.goal['request_slots']['date'] = 'UNK'

    def next(self, system_action):
        """ Generate next User Action based on last System Action """

        self.state['turn'] += 2
        self.episode_over = False
        self.dialog_status = dialog_config.NO_OUTCOME_YET

        sys_act = system_action['diaact']

        if (self.max_turn > 0 and self.state['turn'] > self.max_turn):
            self.dialog_status = dialog_config.FAILED_DIALOG
            self.episode_over = True
            self.state['diaact'] = "closing"
        else:
            self.state['history_slots'].update(self.state['inform_slots'])
            self.state['inform_slots'].clear()

            if sys_act == "inform":
                self.response_inform(system_action)
            elif sys_act == "multiple_choice":
                self.response_multiple_choice(system_action)
            elif sys_act == "request":
                self.response_request(system_action)
            elif sys_act == "thanks":
                self.response_thanks(system_action)
            elif sys_act == "confirm_answer":
                self.response_confirm_answer(system_action)
            elif sys_act == "closing":
                self.episode_over = True
                self.state['diaact'] = "thanks"

        self.corrupt(self.state)

        response_action = {}
        response_action['diaact'] = self.state['diaact']
        response_action['inform_slots'] = self.state['inform_slots']
        response_action['request_slots'] = self.state['request_slots']
        response_action['turn'] = self.state['turn']
        response_action['nl'] = ""

        # add NL to dia_act
        self.add_nl_to_action(response_action)
        return response_action, self.episode_over, self.dialog_status

    def response_confirm_answer(self, system_action):
        """ Response for Confirm_Answer (System Action) """

        if len(self.state['rest_slots']) > 0:
            request_slot = random.choice(self.state['rest_slots'])

            if request_slot in self.goal['request_slots'].keys():
                self.state['diaact'] = "request"
                self.state['request_slots'][request_slot] = "UNK"
            elif request_slot in self.goal['inform_slots'].keys():
                self.state['diaact'] = "inform"
                self.state['inform_slots'][request_slot] = self.goal[
                    'inform_slots'][request_slot]
                if request_slot in self.state['rest_slots']:
                    self.state['rest_slots'].remove(request_slot)
        else:
            self.state['diaact'] = "thanks"

    def response_thanks(self, system_action):
        """ Response for Thanks (System Action) """

        self.episode_over = True
        self.dialog_status = dialog_config.SUCCESS_DIALOG

        request_slot_set = copy.deepcopy(self.state['request_slots'].keys())
        if 'ticket' in request_slot_set:
            request_slot_set.remove('ticket')
        rest_slot_set = copy.deepcopy(self.state['rest_slots'])
        if 'ticket' in rest_slot_set:
            rest_slot_set.remove('ticket')

        if len(request_slot_set) > 0 or len(rest_slot_set) > 0:
            self.dialog_status = dialog_config.FAILED_DIALOG

        for info_slot in self.state['history_slots'].keys():
            if self.state['history_slots'][
                    info_slot] == dialog_config.NO_VALUE_MATCH:
                self.dialog_status = dialog_config.FAILED_DIALOG
            if info_slot in self.goal['inform_slots'].keys():
                if self.state['history_slots'][info_slot] != self.goal[
                        'inform_slots'][info_slot]:
                    self.dialog_status = dialog_config.FAILED_DIALOG

        if 'ticket' in system_action['inform_slots'].keys():
            if system_action['inform_slots'][
                    'ticket'] == dialog_config.NO_VALUE_MATCH:
                self.dialog_status = dialog_config.FAILED_DIALOG

        if self.constraint_check == dialog_config.CONSTRAINT_CHECK_FAILURE:
            self.dialog_status = dialog_config.FAILED_DIALOG

    def response_request(self, system_action):
        """ Response for Request (System Action) """

        if len(system_action['request_slots'].keys()) > 0:
            slot = system_action['request_slots'].keys()[0]  # only one slot
            if slot in self.goal['inform_slots'].keys(
            ):  # request slot in user's constraints  #and slot not in self.state['request_slots'].keys():
                if (self.test_bed.collect_stats_flag == True):
                    self.test_bed.collect_event_stats(0)
                #TODO: Chance to change goal here -- check if in history slots
                # self.event_rand_slot_change(self.goal_change_prob, slot)

                self.state['inform_slots'][slot] = self.goal['inform_slots'][
                    slot]

                #TODO: Potentially go back and change an inform from an old slot -- overrides above line of code
                self.state, self.goal = self.test_bed.event_rand_slot_change(
                    self.test_bed.prob_list[0], self.state, self.goal)

                #TODO: Added to set slot to either old or new slot - should really only be one
                slot = list(self.state['inform_slots'].keys())[0]

                self.state['diaact'] = "inform"
                if slot in self.state['rest_slots']:
                    self.state['rest_slots'].remove(slot)
                if slot in self.state['request_slots'].keys():
                    del self.state['request_slots'][slot]
                self.state['request_slots'].clear()
            elif slot in self.goal['request_slots'].keys(
            ) and slot not in self.state[
                    'rest_slots'] and slot in self.state['history_slots'].keys(
                    ):  # the requested slot not in goal informs, the requested slot has been answered
                if (self.test_bed.collect_stats_flag == True):
                    self.test_bed.collect_event_stats(1)
                self.state, self.goal = self.test_bed.event_rand_slot_change(
                    self.test_bed.prob_list[1], self.state, self.goal)
                #TODO: Chance to change goal here
                # self.event_rand_slot_change(self.goal_change_prob, slot)

                self.state['inform_slots'][slot] = self.state['history_slots'][
                    slot]
                self.state['request_slots'].clear()
                self.state['diaact'] = "inform"
            elif slot in self.goal['request_slots'].keys(
            ) and slot in self.state[
                    'rest_slots']:  # request slot in user's goal's request slots, and not answered yet
                #TODO: Match to rule 0 from maxbren code
                if (self.test_bed.collect_stats_flag == True):
                    self.test_bed.collect_event_stats(2)
                self.state, self.goal = self.test_bed.event_rand_slot_change(
                    self.test_bed.prob_list[2], self.state, self.goal)

                self.state['diaact'] = "request"  # "confirm_question"
                self.state['request_slots'][slot] = "UNK"

                ########################################################################
                # Inform the rest of informable slots
                ########################################################################
                for info_slot in self.state['rest_slots']:
                    if info_slot in self.goal['inform_slots'].keys():
                        self.state['inform_slots'][info_slot] = self.goal[
                            'inform_slots'][info_slot]

                for info_slot in self.state['inform_slots'].keys():
                    if info_slot in self.state['rest_slots']:
                        self.state['rest_slots'].remove(info_slot)
            else:
                if len(self.state['request_slots']) == 0 and len(
                        self.state['rest_slots']) == 0:
                    self.state['diaact'] = "thanks"
                else:
                    self.state['diaact'] = "inform"
                self.state['inform_slots'][slot] = dialog_config.I_DO_NOT_CARE
        else:  # this case should not appear
            if len(self.state['rest_slots']) > 0:
                random_slot = random.choice(self.state['rest_slots'])
                if random_slot in self.goal['inform_slots'].keys():
                    self.state['inform_slots'][random_slot] = self.goal[
                        'inform_slots'][random_slot]
                    self.state['rest_slots'].remove(random_slot)
                    self.state['diaact'] = "inform"
                elif random_slot in self.goal['request_slots'].keys():
                    self.state['request_slots'][random_slot] = self.goal[
                        'request_slots'][random_slot]
                    self.state['diaact'] = "request"

    def response_multiple_choice(self, system_action):
        """ Response for Multiple_Choice (System Action) """

        slot = system_action['inform_slots'].keys()[0]
        if slot in self.goal['inform_slots'].keys():
            self.state['inform_slots'][slot] = self.goal['inform_slots'][slot]
        elif slot in self.goal['request_slots'].keys():
            self.state['inform_slots'][slot] = random.choice(
                system_action['inform_slots'][slot])

        self.state['diaact'] = "inform"
        if slot in self.state['rest_slots']:
            self.state['rest_slots'].remove(slot)
        if slot in self.state['request_slots'].keys():
            del self.state['request_slots'][slot]

    def response_inform(self, system_action):
        """ Response for Inform (System Action) """

        if 'taskcomplete' in system_action['inform_slots'].keys(
        ):  # check all the constraints from agents with user goal
            self.state['diaact'] = "thanks"
            #if 'ticket' in self.state['rest_slots']: self.state['request_slots']['ticket'] = 'UNK'
            self.constraint_check = dialog_config.CONSTRAINT_CHECK_SUCCESS

            if system_action['inform_slots'][
                    'taskcomplete'] == dialog_config.NO_VALUE_MATCH:
                self.state['history_slots'][
                    'ticket'] = dialog_config.NO_VALUE_MATCH
                if 'ticket' in self.state['rest_slots']:
                    self.state['rest_slots'].remove('ticket')
                if 'ticket' in self.state['request_slots'].keys():
                    del self.state['request_slots']['ticket']

            for slot in self.goal['inform_slots'].keys():
                #TODO: Potential goal change here? How will DST react?
                #Can we respond with

                #  Deny, if the answers from agent can not meet the constraints of user
                if slot not in system_action['inform_slots'].keys() or (
                        self.goal['inform_slots'][slot].lower() !=
                        system_action['inform_slots'][slot].lower()):
                    self.state['diaact'] = "deny"
                    self.state['request_slots'].clear()
                    self.state['inform_slots'].clear()
                    self.constraint_check = dialog_config.CONSTRAINT_CHECK_FAILURE
                    break
        else:
            for slot in system_action['inform_slots'].keys():
                self.state['history_slots'][slot] = system_action[
                    'inform_slots'][slot]

                if slot in self.goal['inform_slots'].keys(
                ):  #if agent inform slot key is in my inform slots
                    if system_action['inform_slots'][slot] == self.goal[
                            'inform_slots'][
                                slot]:  #if system value matches my inform value
                        if slot in self.state['rest_slots']:
                            self.state['rest_slots'].remove(
                                slot)  # remove from rest slots

                        if len(self.state['request_slots']
                               ) > 0:  # if there are request slots left
                            self.state['diaact'] = "request"
                        elif len(self.state['rest_slots']) > 0:
                            rest_slot_set = copy.deepcopy(
                                self.state['rest_slots'])
                            if 'ticket' in rest_slot_set:
                                rest_slot_set.remove('ticket')

                            if len(rest_slot_set) > 0:
                                inform_slot = random.choice(
                                    rest_slot_set)  # self.state['rest_slots']
                                if inform_slot in self.goal[
                                        'inform_slots'].keys():
                                    self.state['inform_slots'][
                                        inform_slot] = self.goal[
                                            'inform_slots'][inform_slot]
                                    self.state['diaact'] = "inform"
                                    self.state['rest_slots'].remove(
                                        inform_slot)
                                elif inform_slot in self.goal[
                                        'request_slots'].keys():
                                    self.state['request_slots'][
                                        inform_slot] = 'UNK'
                                    self.state['diaact'] = "request"
                            else:
                                self.state['request_slots']['ticket'] = 'UNK'
                                self.state['diaact'] = "request"
                        else:  # how to reply here?
                            self.state[
                                'diaact'] = "thanks"  # replies "closing"? or replies "confirm_answer"
                    else:  # != value  Should we deny here or ?
                        ########################################################################
                        # TODO When agent informs(slot=value), where the value is different with the constraint in user goal, Should we deny or just inform the correct value?
                        ########################################################################
                        self.state['diaact'] = "inform"
                        self.state['inform_slots'][slot] = self.goal[
                            'inform_slots'][slot]
                        if slot in self.state['rest_slots']:
                            self.state['rest_slots'].remove(slot)
                else:
                    if slot in self.state['rest_slots']:
                        self.state['rest_slots'].remove(slot)
                    if slot in self.state['request_slots'].keys():
                        del self.state['request_slots'][slot]

                    if len(self.state['request_slots']) > 0:
                        request_set = list(self.state['request_slots'].keys())
                        if 'ticket' in request_set:
                            request_set.remove('ticket')

                        if len(request_set) > 0:
                            request_slot = random.choice(request_set)
                        else:
                            request_slot = 'ticket'

                        self.state['request_slots'][request_slot] = "UNK"
                        self.state['diaact'] = "request"
                    elif len(self.state['rest_slots']) > 0:
                        rest_slot_set = copy.deepcopy(self.state['rest_slots'])
                        if 'ticket' in rest_slot_set:
                            rest_slot_set.remove('ticket')

                        if len(rest_slot_set) > 0:
                            inform_slot = random.choice(
                                rest_slot_set)  #self.state['rest_slots']
                            if inform_slot in self.goal['inform_slots'].keys():
                                self.state['inform_slots'][
                                    inform_slot] = self.goal['inform_slots'][
                                        inform_slot]
                                self.state['diaact'] = "inform"
                                self.state['rest_slots'].remove(inform_slot)

                                if 'ticket' in self.state['rest_slots']:
                                    self.state['request_slots'][
                                        'ticket'] = 'UNK'
                                    self.state['diaact'] = "request"
                            elif inform_slot in self.goal[
                                    'request_slots'].keys():
                                self.state['request_slots'][
                                    inform_slot] = self.goal['request_slots'][
                                        inform_slot]
                                self.state['diaact'] = "request"
                        else:
                            self.state['request_slots']['ticket'] = 'UNK'
                            self.state['diaact'] = "request"
                    else:
                        self.state[
                            'diaact'] = "thanks"  # or replies "confirm_answer"
Example #7
0
import cv2
import os
import matplotlib.pyplot as plt
from matplotlib import gridspec
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
import tkinter as tk
from tkinter import ttk
import tkinter.filedialog
from PIL import ImageTk
from PIL import Image
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from testbed import TestBed


TestBed.init("tyger.jpg");
image = TestBed.image;

if(__name__=="__main__"):
	TestBed.root = tk.Tk();
	TestBed.root.minsize(TestBed.ROOT_WIDTH,TestBed.ROOT_HEIGHT);
	
	
	TestBed.scale_var = tk.DoubleVar();
	
	scale = ttk.Scale(TestBed.root,
							variable=TestBed.scale_var,
							from_=100,
							to_=1,
							orient=tk.HORIZONTAL,
							command=TestBed.onSliderChanged,