# Copyright (c) 2012-2014, Max Zwiessele. # Licensed under the BSD 3-clause license (see LICENSE.txt) from __future__ import print_function import numpy as np import sys import time import datetime def exponents(fnow, current_grad): exps = [np.abs(np.float(fnow)), 1 if current_grad is np.nan else current_grad] return np.sign(exps) * np.log10(exps).astype(int) class VerboseOptimization(object): def __init__(self, model, opt, maxiters, verbose=False, current_iteration=0, ipython_notebook=True, clear_after_finish=False): self.verbose = verbose if self.verbose: self.model = model self.iteration = current_iteration self.p_iter = self.iteration self.maxiters = maxiters self.len_maxiters = len(str(maxiters)) self.opt_name = opt.opt_name self.model.add_observer(self, self.print_status) self.status = 'running' self.clear = clear_after_finish self.deltat = .2 self.update() try: from IPython.display import display from IPython.html.widgets import IntProgress, HTML, Box, VBox, HBox, FlexBox self.text = HTML(width='100%') self.progress = IntProgress(min=0, max=maxiters) #self.progresstext = Text(width='100%', disabled=True, value='0/{}'.format(maxiters)) self.model_show = HTML() self.ipython_notebook = ipython_notebook except: # Not in Ipython notebook self.ipython_notebook = False if self.ipython_notebook: left_col = VBox(children=[self.progress, self.text], padding=2, width='40%') right_col = Box(children=[self.model_show], padding=2, width='60%') self.hor_align = FlexBox(children = [left_col, right_col], width='100%', orientation='horizontal') display(self.hor_align) try: self.text.set_css('width', '100%') left_col.set_css({ 'padding': '2px', 'width': "100%", }) right_col.set_css({ 'padding': '2px', }) self.hor_align.set_css({ 'width': "100%", }) self.hor_align.remove_class('vbox') self.hor_align.add_class('hbox') left_col.add_class("box-flex1") right_col.add_class('box-flex0') except: pass #self.text.add_class('box-flex2') #self.progress.add_class('box-flex1') else: self.exps = exponents(self.fnow, self.current_gradient) print('Running {} Code:'.format(self.opt_name)) print(' {3:7s} {0:{mi}s} {1:11s} {2:11s}'.format("i", "f", "|g|", "runtime", mi=self.len_maxiters)) def __enter__(self): self.start = time.time() return self def print_out(self, seconds): if seconds<60: ms = (seconds%1)*100 self.timestring = "{s:0>2d}s{ms:0>2d}".format(s=int(seconds), ms=int(ms)) else: m, s = divmod(seconds, 60) if m>59: h, m = divmod(m, 60) if h>23: d, h = divmod(h, 24) self.timestring = '{d:0>2d}d{h:0>2d}h{m:0>2d}'.format(m=int(m), h=int(h), d=int(d)) else: self.timestring = '{h:0>2d}h{m:0>2d}m{s:0>2d}'.format(m=int(m), s=int(s), h=int(h)) else: ms = (seconds%1)*100 self.timestring = '{m:0>2d}m{s:0>2d}s{ms:0>2d}'.format(m=int(m), s=int(s), ms=int(ms)) if self.ipython_notebook: names_vals = [['optimizer', "{:s}".format(self.opt_name)], ['runtime', "{:>s}".format(self.timestring)], ['evaluation', "{:>0{l}}".format(self.iteration, l=self.len_maxiters)], ['objective', "{: > 12.3E}".format(self.fnow)], ['||gradient||', "{: >+12.3E}".format(float(self.current_gradient))], ['status', "{:s}".format(self.status)], ] #message = "Lik:{:5.3E} Grad:{:5.3E} Lik:{:5.3E} Len:{!s}".format(float(m.log_likelihood()), np.einsum('i,i->', grads, grads), float(m.likelihood.variance), " ".join(["{:3.2E}".format(l) for l in m.kern.lengthscale.values])) html_begin = """