Skip to content
Snippets Groups Projects
Commit 76c17670 authored by Jörn Ungermann's avatar Jörn Ungermann
Browse files

fixed some minor compilation bugs and updated to current jutil. prepared jutil...

fixed some minor compilation bugs and updated to current jutil. prepared jutil reconstruction routines.
parent 0d5bc190
No related branches found
No related tags found
No related merge requests found
...@@ -53,6 +53,8 @@ class Costfunction(object): ...@@ -53,6 +53,8 @@ class Costfunction(object):
# Extract important information: # Extract important information:
self.y = data_set.phase_vec self.y = data_set.phase_vec
self.Se_inv = data_set.Se_inv self.Se_inv = data_set.Se_inv
self.n = data_set.n * 3
self.m = len(self.y)
self.LOG.debug('Created '+str(self)) self.LOG.debug('Created '+str(self))
def __repr__(self): def __repr__(self):
...@@ -65,10 +67,14 @@ class Costfunction(object): ...@@ -65,10 +67,14 @@ class Costfunction(object):
return 'Costfunction(data_set=%s, fwd_model=%s, regularisator=%s)' % \ return 'Costfunction(data_set=%s, fwd_model=%s, regularisator=%s)' % \
(self.data_set, self.fwd_model, self.regularisator) (self.data_set, self.fwd_model, self.regularisator)
def init(self, x):
self(x)
def __call__(self, x): def __call__(self, x):
self.LOG.debug('Calling __call__') self.LOG.debug('Calling __call__')
delta_y = self.fwd_model(x)-self.y delta_y = self.fwd_model(x) - self.y
return delta_y.dot(self.Se_inv.dot(delta_y)) + self.regularisator(x) self.chisq = delta_y.dot(self.Se_inv.dot(delta_y)) + self.regularisator(x)
return self.chisq
def jac(self, x): def jac(self, x):
'''Calculate the derivative of the costfunction for a given magnetization distribution. '''Calculate the derivative of the costfunction for a given magnetization distribution.
...@@ -85,7 +91,8 @@ class Costfunction(object): ...@@ -85,7 +91,8 @@ class Costfunction(object):
''' '''
self.LOG.debug('Calling jac') self.LOG.debug('Calling jac')
return (2 * self.fwd_model.jac_T_dot(x, self.Se_inv.dot(self.fwd_model(x)-self.y)) assert len(x) == self.n
return (2 * self.fwd_model.jac_T_dot(x, self.Se_inv.dot(self.fwd_model(x) - self.y))
+ self.regularisator.jac(x)) + self.regularisator.jac(x))
def hess_dot(self, x, vector): def hess_dot(self, x, vector):
...@@ -111,6 +118,9 @@ class Costfunction(object): ...@@ -111,6 +118,9 @@ class Costfunction(object):
return (2 * self.fwd_model.jac_T_dot(x, self.Se_inv.dot(self.fwd_model.jac_dot(x, vector))) return (2 * self.fwd_model.jac_T_dot(x, self.Se_inv.dot(self.fwd_model.jac_dot(x, vector)))
+ self.regularisator.hess_dot(x, vector)) + self.regularisator.hess_dot(x, vector))
def hess_diag(self, _):
return np.ones(self.n)
class CFAdapterScipyCG(LinearOperator): class CFAdapterScipyCG(LinearOperator):
......
...@@ -83,7 +83,7 @@ class PrintIterator(object): ...@@ -83,7 +83,7 @@ class PrintIterator(object):
return self.iteration return self.iteration
def optimize_sparse_cg(data, regularisator=None, maxiter=1000, verbosity=0): def optimize_linear(data, regularisator=None, maxiter=1000, verbosity=0):
'''Reconstruct a three-dimensional magnetic distribution from given phase maps via the '''Reconstruct a three-dimensional magnetic distribution from given phase maps via the
conjugate gradient optimizaion method :func:`~.scipy.sparse.linalg.cg`. conjugate gradient optimizaion method :func:`~.scipy.sparse.linalg.cg`.
...@@ -113,22 +113,21 @@ def optimize_sparse_cg(data, regularisator=None, maxiter=1000, verbosity=0): ...@@ -113,22 +113,21 @@ def optimize_sparse_cg(data, regularisator=None, maxiter=1000, verbosity=0):
The reconstructed magnetic distribution as a :class:`~.MagData` object. The reconstructed magnetic distribution as a :class:`~.MagData` object.
''' '''
import jutil
LOG.debug('Calling optimize_sparse_cg') LOG.debug('Calling optimize_sparse_cg')
# Set up necessary objects: # Set up necessary objects:
y = data.phase_vec
fwd_model = ForwardModel(data) fwd_model = ForwardModel(data)
cost = Costfunction(data, regularisator) cost = Costfunction(data, regularisator)
# Optimize: print cost(np.zeros(cost.n))
A = CFAdapterScipyCG(cost) x_opt = jutil.cg.conj_grad_minimize(cost)
b = fwd_model.jac_T_dot(None, y) print cost(x_opt)
x_opt, info = cg(A, b, callback=PrintIterator(cost, verbosity), maxiter=maxiter)
# Create and return fitting MagData object: # Create and return fitting MagData object:
mag_opt = MagData(data.a, np.zeros((3,)+data.dim)) mag_opt = MagData(data.a, np.zeros((3,)+data.dim))
mag_opt.mag_vec = x_opt mag_opt.mag_vec = x_opt
return mag_opt return mag_opt
def optimize_cg(data, first_guess): def optimize_nonlin(data, first_guess=None, regularisator=None):
'''Reconstruct a three-dimensional magnetic distribution from given phase maps via the '''Reconstruct a three-dimensional magnetic distribution from given phase maps via the
conjugate gradient optimizaion method :func:`~.scipy.sparse.linalg.cg`. conjugate gradient optimizaion method :func:`~.scipy.sparse.linalg.cg`.
...@@ -149,19 +148,18 @@ def optimize_cg(data, first_guess): ...@@ -149,19 +148,18 @@ def optimize_cg(data, first_guess):
The reconstructed magnetic distribution as a :class:`~.MagData` object. The reconstructed magnetic distribution as a :class:`~.MagData` object.
''' '''
import jutil
LOG.debug('Calling optimize_cg') LOG.debug('Calling optimize_cg')
mag_0 = first_guess if first_guess is None:
first_guess = MagData(data.a, np.zeros((3,)+data.dim))
x_0 = first_guess.mag_vec x_0 = first_guess.mag_vec
y = data.phase_vec fwd_model = ForwardModel(data)
kernel = Kernel(data.a, data.dim_uv) cost = Costfunction(data, regularisator)
fwd_model = ForwardModel(data.projectors, kernel, data.b_0) assert len(x_0) == cost.n, (len(x_0), cost.m, cost.n)
cost = Costfunction(y, fwd_model) result = jutil.minimizer.minimize(cost, x_0, options={"conv_rel":1e-20}, tol={"max_iteration":1})
# Optimize:
result = minimize(cost, x_0, method='Newton-CG', jac=cost.jac, hessp=cost.hess_dot,
options={'maxiter': 1000, 'disp': True})
# Create optimized MagData object:
x_opt = result.x x_opt = result.x
mag_opt = MagData(mag_0.a, np.zeros((3,)+mag_0.dim)) print cost(x_opt)
mag_opt = MagData(data.a, np.zeros((3,)+data.dim))
mag_opt.mag_vec = x_opt mag_opt.mag_vec = x_opt
return mag_opt return mag_opt
...@@ -236,6 +234,8 @@ def optimize_simple_leastsq(phase_map, mask, b_0=1, lam=1E-4, order=0): ...@@ -236,6 +234,8 @@ def optimize_simple_leastsq(phase_map, mask, b_0=1, lam=1E-4, order=0):
J_DICT = [J_0, J_1] # list of cost-functions with different regularisations J_DICT = [J_0, J_1] # list of cost-functions with different regularisations
# Reconstruct the magnetization components: # Reconstruct the magnetization components:
# TODO Use jutil.minimizer.minimize(jutil.costfunction.LeastSquaresCostFunction(J_DICT[order],
# ...) or a simpler frontend.
x_rec, _ = leastsq(J_DICT[order], np.zeros(3*count)) x_rec, _ = leastsq(J_DICT[order], np.zeros(3*count))
mag_data_rec.set_vector(x_rec, mask) mag_data_rec.set_vector(x_rec, mask)
return mag_data_rec return mag_data_rec
...@@ -52,7 +52,7 @@ class Regularisator(object): ...@@ -52,7 +52,7 @@ class Regularisator(object):
def jac(self, x): def jac(self, x):
# TODO: Docstring! # TODO: Docstring!
self.LOG.debug('Calling jac') self.LOG.debug('Calling jac')
return self.lam * self.norm.jac_dot(x) return self.lam * self.norm.jac(x)
def hess_dot(self, x, vector): def hess_dot(self, x, vector):
# TODO: Docstring! # TODO: Docstring!
...@@ -105,7 +105,7 @@ class ZeroOrderRegularisator(Regularisator): ...@@ -105,7 +105,7 @@ class ZeroOrderRegularisator(Regularisator):
def __init__(self, lam): def __init__(self, lam):
self.LOG.debug('Calling __init__') self.LOG.debug('Calling __init__')
norm = jnorm.NormL2Square() norm = jnorm.L2Square()
super(ZeroOrderRegularisator, self).__init__(norm, lam) super(ZeroOrderRegularisator, self).__init__(norm, lam)
self.LOG.debug('Created '+str(self)) self.LOG.debug('Created '+str(self))
......
...@@ -28,6 +28,7 @@ LOGGING_CONF = os.path.join(os.path.dirname(os.path.realpath(pyramid.__file__)), ...@@ -28,6 +28,7 @@ LOGGING_CONF = os.path.join(os.path.dirname(os.path.realpath(pyramid.__file__)),
logging.config.fileConfig(LOGGING_CONF, disable_existing_loggers=False) logging.config.fileConfig(LOGGING_CONF, disable_existing_loggers=False)
logging.basicConfig(level=logging.INFO)
################################################################################################### ###################################################################################################
threshold = 1 threshold = 1
a = 1.0 # in nm a = 1.0 # in nm
...@@ -40,12 +41,13 @@ smoothed_pictures = True ...@@ -40,12 +41,13 @@ smoothed_pictures = True
lam = 1E-4 lam = 1E-4
order = 1 order = 1
log = True log = True
PATH = '../../output/joern/' PATH = './'
dirname = PATH
################################################################################################### ###################################################################################################
# Read in files: # Read in files:
phase_map = PhaseMap.load_from_netcdf4(PATH+'phase_map.nc') phase_map = PhaseMap.load_from_netcdf4(PATH+'phase_map.nc')
#mask = np.genfromtxt('mask.txt', dtype=bool) #mask = np.genfromtxt('mask.txt', dtype=bool)
with open(PATH+'mask.pickle') as pf: with open(PATH + 'mask.pickle') as pf:
mask = pickle.load(pf) mask = pickle.load(pf)
# Setup: # Setup:
data_set = DataSet(a, dim, b_0) data_set = DataSet(a, dim, b_0)
...@@ -53,29 +55,40 @@ data_set.append(phase_map, SimpleProjector(dim)) ...@@ -53,29 +55,40 @@ data_set.append(phase_map, SimpleProjector(dim))
regularisator = ZeroOrderRegularisator(lam) regularisator = ZeroOrderRegularisator(lam)
# Reconstruct the magnetic distribution: # Reconstruct the magnetic distribution:
tic = clock() tic = clock()
mag_data_rec = rc.optimize_sparse_cg(data_set, regularisator, maxiter=100, verbosity=2) mag_data_rec1 = rc.optimize_linear(data_set, regularisator=regularisator)
mag_data_rec = rc.optimize_nonlin(data_set, regularisator=regularisator)
# .optimize_simple_leastsq(phase_map, mask, b_0, lam=lam, order=order) # .optimize_simple_leastsq(phase_map, mask, b_0, lam=lam, order=order)
print 'reconstruction time:', clock() - tic print 'reconstruction time:', clock() - tic
# Display the reconstructed phase map and holography image: # Display the reconstructed phase map and holography image:
phase_map_rec = pm(mag_data_rec) phase_map_rec = pm(mag_data_rec)
phase_map_rec.display_combined('Reconstr. Distribution', gain=gain, interpolation=inter) phase_map_rec.display_combined('Reconstr. Distribution', gain=gain, interpolation=inter, show=False)
plt.savefig(dirname + "/reconstr.png")
# Plot the magnetization: # Plot the magnetization:
axis = (mag_data_rec*(1/mag_data_rec.magnitude.max())).quiver_plot() axis = (mag_data_rec*(1/mag_data_rec.magnitude.max())).quiver_plot(show=False)
axis.set_xlim(20, 45) axis.set_xlim(20, 45)
axis.set_ylim(20, 45) axis.set_ylim(20, 45)
plt.savefig(dirname + "/quiver.png")
# Display the Phase: # Display the Phase:
phase_diff = phase_map_rec-phase_map phase_diff = phase_map_rec-phase_map
phase_diff.display_phase('Difference') phase_diff.display_phase('Difference', show=False)
plt.savefig(dirname + "/difference.png")
# Get the average difference from the experimental results: # Get the average difference from the experimental results:
print 'Average difference:', np.average(phase_diff.phase) print 'Average difference:', np.average(phase_diff.phase)
# Plot holographic contour maps with overlayed magnetic distributions: # Plot holographic contour maps with overlayed magnetic distributions:
axis = phase_map_rec.display_holo('Magnetization Overlay', gain=0.1, interpolation=inter) axis = phase_map_rec.display_holo('Magnetization Overlay', gain=0.1, interpolation=inter, show=False)
mag_data_rec.quiver_plot(axis=axis) mag_data_rec.quiver_plot(axis=axis, show=False)
axis = plt.gca() axis = plt.gca()
axis.set_xlim(20, 45) axis.set_xlim(20, 45)
axis.set_ylim(20, 45) axis.set_ylim(20, 45)
axis = phase_map_rec.display_holo('Magnetization Overlay', gain=0.1, interpolation=inter) plt.savefig(dirname + "/overlay_normal.png")
mag_data_rec.quiver_plot(axis=axis, log=log)
axis = phase_map_rec.display_holo('Magnetization Overlay', gain=0.1, interpolation=inter, show=False)
mag_data_rec.quiver_plot(axis=axis, log=log, show=False)
axis = plt.gca() axis = plt.gca()
axis.set_xlim(20, 45) axis.set_xlim(20, 45)
axis.set_ylim(20, 45) axis.set_ylim(20, 45)
plt.savefig(dirname + "/overlay_log.png")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment