https://github.com/artemyk/perturbationmodularity
Raw File
Tip revision: 5d4f478f61fe05c8869bac009d3259a499344e56 authored by Artemy Kolchinsky on 19 February 2019, 18:28:42 UTC
Merge pull request #1 from artemyk/add-license-1
Tip revision: 5d4f478
coupledmaps.py
import dynpy
import numpy as np
from scipy.sparse import issparse

class CoupledMaps(dynpy.dynsys.VectorDynamicalSystem, dynpy.dynsys.DeterministicDynamicalSystem):
    def __init__(self, coupling_matrix, mapping_func, noise=0.0):
        # TODO: Document

        dynpy.dynsys.VectorDynamicalSystem.__init__(self, num_vars=coupling_matrix.shape[0])
        dynpy.dynsys.DeterministicDynamicalSystem.__init__(self, discrete_time=True)
        self.mapping_func    = mapping_func
        self.coupling_matrix = coupling_matrix
        self.issparse        = issparse(coupling_matrix)
        self.noise           = noise

    def _iterate_1step_discrete(self, start_state):
        r  = self.mapping_func(self, start_state)
        if self.noise > 0:
            r += self.noise * np.random.rand(self.num_vars)
        return r

    def perturb(self, base_vec, pert_vec):
        return base_vec + pert_vec
        
    def get_random_initial(self):
        return np.random.rand(self.num_vars)*2.0-1.0

# From sklearn.utils
def safe_sparse_dot(a, b, dense_output=False):
    if issparse(a) or issparse(b):
        ret = a * b
        if dense_output and hasattr(ret, "toarray"):
            ret = ret.toarray()
        return ret
    else:
        return np.dot(a, b)

def get_logistic_map_update_function(alpha, eps):
    def updatefunction(obj, prev_state):
        updstates = (1 - alpha*(prev_state*prev_state))
        if obj.issparse:
            n = safe_sparse_dot(obj.coupling_matrix, updstates)
        else:
            n = obj.coupling_matrix.dot(updstates)
        return (1-eps) * updstates + eps * n
    return updatefunction

back to top