Esempio n. 1
0
class DummyProbe(Behavior):
    def __init__(self, logger, params):
        self.lick_timer = Timer()
        self.lick_timer.start()
        self.ready_timer = Timer()
        self.ready_timer.start()
        self.ready = False
        self.probe = 0

        super(DummyProbe, self).__init__(logger, params)

    def is_ready(self, init_duration):
        self.__get_events()
        elapsed_time = self.ready_timer.elapsed_time()
        return self.ready and elapsed_time > init_duration

    def inactivity_time(self):  # in minutes
        return self.lick_timer.elapsed_time() / 1000 / 60

    def is_licking(self, since=0):
        probe = self.__get_events()
        # reset lick timer if licking is detected &
        if probe > 0:
            self.resp_timer.start()
        self.licked_probe = probe
        return probe

    def __get_events(self):
        probe = 0
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.logger.log_lick(1)
                    print('Probe 1 activated!')
                    probe = 1
                    self.lick_timer.start()
                elif event.key == pygame.K_RIGHT:
                    self.logger.log_lick(2)
                    print('Probe 2 activated!')
                    probe = 2
                elif event.key == pygame.K_SPACE and self.ready:
                    self.ready = False
                    print('off position')
                elif event.key == pygame.K_SPACE and not self.ready:
                    self.lick_timer.start()
                    self.ready = True
                    print('in position')
        return probe
Esempio n. 2
0
class Agent(Panda):
    def __init__(self, env, cond):
        self.cond = cond
        self.env = env
        self.timer = Timer()
        self.duration = cond['dur']
        hfov = self.env.camLens.get_fov(
        ) * np.pi / 180  # half field of view in radians
        # define object time parameters
        self.rot_fun = self.time_fun(cond['rot'])
        self.tilt_fun = self.time_fun(cond['tilt'])
        self.yaw_fun = self.time_fun(cond['yaw'])
        z_loc = 2
        self.x_fun = self.time_fun(cond['pos_x'],
                                   lambda x, t: np.arctan(x * hfov[0]) * z_loc)
        self.y_fun = self.time_fun(cond['pos_y'],
                                   lambda x, t: np.arctan(x * hfov[0]) * z_loc)
        self.scale_fun = self.time_fun(cond['mag'], lambda x, t: .15 * x)
        # add task object
        self.name = "Obj%s-Task" % cond['id']

    def run(self):
        self.model = self.env.loader.loadModel(
            self.env.object_files[self.cond['id']])
        self.model.reparentTo(self.env.render)
        self.task = self.env.taskMgr.doMethodLater(self.cond['delay'] / 1000,
                                                   self.objTask, self.name)

    def objTask(self, task):
        t = self.timer.elapsed_time() / 1000
        if t > self.duration / 1000:
            self.remove(task)
            return
        self.model.setHpr(self.rot_fun(t), self.tilt_fun(t), self.yaw_fun(t))
        self.model.setPos(self.x_fun(t), 2, self.y_fun(t))
        self.model.setScale(self.scale_fun(t))

        return Task.cont

    def remove(self, task):
        task.remove()
        self.model.removeNode()

    def time_fun(self, param, fun=lambda x, t: x):
        param = (iterable(param))
        idx = np.linspace(0, self.duration / 1000, param.size)
        return lambda t: np.interp(t, idx, fun(param, t))
Esempio n. 3
0
class DummyPorts(MultiPort):
    def setup(self, exp):
        import pygame
        self.lick_timer = Timer()
        self.lick_timer.start()
        self.ready_timer = Timer()
        self.ready_timer.start()
        self.ready = False
        self.interface = 0
        pygame.init()
        #self.screen = pygame.display.set_mode((800, 480))
        self.params = exp.params
        self.resp_timer = Timer()
        self.resp_timer.start()
        self.logger = exp.logger
        self.exp = exp
        self.rew_port = 0
        self.choices = np.array(np.empty(0))
        self.choice_history = list()  # History term for bias calculation
        self.reward_history = list(
        )  # History term for performance calculation
        self.licked_port = 0
        self.reward_amount = dict()
        self.curr_cond = []

    def is_ready(self, duration, since=0):
        if duration == 0: return True
        self.__get_events()
        elapsed_time = self.ready_timer.elapsed_time()
        return self.ready and elapsed_time >= duration

    def is_licking(self, since=0):
        port = self.__get_events()
        if port > 0: self.resp_timer.start()
        self.licked_port = port
        return port

    def get_response(self, since=0):
        port = self.is_licking(since)
        return port > 0

    def is_correct(self):
        return np.any(
            np.equal(self.licked_port, self.curr_cond['response_port']))

    def reward(self):
        self.update_history(self.licked_port, self.reward_amount)
        self.log_reward(self.reward_amount)
        print('Giving Water at port:%1d' % self.licked_port)
        return True

    def prepare(self, condition):
        self.curr_cond = condition
        self.reward_amount = condition['reward_amount']
        self.logger.log('BehCondition.Trial',
                        dict(beh_hash=self.curr_cond['beh_hash']),
                        schema='behavior')

    def punish(self):
        print('punishing')
        port = self.licked_port if self.licked_port > 0 else np.nan
        self.update_history(port)

    def exit(self):
        pass

    def __get_events(self):
        port = 0
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.logger.log('Activity.Lick',
                                    dict(port=1),
                                    schema='behavior')
                    print('Probe 1 activated!')
                    port = 1
                    self.lick_timer.start()
                elif event.key == pygame.K_RIGHT:
                    self.logger.log('Activity.Lick',
                                    dict(port=2),
                                    schema='behavior')
                    print('Probe 2 activated!')
                    port = 2
                elif event.key == pygame.K_SPACE and not self.ready:
                    self.lick_timer.start()
                    self.ready = True
                    self.log_activity('Proximity',
                                      dict(port=3, in_position=self.ready))
                    print('in position')
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE and self.ready:
                    self.ready = False
                    self.log_activity('Proximity',
                                      dict(port=3, in_position=self.ready))
                    print('off position')
                    print(pygame.mouse.get_pos())
            elif event.type == pygame.MOUSEBUTTONDOWN:
                print(pygame.mouse.get_pos())
        return port
Esempio n. 4
0
class Logger:
    def __init__(self, protocol=False):
        self.setup, self.is_pi = socket.gethostname(), os.uname(
        )[4][:3] == 'arm'
        self.curr_state, self.lock, self.queue, self.curr_trial, self.total_reward = '', False, PriorityQueue(
        ), 0, 0
        self.session_key = dict()
        self.ping_timer, self.logger_timer = Timer(), Timer()
        self.setup_status = 'running' if protocol else 'ready'
        self.log_setup(protocol)
        fileobject = open(
            os.path.dirname(os.path.abspath(__file__)) + '/dj_local_conf.json')
        connect_info = json.loads(fileobject.read())
        background_conn = dj.Connection(connect_info['database.host'],
                                        connect_info['database.user'],
                                        connect_info['database.password'])
        self.schemata = dict()
        self.schemata['lab'] = dj.create_virtual_module(
            'beh.py', 'lab_behavior', connection=background_conn)
        self.schemata['mice'] = dj.create_virtual_module(
            'mice.py', 'lab_mice', connection=background_conn)
        self.thread_end, self.thread_lock = threading.Event(), threading.Lock()
        self.inserter_thread = threading.Thread(target=self.inserter)
        self.getter_thread = threading.Thread(target=self.getter)
        self.inserter_thread.start()
        self.getter_thread.start()
        self.logger_timer.start()  # start session time

    def put(self, **kwargs):
        self.queue.put(PrioritizedItem(**kwargs))

    def inserter(self):
        while not self.thread_end.is_set():
            if self.queue.empty():
                time.sleep(.5)
                continue
            item = self.queue.get()
            ignore, skip = (False, False) if item.replace else (True, True)
            table = self.rgetattr(self.schemata[item.schema], item.table)
            self.thread_lock.acquire()
            table.insert1(item.tuple,
                          ignore_extra_fields=ignore,
                          skip_duplicates=skip,
                          replace=item.replace)
            self.thread_lock.release()

    def getter(self):
        while not self.thread_end.is_set():
            self.thread_lock.acquire()
            self.setup_info = (self.schemata['lab'].SetupControl()
                               & dict(setup=self.setup)).fetch1()
            self.thread_lock.release()
            self.setup_status = self.setup_info['status']
            time.sleep(1)  # update once a second

    def log(self, table, data=dict()):
        tmst = self.logger_timer.elapsed_time()
        self.put(table=table,
                 tuple={
                     **self.session_key, 'trial_idx': self.curr_trial,
                     'time': tmst,
                     **data
                 })
        return tmst

    def log_setup(self, task_idx=False):
        rel = SetupControl() & dict(setup=self.setup)
        key = rel.fetch1() if numpy.size(rel.fetch()) else dict(
            setup=self.setup)
        if task_idx: key['task_idx'] = task_idx
        key = {**key, 'ip': self.get_ip(), 'status': self.setup_status}
        SetupControl.insert1(key, replace=True)

    def log_session(self, params, exp_type=''):
        self.curr_trial, self.total_reward, self.session_key = 0, 0, {
            'animal_id': self.get_setup_info('animal_id')
        }
        last_sessions = (Session() & self.session_key).fetch('session')
        self.session_key['session'] = 1 if numpy.size(
            last_sessions) == 0 else numpy.max(last_sessions) + 1
        self.put(table='Session',
                 tuple={
                     **self.session_key, 'session_params': params,
                     'setup': self.setup,
                     'protocol': self.get_protocol(),
                     'experiment_type': exp_type
                 },
                 priority=1)
        key = {
            'session': self.session_key['session'],
            'trials': 0,
            'total_liquid': 0,
            'difficulty': 1
        }
        if 'start_time' in params:
            tdelta = lambda t: datetime.strptime(
                t, "%H:%M:%S") - datetime.strptime("00:00:00", "%H:%M:%S")
            key = {
                **key, 'start_time': tdelta(params['start_time']),
                'stop_time': tdelta(params['stop_time'])
            }
        self.update_setup_info(key)
        self.logger_timer.start()  # start session time

    def log_conditions(self, conditions, condition_tables=[]):
        for cond in conditions:
            cond_hash = make_hash(cond)
            self.put(table='Condition',
                     tuple=dict(cond_hash=cond_hash, cond_tuple=cond.copy()),
                     priority=5)
            cond.update({'cond_hash': cond_hash})
            for condtable in condition_tables:
                if condtable == 'RewardCond' and isinstance(
                        cond['probe'], tuple):
                    for idx, probe in enumerate(cond['probe']):
                        self.put(table=condtable,
                                 tuple={
                                     'cond_hash': cond['cond_hash'],
                                     'probe': probe,
                                     'reward_amount': cond['reward_amount']
                                 })
                else:
                    self.put(table=condtable, tuple=dict(cond.items()))
                    if condtable == 'OdorCond':
                        for idx, port in enumerate(cond['delivery_port']):
                            self.put(table=condtable + '.Port',
                                     tuple={
                                         'cond_hash': cond['cond_hash'],
                                         'dutycycle': cond['dutycycle'][idx],
                                         'odor_id': cond['odor_id'][idx],
                                         'delivery_port': port
                                     })
        return conditions

    def init_trial(self, cond_hash):
        self.curr_trial += 1
        if self.lock: self.thread_lock.acquire()
        self.curr_cond, self.trial_start = cond_hash, self.logger_timer.elapsed_time(
        )
        return self.trial_start  # return trial start time

    def log_trial(self, last_flip_count=0):
        if self.lock: self.thread_lock.release()
        timestamp = self.logger_timer.elapsed_time()
        self.put(table='Trial',
                 tuple=dict(self.session_key,
                            trial_idx=self.curr_trial,
                            cond_hash=self.curr_cond,
                            start_time=self.trial_start,
                            end_time=timestamp,
                            last_flip_count=last_flip_count))

    def log_pulse_weight(self, pulse_dur, probe, pulse_num, weight=0):
        key = dict(setup=self.setup,
                   probe=probe,
                   date=systime.strftime("%Y-%m-%d"))
        self.put(table='LiquidCalibration', tuple=key, priority=5)
        self.put(table='LiquidCalibration.PulseWeight',
                 tuple=dict(key,
                            pulse_dur=pulse_dur,
                            pulse_num=pulse_num,
                            weight=weight),
                 replace=True)

    def update_setup_info(self, info):
        self.setup_info = {
            **(SetupControl() & dict(setup=self.setup)).fetch1(),
            **info
        }
        self.put(table='SetupControl',
                 tuple=self.setup_info,
                 replace=True,
                 priority=1)
        self.setup_status = self.setup_info['status']
        if 'status' in info:
            while self.get_setup_info('status') != info['status']:
                time.sleep(.5)

    def get_setup_info(self, field):
        return (SetupControl() & dict(setup=self.setup)).fetch1(field)

    def get_protocol(self, task_idx=None):
        if not task_idx: task_idx = self.get_setup_info('task_idx')
        if len(Task() & dict(task_idx=task_idx)) > 0:
            protocol = (Task() & dict(task_idx=task_idx)).fetch1('protocol')
            path, filename = os.path.split(protocol)
            if not path:
                protocol = str(pathlib.Path(
                    __file__).parent.absolute()) + '/conf/' + filename
            return protocol
        else:
            return False

    def ping(self, period=5000):
        if self.ping_timer.elapsed_time(
        ) >= period:  # occasionally update control table
            self.ping_timer.start()
            self.update_setup_info({
                'last_ping':
                str(datetime.now().strftime("%Y-%m-%d %H:%M:%S")),
                'queue_size':
                self.queue.qsize(),
                'trials':
                self.curr_trial,
                'total_liquid':
                self.total_reward,
                'state':
                self.curr_state
            })

    def cleanup(self):
        while not self.queue.empty():
            print('Waiting for empty queue... qsize: %d' % self.queue.qsize())
            time.sleep(2)
        self.thread_end.set()

    @staticmethod
    def get_ip():
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            s.connect(("8.8.8.8", 80))
            IP = s.getsockname()[0]
        except Exception:
            IP = '127.0.0.1'
        finally:
            s.close()
        return IP

    @staticmethod
    def rgetattr(obj, attr, *args):
        def _getattr(obj, attr):
            return getattr(obj, attr, *args)

        return functools.reduce(_getattr, [obj] + attr.split('.'))
Esempio n. 5
0
class Logger:
    """ This class handles the database logging"""
    def __init__(self):
        self.last_trial = 0
        self.queue = Queue()
        self.timer = Timer()
        self.trial_start = 0
        self.curr_cond = []
        self.task_idx = []
        self.session_key = dict()
        self.setup = socket.gethostname()
        self.lock = True
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        self.ip = s.getsockname()[0]
        path = os.path.dirname(os.path.abspath(__file__))
        fileobject = open(path + '/dj_local_conf.json')
        connect_info = json.loads(fileobject.read())
        conn2 = dj.Connection(connect_info['database.host'],
                              connect_info['database.user'],
                              connect_info['database.password'])
        self.insert_schema = dj.create_virtual_module('beh.py',
                                                      'lab_behavior',
                                                      connection=conn2)
        self.thread_end = threading.Event()
        self.thread_lock = Lock()
        self.thread_runner = threading.Thread(
            target=self.inserter)  # max insertion rate of 10 events/sec
        self.thread_runner.start()

    def cleanup(self):
        self.thread_end.set()

    def inserter(self):
        while not self.thread_end.is_set():
            if not self.queue.empty():
                self.thread_lock.acquire()
                item = self.queue.get()
                if 'update' in item:
                    eval(
                        '(self.insert_schema.' + item['table'] +
                        '() & item["tuple"])._update(item["field"],item["value"])'
                    )
                else:
                    eval(
                        'self.insert_schema.' + item['table'] +
                        '.insert1(item["tuple"], ignore_extra_fields=True, skip_duplicates=True)'
                    )
                self.thread_lock.release()
            else:
                time.sleep(.5)

    def log_setup(self):
        key = dict(setup=self.setup)
        # update values in case they exist
        if numpy.size((SetupControl() & dict(setup=self.setup)).fetch()):
            key = (SetupControl() & dict(setup=self.setup)).fetch1()
            (SetupControl() & dict(setup=self.setup)).delete_quick()

        # insert new setup
        key['ip'] = self.ip
        key['status'] = 'ready'
        SetupControl().insert1(key)

    def log_session(self, session_params, exp_type=''):
        animal_id, task_idx = (SetupControl() & dict(setup=self.setup)).fetch1(
            'animal_id', 'task_idx')
        self.task_idx = task_idx
        self.last_trial = 0

        # create session key
        self.session_key = dict()
        self.session_key['animal_id'] = animal_id
        last_sessions = (Session() & self.session_key).fetch('session')
        if numpy.size(last_sessions) == 0:
            last_session = 0
        else:
            last_session = numpy.max(last_sessions)
        self.session_key['session'] = last_session + 1

        # get task parameters for session table
        key = dict(self.session_key.items())
        key['session_params'] = session_params
        key['setup'] = self.setup
        key['protocol'] = self.get_protocol()
        key['experiment_type'] = exp_type
        self.queue.put(dict(table='Session', tuple=key))

        # start session time
        self.timer.start()
        (SetupControl() & dict(setup=self.setup))._update(
            'current_session', self.session_key['session'])
        (SetupControl() & dict(setup=self.setup))._update('last_trial', 0)
        (SetupControl() & dict(setup=self.setup))._update('total_liquid', 0)

    def log_conditions(
            self,
            conditions,
            condition_tables=['OdorCond', 'MovieCond', 'RewardCond']):
        # iterate through all conditions and insert
        for cond in conditions:
            cond_hash = make_hash(cond)
            self.queue.put(
                dict(table='Condition',
                     tuple=dict(cond_hash=cond_hash, cond_tuple=cond.copy())))
            cond.update({'cond_hash': cond_hash})
            for condtable in condition_tables:
                if condtable == 'RewardCond' and isinstance(
                        cond['probe'], tuple):
                    for idx, probe in enumerate(cond['probe']):
                        key = {
                            'cond_hash': cond['cond_hash'],
                            'probe': probe,
                            'reward_amount': cond['reward_amount']
                        }
                        self.queue.put(dict(table=condtable, tuple=key))
                else:
                    self.queue.put(
                        dict(table=condtable, tuple=dict(cond.items())))
                    if condtable == 'OdorCond':
                        for idx, port in enumerate(cond['delivery_port']):
                            key = {
                                'cond_hash': cond['cond_hash'],
                                'dutycycle': cond['dutycycle'][idx],
                                'odor_id': cond['odor_id'][idx],
                                'delivery_port': port
                            }
                            self.queue.put(
                                dict(table=condtable + '.Port', tuple=key))
        return conditions

    def init_trial(self, cond_hash):
        self.curr_cond = cond_hash
        if self.lock:
            self.thread_lock.acquire()
        # return trial start time
        self.trial_start = self.timer.elapsed_time()
        return self.trial_start

    def log_trial(self, last_flip_count=0):
        if self.lock:
            self.thread_lock.release()
        timestamp = self.timer.elapsed_time()
        trial_key = dict(self.session_key,
                         trial_idx=self.last_trial + 1,
                         cond_hash=self.curr_cond,
                         start_time=self.trial_start,
                         end_time=timestamp,
                         last_flip_count=last_flip_count)
        self.queue.put(dict(table='Trial', tuple=trial_key))
        self.last_trial += 1

        # insert ping
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='last_trial',
                 value=self.last_trial,
                 update=True))

    def log_liquid(self, probe, reward_amount):
        timestamp = self.timer.elapsed_time()
        self.queue.put(
            dict(table='LiquidDelivery',
                 tuple=dict(self.session_key,
                            time=timestamp,
                            probe=probe,
                            reward_amount=reward_amount)))

    def log_stim(self):
        timestamp = self.timer.elapsed_time()
        self.queue.put(
            dict(table='StimOnset',
                 tuple=dict(self.session_key, time=timestamp)))

    def log_lick(self, probe):
        timestamp = self.timer.elapsed_time()
        self.queue.put(
            dict(table='Lick',
                 tuple=dict(self.session_key, time=timestamp, probe=probe)))
        return timestamp

    def log_pulse_weight(self, pulse_dur, probe, pulse_num, weight=0):
        cal_key = dict(setup=self.setup,
                       probe=probe,
                       date=systime.strftime("%Y-%m-%d"))
        LiquidCalibration().insert1(cal_key, skip_duplicates=True)
        (LiquidCalibration.PulseWeight()
         & dict(cal_key, pulse_dur=pulse_dur)).delete_quick()
        LiquidCalibration.PulseWeight().insert1(
            dict(cal_key,
                 pulse_dur=pulse_dur,
                 pulse_num=pulse_num,
                 weight=weight))

    def log_animal_weight(self, weight):
        key = dict(animal_id=self.get_setup_info('animal_id'), weight=weight)
        Mice.MouseWeight().insert1(key)

    def log_position(self, in_position, state):
        timestamp = self.timer.elapsed_time()
        self.queue.put(
            dict(table='CenterPort',
                 tuple=dict(self.session_key,
                            time=timestamp,
                            in_position=in_position,
                            state=state)))

    def update_setup_status(self, status):
        key = (SetupControl() & dict(setup=self.setup)).fetch1()
        in_status = key['status'] == status
        if not in_status:
            (SetupControl() & dict(setup=self.setup))._update('status', status)
        return in_status

    def update_setup_notes(self, note):
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='notes',
                 value=note,
                 update=True))

    def update_state(self, state):
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='state',
                 value=state,
                 update=True))

    def update_animal_id(self, animal_id):
        (SetupControl() & dict(setup=self.setup))._update(
            'animal_id', animal_id)

    def update_task_idx(self, task_idx):
        (SetupControl() & dict(setup=self.setup))._update('task_idx', task_idx)

    def update_total_liquid(self, total_rew):
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='total_liquid',
                 value=total_rew,
                 update=True))

    def update_difficulty(self, difficulty):
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='difficulty',
                 value=difficulty,
                 update=True))

    def update_setup_info(self, field, value):
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field=field,
                 value=value,
                 update=True))

    def get_setup_info(self, field):
        info = (SetupControl() & dict(setup=self.setup)).fetch1(field)
        return info

    def get_session_key(self):
        return self.session_key

    def get_clip_info(self, key):
        clip_info = (MovieTables.Movie() * MovieTables.Movie.Clip() & key
                     & self.session_key).fetch1()
        return clip_info

    def get_protocol(self):
        task_idx = (SetupControl() & dict(setup=self.setup)).fetch1('task_idx')
        protocol = (Task() & dict(task_idx=task_idx)).fetch1('protocol')
        path, filename = os.path.split(protocol)
        if not path:
            path = pathlib.Path(__file__).parent.absolute()
            protocol = str(path) + '/conf/' + filename
        return protocol

    def ping(self):
        lp = str(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='last_ping',
                 value=lp,
                 update=True))
        self.queue.put(
            dict(table='SetupControl',
                 tuple=dict(setup=self.setup),
                 field='queue_size',
                 value=self.queue.qsize(),
                 update=True))
Esempio n. 6
0
class DummyProbe(Behavior):
    def __init__(self, logger, params):
        import pygame
        self.lick_timer = Timer()
        self.lick_timer.start()
        self.ready_timer = Timer()
        self.ready_timer.start()
        self.ready = False
        self.interface = 0
        pygame.init()
        self.screen = pygame.display.set_mode((800, 480))
        super(DummyProbe, self).__init__(logger, params)

    def get_cond_tables(self):
        return ['RewardCond']

    def is_ready(self, duration, since=0):
        if duration == 0: return True
        self.__get_events()
        elapsed_time = self.ready_timer.elapsed_time()
        return self.ready and elapsed_time >= duration

    def is_licking(self,since=0):
        probe = self.__get_events()
        if probe > 0: self.resp_timer.start()
        self.licked_probe = probe
        return probe

    def get_response(self, since=0):
        probe = self.is_licking(since)
        return probe > 0

    def is_correct(self):
        return np.any(np.equal(self.licked_probe, self.curr_cond['probe']))

    def prepare(self, condition):
        self.curr_cond = condition
        self.reward_amount = condition['reward_amount']

    def reward(self):
        self.update_history(self.licked_probe, self.reward_amount)
        self.logger.log('LiquidDelivery', dict(probe=self.licked_probe,
                                               reward_amount=self.reward_amount))
        print('Giving Water at probe:%1d' % self.licked_probe)
        return True

    def punish(self):
        print('punishing')
        probe = self.licked_probe if self.licked_probe > 0 else np.nan
        self.update_history(probe)

    def __get_events(self):
        probe = 0
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.logger.log('Lick', dict(probe=1))
                    print('Probe 1 activated!')
                    probe = 1
                    self.lick_timer.start()
                elif event.key == pygame.K_RIGHT:
                    self.logger.log('Lick', dict(probe=2))
                    print('Probe 2 activated!')
                    probe = 2
                elif event.key == pygame.K_SPACE and not self.ready:
                    self.lick_timer.start()
                    self.ready = True
                    print('in position')
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_SPACE and self.ready:
                    self.ready = False
                    print('off position')
                    print(pygame.mouse.get_pos())
            elif event.type == pygame.MOUSEBUTTONDOWN:
                print(pygame.mouse.get_pos())
        return probe
Esempio n. 7
0
def main(args):
    device = torch.device(args.device)
    logger = SummaryWriter(
        os.path.join(
            args.logs_dir,
            "tensorboard_log{0:%Y-%m-%dT%H-%M-%S/}".format(datetime.now())))

    if args.dataset not in DATASETS:
        raise Exception(
            f'`--dataset` is invalid. it should be one of {list(DATASETS.keys())}'
        )
    train_data = DATASETS[args.dataset](args.train_root,
                                        transforms=Compose([
                                            RandomCrop(224),
                                            RandomHorizontalFlip(),
                                            RandomVerticalFlip(),
                                            ToTensor(),
                                            Normalize([0.5, 0.5, 0.5],
                                                      [0.5, 0.5, 0.5])
                                        ]),
                                        **args.__dict__)
    train_loader = DataLoader(train_data,
                              batch_size=args.batch_size,
                              shuffle=True,
                              pin_memory=True,
                              num_workers=args.num_workers)

    do_val = False
    if args.val_root:
        val_data = DATASETS[args.dataset](args.val_root,
                                          transforms=ToTensor(),
                                          **args.__dict__)
        val_loader = DataLoader(val_data,
                                batch_size=args.batch_size,
                                num_workers=args.num_workers)
        do_val = True

    net = MODELS[args.model_name](pretrained=args.resume is None,
                                  **args.__dict__).to(device)
    optimizer = torch.optim.SGD(params=net.parameters(),
                                lr=args.lr,
                                momentum=0.9,
                                weight_decay=1e-4)

    start_epoch, total_epoch, global_step = 0, args.epochs, 0
    if args.resume is not None:
        checkpoint = load_checkpoint(args.resume)
        net.load_state_dict(checkpoint['net'])
        optimizer.load_state_dict(checkpoint['optimizer'])

        start_epoch = checkpoint['epoch']
        global_step = checkpoint['global_step']
        print(f"=> Start epoch {start_epoch} ")

    for epoch in range(start_epoch, total_epoch):
        net.train()

        timer, counter = Timer(), Counter()
        timer.start()
        for step, (img, label) in enumerate(train_loader):
            img, label = img.to(device), label.to(device)
            reader_time = timer.elapsed_time()

            loss, miou = net(img, label)

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            loss = float(loss)
            batch_time = timer.elapsed_time()
            counter.append(loss=loss,
                           miou=miou,
                           reader_time=reader_time,
                           batch_time=batch_time)
            eta = calculate_eta(len(train_loader) - step, counter.batch_time)
            print(
                f"[epoch={epoch + 1}/{total_epoch}] "
                f"step={step + 1}/{len(train_loader)} "
                f"loss={loss:.4f}/{counter.loss:.4f} "
                f"miou={miou:.4f}/{counter.miou:.4f} "
                f"batch_time={counter.batch_time:.4f} "
                f"reader_time={counter.reader_time:.4f} "
                f"| ETA {eta}",
                end="\r",
                flush=True)

            logger.add_scalar("loss", float(loss), global_step=global_step)
            logger.add_scalar("miou", float(miou), global_step=global_step)
            global_step += 1
            logger.flush()

            timer.restart()
        print()

        save_checkpoint(
            {
                'net': net.state_dict(),
                'optimizer': optimizer.state_dict(),
                'epoch': epoch + 1,
                'global_step': global_step,
            },
            epoch + 1,
            False,
            save_dir=args.save_dir)

        pass

    pass