Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ sudo: false

language: python
python:
- "2.7"
- 2.7
- 3.6
- 3.7
- 3.8

addons:
apt:
Expand All @@ -13,17 +16,18 @@ addons:
- liblapack-dev

before_install:
- travis_retry wget http://repo.continuum.io/miniconda/Miniconda-3.8.3-Linux-x86_64.sh -O miniconda.sh
- chmod +x miniconda.sh
- bash miniconda.sh -b -p $HOME/miniconda
- export PATH=/home/travis/miniconda/bin:$PATH
- conda update --yes conda
- #travis_retry wget http://repo.continuum.io/miniconda/Miniconda-3.8.3-Linux-x86_64.sh -O miniconda.sh
- #chmod +x miniconda.sh
- #bash miniconda.sh -b -p $HOME/miniconda
- #export PATH=/home/travis/miniconda/bin:$PATH
- #conda update --yes conda

install:
- conda create --yes -n test python=$TRAVIS_PYTHON_VERSION
- source activate test
- conda install --yes numpy scipy matplotlib pip nose
- pip install setuptools
- python setup.py install
#- conda create --yes -n test python=$TRAVIS_PYTHON_VERSION
#- source activate test
#- conda install --yes numpy scipy matplotlib pip nose
# - pip install setuptools
- pip install .
- export MPLBACKEND="Agg"

script: python test.py
script: nosetests
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ You should now be able to import the active subspaces library in Python scripts

This method was tested on Windows 7 Professional, and Ubuntu 14.04 LTS, and Mac OSX El Capitan with the [Enthought](https://www.enthought.com/) Python distribution (Python 2.7.11, NumPy 1.10.4, SciPy 0.17.0, and matplotlib 1.5.1).

This method was also tested on Ubuntu 18.04 with Python 3.6 and Python 2.7 using the [Conda](https://anaconda.org) Python distribution.

# Usage

For detailed examples of usage and results, see the Jupyter notebooks contained in the `tutorials` directory, the [active subspaces website]
Expand Down Expand Up @@ -80,4 +82,4 @@ If you have questions or feedback, contact [*Paul Constantine*](http://inside.mi

# Acknowledgments

This material is based upon work supported by the U.S. Department of Energy Office of Science, Office of Advanced Scientific Computing Research, Applied Mathematics program under Award Number DE-SC-0011077.
This material is based upon work supported by the U.S. Department of Energy Office of Science, Office of Advanced Scientific Computing Research, Applied Mathematics program under Award Number DE-SC-0011077.
2 changes: 1 addition & 1 deletion active_subspaces/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
''' This is the init file.'''
import utils, domains, gradients, integrals, optimizers, response_surfaces, subspaces
from . import utils, domains, gradients, integrals, optimizers, response_surfaces, subspaces
10 changes: 5 additions & 5 deletions active_subspaces/domains.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"""Utilities for building the domains and maps for active variables."""
import numpy as np
from utils.misc import process_inputs, BoundedNormalizer
from .utils.misc import process_inputs, BoundedNormalizer
from scipy.spatial import ConvexHull
from scipy.misc import comb
from utils.qp_solver import QPSolver
from subspaces import Subspaces
from .utils.qp_solver import QPSolver
from .subspaces import Subspaces

class ActiveVariableDomain():
"""A base class for the domain of functions of active variables.
Expand Down Expand Up @@ -116,7 +116,7 @@ def compute_boundary(self):
convhull = None
constraints = None
else:
Y, X = zonotope_vertices(W1)
Y, X = zonotope_vertices(W1)
convhull = ConvexHull(Y)
A = convhull.equations[:,:n]
b = convhull.equations[:,n]
Expand Down Expand Up @@ -468,7 +468,7 @@ def zonotope_vertices(W1, Nsamples=10000, maxcount=100000):

numverts = X.shape[0]
if totalverts > numverts:
print 'Warning: {} of {} vertices found.'.format(numverts, totalverts)
print('Warning: {} of {} vertices found.'.format(numverts, totalverts))

Y = np.dot(X, W1)
return Y.reshape((numverts, n)), X.reshape((numverts, m))
Expand Down
6 changes: 3 additions & 3 deletions active_subspaces/gradients.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Utilities for approximating gradients."""
import numpy as np
from utils.misc import process_inputs
from utils.simrunners import SimulationRunner
from .utils.misc import process_inputs
from .utils.simrunners import SimulationRunner

def local_linear_gradients(X, f, p=None, weights=None):
"""Estimate a collection of gradients from input/output pairs.
Expand Down Expand Up @@ -58,7 +58,7 @@ def local_linear_gradients(X, f, p=None, weights=None):
ind = ind[D2 != 0]
A = np.hstack((np.ones((p,1)), X[ind[:p],:])) * np.sqrt(weights[ii])
b = f[ind[:p]] * np.sqrt(weights[ii])
u = np.linalg.lstsq(A, b)[0]
u = np.linalg.lstsq(A, b, rcond=None)[0]
df[i,:] = u[1:].T
return df

Expand Down
12 changes: 6 additions & 6 deletions active_subspaces/integrals.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
"""Utilities for exploiting active subspaces when estimating integrals."""

import numpy as np
import utils.quadrature as gq
from utils.misc import conditional_expectations
from utils.designs import maximin_design
from utils.simrunners import SimulationRunner
from domains import UnboundedActiveVariableDomain, BoundedActiveVariableDomain, \
from active_subspaces.utils import quadrature as gq
from active_subspaces.utils.misc import conditional_expectations
from active_subspaces.utils.designs import maximin_design
from active_subspaces.utils.simrunners import SimulationRunner
from active_subspaces.domains import UnboundedActiveVariableDomain, BoundedActiveVariableDomain, \
ActiveVariableMap
from response_surfaces import ActiveSubspaceResponseSurface
from active_subspaces.response_surfaces import ActiveSubspaceResponseSurface
from scipy.spatial import Delaunay

def integrate(fun, avmap, N, NMC=10):
Expand Down
8 changes: 4 additions & 4 deletions active_subspaces/optimizers.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Utilities for exploiting active subspaces when optimizing."""
import numpy as np
from domains import UnboundedActiveVariableDomain, BoundedActiveVariableDomain, \
from .domains import UnboundedActiveVariableDomain, BoundedActiveVariableDomain, \
ActiveVariableMap
import scipy.optimize as scopt
from utils.response_surfaces import PolynomialApproximation
from utils.qp_solver import QPSolver
from utils.misc import process_inputs_outputs
from .utils.response_surfaces import PolynomialApproximation
from .utils.qp_solver import QPSolver
from .utils.misc import process_inputs_outputs

class MinVariableMap(ActiveVariableMap):
"""ActiveVariableMap for optimization
Expand Down
10 changes: 5 additions & 5 deletions active_subspaces/response_surfaces.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"""Utilities for exploiting active subspaces in response surfaces."""
import numpy as np
import utils.designs as dn
from utils.simrunners import SimulationRunner
from utils.misc import conditional_expectations
from utils.response_surfaces import RadialBasisApproximation
from domains import UnboundedActiveVariableDomain, BoundedActiveVariableDomain, \
from active_subspaces.utils import designs as dn
from active_subspaces.utils.simrunners import SimulationRunner
from active_subspaces.utils.misc import conditional_expectations
from active_subspaces.utils.response_surfaces import RadialBasisApproximation
from active_subspaces.domains import UnboundedActiveVariableDomain, BoundedActiveVariableDomain, \
ActiveVariableMap

class ActiveSubspaceResponseSurface():
Expand Down
16 changes: 9 additions & 7 deletions active_subspaces/subspaces.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"""Utilities for computing active and inactive subspaces."""
from __future__ import division

import numpy as np
from utils.misc import process_inputs, process_inputs_outputs
from utils.response_surfaces import PolynomialApproximation
from gradients import local_linear_gradients
from .utils.misc import process_inputs, process_inputs_outputs
from .utils.response_surfaces import PolynomialApproximation
from .gradients import local_linear_gradients

SQRTEPS = np.sqrt(np.finfo(float).eps)

Expand Down Expand Up @@ -171,7 +171,9 @@ def partition(self, n):

"""
if not isinstance(n, int):
raise TypeError('n should be an integer')
#raise TypeError('n should be an integer')
n = int(n)
print(Warning("n should be an integer. Performing conversion."))

m = self.eigenvecs.shape[0]
if n<1 or n>m:
Expand Down Expand Up @@ -236,7 +238,7 @@ def ols_subspace(X, f, weights):
# solve weighted least squares
A = np.hstack((np.ones((M, 1)), X)) * np.sqrt(weights)
b = f * np.sqrt(weights)
u = np.linalg.lstsq(A, b)[0]
u = np.linalg.lstsq(A, b, rcond=None)[0]
w = u[1:].reshape((m, 1))

# compute rank-1 C
Expand Down Expand Up @@ -273,7 +275,7 @@ def qphd_subspace(X, f, weights):
X, f, M, m = process_inputs_outputs(X, f)

# check if the points are uniform or Gaussian, set 2nd moment
if np.amax(X) > 1.0 or np.amin < -1.0:
if np.amax(X) > 1.0 or np.amin(X) < -1.0:
gamma = 1.0
else:
gamma = 1.0 / 3.0
Expand Down
2 changes: 1 addition & 1 deletion active_subspaces/utils/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
import designs, misc, plotters, qp_solver, quadrature, response_surfaces, simrunners
from . import designs, misc, plotters, qp_solver, quadrature, response_surfaces, simrunners
22 changes: 13 additions & 9 deletions active_subspaces/utils/designs.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Utilities for constructing design-of-experiments."""
import numpy as np
import misc as mi
from quadrature import gauss_hermite
from . import misc as mi
from .quadrature import gauss_hermite
from scipy.spatial import ConvexHull, distance_matrix
from scipy.optimize import minimize

Expand Down Expand Up @@ -120,7 +120,7 @@ def _maximin_design_obj(y, vert=None):
the design and between points and vertices.
"""
Ny, n = vert.shape
N = y.size / n
N = y.size // n
Y = y.reshape((N, n))

# get minimum distance among points
Expand Down Expand Up @@ -149,7 +149,7 @@ def _maximin_design_grad(y, vert=None):
Ny, n = vert.shape
v = vert.reshape((Ny*n, ))

N = y.size / n
N = y.size // n
Y = y.reshape((N, n))

# get minimum distance among points
Expand All @@ -165,19 +165,23 @@ def _maximin_design_grad(y, vert=None):
g = np.zeros((N*n, ))
if d0star < d1star:
dstar, kstar = d0star, k0star
istar = kstar/N
istar = kstar // N
jstar = np.mod(kstar, N)

for k in range(n):
g[istar*n + k] = 2*(y[istar*n + k] - y[jstar*n + k])
g[jstar*n + k] = 2*(y[jstar*n + k] - y[istar*n + k])
i = int(np.floor(istar*n))
j = int(np.floor(jstar*n))
g[i + k] = 2*(y[i + k] - y[j + k])
g[j + k] = 2*(y[j + k] - y[i + k])

else:
dstar, kstar = d1star, k1star
istar = kstar/Ny
istar = kstar // Ny
jstar = np.mod(kstar, Ny)

for k in range(n):
g[istar*n + k] = 2*(y[istar*n + k] - v[jstar*n + k])
i = int(np.floor(istar*n))
j = int(np.floor(jstar*n))
g[i + k] = 2*(y[i + k] - v[j + k])

return -g
2 changes: 1 addition & 1 deletion active_subspaces/utils/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ def atleast_2d(A, oned_as='row'):
elif oned_as == 'col':
A = A[:,None]
else:
raise Exception , "oned_as must be 'row' or 'col' "
raise Exception("oned_as must be 'row' or 'col' ")

return A

Expand Down
Loading