0

I am trying to train a surrogate in openmdao 1.7.1 using FloatKrigingSurrogate(). I get an error message:

/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py:145: RuntimeWarning: divide by zero encountered in log
  reduced_likelihood = -(np.log(np.sum(sigma2)) + logdet / self.n_samples)
/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/slsqp.py:62: RuntimeWarning: invalid value encountered in subtract
  jac[i] = (func(*((x0+dx,)+args)) - f0)/epsilon
Traceback (most recent call last):
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/drivers/predeterminedruns_driver.py", line 441, in _try_case
    root.solve_nonlinear(metadata=metadata)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/group.py", line 733, in solve_nonlinear
    self.nl_solver.solve(params, unknowns, resids, self, metadata)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/solvers/solver_base.py", line 23, in wrapper
    fn(driver, params, unknowns, resids, system, metadata)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/solvers/run_once.py", line 51, in solve
    system.children_solve_nonlinear(local_meta)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/group.py", line 751, in children_solve_nonlinear
    sub._sys_solve_nonlinear(sub.params, sub.unknowns, sub.resids)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/component.py", line 617, in _sys_solve_nonlinear
    self.solve_nonlinear(params, unknowns, resids)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/components/meta_model.py", line 211, in solve_nonlinear
    self._train()
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/components/meta_model.py", line 371, in _train
    surrogate.train(self._training_input, self._training_output[name])
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py", line 96, in train
    bounds=bounds)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 455, in minimize
    constraints, callback=callback, **options)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/slsqp.py", line 363, in _minimize_slsqp
    fx = func(x)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 289, in function_wrapper
    return function(*(wrapper_args + args))
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py", line 89, in _calcll
    loglike = self._calculate_reduced_likelihood_params(np.exp(thetas))[0]
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py", line 133, in _calculate_reduced_likelihood_params
    [U,S,Vh] = linalg.svd(R)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/linalg/decomp_svd.py", line 88, in svd
    a1 = _asarray_validated(a, check_finite=check_finite)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/_lib/_util.py", line 187, in _asarray_validated
    a = toarray(a)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/numpy/lib/function_base.py", line 1033, in asarray_chkfinite
    "array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

Traceback (most recent call last):
  File "C3DMMdriver.py", line 321, in <module>
    sample.run()
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/problem.py", line 1167, in run
    self.driver.run(self)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/drivers/predeterminedruns_driver.py", line 409, in run
    self._run_serial()
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/drivers/predeterminedruns_driver.py", line 473, in _run_serial
    exec('raise exc[0], exc[1], exc[2]')
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/drivers/predeterminedruns_driver.py", line 441, in _try_case
    root.solve_nonlinear(metadata=metadata)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/group.py", line 733, in solve_nonlinear
    self.nl_solver.solve(params, unknowns, resids, self, metadata)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/solvers/solver_base.py", line 23, in wrapper
    fn(driver, params, unknowns, resids, system, metadata)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/solvers/run_once.py", line 51, in solve
    system.children_solve_nonlinear(local_meta)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/group.py", line 751, in children_solve_nonlinear
    sub._sys_solve_nonlinear(sub.params, sub.unknowns, sub.resids)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/core/component.py", line 617, in _sys_solve_nonlinear
    self.solve_nonlinear(params, unknowns, resids)
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/components/meta_model.py", line 211, in solve_nonlinear
    self._train()
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/components/meta_model.py", line 371, in _train
    surrogate.train(self._training_input, self._training_output[name])
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py", line 96, in train
    bounds=bounds)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 455, in minimize
    constraints, callback=callback, **options)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/slsqp.py", line 363, in _minimize_slsqp
    fx = func(x)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 289, in function_wrapper
    return function(*(wrapper_args + args))
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py", line 89, in _calcll
    loglike = self._calculate_reduced_likelihood_params(np.exp(thetas))[0]
  File "/applications/Frameworks/Python_Frameworks/OpenMDAO/openmdao-1.7.1/lib/python2.7/site-packages/openmdao/surrogate_models/kriging.py", line 133, in _calculate_reduced_likelihood_params
    [U,S,Vh] = linalg.svd(R)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/linalg/decomp_svd.py", line 88, in svd
    a1 = _asarray_validated(a, check_finite=check_finite)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/scipy/_lib/_util.py", line 187, in _asarray_validated
    a = toarray(a)
  File "/applications/Python_distributions/python2.7_anaconda/lib/python2.7/site-packages/numpy/lib/function_base.py", line 1033, in asarray_chkfinite
    "array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

I have checked the data files from the application for which I am making a model. I have copied the training data to a file and checked it. Everything is a number. It doesn't always mess up, but I intend to make this part of a larger problem where the sampling part is nested, so if it ever does, the whole problem will go to pot. How else can I look for what is screwed up? Exerpts of my code:

class C3DMM(MetaModel):
    def __init__(self):
        super(C3DMM, self).__init__()

    self.add_param('AOA', val= 0.)
    self.add_output('cl', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('cd', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('cm', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('wfy', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('wfx', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('wmz', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('hfy', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('hfx', val=0., surrogate=FloatKrigingSurrogate())
    self.add_output('dlcoefs', val=np.zeros(96), surrogate=FloatKrigingSurrogate())

class C3Dsurr(Group):
    def __init__(self,):
        super(C3Dsurr, self).__init__()

        # Create meta_model for C3D with response
        self.add('c3dmm', C3DMM())

        # Create variable for problem interaction
        self.add('mmalp', IndepVarComp('AOA',0.))
        self.connect('mmalp.AOA','c3dmm.AOA')
...
    train=Problem(root=Group())
    train.root.add('train', IndepVarComp('AOA',0.))
    train.root.add('c3d',GoC3D())
    train.root.connect('train.AOA','c3d.AOA')
    train.driver = FullFactorialDriver(num_levels=samples)
    train.driver.add_desvar("train.AOA", lower= -4.,\
               upper= 32.)

    recorder = InMemoryRecorder()
    recorder.options['record_params'] = True
    recorder.options['record_metadata'] = True
    train.driver.add_recorder(recorder)
    train.setup()
    train.run()
    train.cleanup()
...

    sample=Problem(root=C3Dsurr())
...
    sample.setup()
    # train the surrogate
    alp_train=[]
    cl_train=[]
    cm_train=[]
    cd_train=[]
    wfy_train=[]
    wfx_train=[]
    wmz_train=[]
    hfy_train=[]
    hfx_train=[]
    knot_train=[]
    dlc_train=[]
    if debug:
    dbfile=open('C3Dsample.dat','w')
    dbfile.write('variables=AOA,cl,cm,cd,wfy,wfx,wmz,hfy,hfx,knots,coefs\n')
    dbfile.write('variables=AOA,cl,cm,cd,wfy,wfx,wmz,hfy,hfx,coefs\n')
    for line in recorder.iters:
    alp_train.append(line['params']['c3d.AOA'])
    cl_train.append(line['unknowns']['c3d.cl'])
    cm_train.append(line['unknowns']['c3d.cm'])
    cd_train.append(line['unknowns']['c3d.cd'])
    wfy_train.append(line['unknowns']['c3d.wfy'])
    wfx_train.append(line['unknowns']['c3d.wfx'])
    wmz_train.append(line['unknowns']['c3d.wmz'])
    hfy_train.append(line['unknowns']['c3d.hfy'])
    hfx_train.append(line['unknowns']['c3d.hfx'])
    #knot_train.append(line['unknowns']['c3d.knots'].flatten())
    dlc_train.append(line['unknowns']['c3d.dlcoefs'].flatten())
    if debug:
        dbfile.write('%f '% line['params']['c3d.AOA'])
        dbfile.write('%f '% line['unknowns']['c3d.cl'])
        dbfile.write('%f '% line['unknowns']['c3d.cm'])
        dbfile.write('%f '% line['unknowns']['c3d.cd'])
        dbfile.write('%f '% line['unknowns']['c3d.wfy'])
        dbfile.write('%f '% line['unknowns']['c3d.wfx'])
        dbfile.write('%f '% line['unknowns']['c3d.wmz'])
        dbfile.write('%f '% line['unknowns']['c3d.hfy'])
        dbfile.write('%f '% line['unknowns']['c3d.hfx'])
        #for each in line['unknowns']['c3d.knots'].flatten():
        #dbfile.write('%f '%each)
        for each in line['unknowns']['c3d.dlcoefs'].flatten():
        dbfile.write('%f '%each)
        dbfile.write('\n')
...
    sample.setup()
    # train the surrogate
    sample['c3dmm.train:AOA']=alp_train
    sample['c3dmm.train:cl']=cl_train
    sample['c3dmm.train:cm']= cm_train
    sample['c3dmm.train:cd']= cd_train
    sample['c3dmm.train:wfy']= wfy_train
    sample['c3dmm.train:wfx']= wfx_train
    sample['c3dmm.train:wmz']= wmz_train
    sample['c3dmm.train:hfy']= hfy_train
    sample['c3dmm.train:hfx']= hfx_train
    #sample['c3dmm.train:knots']= knot_train
    sample['c3dmm.train:dlcoefs']= dlc_train
    sample.run()

Sep 1 revision based on Kenneth's comment: Apparently the Kriging surrogate model needs a challenge. It does not like a bonehead simple function, ie f(x)=constant. I slightly modified the metamodel example problem from the docs:

from __future__ import print_function

import sys
import numpy as np

from openmdao.api import Group, Component, MetaModel, KrigingSurrogate, FloatKrigingSurrogate

class TrigMM(Group):
    ''' FloatKriging gives responses as floats '''

    def __init__(self):
        super(TrigMM, self).__init__()

        # Create meta_model for f_x as the response
        sin_mm = self.add("sin_mm", MetaModel())
        sin_mm.add_param('x', val=0.)
        sin_mm.add_output('f_x:float', val=0., surrogate=FloatKrigingSurrogate())
    # train a vector or a set of scalars
        #sin_mm.add_output('g', val=np.zeros(SURVECSIZ), surrogate=KrigingSurrogate())
    for each in range(SURVECSIZ):
        sin_mm.add_output('g%d'%each, val=0., surrogate=FloatKrigingSurrogate())

from openmdao.api import Problem

prob = Problem()
prob.root = TrigMM()
prob.setup()

#traning data is just set manually. No connected input needed, since
#  we're assuming the data is pre-existing
prob['sin_mm.train:x'] = np.linspace(0,10,20)
prob['sin_mm.train:f_x:float'] = np.sin(prob['sin_mm.train:x'])

for each in range(SURVECSIZ):
    prob['sin_mm.train:g%d'%each]=np.sin(prob['sin_mm.train:x'])*(float(each))

try:
    samplex=float(sys.argv[1])
except IndexError:
    samplex=2.1
prob['sin_mm.x'] = samplex #prediction happens at this value
prob.run()
print('float predicted:', '%3.4f'%prob['sin_mm.f_x:float']) #predicted value
print('float actual   :', '%3.4f'%np.sin(samplex))
for each in range(SURVECSIZ):
    print('g%d predicted:'%each, '%3.4f,'%prob['sin_mm.g%d'%each]) #predicted value
    print('g actual   :', '%3.4f'%(np.sin(samplex)*(float(each))))

I was originaly wondering if there was a max number of surrogates, so I built that variable SURVECSIZ. Even with SURVECSIZ=1 it died. But when I change the function for gi to multiply by (float(each)+1.), it runs. Putting the +1 outside the parens to make the value a constant = 1 rather than 0 also causes it to die. I guess the kriging model process normalizes by the range of variation of the data. Kriging just doesn't want to waste its time on a simple problem. Unfortunately, there are some cases where I may have zero variation and the kriging model needs to allow it.

  • can we see the full error stack trace that is reported when it errors out? Also, you you saying that the error is not deterministic? i.e. with the exact same training data it sometimes errors and sometimes doesn't? – Justin Gray Aug 31 '16 at 10:12
  • I added the full trace. And yes, I have run it more than once and only sometimes get the error. – Clyde Gumbert Aug 31 '16 at 12:54
  • After some more playing. I ran a 'normal' case and got the error. To debug, I ran a case with three samples, and got no error. I added more debug stuff and ran with two samples; it got the error. I concluded it was not deterministic. Wrong! Every time I run with three samples, it runs OK. Every time I run with two samples it croaks. Since I specified FullFactorialDriver to build the samples, it is deterministic. But no matter how many samples I specify, the first and last are the same. So what is the difference whether I run two samples or three? Not the values of the data that croaks. – Clyde Gumbert Aug 31 '16 at 14:48
  • Given the output, I get the feeling that maybe the two training points that Kriging receives are identical. Perhaps you could check the output of the FullFactorialDriver to see what it is feeding into the Kriging model. Might be a bug in the Full Factorial. – Kenneth Moore Sep 01 '16 at 04:25
  • Modded the question to add a simpler problem. – Clyde Gumbert Sep 01 '16 at 13:16

0 Answers0