'Adjusts the learning rate based on the contents of model.monitor
Parameters
model : a Model instance
dataset : Dataset
algorithm : WRITEME'

def on_monitor(self, model, dataset, algorithm):

    model = algorithm.model
    lr = algorithm.learning_rate
    current_learning_rate = lr.get_value()
    assert hasattr(model, 'monitor'), ('no    monitor    associated    with    ' + str(model))
    monitor = model.monitor
    monitor_channel_specified = True
    if (self.channel_name is None):
        monitor_channel_specified = False
        channels = [elem for elem in monitor.channels if elem.endswith('objective')]
        if (len(channels) < 1):
            raise ValueError('There    are    no    monitoring    channels    that    end    with    "objective".    Please    specify    either    channel_name    or    dataset_name.')
        elif (len(channels) > 1):
            datasets = algorithm.monitoring_dataset.keys()
            raise ValueError((('There    are    multiple    monitoring    channels    thatend    with    "_objective".    The    list    of    available    datasets    are:    ' + str(datasets)) + '    .    Please    specify    either    channel_name    or    dataset_name    in    the    MonitorBasedLRAdjuster    constructor    to    disambiguate.'))
        else:
            self.channel_name = channels[0]
            warnings.warn((('The    channel    that    has    been    chosen    for    monitoring    is:    ' + str(self.channel_name)) + '.'))
    try:
        v = monitor.channels[self.channel_name].val_record
    except KeyError:
        err_input = ''
        if monitor_channel_specified:
            if self.dataset_name:
                err_input = (("The    dataset_name    '" + str(self.dataset_name)) + "'    is    not    valid.")
            else:
                err_input = (("The    channel_name    '" + str(self.channel_name)) + "'    is    not    valid.")
        err_message = (((((("There    is    no    monitoring    channel    named    '" + str(self.channel_name)) + "'.    You    probably    need    to    ") + 'specify    a    valid    monitoring    channel    by    using    either    ') + 'dataset_name    or    channel_name    in    the    ') + 'MonitorBasedLRAdjuster    constructor.    ') + err_input)
        raise ValueError(err_message)
    if (len(v) < 1):
        if (monitor.dataset is None):
            assert (len(v) == 0)
            raise ValueError("You're    trying    to    use    a    monitor-based    learning    rate    adjustor    but    the    monitor    has    no    entries    because    you    didn't    specify    a    monitoring    dataset.")
        raise ValueError('For    some    reason    there    are    no    monitor    entriesyet    the    MonitorBasedLRAdjuster    has    been    called.    This    should    never    happen.    The    Train    object    should    call    the    monitor    once    on    initialization,    then    call    the    callbacks.    It    seems    you    are    either    calling    the    callback    manually    rather    than    as    part    of    a    training    algorithm,    or    there    is    a    problem    with    the    Train    object.')
    if (len(v) == 1):
        return
    rval = current_learning_rate
    log.info('monitoring    channel    is    {0}'.format(self.channel_name))
    if (v[(-1)] > (self.high_trigger * v[(-2)])):
        rval *= self.shrink_amt
        log.info(('shrinking    learning    rate    to    %f' % rval))
    elif (v[(-1)] > (self.low_trigger * v[(-2)])):
        rval *= self.grow_amt
        log.info(('growing    learning    rate    to    %f' % rval))
    rval = max(self.min_lr, rval)
    rval = min(self.max_lr, rval)
    lr.set_value(np.cast[lr.dtype](rval))
