ReducedFunctional doesn't like InitialConditionParameter("name")

Bug #1063825 reported by Patrick Farrell
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
dolfin-adjoint
New
High
Simon Funke

Bug Description

[pef@aislinn:~/src/dolfin-adjoint/tests/optimization]$ bzr diff
=== modified file 'tests/optimization/optimization.py'
--- tests/optimization/optimization.py 2012-08-19 19:55:02 +0000
+++ tests/optimization/optimization.py 2012-10-08 14:52:25 +0000
@@ -54,7 +54,7 @@
     lb = project(Expression("-1"), V)

     # Define the reduced funtional
- reduced_functional = ReducedFunctional(J, InitialConditionParameter(u))
+ reduced_functional = ReducedFunctional(J, InitialConditionParameter("Velocity"))

     # Run the optimisation problem with gradient tests and L-BFGS-B
     u_opt = minimize(reduced_functional, algorithm = 'scipy.l_bfgs_b', pgtol=1e-6, factr=1e5, bounds = (lb, 1), iprint = 1)

[pef@aislinn:~/src/dolfin-adjoint/tests/optimization]$ python optimization.py
Traceback (most recent call last):
  File "optimization.py", line 60, in <module>
    u_opt = minimize(reduced_functional, algorithm = 'scipy.l_bfgs_b', pgtol=1e-6, factr=1e5, bounds = (lb, 1), iprint = 1)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 236, in minimize
    return optimization_algorithms_dict[algorithm][1](reduced_func_array, reduced_func_deriv_array, [p.data() for p in reduced_func.parameter], **kwargs)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 106, in minimize_scipy_fmin_l_bfgs_b
    m_global = get_global(m)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 35, in get_global
    raise TypeError, 'Unknown parameter type %s.' % str(type(m))
TypeError: Unknown parameter type <type 'str'>.

Revision history for this message
Patrick Farrell (pefarrell) wrote :
Download full text (3.2 KiB)

Making the change
=== modified file 'dolfin_adjoint/parameter.py'
--- dolfin_adjoint/parameter.py 2012-08-01 14:43:02 +0000
+++ dolfin_adjoint/parameter.py 2012-10-08 14:54:16 +0000
@@ -60,7 +60,10 @@
       return None

   def data(self):
- return self.coeff
+ if isinstance(self.coeff, str):
+ return adjglobals.adjointer.get_variable_value(self.var).data
+ else:
+ return self.coeff

 class ScalarParameter(DolfinAdjointParameter):
   '''This Parameter is used as input to the tangent linear model (TLM)

helps -- it now gets a little further:

RUNNING THE L-BFGS-B CODE

           * * *

Machine precision = 2.220D-16
 N = 21 M = 10

At X0 1 variables are exactly at the bounds
Traceback (most recent call last):
Traceback (most recent call last):
  File "optimization.py", line 60, in <module>
    u_opt = minimize(reduced_functional, algorithm = 'scipy.l_bfgs_b', pgtol=1e-6, factr=1e5, bounds = (lb, 1), iprint = 1)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 236, in minimize
    return optimization_algorithms_dict[algorithm][1](reduced_func_array, reduced_func_deriv_array, [p.data() for p in reduced_func.parameter], **kwargs)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 115, in minimize_scipy_fmin_l_bfgs_b
    mopt, f, d = fmin_l_bfgs_b(J, m_global, fprime = dJ, bounds = bounds, **kwargs)
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 196, in fmin_l_bfgs_b
    f, g = func_and_grad(x)
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.py", line 152, in func_and_grad
    g = fprime(x, *args)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 213, in reduced_func_deriv_array
    seed = dolfin.parameters["optimization"]["test_gradient_seed"])
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/utils.py", line 455, in test_gradient_array
    j_direct = J(x)
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/optimization.py", line 229, in reduced_func_array
    m = [p.data() for p in reduced_func.parameter]
  File "/home/pef/src/dolfin-adjoint/dolfin_adjoint/parameter.py", line 64, in data
    return adjglobals.adjointer.get_variable_value(self.var).data
  File "/usr/lib/python2.7/dist-packages/libadjoint/libadjoint.py", line 1429, in get_variable_value
    clib.adj_get_variable_value(self.adjointer, var.var, vec)
  File "/usr/lib/python2.7/dist-packages/libadjoint/libadjoint.py", line 18, in handle_error
    raise exception, errstr
libadjoint.exceptions.LibadjointErrorNeedValue: Need a value for Velocity:0:0:Forward, but don't have one recorded.

If you apply the following patch (which you shouldn't), this fixes it:
=== modified file 'dolfin_adjoint/optimization.py'
--- dolfin_adjoint/optimization.py 2012-09-20 15:40:13 +0000
+++ dolfin_adjoint/optimization.py 2012-10-08 14:55:59 +0000
@@ -204,7 +204,7 @@
         if (m_array != get_global(m)).any():
             reduced_func_array(m_array)

- dJdm = utils.compute_gradient(reduced_func.functional, reduced_func.parameter)
+ dJdm = utils.compute_gradient(reduced_func.functional, reduced_func.parameter, forget=False...

Read more...

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.