# Source code for openmdao.util.mdo

```"""
Math related utility functions used by OpenMDAO.
"""
from random import shuffle

from numpy import zeros, array

[docs]def rand_latin_hypercube(n, k, edges=False):
"""
Calculates a random latin hypercube set of n points in k
dimensions within [0,1]^k hypercube.

n: int
Desired number of points.
k: int
Number of design variables (dimensions).
edges: bool (optional)
if Edges=True, the extreme bins will have their centres on the
edges of the domain; otherwise the bins will be entirely
contained within the domain (default setting).

Returns an n by k numpy array.
"""
#generate nxk array of random numbers from the list of range(n) choices
X = zeros((n, k))
row = range(1, n+1)
for i in range(k):
shuffle(row)
X[:,i] = row

if edges:
return (X-1.0)/float((n-1))

return (X-.5)/float(n)

[docs]def is_latin_hypercube(lh):
"""Returns True if the given array is a latin hypercube.
The given array is assumed to be a numpy array.
"""
n,k = lh.shape
for j in range(k):
colset = set()
col = lh[:,j]
colset.update(col)
if len(colset) < len(col):
return False  # something was duplicated
return True

if __name__ == '__main__': # pragma no cover
lh1 = array([[1,2,3],[3,1,2],[2,3,1]])
assert(is_latin_hypercube(lh1))
badlh = array([[1,2,3],[1,3,2],[3,2,1]])
assert(is_latin_hypercube(badlh) is False)
``` 