Source code for jitcsim.utility
import numpy as np
from numba import jit
import time
[docs]def timer(func):
'''
decorator to measure elapsed time
Parameters
-----------
func: function
function to be decorated
'''
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
display_time(end-start, message="{:s}".format(func.__name__))
return result
return wrapper
[docs]@jit(nopython=True)
def order_parameter(phases):
"""
calculate the Kuramoto order parameter.
Parameters
----------
phases : numpy 2D array (num_time_step by num_nodes)
phase of oscillators
Return
------
r : float
Kuramotoorder parameter.
"""
n_steps, n_nodes = phases.shape
r = np.zeros(n_steps)
for i in range(n_steps):
r[i] = np.abs(np.sum(np.exp(1j * phases[i, :]))) / n_nodes
return r
[docs]@jit(nopython=True)
def local_order_parameter(phases, indices):
"""
calculate the local order parameter of given indices
Parameters
----------
phases : numpy 2D array (num_time_step by num_nodes)
phase of each node
indices : array(list) of int
indices of nodes to measure their order parameters;
Return
-------
r : float
Kuramoto order parameter.
"""
n_nodes = len(indices)
n_steps = phases.shape[0]
assert(n_nodes > 1), "length of indices need to be larger that 1."
assert(n_nodes <= phases.shape[1]
), "number of indices exceeded the number of nodes"
r = np.zeros(n_steps)
for i in range(n_steps):
r[i] = abs(sum(np.exp(1j * phases[i, indices]))) / n_nodes
return r
[docs]def flatten(t):
"""
flatten a list of list
Parameters
----------
t : list of list
Return:
flattend list
"""
return [item for sublist in t for item in sublist]
[docs]@jit(nopython=True)
def kuramoto_correlation(x):
"""
Calculate the Kuramoto correlation between phase of nodes
Parameters
----------
x : numpy array, float
input phase of oscillators
Return
-------
cor : 2D numpy array
The correlation matrix.
"""
n = len(x)
cor = np.zeros((n, n))
for i in range(n):
for j in range(i, n):
cor[j, i] = cor[i, j] = np.cos(x[j] - x[i])
cor = cor + np.diag(np.ones(n))
return cor
def is_symmetric(a, rtol=1e-05, atol=1e-08):
return np.allclose(a, a.T, rtol=rtol, atol=atol)
[docs]def display_time(time, message=""):
'''
display elapsed time in hours, minutes, seconds
Parameters
-----------
time: float
elaspsed time in seconds
'''
hour = int(time/3600)
minute = (int(time % 3600))//60
second = time-(3600.*hour+60.*minute)
print("{:s} Done in {:d} hours {:d} minutes {:09.6f} seconds".format(
message, hour, minute, second))
def get_step_current(t_start, t_end, amplitude):
return {
"current_type": "step",
"current_t_end": t_end,
"current_t_start": t_start,
"current_amplitude": amplitude
}
@jit
def binarize(data, threshold=1e-8):
data = np.asarray(data)
upper, lower = 1, 0
data = np.where(data >= threshold, upper, lower)
return data