mirror of
https://github.com/vale981/jobmanager
synced 2025-03-06 02:11:39 -05:00
148 lines
4.6 KiB
Python
148 lines
4.6 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
from __future__ import division, print_function
|
|
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
import os
|
|
from os.path import split, dirname, abspath
|
|
from scipy.optimize import minimize
|
|
import sys
|
|
|
|
sys.path.append(split(split(dirname(abspath(__file__)))[0])[0])
|
|
|
|
import jobmanager as jm
|
|
from calculations import *
|
|
|
|
|
|
class FitFunc_Client(jm.JobManager_Client):
|
|
def __init__(self):
|
|
super(FitFunc_Client, self).__init__(server="localhost",
|
|
authkey='fit function example',
|
|
port = 42524,
|
|
nproc = 0,
|
|
nice=19,
|
|
no_warnings=True,
|
|
verbose=2)
|
|
@staticmethod
|
|
def func(args, const_args):
|
|
eta, Gamma, s, p, tau_max, tau_n = const_args
|
|
tau = np.linspace(0, tau_max, tau_n)
|
|
alpha_true = alpha_func(tau, eta, Gamma, s)
|
|
|
|
f_min = lambda x: diff(x, tau, alpha_true, p)
|
|
|
|
res = minimize(fun=f_min,
|
|
x0=np.array(args),
|
|
method="BFGS")
|
|
|
|
return res.x, res.fun
|
|
|
|
|
|
class FitFunc_Server(jm.JobManager_Server):
|
|
def __init__(self, const_args, num_samples, n, g_max, w_max):
|
|
|
|
# setup init parameters for the ancestor class
|
|
authkey = 'fit function example'
|
|
fname_dump = None
|
|
const_args = const_args
|
|
port = 42524
|
|
verbose = 1
|
|
msg_interval = 1
|
|
|
|
# init ancestor class
|
|
super(FitFunc_Server, self).__init__(authkey=authkey,
|
|
const_arg = const_args,
|
|
port = port,
|
|
verbose = verbose,
|
|
msg_interval = msg_interval,
|
|
fname_dump = fname_dump)
|
|
|
|
self.final_result = None
|
|
for i in range(num_samples):
|
|
g_re = (np.random.rand(n)*2 - 1)*g_max
|
|
g_im = (np.random.rand(n)*2 - 1)*g_max
|
|
w = (np.random.rand(n)*2 - 1)*w_max
|
|
x0 = tuple(g_re) + tuple(g_im) + tuple(w) # need tuple instead if numpy ndarray
|
|
# here because it needs to be hashable
|
|
self.put_arg(x0)
|
|
|
|
|
|
def process_new_result(self, arg, result):
|
|
x, fun = result
|
|
g, w, n = x_to_g_w(x)
|
|
if ((self.final_result == None) or
|
|
(self.final_result[0] > fun)):
|
|
print("\nnew result {}".format(fun))
|
|
|
|
self.final_result = (fun, g, w)
|
|
|
|
def process_final_result(self):
|
|
print("final Res")
|
|
if self.final_result != None:
|
|
eta, Gamma, s, p, tau_max, tau_n = self.const_arg
|
|
(fun, g, w) = self.final_result
|
|
|
|
tau = np.linspace(0, tau_max, tau_n)
|
|
alpha_true = alpha_func(tau, eta, Gamma, s)
|
|
alpha = alpha_apprx(tau, g, w)
|
|
|
|
plt.plot(tau, np.real(alpha_true), c='k', label='true')
|
|
plt.plot(tau, np.imag(alpha_true), c='k', ls='--')
|
|
plt.plot(tau, np.real(alpha), c='r', label='approx')
|
|
plt.plot(tau, np.imag(alpha), c='r', ls='--')
|
|
|
|
plt.legend()
|
|
plt.grid()
|
|
plt.show()
|
|
|
|
args = {}
|
|
|
|
args['eta'] = 1
|
|
args['Gamma'] = 1
|
|
args['s'] = 0.7
|
|
args['p'] = 0.99
|
|
args['tau_max'] = 2
|
|
args['tau_n'] = 500
|
|
args['num_samples'] = 300
|
|
args['n'] = 5
|
|
args['g_max'] = 10
|
|
args['w_max'] = 5
|
|
|
|
const_args = (args['eta'],
|
|
args['Gamma'],
|
|
args['s'],
|
|
args['p'],
|
|
args['tau_max'],
|
|
args['tau_n'])
|
|
|
|
def FitFunc_Server_from_args():
|
|
return FitFunc_Server(const_args = const_args,
|
|
num_samples = args['num_samples'],
|
|
n = args['n'],
|
|
g_max = args['g_max'],
|
|
w_max = args['w_max'])
|
|
|
|
if __name__ == "__main__":
|
|
fitfunc_server = FitFunc_Server_from_args()
|
|
|
|
# note the server does not get started, but as the init
|
|
# function of the subclass generates the arguments
|
|
# we can check if they can be process by the
|
|
# clinet's static function func
|
|
|
|
arg0 = fitfunc_server.job_q.get()
|
|
x, fun = FitFunc_Client.func(arg0, const_args=const_args)
|
|
print("arg0 :", arg0)
|
|
print("x :", x)
|
|
print("fmin :", fun)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|