<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mintoc.de/index.php?action=history&amp;feed=atom&amp;title=Source_Inversion_%28FEniCS%2FCasadi%29</id>
	<title>Source Inversion (FEniCS/Casadi) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mintoc.de/index.php?action=history&amp;feed=atom&amp;title=Source_Inversion_%28FEniCS%2FCasadi%29"/>
	<link rel="alternate" type="text/html" href="https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;action=history"/>
	<updated>2026-06-09T08:03:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1238&amp;oldid=prev</id>
		<title>MirkoHahn: /* Solution */</title>
		<link rel="alternate" type="text/html" href="https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1238&amp;oldid=prev"/>
		<updated>2016-01-12T21:42:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Solution&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:42, 12 January 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l237&quot;&gt;Line 237:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 237:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# x &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/del&gt;w &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &lt;/del&gt;w0&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/ins&gt;x &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &lt;/ins&gt;w &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;       &lt;/ins&gt;w0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    0.0625         0 2.91549e-08&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    0.0625         0 2.91549e-08&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    0.1875         0 2.75108e-08&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    0.1875         0 2.75108e-08&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>MirkoHahn</name></author>
	</entry>
	<entry>
		<id>https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1237&amp;oldid=prev</id>
		<title>MirkoHahn: /* Solution */</title>
		<link rel="alternate" type="text/html" href="https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1237&amp;oldid=prev"/>
		<updated>2016-01-12T21:41:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Solution&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:41, 12 January 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l248&quot;&gt;Line 248:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 248:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The following is a Gnuplot compatible tabular version of the solution &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;found using FEM approximations&lt;/del&gt;:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The following is a Gnuplot compatible tabular version of the solution &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;functions&lt;/ins&gt;:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>MirkoHahn</name></author>
	</entry>
	<entry>
		<id>https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1236&amp;oldid=prev</id>
		<title>MirkoHahn: /* Solution */</title>
		<link rel="alternate" type="text/html" href="https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1236&amp;oldid=prev"/>
		<updated>2016-01-12T21:41:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Solution&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;amp;diff=1236&amp;amp;oldid=1235&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>MirkoHahn</name></author>
	</entry>
	<entry>
		<id>https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1235&amp;oldid=prev</id>
		<title>MirkoHahn at 21:37, 12 January 2016</title>
		<link rel="alternate" type="text/html" href="https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1235&amp;oldid=prev"/>
		<updated>2016-01-12T21:37:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;amp;diff=1235&amp;amp;oldid=1210&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>MirkoHahn</name></author>
	</entry>
	<entry>
		<id>https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1210&amp;oldid=prev</id>
		<title>MirkoHahn: Created page with &quot;This page contains a discretized version of the mixed integer PDE constrained optimization problem Source Inversion in [http://www.casadi.org CasADi 2.4.3] format. The wea...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mintoc.de/index.php?title=Source_Inversion_(FEniCS/Casadi)&amp;diff=1210&amp;oldid=prev"/>
		<updated>2016-01-12T17:38:50Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;This page contains a discretized version of the mixed integer PDE constrained optimization problem &lt;a href=&quot;/index.php?title=Source_Inversion&quot; title=&quot;Source Inversion&quot;&gt;Source Inversion&lt;/a&gt; in [http://www.casadi.org CasADi 2.4.3] format. The wea...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This page contains a discretized version of the mixed integer PDE constrained optimization problem [[Source Inversion]] in [http://www.casadi.org CasADi 2.4.3] format. The weak version of the problem was discretized using finite element methods (via [http://www.fenicsproject.org FEniCS]) using first-degree Lagrangian elements on an equidistant mesh with &amp;lt;math&amp;gt;128&amp;lt;/math&amp;gt; cells.&lt;br /&gt;
&lt;br /&gt;
=== CasADi ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
from dolfin import *&lt;br /&gt;
&lt;br /&gt;
import math&lt;br /&gt;
import numpy&lt;br /&gt;
import scipy, scipy.sparse&lt;br /&gt;
import casadi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Simple Branch and Bound solver&lt;br /&gt;
def solve_bnb(solver, root, integers):&lt;br /&gt;
    # Initialize the node queue&lt;br /&gt;
    Q = [(numpy.inf, root)]&lt;br /&gt;
&lt;br /&gt;
    # Global solution data&lt;br /&gt;
    x_opt = None&lt;br /&gt;
    f_opt = numpy.inf&lt;br /&gt;
&lt;br /&gt;
    # Continuous solution data&lt;br /&gt;
    x0 = None&lt;br /&gt;
    f0 = numpy.inf&lt;br /&gt;
&lt;br /&gt;
    # Main loop&lt;br /&gt;
    seqnum = 0&lt;br /&gt;
    while Q:&lt;br /&gt;
        seqnum += 1&lt;br /&gt;
&lt;br /&gt;
        # Extract node with lowest lower bound and check if fathoming is necessary&lt;br /&gt;
        # (should not happen)&lt;br /&gt;
        node = Q.pop()&lt;br /&gt;
        if f_opt &amp;lt; numpy.inf and node[0] &amp;gt;= f_opt:&lt;br /&gt;
            print &amp;quot;Node %4d (%4d left): %9g &amp;gt;= %9g - PRE-FATHOM&amp;quot; % (seqnum, len(Q), node[0], f_opt)&lt;br /&gt;
            continue&lt;br /&gt;
        node = node[1]&lt;br /&gt;
&lt;br /&gt;
        # Solve the node&lt;br /&gt;
        result = solver(node)&lt;br /&gt;
&lt;br /&gt;
        # Local solution data&lt;br /&gt;
        x = result[&amp;#039;x&amp;#039;]&lt;br /&gt;
        f = result[&amp;#039;f&amp;#039;].get()[0]&lt;br /&gt;
&lt;br /&gt;
        # Store continuous solution data if none has been stored yet&lt;br /&gt;
        if x0 is None:&lt;br /&gt;
            x0 = casadi.DMatrix(x)&lt;br /&gt;
            f0 = f&lt;br /&gt;
&lt;br /&gt;
        # Check if branch can be fathomed&lt;br /&gt;
        if f &amp;gt;= f_opt:&lt;br /&gt;
            print &amp;quot;Node %4d (%4d left): %9g &amp;gt;= %9g - POST-FATHOM&amp;quot; % (seqnum, len(Q), f, f_opt)&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        # Check for violations of integrality (fixed tolerance 1e-5)&lt;br /&gt;
        viol = [abs(casadi.floor(x[i] + 0.5) - x[i]) for i in integers]&lt;br /&gt;
        idx  = [(integers[i], viol[i]) for i in range(len(integers)) if viol[i] &amp;gt; 1e-5]&lt;br /&gt;
        if not idx:&lt;br /&gt;
            # Register new global solution&lt;br /&gt;
            x_opt = x&lt;br /&gt;
            f_opt = f&lt;br /&gt;
&lt;br /&gt;
            # Cull the branch and bound tree&lt;br /&gt;
            pre  = len(Q)&lt;br /&gt;
            Q    = [n for n in Q if n[0] &amp;lt; f_opt]&lt;br /&gt;
            post = len(Q)&lt;br /&gt;
&lt;br /&gt;
            print &amp;quot;Node %4d (%4d left): f_opt = %9g - *** SOLUTION *** (%d culled)&amp;quot; % (seqnum, len(Q), f, pre - post)&lt;br /&gt;
        else:&lt;br /&gt;
            # Branch on first violation&lt;br /&gt;
            idx = idx[0][0]&lt;br /&gt;
&lt;br /&gt;
            # Generate two new nodes (could reuse node structure)&lt;br /&gt;
            ln = {&lt;br /&gt;
                &amp;#039;x0&amp;#039;:     casadi.DMatrix(x),&lt;br /&gt;
                &amp;#039;lbx&amp;#039;:    node[&amp;#039;lbx&amp;#039;],&lt;br /&gt;
                &amp;#039;ubx&amp;#039;:    casadi.DMatrix(node[&amp;#039;ubx&amp;#039;]),&lt;br /&gt;
                &amp;#039;lbg&amp;#039;:    node[&amp;#039;lbg&amp;#039;],&lt;br /&gt;
                &amp;#039;ubg&amp;#039;:    node[&amp;#039;ubg&amp;#039;],&lt;br /&gt;
                &amp;#039;lam_x0&amp;#039;: casadi.DMatrix(result[&amp;#039;lam_x&amp;#039;]),&lt;br /&gt;
                &amp;#039;lam_g0&amp;#039;: casadi.DMatrix(result[&amp;#039;lam_g&amp;#039;])&lt;br /&gt;
            }&lt;br /&gt;
            un = {&lt;br /&gt;
                &amp;#039;x0&amp;#039;:     casadi.DMatrix(x),&lt;br /&gt;
                &amp;#039;lbx&amp;#039;:    casadi.DMatrix(node[&amp;#039;lbx&amp;#039;]),&lt;br /&gt;
                &amp;#039;ubx&amp;#039;:    node[&amp;#039;ubx&amp;#039;],&lt;br /&gt;
                &amp;#039;lbg&amp;#039;:    node[&amp;#039;lbg&amp;#039;],&lt;br /&gt;
                &amp;#039;ubg&amp;#039;:    node[&amp;#039;ubg&amp;#039;],&lt;br /&gt;
                &amp;#039;lam_x0&amp;#039;: casadi.DMatrix(result[&amp;#039;lam_x&amp;#039;]),&lt;br /&gt;
                &amp;#039;lam_g0&amp;#039;: casadi.DMatrix(result[&amp;#039;lam_g&amp;#039;])&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            ln[&amp;#039;ubx&amp;#039;][idx] = casadi.floor(x[idx])&lt;br /&gt;
            un[&amp;#039;lbx&amp;#039;][idx] = casadi.ceil(x[idx])&lt;br /&gt;
&lt;br /&gt;
            lower_node = (f, ln)&lt;br /&gt;
            upper_node = (f, un)&lt;br /&gt;
&lt;br /&gt;
            # Insert new nodes in queue (inefficient for large queues)&lt;br /&gt;
            Q.extend([lower_node, upper_node])&lt;br /&gt;
            Q.sort(cmp=lambda x,y: cmp(y[0], x[0]))&lt;br /&gt;
            print &amp;quot;Node %4d (%4d left): %9g - BRANCH ON %d&amp;quot; % (seqnum, len(Q), f, idx)&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;#039;x0&amp;#039;: x0,&lt;br /&gt;
        &amp;#039;f0&amp;#039;: f0,&lt;br /&gt;
        &amp;#039;x&amp;#039;: x_opt,&lt;br /&gt;
        &amp;#039;f&amp;#039;: f_opt&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Converts FEniCS matrix to scipy.sparse.coo_matrix&lt;br /&gt;
def matrix_to_coo(A, shape=None):&lt;br /&gt;
    nnz = A.nnz()&lt;br /&gt;
    col = numpy.empty(nnz, dtype=&amp;#039;uint64&amp;#039;)&lt;br /&gt;
    row = numpy.empty(nnz, dtype=&amp;#039;uint64&amp;#039;)&lt;br /&gt;
    val = numpy.empty(nnz)&lt;br /&gt;
&lt;br /&gt;
    if shape is None:&lt;br /&gt;
        shape = (A.size(0), A.size(1))&lt;br /&gt;
&lt;br /&gt;
    it = 0&lt;br /&gt;
    for i in range(A.size(0)):&lt;br /&gt;
        col_local, val_local = A.getrow(i)&lt;br /&gt;
        nnz_local = col_local.shape[0]&lt;br /&gt;
&lt;br /&gt;
        col[it:it+nnz_local] = col_local[:]&lt;br /&gt;
        row[it:it+nnz_local] = i&lt;br /&gt;
        val[it:it+nnz_local] = val_local[:]&lt;br /&gt;
        it                  += nnz_local&lt;br /&gt;
&lt;br /&gt;
    return scipy.sparse.coo_matrix((val, (row, col)), shape=shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Returns FEniCS expression for elementary source term&lt;br /&gt;
def source_term(x0):&lt;br /&gt;
    return Expression(&amp;quot;100.0 * exp(-pow(x[0] - x0, 2) / 0.02)&amp;quot;, x0=x0)&lt;br /&gt;
&lt;br /&gt;
# Grid resolutions&lt;br /&gt;
nx = 128&lt;br /&gt;
nu = 8&lt;br /&gt;
&lt;br /&gt;
# Generate mesh and function space&lt;br /&gt;
mesh = UnitIntervalMesh(nx)&lt;br /&gt;
V    = FunctionSpace(mesh, &amp;#039;CG&amp;#039;, 1)&lt;br /&gt;
&lt;br /&gt;
# Define the bilinear form and assemble it&lt;br /&gt;
u = TrialFunction(V)&lt;br /&gt;
v = TestFunction(V)&lt;br /&gt;
a = inner(grad(u), grad(v)) * dx + u * v * ds&lt;br /&gt;
A = assemble(a)&lt;br /&gt;
&lt;br /&gt;
# Create the linear form for the exact source term and perform assembly&lt;br /&gt;
f = source_term(3.0 / math.pi) + source_term(0.5)&lt;br /&gt;
L = f * v * dx&lt;br /&gt;
b = assemble(L)&lt;br /&gt;
&lt;br /&gt;
# Solve for the reference solution&lt;br /&gt;
u_ref = Function(V)&lt;br /&gt;
solve(A, u_ref.vector(), b)&lt;br /&gt;
&lt;br /&gt;
# Define the control grid and the elementary source terms&lt;br /&gt;
ctrl_grid = numpy.linspace(0.0, 1.0, num=nu+1)[:-1]&lt;br /&gt;
ctrl_grid += 0.5 * ctrl_grid[1]&lt;br /&gt;
src_expr  = [source_term(x0) for x0 in ctrl_grid]&lt;br /&gt;
&lt;br /&gt;
# Assemble the linear forms corresponding to the elementary source terms and&lt;br /&gt;
# construct the second half of the coefficient matrix&lt;br /&gt;
b = [assemble(-f * v * dx) for f in src_expr]&lt;br /&gt;
B = scipy.column_stack([v.array() for v in b])&lt;br /&gt;
&lt;br /&gt;
# Construct the full coefficient matrix&lt;br /&gt;
C = scipy.sparse.vstack([&lt;br /&gt;
    scipy.sparse.hstack([matrix_to_coo(A), B]),&lt;br /&gt;
    scipy.sparse.coo_matrix(([1.0]*nu, ([0]*nu, [V.dim() + i for i in range(nu)])), shape=(1, V.dim() + nu))&lt;br /&gt;
])&lt;br /&gt;
&lt;br /&gt;
# Transfer the optimization constraints to CasADi&lt;br /&gt;
C  = casadi.DMatrix(C)&lt;br /&gt;
lb = casadi.DMatrix.zeros(C.shape[0], 1)&lt;br /&gt;
ub = casadi.DMatrix.zeros(C.shape[0], 1)&lt;br /&gt;
&lt;br /&gt;
lb[-1] = 0.0&lt;br /&gt;
ub[-1] = 5.0&lt;br /&gt;
&lt;br /&gt;
lbx = numpy.array([-numpy.inf]*V.dim() + [0.0]*nu)&lt;br /&gt;
ubx = numpy.array([ numpy.inf]*V.dim() + [1.0]*nu)&lt;br /&gt;
&lt;br /&gt;
# Define the objective functional and assemble it&lt;br /&gt;
u     = Function(V)&lt;br /&gt;
J     = (u_ref - u)**2 * dx&lt;br /&gt;
dJdu  = derivative(J, u)&lt;br /&gt;
dJdu2 = derivative(dJdu, u)&lt;br /&gt;
&lt;br /&gt;
H = casadi.DMatrix(matrix_to_coo(assemble(dJdu2), shape=(V.dim() + nu, V.dim() + nu)))&lt;br /&gt;
g = casadi.DMatrix(numpy.concatenate((assemble(dJdu).array(), [0.0]*nu)))&lt;br /&gt;
c = assemble(J)&lt;br /&gt;
&lt;br /&gt;
# Build the CasADi NLP&lt;br /&gt;
x   = casadi.MX.sym(&amp;#039;X&amp;#039;, V.dim() + nu)&lt;br /&gt;
nlp = casadi.MXFunction(&amp;#039;nlp&amp;#039;,&lt;br /&gt;
    casadi.nlpIn(x=x),&lt;br /&gt;
    casadi.nlpOut(&lt;br /&gt;
        f=0.5*casadi.quad_form(x, H) + casadi.inner_prod(g, x) + c,&lt;br /&gt;
        g=casadi.mul(C, x)&lt;br /&gt;
    ))&lt;br /&gt;
&lt;br /&gt;
# Build NLP solver&lt;br /&gt;
solver = casadi.NlpSolver(&amp;#039;solver&amp;#039;, &amp;#039;ipopt&amp;#039;, nlp, {&lt;br /&gt;
    &amp;#039;print_level&amp;#039;: 0,&lt;br /&gt;
    &amp;#039;print_time&amp;#039;:  False&lt;br /&gt;
})&lt;br /&gt;
result = solve_bnb(solver, {&lt;br /&gt;
    &amp;#039;lbx&amp;#039;: lbx,&lt;br /&gt;
    &amp;#039;ubx&amp;#039;: ubx,&lt;br /&gt;
    &amp;#039;lbg&amp;#039;: lb,&lt;br /&gt;
    &amp;#039;ubg&amp;#039;: ub&lt;br /&gt;
}, range(V.dim(), V.dim() + nu))&lt;br /&gt;
&lt;br /&gt;
# Evaluate result&lt;br /&gt;
print &amp;quot;&amp;quot;&lt;br /&gt;
print &amp;quot;----------------------------&amp;quot;&lt;br /&gt;
print &amp;quot; f = %g&amp;quot; % result[&amp;#039;f&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
u.vector()[:] = result[&amp;#039;x&amp;#039;][:V.dim()].toArray()[:,0]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Results ==&lt;br /&gt;
&lt;br /&gt;
Node solutions are calculated using IPOPT (3.12, default settings, using linear solver MUMPS on Ubuntu 15.10 for x86-64 with Linux 4.2.0-19-generic, Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz, 16 GB RAM). The objective function value is &amp;lt;math&amp;gt;0.858837&amp;lt;/math&amp;gt;. The integer solution is found after processing 25 nodes.&lt;br /&gt;
 &lt;br /&gt;
[[Category:Casadi]]&lt;/div&gt;</summary>
		<author><name>MirkoHahn</name></author>
	</entry>
</feed>