def test_LBFGS(bfgs_options, bfgs_expected, moola_problem): problem, x_init, options = moola_problem options.update(bfgs_options) solver = moola.BFGS(problem, x_init, options=options) sol = solver.solve() assert len(sol['lbfgs']) == min(options['mem_lim'], sol['iteration']) if options['gtol'] is not None: assert sol['grad_norm'] < options['gtol'] if options['jtol'] is not None: assert sol['delta_J'] < options['jtol'] assert sol['iteration'] in bfgs_expected
def solve_moola_bfgs(rf, ctrls, optimization_parameters=None): if optimization_parameters is None: optimization_parameters = { 'jtol': 1e-6, 'gtol': 1e-6, 'Hinit': "default", 'maxiter': 100, 'mem_lim': 10 } problem = MoolaOptimizationProblem(rf) f_moola = moola.DolfinPrimalVectorSet( [moola.DolfinPrimalVector(c, inner_product="L2") for c in ctrls]) solver = moola.BFGS(problem, f_moola, options=optimization_parameters) sol = solver.solve() opt_ctrls = sol['control'].data return opt_ctrls
alpha / 2 * f**2 * fa.dx) control = da.Control(f) rf = da.ReducedFunctional(J, control) # set the initial value to be zero for optimization f.vector()[:] = 0 # N = len(f.vector()[:]) # f.vector()[:] = np.random.rand(N)*2 -1 problem = da.MoolaOptimizationProblem(rf) f_moola = moola.DolfinPrimalVector(f) solver = moola.BFGS(problem, f_moola, options={ 'jtol': 0, 'gtol': 1e-9, 'Hinit': "default", 'maxiter': 100, 'mem_lim': 10 }) sol = solver.solve() f_opt = sol['control'].data file = fa.File('f.pvd') f_opt.rename('f', 'f') file << f_opt file = fa.File('g.pvd') g.rename('g', 'g') file << g
from dolfin import * from dolfin_adjoint import * import moola mesh = UnitSquareMesh(64, 64) V = FunctionSpace(mesh, "CG", 1) W = FunctionSpace(mesh, "CG", 1) m = Function(W, name='Control') u = Function(V, name='State') v = TestFunction(V) # Define weak problem F = (inner(grad(u), grad(v)) - m * v) * dx bc = DirichletBC(V, 0.0, "on_boundary") solve(F == 0, u, bc) # Define regularisation parameter alpha = Constant(1e-6) # Define desired temperature profile x = SpatialCoordinate(mesh) d = (1 / (2 * pi**2) + 2 * alpha * pi**2) * sin(pi * x[0]) * sin(pi * x[1]) control = SteadyParameter(m) J = Functional((0.5 * inner(u - d, u - d)) * dx + alpha / 2 * m**2 * dx) rf = ReducedFunctional(J, control) # Set up moola problem and solve optimisation problem = rf.moola_problem() m_moola = moola.DolfinPrimalVector(m, inner_product="L2") solver = moola.BFGS(problem, m_moola) sol = solver.solve()