Skip to content

Commit

Permalink
Refactor and pylint (#59)
Browse files Browse the repository at this point in the history
* major rewrite of fit.py
* add evaluate function to returned constraint
* remove generic_resid_fun and its dimensionality tests
* get pylint running
  • Loading branch information
Michael Burton authored and bqpd committed Jan 2, 2017
1 parent 81c8606 commit 648d114
Show file tree
Hide file tree
Showing 27 changed files with 412 additions and 683 deletions.
48 changes: 9 additions & 39 deletions .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ confidence=
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
#disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating
disable=locally-disabled
disable=locally-disabled,superfluous-parens,wrong-import-position, fixme, duplicate-code, maybe-no-member

[REPORTS]

Expand Down Expand Up @@ -108,64 +108,34 @@ name-group=
include-naming-hint=no

# Regular expression matching correct function names
function-rgx=[a-z_][a-z0-9_]{2,30}$

# Naming hint for function names
function-name-hint=[a-z_][a-z0-9_]{2,30}$
function-rgx=[A-Za-z_][a-z0-9_]{2,30}$

# Regular expression matching correct variable names
variable-rgx=[a-z_][a-z0-9_]{2,30}$

# Naming hint for variable names
variable-name-hint=[a-z_][a-z0-9_]{2,30}$
variable-rgx=[A-Za-z_][A-Za-z0-9_]{0,30}$

# Regular expression matching correct constant names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$

# Naming hint for constant names
const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$

# Regular expression matching correct attribute names
attr-rgx=[a-z_][a-z0-9_]{2,30}$

# Naming hint for attribute names
attr-name-hint=[a-z_][a-z0-9_]{2,30}$
attr-rgx=[A-Za-z_][a-z0-9_]{0,30}$

# Regular expression matching correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$

# Naming hint for argument names
argument-name-hint=[a-z_][a-z0-9_]{2,30}$
argument-rgx=[A-Za-z_][a-z0-9_]{0,30}$

# Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$

# Naming hint for class attribute names
class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{0,30}|(__.*__))$

# Regular expression matching correct inline iteration names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$

# Naming hint for inline iteration names
inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$

# Regular expression matching correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$

# Naming hint for class names
class-name-hint=[A-Z_][a-zA-Z0-9]+$
class-rgx=[t_]?|[A-Z_][a-zA-Z0-9]+$

# Regular expression matching correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$

# Naming hint for module names
module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
module-rgx=[t_]?|(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$

# Regular expression matching correct method names
method-rgx=[a-z_][a-z0-9_]{2,30}$

# Naming hint for method names
method-name-hint=[a-z_][a-z0-9_]{2,30}$
method-rgx=[test_]?[a-z_][a-z0-9_]{2,30}$

# Regular expression which should only match function or class names that do
# not require a docstring.
Expand Down
3 changes: 2 additions & 1 deletion docs/source/examples/hoburgabbeel_ex6_1.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from gpfit.fit import fit
"Fits an example function"
from numpy import logspace, log, log10, random
from gpfit.fit import fit

# fixed initial guess for fitting
random.seed(33404)
Expand Down
81 changes: 81 additions & 0 deletions gpfit/ba_init.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
"Implements ba_init"
from numpy import ones, hstack, zeros, tile, argmin
from numpy.linalg import lstsq, matrix_rank
from numpy.random import permutation as randperm


# pylint: disable=too-many-locals
def ba_init(x, y, K):
"""
Initializes max-affine fit to data (y, x)
ensures that initialization has at least K+1 points per partition (i.e.
per affine function)
INPUTS:
x: Independent variable data
2D column vector [nPoints x nDims]
y: Dependent variable data
2D column vector [nPoints x 1]
OUTPUTS:
ba: Initial b and a parameters
2D array [(dimx+1) x k]
"""
defaults = {}
defaults['bverbose'] = False
options = defaults

npt, dimx = x.shape

X = hstack((ones((npt, 1)), x))
b = zeros((dimx+1, K))

if K*(dimx+1) > npt:
raise ValueError('Not enough data points')

# Choose K unique indices
randinds = randperm(npt)[0:K]

# partition based on distances
sqdists = zeros((npt, K))
for k in range(K):
sqdists[:, k] = ((x - tile(x[randinds[k], :], (npt, 1))) ** 2).sum(1)

# index to closest k for each data pt
mindistind = argmin(sqdists, axis=1)

# loop through each partition, making local fits
# note we expand partitions that result in singular least squares problems
# why this way? some points will be shared by multiple partitions, but
# resulting max-affine fit will tend to be good. (as opposed to solving least-norm version)
for k in range(K):
inds = mindistind == k

# before fitting, check rank and increase partition size if necessary
# (this does create overlaps)
if matrix_rank(X[inds, :]) < dimx + 1:
sortdistind = sqdists[:, k].argsort()

i = sum(inds) # number of points in partition
iinit = i

if i < dimx+1:
# obviously, at least need dimx+1 points. fill these in before
# checking any ranks
inds[sortdistind[i+1:dimx+1]] = 1 # TODO: check index
i = dimx+1 # TODO: check index

# now add points until rank condition satisfied
while matrix_rank(X[inds, :]) < dimx+1:
i = i+1
inds[sortdistind[i]] = 1

if options['bverbose']:
print("ba_init: Added %s points to partition %s to maintain"
"full rank for local fitting." % (i-iinit, k))
# now create the local fit
b[:, k] = lstsq(X[inds.nonzero()], y[inds.nonzero()])[0][:, 0]

return b
Loading

0 comments on commit 648d114

Please sign in to comment.