# Copyright (c) 2013, Guillaume Desjardins, Razvan Pascanu.
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#   * Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#   * Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#   * Neither the name of the <organization> nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import numpy
from . import floatX

class HyperParamIterator():

    def __init__(self, timestamps, vals):
        assert len(timestamps) != 0
        assert len(timestamps) == len(vals)

        self.i = 0
        self.n = 0

        if not isinstance(vals, (list, numpy.ndarray)):
            vals = [vals]
        if not isinstance(timestamps, (list, numpy.ndarray)):
            timestamps = [timestamps]

        self.vals = vals if isinstance(vals[0], int) else numpy.asarray(vals, dtype=floatX)
        self.timestamps = numpy.asarray(timestamps, dtype=floatX)
        try:
            self.value = self.vals[0]
        except:
            import pdb; pdb.set_trace()

    def next(self):
        rval = False

        if self.i+1 < len(self.timestamps) and \
           self.n >= self.timestamps[self.i+1]:
            self.i += 1
            self.value = self.vals[self.i]
            rval = True

        self.n += 1
        return rval

    def __iterator__(self):
        return self

