From c8e05fe88b77f22ad0d34013cc9c57eedaa1a112 Mon Sep 17 00:00:00 2001 From: MechCoder Date: Thu, 28 Jan 2016 18:13:10 -0500 Subject: [PATCH] Python3 compatibility --- examples/simple/make_plots.py | 3 ++- spearmint/choosers/acquisition_functions.py | 7 ++++- spearmint/choosers/default_chooser.py | 11 ++++---- spearmint/grids/sobol.py | 12 +++++++-- spearmint/kernels/__init__.py | 12 ++++----- spearmint/kernels/kernel_utils.py | 8 +++++- spearmint/kernels/matern.py | 2 +- spearmint/kernels/product.py | 2 ++ spearmint/launcher.py | 7 ++--- spearmint/main.py | 6 +++-- spearmint/models/__init__.py | 4 +-- spearmint/models/abstract_model.py | 2 ++ spearmint/models/gp.py | 8 +++--- spearmint/models/gp_classifier.py | 6 ++--- spearmint/resources/resource.py | 6 +++-- spearmint/sampling/__init__.py | 8 +++--- .../sampling/elliptical_slice_sampler.py | 27 ++++++++++--------- spearmint/sampling/mcmc.py | 12 +++++---- spearmint/sampling/slice_sampler.py | 27 ++++++++++--------- .../sampling/whitened_prior_slice_sampler.py | 23 ++++++++-------- spearmint/schedulers/local.py | 2 +- spearmint/tasks/base_task.py | 13 ++++----- spearmint/tasks/task_group.py | 7 ++--- spearmint/tests/kernels/test_matern.py | 1 + .../tests/kernels/test_product_kernel.py | 1 + spearmint/tests/kernels/test_scale.py | 1 + spearmint/tests/kernels/test_subset.py | 1 + spearmint/tests/kernels/test_sum_kernel.py | 1 + .../tests/kernels/test_transform_kernel.py | 1 + spearmint/tests/models/in_progress/gp.py | 1 + spearmint/tests/models/test_gp_classifier.py | 1 + spearmint/tests/tasks/test_task.py | 3 ++- .../tests/transformations/test_beta_warp.py | 1 + .../tests/transformations/test_kumar_warp.py | 1 + .../tests/transformations/test_linear.py | 1 + .../tests/transformations/test_norm_lin.py | 1 + .../transformations/test_normalization.py | 1 + .../tests/transformations/test_transformer.py | 1 + spearmint/transformations/__init__.py | 14 +++++----- spearmint/utils/cleanup.py | 2 +- spearmint/utils/compression.py | 6 +++-- spearmint/utils/database/mongodb.py | 2 +- spearmint/utils/fixes.py | 11 ++++++++ spearmint/utils/linalg.py | 7 ++++- spearmint/utils/param.py | 8 +++--- 45 files changed, 177 insertions(+), 105 deletions(-) create mode 100644 spearmint/utils/fixes.py diff --git a/examples/simple/make_plots.py b/examples/simple/make_plots.py index 70200b1..5c37a15 100644 --- a/examples/simple/make_plots.py +++ b/examples/simple/make_plots.py @@ -8,6 +8,7 @@ from spearmint.utils.database.mongodb import MongoDB +from spearmint.utils.fixes import items from spearmint.main import get_options, parse_resources_from_config, load_jobs, remove_broken_jobs, \ load_task_group, load_hypers @@ -15,7 +16,7 @@ def print_dict(d, level=1): if isinstance(d, dict): if level > 1: print "" - for k, v in d.iteritems(): + for k, v in items(d): print " " * level, k, print_dict(v, level=level+1) else: diff --git a/spearmint/choosers/acquisition_functions.py b/spearmint/choosers/acquisition_functions.py index ddd319d..7216ce4 100755 --- a/spearmint/choosers/acquisition_functions.py +++ b/spearmint/choosers/acquisition_functions.py @@ -183,6 +183,7 @@ # its Institution. +import sys import os import tempfile import copy @@ -191,10 +192,14 @@ import scipy.linalg as spla import scipy.stats as sps import scipy.optimize as spo -import cPickle import multiprocessing import ast +if sys.version < '3': + import cPickle +else: + import pickle as cPickle + def compute_ei(model, pred, ei_target=None, compute_grad=True): # TODO: use ei_target if pred.ndim == 1: diff --git a/spearmint/choosers/default_chooser.py b/spearmint/choosers/default_chooser.py index 26bf585..f6784a8 100755 --- a/spearmint/choosers/default_chooser.py +++ b/spearmint/choosers/default_chooser.py @@ -193,6 +193,7 @@ from .acquisition_functions import compute_ei from ..utils.grad_check import check_grad +from ..utils.fixes import items, xrange from ..grids import sobol_grid from ..models.abstract_model import function_over_hypers from .. import models @@ -260,7 +261,7 @@ def fit(self, task_group, hypers=None, options=None): grid_seed=self.grid_seed) # A useful hack: add previously visited points to the grid - for task_name, task in task_group.tasks.iteritems(): + for task_name, task in items(task_group.tasks): if task.has_valid_inputs(): self.grid = np.append(self.grid, task.valid_normalized_data_dict['inputs'], axis=0) if task.has_pending(): @@ -274,7 +275,7 @@ def fit(self, task_group, hypers=None, options=None): # print 'Fittings tasks: %s' % str(task_group.tasks.keys()) - for task_name, task in task_group.tasks.iteritems(): + for task_name, task in items(task_group.tasks): if task.type.lower() == 'objective': data_dict = self.objective # confusing: this is how self.objective gets populated elif task.type.lower() == 'constraint': @@ -351,7 +352,7 @@ def suggest(self): best_grid_ei = grid_ei[best_grid_ind] if VERBOSE: - print 'Best EI before optimization: %f' % best_grid_ei + print('Best EI before optimization: %f' % best_grid_ei) if self.check_grad: check_grad(lambda x: self.acq_optimize_wrapper(x, current_best, True), @@ -387,8 +388,8 @@ def suggest(self): # Optimization should always be better unless the optimization # breaks in some way. if VERBOSE: - print 'Best EI after optimization: %f' % best_opt_ei - print 'Suggested input %s' % cand[best_opt_ind] + print('Best EI after optimization: %f' % best_opt_ei) + print('Suggested input %s' % cand[best_opt_ind]) if best_opt_ei >= best_grid_ei: suggestion = cand[best_opt_ind] diff --git a/spearmint/grids/sobol.py b/spearmint/grids/sobol.py index 558e663..95bea3e 100755 --- a/spearmint/grids/sobol.py +++ b/spearmint/grids/sobol.py @@ -182,8 +182,15 @@ # to enter into this License and Terms of Use on behalf of itself and # its Institution. +import sys import numpy as np -import cPickle as pickle + +from spearmint.utils.fixes import xrange + +if sys.version < '3': + import cPickle as pickle +else: + import pickle # Numba autojit might be nice. Currently asplodes. def sobol(num_points, num_dims): @@ -236,7 +243,8 @@ def sobol(num_points, num_dims): return Z def to_binary(X, bits): - return 1 & (X[:,np.newaxis]/2**np.arange(bits-1,-1,-1, dtype=np.uint32)) + temp = X[:,np.newaxis]/2**np.arange(bits-1,-1,-1, dtype=np.uint32) + return np.ones_like(temp) & temp # These are the parameters for the Sobol sequence. # This is hilarious. diff --git a/spearmint/kernels/__init__.py b/spearmint/kernels/__init__.py index e79df88..25e96a0 100755 --- a/spearmint/kernels/__init__.py +++ b/spearmint/kernels/__init__.py @@ -1,8 +1,8 @@ -from matern import Matern52 -from sum_kernel import SumKernel -from product_kernel import ProductKernel -from noise import Noise -from scale import Scale -from transform_kernel import TransformKernel +from spearmint.kernels.matern import Matern52 +from spearmint.kernels.sum_kernel import SumKernel +from spearmint.kernels.product_kernel import ProductKernel +from spearmint.kernels.noise import Noise +from spearmint.kernels.scale import Scale +from spearmint.kernels.transform_kernel import TransformKernel __all__ = ["Matern52", "SumKernel", "ProductKernel", "Noise", "Scale", "TransformKernel"] diff --git a/spearmint/kernels/kernel_utils.py b/spearmint/kernels/kernel_utils.py index c84248d..a8d9565 100755 --- a/spearmint/kernels/kernel_utils.py +++ b/spearmint/kernels/kernel_utils.py @@ -184,7 +184,13 @@ import numpy as np -import scipy.weave + +try: + import scipy.weave +except ImportError: + pass + +from spearmint.utils.fixes import xrange from scipy.spatial.distance import cdist def dist2(ls, x1, x2=None): diff --git a/spearmint/kernels/matern.py b/spearmint/kernels/matern.py index 19f3836..16bf1e3 100755 --- a/spearmint/kernels/matern.py +++ b/spearmint/kernels/matern.py @@ -184,7 +184,7 @@ import numpy as np -import kernel_utils +from spearmint.kernels import kernel_utils from .abstract_kernel import AbstractKernel from ..utils import priors diff --git a/spearmint/kernels/product.py b/spearmint/kernels/product.py index 22e037c..c55c5be 100755 --- a/spearmint/kernels/product.py +++ b/spearmint/kernels/product.py @@ -196,6 +196,8 @@ import logging #warnings.filterwarnings("ignore", category=RuntimeWarning) +from spearmint.utils.fixes import xrange + class productCov: def __init__(self, num_dimensions, **kwargs): # The sub-covariances of which this is the elementwise product diff --git a/spearmint/launcher.py b/spearmint/launcher.py index b2ce21f..e596492 100755 --- a/spearmint/launcher.py +++ b/spearmint/launcher.py @@ -190,6 +190,7 @@ import numpy as np from spearmint.utils.database.mongodb import MongoDB +from spearmint.utils.fixes import items def main(): parser = optparse.OptionParser(usage="usage: %prog [options]") @@ -271,7 +272,7 @@ def launch(db_address, experiment_name, job_id): import traceback traceback.print_exc() sys.stderr.write("Problem executing the function\n") - print sys.exc_info() + print(sys.exc_info()) end_time = time.time() @@ -305,7 +306,7 @@ def python_launcher(job): # Convert the JSON object into useful parameters. params = {} - for name, param in job['params'].iteritems(): + for name, param in items(job['params']): vals = param['values'] if param['type'].lower() == 'float': @@ -351,7 +352,7 @@ def matlab_launcher(job): session.run("cd('%s')" % os.path.realpath(job['expt_dir'])) session.run('params = struct()') - for name, param in job['params'].iteritems(): + for name, param in items(job['params']): vals = param['values'] # sys.stderr.write('%s = %s\n' % (param['name'], str(vals))) diff --git a/spearmint/main.py b/spearmint/main.py index 052bea6..889c431 100755 --- a/spearmint/main.py +++ b/spearmint/main.py @@ -196,6 +196,7 @@ from collections import OrderedDict from spearmint.utils.database.mongodb import MongoDB +from spearmint.utils.fixes import items from spearmint.tasks.task_group import TaskGroup from spearmint.resources.resource import parse_resources_from_config @@ -203,6 +204,7 @@ from spearmint.utils.parsing import parse_db_address + def get_options(): parser = optparse.OptionParser(usage="usage: %prog [options] directory") @@ -262,7 +264,7 @@ def main(): while True: - for resource_name, resource in resources.iteritems(): + for resource_name, resource in items(resources): jobs = load_jobs(db, experiment_name) # resource.printStatus(jobs) @@ -313,7 +315,7 @@ def tired(db, experiment_name, resources): return True if no resources are accepting jobs """ jobs = load_jobs(db, experiment_name) - for resource_name, resource in resources.iteritems(): + for resource_name, resource in items(resources): if resource.acceptingJobs(jobs): return False return True diff --git a/spearmint/models/__init__.py b/spearmint/models/__init__.py index abd0926..26b67f6 100755 --- a/spearmint/models/__init__.py +++ b/spearmint/models/__init__.py @@ -1,4 +1,4 @@ -from gp import GP -from gp_classifier import GPClassifier +from spearmint.models.gp import GP +from spearmint.models.gp_classifier import GPClassifier __all__ = ["GP", "GPClassifier"] diff --git a/spearmint/models/abstract_model.py b/spearmint/models/abstract_model.py index 588379b..a560ac6 100755 --- a/spearmint/models/abstract_model.py +++ b/spearmint/models/abstract_model.py @@ -186,6 +186,8 @@ from abc import ABCMeta, abstractmethod +from spearmint.utils.fixes import xrange + class AbstractModel(object): __metaclass__ = ABCMeta diff --git a/spearmint/models/gp.py b/spearmint/models/gp.py index 3d41dee..b4b2de8 100755 --- a/spearmint/models/gp.py +++ b/spearmint/models/gp.py @@ -190,10 +190,12 @@ import scipy.stats as sps from .abstract_model import AbstractModel +from ..utils.fixes import items from ..utils.param import Param as Hyperparameter from ..kernels import Matern52, Noise, Scale, SumKernel, TransformKernel from ..sampling.slice_sampler import SliceSampler from ..utils import priors +from ..utils.fixes import items, xrange from ..transformations import BetaWarp, Transformer try: @@ -201,7 +203,7 @@ log = logging.getLogger(module) except: log = logging.getLogger() - print 'Not running from main.' + print('Not running from main.') DEFAULT_MCMC_ITERS = 10 DEFAULT_BURNIN = 100 @@ -274,7 +276,7 @@ def _set_likelihood(self, options): self.noiseless = False def _set_params_from_dict(self, hypers_dict): - for name, hyper in self.params.iteritems(): + for name, hyper in items(self.params): self.params[name].value = hypers_dict[name] def _reset_params(self): @@ -463,7 +465,7 @@ def set_state(self, state): def to_dict(self): """return a dictionary that saves the values of the hypers and the chain length""" gp_dict = {'hypers' : {}} - for name, hyper in self.params.iteritems(): + for name, hyper in items(self.params): gp_dict['hypers'][name] = hyper.value gp_dict['chain length'] = self.chain_length diff --git a/spearmint/models/gp_classifier.py b/spearmint/models/gp_classifier.py index 32ce8ad..6676d56 100755 --- a/spearmint/models/gp_classifier.py +++ b/spearmint/models/gp_classifier.py @@ -191,11 +191,11 @@ import scipy.optimize as spo import scipy.io as sio import scipy.stats as sps -import scipy.weave from .gp import GP from ..utils.param import Param as Hyperparameter +from ..utils.fixes import items, xrange from ..kernels import Matern52, Noise, Scale, SumKernel, TransformKernel from ..sampling.slice_sampler import SliceSampler from ..sampling.whitened_prior_slice_sampler import WhitenedPriorSliceSampler @@ -208,7 +208,7 @@ log = logging.getLogger(module) except: log = logging.getLogger() - print 'Not running from main.' + print('Not running from main.') class GPClassifier(GP): def __init__(self, num_dims, **options): @@ -476,7 +476,7 @@ def to_dict(self): gp_dict = {} gp_dict['hypers'] = {} - for name, hyper in self.params.iteritems(): + for name, hyper in items(self.params): gp_dict['hypers'][name] = hyper.value # Save the latent values as a dict with keys as hashes of the data diff --git a/spearmint/resources/resource.py b/spearmint/resources/resource.py index e693bf1..61bf3ed 100755 --- a/spearmint/resources/resource.py +++ b/spearmint/resources/resource.py @@ -190,6 +190,8 @@ import numpy as np import sys +from spearmint.utils.fixes import items + def parse_resources_from_config(config): """Parse the config dict and return a dictionary of resource objects keyed by resource name""" @@ -202,7 +204,7 @@ def parse_resources_from_config(config): # If resources are specified else: resources = dict() - for resource_name, resource_opts in config["resources"].iteritems(): + for resource_name, resource_opts in items(config["resources"]): task_names = parse_tasks_in_resource_from_config(config, resource_name) resources[resource_name] = resource_factory(resource_name, task_names, resource_opts) return resources @@ -217,7 +219,7 @@ def parse_tasks_in_resource_from_config(config, resource_name): return ['main'] else: tasks = list() - for task_name, task_config in config["tasks"].iteritems(): + for task_name, task_config in items(config["tasks"]): # If the user specified tasks but not specific resources for those tasks, # We have to assume the tasks run on all resources... if "resources" not in task_config: diff --git a/spearmint/sampling/__init__.py b/spearmint/sampling/__init__.py index 861ffd1..7a04b80 100755 --- a/spearmint/sampling/__init__.py +++ b/spearmint/sampling/__init__.py @@ -1,6 +1,6 @@ -from abstract_sampler import AbstractSampler -from slice_sampler import SliceSampler -from whitened_prior_slice_sampler import WhitenedPriorSliceSampler -from elliptical_slice_sampler import EllipticalSliceSampler +from spearmint.sampling.abstract_sampler import AbstractSampler +from spearmint.sampling.slice_sampler import SliceSampler +from spearmint.sampling.whitened_prior_slice_sampler import WhitenedPriorSliceSampler +from spearmint.sampling.elliptical_slice_sampler import EllipticalSliceSampler __all__ = ["AbstractSampler", "SliceSampler", "WhitenedPriorSliceSampler", "EllipticalSliceSampler"] \ No newline at end of file diff --git a/spearmint/sampling/elliptical_slice_sampler.py b/spearmint/sampling/elliptical_slice_sampler.py index 98d0a4a..38a078d 100755 --- a/spearmint/sampling/elliptical_slice_sampler.py +++ b/spearmint/sampling/elliptical_slice_sampler.py @@ -192,6 +192,7 @@ from .abstract_sampler import AbstractSampler from ..utils import param as hyperparameter_utils +from ..utils.fixes import xrange class EllipticalSliceSampler(AbstractSampler): @@ -292,7 +293,7 @@ def elliptical_slice(xx, log_like_fn, prior_chol, prior_mean, *log_like_args, ** from utils import priors import time - print '2D Gaussian:' + print('2D Gaussian:') n = 1000000 @@ -312,20 +313,20 @@ def elliptical_slice(xx, log_like_fn, prior_chol, prior_mean, *log_like_args, ** like_cov = np.dot(like_L, like_L.T) like = priors.MultivariateNormal(mu=like_mu, cov=like_cov) - print 'Prior cov:' - print prior_cov - print 'Like cov:' - print like_cov + print('Prior cov:') + print(prior_cov) + print('Like cov:') + print(like_cov) current_time = time.time() cur_ll = None for i in xrange(n): if i % 1000 == 0: - print 'Elliptical Slice Sample %d/%d' % (i,n) + print('Elliptical Slice Sample %d/%d' % (i,n)) x, cur_ll = elliptical_slice(x, like.logprob, prior_L, prior_mu, cur_log_like=cur_ll) x_samples[:,i] = x.copy() - print 'Elliptical slice sampling took %f seconds' % (time.time() - current_time) + print('Elliptical slice sampling took %f seconds' % (time.time() - current_time)) # Formula for the actual mean and covariance matrix below came from # the wikipedia page on conjugate priors @@ -334,13 +335,13 @@ def elliptical_slice(xx, log_like_fn, prior_chol, prior_mean, *log_like_args, ** B = spla.cho_solve((like_L, True), like_mu) actual_mean = np.dot(actual_cov, A+B) - print 'Actual mean: %s' % actual_mean - print 'Mean of ESS samples: %s' % np.mean(x_samples,axis=1) + print('Actual mean: %s' % actual_mean) + print('Mean of ESS samples: %s' % np.mean(x_samples,axis=1)) - print 'Actual Cov:' - print actual_cov - print 'Cov of ESS samples:' - print np.cov(x_samples) + print('Actual Cov:') + print(actual_cov) + print('Cov of ESS samples:') + print(np.cov(x_samples)) # below: also compare with regular slice sampling (slower) diff --git a/spearmint/sampling/mcmc.py b/spearmint/sampling/mcmc.py index fa57e74..c6bda1c 100755 --- a/spearmint/sampling/mcmc.py +++ b/spearmint/sampling/mcmc.py @@ -186,6 +186,8 @@ import numpy as np import numpy.random as npr +from spearmint.utils.fixes import xrange + def elliptical_slice(xx, chol_Sigma, log_like_fn, *log_like_fn_args): D = xx.size @@ -316,7 +318,7 @@ def acceptable(z, llh_s, L, U): new_z = (upper - lower)*npr.rand() + lower new_llh = dir_logprob(new_z) if np.isnan(new_llh): - print new_z, direction*new_z + init_x, new_llh, llh_s, init_x, logprob(init_x, *logprob_args) + print(new_z, direction*new_z + init_x, new_llh, llh_s, init_x, logprob(init_x, *logprob_args)) raise Exception("Slice sampler got a NaN") if new_llh > llh_s and acceptable(new_z, llh_s, start_lower, start_upper): break @@ -328,7 +330,7 @@ def acceptable(z, llh_s, L, U): raise Exception("Slice sampler shrank to zero!") if verbose: - print "Steps Out:", l_steps_out, u_steps_out, " Steps In:", steps_in + print("Steps Out:", l_steps_out, u_steps_out, " Steps In:", steps_in) return new_z*direction + init_x, new_llh @@ -377,7 +379,7 @@ def dir_logprob(z): # logprob of the proposed point (x + dir*z) where z must be try: return logprob(direction*z + init_x, *logprob_args) except: - print 'ERROR: Logprob failed at input %s' % str(direction*z + init_x) + print('ERROR: Logprob failed at input %s' % str(direction*z + init_x)) raise @@ -407,7 +409,7 @@ def dir_logprob(z): # logprob of the proposed point (x + dir*z) where z must be new_z = (upper - lower)*npr.rand() + lower # uniformly sample between upper and lower new_llh = dir_logprob(new_z) # new current logprob if np.isnan(new_llh): - print new_z, direction*new_z + init_x, new_llh, llh_s, init_x, logprob(init_x) + print(new_z, direction*new_z + init_x, new_llh, llh_s, init_x, logprob(init_x)) raise Exception("Slice sampler got a NaN logprob") if new_llh > llh_s: # this is the termination condition break # it says, if you got to a better place than you started, you're done @@ -422,7 +424,7 @@ def dir_logprob(z): # logprob of the proposed point (x + dir*z) where z must be raise Exception("Slice sampler shrank to zero!") if verbose: - print "Steps Out:", l_steps_out, u_steps_out, " Steps In:", steps_in, "Final logprob:", new_llh + print("Steps Out:", l_steps_out, u_steps_out, " Steps In:", steps_in, "Final logprob:", new_llh) # return new the point return new_z*direction + init_x, new_llh diff --git a/spearmint/sampling/slice_sampler.py b/spearmint/sampling/slice_sampler.py index cc2328a..8d86f9c 100755 --- a/spearmint/sampling/slice_sampler.py +++ b/spearmint/sampling/slice_sampler.py @@ -191,6 +191,7 @@ # from .mcmc import slice_sample_simple as slice_sample from .abstract_sampler import AbstractSampler from ..utils import param as hyperparameter_utils +from ..utils.fixes import xrange class SliceSampler(AbstractSampler): @@ -228,9 +229,9 @@ def logprob(self, x, model): lp += param.prior_logprob() if np.isnan(lp): # Positive infinity should be ok, right? - print 'Param diagnostics:' + print('Param diagnostics:') param.print_diagnostics() - print 'Prior logprob: %f' % param.prior_logprob() + print('Prior logprob: %f' % param.prior_logprob()) raise Exception("Prior returned %f logprob" % lp) if not np.isfinite(lp): @@ -282,13 +283,13 @@ def sample(self, model): for i in xrange(n): if i % 1000 == 0: - print 'Sample %d/%d' % (i,n) + print('Sample %d/%d' % (i,n)) x, cur_ll = slice_sample(x, gsn. logprob) x_samples[i] = x.copy() - print '1D Gaussian actual mean: %f, mean of samples: %f' % (-1, np.mean(x_samples)) - print '1D Gaussian actual sigma: %f, std of samples: %f' % (4, np.std(x_samples)) + print('1D Gaussian actual mean: %f, mean of samples: %f' % (-1, np.mean(x_samples))) + print('1D Gaussian actual sigma: %f, std of samples: %f' % (4, np.std(x_samples))) plt.figure(1) @@ -307,19 +308,19 @@ def sample(self, model): for i in xrange(n): if i % 1000 == 0: - print 'Sample %d/%d' % (i,n) + print('Sample %d/%d' % (i,n)) x, cur_ll = slice_sample(x, mvn.logprob) x_samples[:,i] = x.copy() mu_samp = np.mean(x_samples,axis=1) - print '2D Gaussian:' - print 'Actual mean: [%f,%f]' % (mu[0], mu[1]) - print 'Mean of samples: [%f,%f]' % (mu_samp[0], mu_samp[1]) - print 'Actual Cov:' - print str(cov) - print 'Cov of samples' - print str(np.cov(x_samples)) + print('2D Gaussian:') + print('Actual mean: [%f,%f]' % (mu[0], mu[1])) + print('Mean of samples: [%f,%f]' % (mu_samp[0], mu_samp[1])) + print('Actual Cov:') + print(str(cov)) + print('Cov of samples') + print(str(np.cov(x_samples))) # plt.figure(1) # plt.clf() diff --git a/spearmint/sampling/whitened_prior_slice_sampler.py b/spearmint/sampling/whitened_prior_slice_sampler.py index 6a7c770..61b12c0 100755 --- a/spearmint/sampling/whitened_prior_slice_sampler.py +++ b/spearmint/sampling/whitened_prior_slice_sampler.py @@ -192,6 +192,7 @@ # from .mcmc import slice_sample_simple as slice_sample from .abstract_sampler import AbstractSampler from ..utils import param as hyperparameter_utils +from ..utils.fixes import xrange class WhitenedPriorSliceSampler(AbstractSampler): @@ -268,13 +269,13 @@ def sample_fun(self, model, **sampler_options): for i in xrange(n): if i % 1000 == 0: - print 'Sample %d/%d' % (i,n) + print('Sample %d/%d' % (i,n)) x, cur_ll = slice_sample(x, gsn. logprob) x_samples[i] = x.copy() - print '1D Gaussian actual mean: %f, mean of samples: %f' % (-1, np.mean(x_samples)) - print '1D Gaussian actual sigma: %f, std of samples: %f' % (4, np.std(x_samples)) + print('1D Gaussian actual mean: %f, mean of samples: %f' % (-1, np.mean(x_samples))) + print('1D Gaussian actual sigma: %f, std of samples: %f' % (4, np.std(x_samples))) plt.figure(1) @@ -293,19 +294,19 @@ def sample_fun(self, model, **sampler_options): for i in xrange(n): if i % 1000 == 0: - print 'Sample %d/%d' % (i,n) + print('Sample %d/%d' % (i,n)) x, cur_ll = slice_sample(x, mvn.logprob) x_samples[:,i] = x.copy() mu_samp = np.mean(x_samples,axis=1) - print '2D Gaussian:' - print 'Actual mean: [%f,%f]' % (mu[0], mu[1]) - print 'Mean of samples: [%f,%f]' % (mu_samp[0], mu_samp[1]) - print 'Actual Cov:' - print str(cov) - print 'Cov of samples' - print str(np.cov(x_samples)) + print('2D Gaussian:') + print('Actual mean: [%f,%f]' % (mu[0], mu[1])) + print('Mean of samples: [%f,%f]' % (mu_samp[0], mu_samp[1])) + print('Actual Cov:') + print(str(cov)) + print('Cov of samples') + print(str(np.cov(x_samples))) # plt.figure(1) # plt.clf() diff --git a/spearmint/schedulers/local.py b/spearmint/schedulers/local.py index 04072d9..4059dc2 100755 --- a/spearmint/schedulers/local.py +++ b/spearmint/schedulers/local.py @@ -183,7 +183,7 @@ # its Institution. import spearmint -from abstract_scheduler import AbstractScheduler +from spearmint.schedulers.abstract_scheduler import AbstractScheduler import os import subprocess import sys diff --git a/spearmint/tasks/base_task.py b/spearmint/tasks/base_task.py index 34c183a..6903654 100755 --- a/spearmint/tasks/base_task.py +++ b/spearmint/tasks/base_task.py @@ -187,6 +187,7 @@ import numpy as np from collections import OrderedDict +from spearmint.utils.fixes import items, xrange class BaseTask(object): """ @@ -207,7 +208,7 @@ def variables_config_to_meta(self, variables_config): cardinality = 0 # The number of distinct variables num_dims = 0 # The number of dimensions in the matrix representation - for name, variable in variables_config.iteritems(): + for name, variable in items(variables_config): cardinality += variable['size'] vdict = {'type' : variable['type'].lower(), 'indices' : []} # indices stores a mapping from these variable(s) to their matrix column(s) @@ -250,7 +251,7 @@ def paramify_and_print(self, data_vector, left_indent=0, indent_top_row=False): sys.stderr.write(indentation) sys.stderr.write('---- ---- -----\n') - for param_name, param in params.iteritems(): + for param_name, param in items(params): if param['type'] == 'float': format_str = '%s%-12.12s %-9.9s %-12f\n' @@ -271,7 +272,7 @@ def paramify(self, data_vector): raise Exception('Input to paramify must be a 1-D array.') params = {} - for name, vdict in self.variables_meta.iteritems(): + for name, vdict in items(self.variables_meta): indices = vdict['indices'] params[name] = {} params[name]['type'] = vdict['type'] @@ -290,7 +291,7 @@ def paramify(self, data_vector): # Converts a dict of params to the corresponding vector in puts space def vectorify(self, params): v = np.zeros(self.num_dims) - for name, param in params.iteritems(): + for name, param in items(params): indices = self.variables_meta[name]['indices'] if param['type'] == 'int' or param['type'] == 'float': @@ -316,7 +317,7 @@ def to_unit(self, V): squeeze = False U = np.zeros(V.shape) - for name, variable in self.variables_meta.iteritems(): + for name, variable in items(self.variables_meta): indices = variable['indices'] if variable['type'] == 'int': vals = V[:,indices] @@ -346,7 +347,7 @@ def from_unit(self, U): squeeze = False V = np.zeros(U.shape) - for name, variable in self.variables_meta.iteritems(): + for name, variable in items(self.variables_meta): indices = variable['indices'] if variable['type'] == 'int': vals = U[:,indices] diff --git a/spearmint/tasks/task_group.py b/spearmint/tasks/task_group.py index 1ed01a1..b807d57 100755 --- a/spearmint/tasks/task_group.py +++ b/spearmint/tasks/task_group.py @@ -185,11 +185,12 @@ import copy import numpy as np +import sys from collections import OrderedDict from .task import Task - +from spearmint.utils.fixes import items class TaskGroup(object): """ @@ -203,7 +204,7 @@ class TaskGroup(object): def __init__(self, tasks_config, variables_config): self.tasks = {} - for task_name, task_options in tasks_config.iteritems(): + for task_name, task_options in items(tasks_config): self.tasks[task_name] = Task(task_name, task_options, variables_config) @@ -245,7 +246,7 @@ def pending(self, pending): @property def values(self): """return a dictionary of the task values keyed by task name""" - return {task_name : task.values for task_name, task in self.tasks.iteritems()} + return {task_name : task.values for task_name, task in items(self.tasks)} @values.setter def values(self, values): diff --git a/spearmint/tests/kernels/test_matern.py b/spearmint/tests/kernels/test_matern.py index 4a131da..8e2d29b 100755 --- a/spearmint/tests/kernels/test_matern.py +++ b/spearmint/tests/kernels/test_matern.py @@ -186,6 +186,7 @@ import numpy.random as npr from spearmint.kernels import Matern52 +from spearmint.utils.fixes import xrange def test_matern_grad(): npr.seed(1) diff --git a/spearmint/tests/kernels/test_product_kernel.py b/spearmint/tests/kernels/test_product_kernel.py index 95826b1..131ab01 100755 --- a/spearmint/tests/kernels/test_product_kernel.py +++ b/spearmint/tests/kernels/test_product_kernel.py @@ -186,6 +186,7 @@ import numpy.random as npr from spearmint.kernels import Matern52, ProductKernel +from spearmint.utils.fixes import xrange def test_product_kernel_grad(): npr.seed(1) diff --git a/spearmint/tests/kernels/test_scale.py b/spearmint/tests/kernels/test_scale.py index ace7495..2a56b02 100755 --- a/spearmint/tests/kernels/test_scale.py +++ b/spearmint/tests/kernels/test_scale.py @@ -186,6 +186,7 @@ import numpy.random as npr from spearmint.kernels import Matern52, Scale +from spearmint.utils.fixes import xrange def test_grad(): npr.seed(1) diff --git a/spearmint/tests/kernels/test_subset.py b/spearmint/tests/kernels/test_subset.py index b254c81..f9abaf2 100755 --- a/spearmint/tests/kernels/test_subset.py +++ b/spearmint/tests/kernels/test_subset.py @@ -186,6 +186,7 @@ import numpy.random as npr from spearmint.kernels import Matern52, Subset +from spearmint.utils.fixes import xrange def test_grad(): npr.seed(1) diff --git a/spearmint/tests/kernels/test_sum_kernel.py b/spearmint/tests/kernels/test_sum_kernel.py index d40cd10..ad9bd55 100755 --- a/spearmint/tests/kernels/test_sum_kernel.py +++ b/spearmint/tests/kernels/test_sum_kernel.py @@ -186,6 +186,7 @@ import numpy.random as npr from spearmint.kernels import Matern52, SumKernel +from spearmint.utils.fixes import xrange def test_sum_kernel_grad(): npr.seed(1) diff --git a/spearmint/tests/kernels/test_transform_kernel.py b/spearmint/tests/kernels/test_transform_kernel.py index 344cf75..bb19793 100755 --- a/spearmint/tests/kernels/test_transform_kernel.py +++ b/spearmint/tests/kernels/test_transform_kernel.py @@ -187,6 +187,7 @@ from spearmint.kernels import Matern52, TransformKernel from spearmint.transformations import BetaWarp, Normalization, Linear, Transformer +from spearmint.utils.fixes import xrange def test_grad(): npr.seed(1) diff --git a/spearmint/tests/models/in_progress/gp.py b/spearmint/tests/models/in_progress/gp.py index fda1a2c..ac3ce5e 100755 --- a/spearmint/tests/models/in_progress/gp.py +++ b/spearmint/tests/models/in_progress/gp.py @@ -195,6 +195,7 @@ from spearmint.kernels import Matern, Noise, Scale, SumKernel, TransformKernel from spearmint.sampling.slice_sampler import SliceSampler from spearmint.utils import priors +from spearmint.utils.fixes import xrange from spearmint.transformations import BetaWarp, IgnoreDims, Linear, Normalization, Transformer import spearmint.utils.param as param_util diff --git a/spearmint/tests/models/test_gp_classifier.py b/spearmint/tests/models/test_gp_classifier.py index c92bcbb..a80c530 100755 --- a/spearmint/tests/models/test_gp_classifier.py +++ b/spearmint/tests/models/test_gp_classifier.py @@ -186,6 +186,7 @@ import numpy.random as npr from spearmint.models import GPClassifier +from spearmint.utils.fixes import xrange def test_gp_init(): gp = GPClassifier(5) diff --git a/spearmint/tests/tasks/test_task.py b/spearmint/tests/tasks/test_task.py index 5920d7b..bb52f0e 100755 --- a/spearmint/tests/tasks/test_task.py +++ b/spearmint/tests/tasks/test_task.py @@ -186,6 +186,7 @@ from collections import OrderedDict from spearmint.tasks.task import Task +from spearmint.utils.fixes import items def create_task(): task_name = "mytask" @@ -211,7 +212,7 @@ def create_task(): # Create a set of inputs that satisfies the constraints of each variable X = np.zeros((10,num_dims)) for i in xrange(10): - for name, variable in variables_meta.iteritems(): + for name, variable in items(variables_meta): indices = variable['indices'] if variable['type'] == 'int': X[i,indices] = np.random.randint(variable['min'], variable['max']+1, len(indices)) diff --git a/spearmint/tests/transformations/test_beta_warp.py b/spearmint/tests/transformations/test_beta_warp.py index b72e4eb..a466186 100755 --- a/spearmint/tests/transformations/test_beta_warp.py +++ b/spearmint/tests/transformations/test_beta_warp.py @@ -191,6 +191,7 @@ from spearmint.transformations import BetaWarp from spearmint.utils import priors +from spearmint.utils.fixes import xrange from spearmint.utils.param import Param as Hyperparameter def test_validation(): diff --git a/spearmint/tests/transformations/test_kumar_warp.py b/spearmint/tests/transformations/test_kumar_warp.py index 40b5fa9..d382962 100755 --- a/spearmint/tests/transformations/test_kumar_warp.py +++ b/spearmint/tests/transformations/test_kumar_warp.py @@ -191,6 +191,7 @@ from spearmint.transformations import KumarWarp from spearmint.utils import priors +from spearmint.utils.fixes import xrange from spearmint.utils.param import Param as Hyperparameter def test_validation(): diff --git a/spearmint/tests/transformations/test_linear.py b/spearmint/tests/transformations/test_linear.py index 89ba002..86dab42 100755 --- a/spearmint/tests/transformations/test_linear.py +++ b/spearmint/tests/transformations/test_linear.py @@ -189,6 +189,7 @@ from spearmint.transformations import Linear from spearmint.utils import priors +from spearmint.utils.fixes import xrange from spearmint.utils.param import Param as Hyperparameter def test_backward_pass(): diff --git a/spearmint/tests/transformations/test_norm_lin.py b/spearmint/tests/transformations/test_norm_lin.py index 2c69c17..705391d 100755 --- a/spearmint/tests/transformations/test_norm_lin.py +++ b/spearmint/tests/transformations/test_norm_lin.py @@ -189,6 +189,7 @@ from spearmint.transformations import NormLin from spearmint.utils import priors +from spearmint.utils.fixes import xrange from spearmint.utils.param import Param as Hyperparameter def test_backward_pass(): diff --git a/spearmint/tests/transformations/test_normalization.py b/spearmint/tests/transformations/test_normalization.py index 50f58d4..1d7d5ce 100755 --- a/spearmint/tests/transformations/test_normalization.py +++ b/spearmint/tests/transformations/test_normalization.py @@ -189,6 +189,7 @@ from spearmint.transformations import Normalization from spearmint.utils import priors +from spearmint.utils.fixes import xrange from spearmint.utils.param import Param as Hyperparameter def test_backward_pass(): diff --git a/spearmint/tests/transformations/test_transformer.py b/spearmint/tests/transformations/test_transformer.py index ae266d8..bc5ef73 100755 --- a/spearmint/tests/transformations/test_transformer.py +++ b/spearmint/tests/transformations/test_transformer.py @@ -189,6 +189,7 @@ from spearmint.transformations import Transformer, BetaWarp, Normalization, Linear from spearmint.transformations.abstract_transformation import AbstractTransformation +from spearmint.utils.fixes import xrange class SimpleTransformation(AbstractTransformation): def __init__(self, num_dims): diff --git a/spearmint/transformations/__init__.py b/spearmint/transformations/__init__.py index 52f774c..6742a91 100755 --- a/spearmint/transformations/__init__.py +++ b/spearmint/transformations/__init__.py @@ -1,9 +1,9 @@ -from beta_warp import BetaWarp -from ignore_dims import IgnoreDims -from kumar_warp import KumarWarp -from normalization import Normalization -from linear import Linear -from transformer import Transformer -from norm_lin import NormLin +from spearmint.transformations.beta_warp import BetaWarp +from spearmint.transformations.ignore_dims import IgnoreDims +from spearmint.transformations.kumar_warp import KumarWarp +from spearmint.transformations.normalization import Normalization +from spearmint.transformations.linear import Linear +from spearmint.transformations.transformer import Transformer +from spearmint.transformations.norm_lin import NormLin __all__ = ["BetaWarp", "IgnoreDims", "KumarWarp", "Normalization", "Linear", "Transformer", "NormLin"] diff --git a/spearmint/utils/cleanup.py b/spearmint/utils/cleanup.py index 71660c3..ae8b04b 100755 --- a/spearmint/utils/cleanup.py +++ b/spearmint/utils/cleanup.py @@ -199,7 +199,7 @@ def cleanup(path): cfg = json.load(f) db_address = parse_db_address(cfg) - print 'Cleaning up experiment %s in database at %s' % (cfg["experiment-name"], db_address) + print('Cleaning up experiment %s in database at %s' + cfg["experiment-name"] + db_address) client = pymongo.MongoClient(db_address) diff --git a/spearmint/utils/compression.py b/spearmint/utils/compression.py index b0101e9..3fb563e 100755 --- a/spearmint/utils/compression.py +++ b/spearmint/utils/compression.py @@ -185,6 +185,8 @@ import zlib import numpy as np +from spearmint.utils.fixes import items + COMPRESS_TYPE = 'compressed array' # TODO: see if there is a better way to encode this than base64 @@ -201,7 +203,7 @@ def decompress_array(a): def compress_nested_container(u_container): if isinstance(u_container, dict): cdict = {} - for key, value in u_container.iteritems(): + for key, value in items(u_container): if isinstance(value, dict) or isinstance(value, list): cdict[key] = compress_nested_container(value) else: @@ -233,7 +235,7 @@ def decompress_nested_container(c_container): raise Exception('Container does not contain a valid array.') else: udict = {} - for key, value in c_container.iteritems(): + for key, value in items(c_container): if isinstance(value, dict) or isinstance(value, list): udict[key] = decompress_nested_container(value) else: diff --git a/spearmint/utils/database/mongodb.py b/spearmint/utils/database/mongodb.py index 28ab540..f664d1f 100755 --- a/spearmint/utils/database/mongodb.py +++ b/spearmint/utils/database/mongodb.py @@ -187,7 +187,7 @@ import pymongo import numpy.random as npr -from abstractdb import AbstractDB +from spearmint.utils.database.abstractdb import AbstractDB from spearmint.utils.compression import compress_nested_container, decompress_nested_container class MongoDB(AbstractDB): diff --git a/spearmint/utils/fixes.py b/spearmint/utils/fixes.py new file mode 100644 index 0000000..28f9254 --- /dev/null +++ b/spearmint/utils/fixes.py @@ -0,0 +1,11 @@ +import sys + +def items(x): + if sys.version < '3': + return x.iteritems() + return x.items() + +def xrange(x): + if sys.version < '3': + return xrange(x) + return range(x) diff --git a/spearmint/utils/linalg.py b/spearmint/utils/linalg.py index 659f02a..4bac189 100755 --- a/spearmint/utils/linalg.py +++ b/spearmint/utils/linalg.py @@ -184,9 +184,14 @@ import numpy as np -import scipy.weave +try: + import scipy.weave +except ImportError: + pass import scipy.linalg as spla +from spearmint.utils.fixes import xrange + # Update Cholesky decomposition to include a single extra # row/column in the input matrix which is significantly faster than # recomputing the entire cholesky decomposition. diff --git a/spearmint/utils/param.py b/spearmint/utils/param.py index 459bd89..dc6d7a5 100755 --- a/spearmint/utils/param.py +++ b/spearmint/utils/param.py @@ -186,8 +186,8 @@ import numpy as np -import priors -from compression import compress_array +from spearmint.utils import priors +from spearmint.utils.compression import compress_array def set_params_from_array(params_iterable, params_array): """Update the params in params_iterable with the new values stored in params_array""" @@ -272,6 +272,6 @@ def sample_from_prior(self): def print_diagnostics(self): if self.size() == 1: - print ' %s: %s' % (self.name, self.value) + print((' %s: %s') % (self.name, self.value)) else: - print ' %s: min=%s, max=%s (size=%d)' % (self.name, self.value.min(), self.value.max(), self.size()) + print('( %s: min=%s, max=%s (size=%d)' % (self.name, self.value.min(), self.value.max(), self.size()))