cubnm.optimize¶
Optimizers of the model free parameters
Grid search of model free parameters |
|
Brain network model problem. A |
|
Base class for evolutionary optimizers |
|
Generic wrapper for pymoo optimizers. |
|
Covariance Matrix Adaptation Evolution Strategy (CMA-ES) optimizer |
|
Non-dominated Sorting Genetic Algorithm II (NSGA-II) optimizer |
|
Bayesian optimizer |
|
Optimize a batch of optimizers in parallel (without requiring |
- class cubnm.optimize.GridSearch(model, params, **kwargs)¶
Grid search of model free parameters
Parameters¶
- model:
str, {‘rWW’, ‘rWWEx’, ‘Kuramoto’} model name
- params:
dictoftupleorfloat a dictionary including parameter names as keys and their fixed values (
float) or discrete range of values (tupleof (min, max, n)) as values.- **kwargs
Keyword arguments passed to
cubnm.sim.SimGroup
Example¶
Run a grid search of rWW model with 10 G and 10 wEE values with fixed wEI:
from cubnm import datasets, optimize gs = optimize.GridSearch( model = 'rWW', params = { 'G': (0.5, 2.5, 10), 'wEE': (0.05, 0.75, 10), 'wEI': 0.21 }, duration = 60, TR = 1, sc_path = datasets.load_sc('strength', 'schaefer-100', return_path=True), states_ts = True ) emp_fc_tril = datasets.load_functional('FC', 'schaefer-100') emp_fcd_tril = datasets.load_functional('FCD', 'schaefer-100') scores = gs.evaluate(emp_fc_tril, emp_fcd_tril)
- evaluate(emp_fc_tril=None, emp_fcd_tril=None, bold=None)¶
Runs the grid simulations and evaluates their goodness of fit to the empirical FC and FCD
Parameters¶
- emp_fc_tril:
np.ndarrayorNone lower triangular part of empirical FC. Shape: (edges,)
- emp_fcd_tril:
np.ndarrayorNone lower triangular part of empirical FCD. Shape: (window_pairs,)
- emp_bold:
np.ndarrayor None cleaned and parcellated empirical BOLD time series. Shape: (nodes, volumes) Motion outliers should either be excluded (not recommended as it disrupts the temporal structure) or replaced with zeros. If provided emp_fc_tril and emp_fcd_tril will be ignored.
Returns¶
pd.DataFrameThe goodness of fit measures (columns) of each simulation (rows)
- emp_fc_tril:
- model:
- class cubnm.optimize.BNMProblem(model, params, emp_fc_tril=None, emp_fcd_tril=None, emp_bold=None, het_params=[], maps=None, maps_coef_range='auto', node_grouping=None, multiobj=False, **kwargs)¶
Bases:
pymoo.core.problem.ProblemBrain network model problem. A
pymoo.core.problem.Problemthat defines the model, free parameters and their ranges, and target empirical data (FC and FCD), and the simulation configurations (throughcubnm.sim.SimGroup).cubnm.optimize.Optimizerclasses can be used to optimize the free parameters of this problem.Parameters¶
- model:
str, {‘rWW’, ‘rWWEx’, ‘Kuramoto’} model name
- params:
dictoftupleorfloat a dictionary including parameter names as keys and their fixed values (
float) or continuous range of values (tupleof (min, max)) as values.- emp_fc_tril:
np.ndarrayorNone lower triangular part of empirical FC. Shape: (edges,)
- emp_fcd_tril:
np.ndarrayorNone lower triangular part of empirical FCD. Shape: (window_pairs,)
- emp_bold:
np.ndarrayor None cleaned and parcellated empirical BOLD time series. Shape: (nodes, volumes) Motion outliers should either be excluded (not recommended as it disrupts the temporal structure) or replaced with zeros. If provided emp_fc_tril and emp_fcd_tril will be ignored.
- het_params:
listofstr, optional which regional parameters are heterogeneous across nodes
- maps:
str, optional path to heterogeneity maps as a text file or a numpy array. Shape: (n_maps, nodes). If provided one free parameter per regional parameter per each map will be added.
- maps_coef_range: ‘auto’ or
tupleorlistoftuple ‘auto’: uses (-1/max, -1/min) for maps with positive and negative values (assuming they are z-scored) and (0, 1) otherwise
tuple: uses the same range for all mapslistoftuple: n-map element list specifying the rangeof coefficients for each map
- node_grouping: {None, ‘node’, ‘sym’,
str,np.ndarray}, optional None: does not use region-/group-specific parameters
‘node’: each node has its own regional free parameters
‘sym’: uses the same regional free parameters for each pair of symmetric nodes (e.g. L and R hemispheres). Assumes symmetry of parcels between L and R hemispheres.
str: path to a text file including node grouping array. Shape: (nodes,)np.ndarray: a numpy array. Shape: (nodes,)
- multiobj:
bool, optional instead of combining the objectives into a single objective function (via summation) defines each objective separately. This must not be used with single-objective optimizers
- **kwargs
Keyword arguments passed to
cubnm.sim.SimGroup
- get_config(include_sim_group=True, include_N=False)¶
Get the problem configuration
Parameters¶
- include_sim_group:
bool, optional whether to include the configuration of the associated
cubnm.sim.SimGroup- include_N:
bool, optional whether to include the current population size in the configuration
Returns¶
dictthe configuration of the problem
- include_sim_group:
- eval(X, skip_run=False)¶
Runs the simulations based on normalized candidate free parameters X and evaluates their goodness of fit to the empirical FC and FCD of the problem.
Parameters¶
- X:
np.ndarray the normalized parameters of current population in range [0, 1]. Shape: (N, ndim)
- skip_run:
bool, optional will only be true in batch optimization where the simulations are already run and only the GOF calculation is needed
Returns¶
pd.DataFrameThe goodness of fit measures (columns) of each simulation (rows)
- X:
- model:
- class cubnm.optimize.Optimizer(**kwargs)¶
Bases:
abc.ABCBase class for evolutionary optimizers
- abstract setup_problem(problem, **kwargs)¶
- abstract optimize()¶
- save(save_opt=True, save_obj=False)¶
Saves the output of the optimizer, including history of particles, history of optima, the optimal point, and its simulation data. The output will be saved to out_dir of the problem’s
cubnm.sim.SimGroup. If a directory with the same type of optimizer already exists, a new directory with a new index will be created.Parameters¶
- save_opt:
bool, optional reruns and saves the optimal simulation(s) data
- save_obj:
bool, optional saves the optimizer object which also includes the simulation data of all simulations and therefore can be large file. Warning: this file is very large.
- save_opt:
- class cubnm.optimize.PymooOptimizer(termination=None, n_iter=2, seed=0, print_history=True, save_history_sim=False, **kwargs)¶
Bases:
OptimizerGeneric wrapper for pymoo optimizers.
Parameters:¶
- termination:
pymoo.termination.Termination, optional The termination object that defines the stopping criteria for the optimization process. If not provided, the termination criteria will be based on the number of iterations (n_iter).
- n_iter:
int, optional The maximum number of iterations for the optimization process. This parameter is only used if termination is not provided.
- seed:
int, optional The seed value for the random number generator used by the optimizer.
- print_history:
bool, optional Flag indicating whether to print the optimization history during the optimization process.
- save_history_sim:
bool, optional Flag indicating whether to save the simulation data of each iteration. Default is False to avoid consuming too much memory across iterations.
- **kwargs
Additional keyword arguments that can be passed to the pymoo optimizer.
- setup_problem(problem, pymoo_verbose=False, **kwargs)¶
Registers a
cubnm.optimizer.BNMProblemwith the optimizer, so that the optimizer can optimize its free parameters.Parameters¶
- problem:
cubnm.optimizer.BNMProblem The problem to be set up with the algorithm.
- pymoo_verbose:
bool, optional Flag indicating whether to enable verbose output from pymoo. Default is False.
- **kwargs
Additional keyword arguments to be passed to the algorithm setup method.
- problem:
- optimize()¶
Optimizes the associated
cubnm.optimizer.BNMProblemfree parameters through an evolutionary optimization approach by running multiple generations of parallel simulations until the termination criteria is met or maximum number of iterations is reached.
- save(save_opt=True, save_obj=False)¶
Saves the output of the optimizer, including history of particles, history of optima, the optimal point, and its simulation data. The output will be saved to out_dir of the problem’s
cubnm.sim.SimGroup. If a directory with the same type of optimizer already exists, a new directory with a new index will be created.Parameters¶
- save_opt:
bool, optional reruns and saves the optimal simulation(s) data
- save_obj:
bool, optional saves the optimizer object which also includes the simulation data of all simulations and therefore can be large file. Warning: this file is very large.
- save_opt:
- termination:
- class cubnm.optimize.CMAESOptimizer(popsize, x0=None, sigma=0.5, use_bound_penalty=False, algorithm_kws={}, **kwargs)¶
Bases:
PymooOptimizerCovariance Matrix Adaptation Evolution Strategy (CMA-ES) optimizer
Parameters¶
- popsize:
int The population size for the optimizer
- x0: array-like, optional
The initial guess for the optimization. If None (default), the initial guess will be estimated based on 20 random samples as the first generation
- sigma:
float, optional The initial step size for the optimization
- use_bound_penalty:
bool, optional Whether to use a bound penalty for the optimization
- algorithm_kws:
dict, optional Additional keyword arguments for the CMAES algorithm
- **kwargs
Additional keyword arguments
Example¶
Run a CMAES optimization for 10 iterations with a population size of 20:
from cubnm import datasets, optimize problem = optimize.BNMProblem( model = 'rWW', params = { 'G': (0.5, 2.5), 'wEE': (0.05, 0.75), 'wEI': 0.15, }, emp_fc_tril = datasets.load_functional('FC', 'schaefer-100'), emp_fcd_tril = datasets.load_functional('FCD', 'schaefer-100'), duration = 60, TR = 1, sc_path = datasets.load_sc('strength', 'schaefer-100', return_path=True), states_ts = True ) cmaes = optimize.CMAESOptimizer(popsize=20, n_iter=10, seed=1) cmaes.setup_problem(problem) cmaes.optimize() cmaes.save()
- max_obj = 1¶
- setup_problem(problem, **kwargs)¶
Extends
cubnm.optimizer.PymooOptimizer.setup_problem()to set up the optimizer with the problem and set the bound penalty option based on the optimizer’s use_bound_penalty attribute.Parameters¶
- problem:
cubnm.optimizer.BNMProblem The problem to be set up with the algorithm.
- **kwargs
Additional keyword arguments to be passed to
cubnm.optimizer.PymooOptimizer.setup_problem()
- problem:
- optimize()¶
Optimizes the associated
cubnm.optimizer.BNMProblemfree parameters through an evolutionary optimization approach by running multiple generations of parallel simulations until the termination criteria is met or maximum number of iterations is reached.
- save(save_opt=True, save_obj=False)¶
Saves the output of the optimizer, including history of particles, history of optima, the optimal point, and its simulation data. The output will be saved to out_dir of the problem’s
cubnm.sim.SimGroup. If a directory with the same type of optimizer already exists, a new directory with a new index will be created.Parameters¶
- save_opt:
bool, optional reruns and saves the optimal simulation(s) data
- save_obj:
bool, optional saves the optimizer object which also includes the simulation data of all simulations and therefore can be large file. Warning: this file is very large.
- save_opt:
- popsize:
- class cubnm.optimize.NSGA2Optimizer(popsize, algorithm_kws={}, **kwargs)¶
Bases:
PymooOptimizerNon-dominated Sorting Genetic Algorithm II (NSGA-II) optimizer
Parameters¶
- popsize: int
The population size for the optimizer
- algorithm_kws: dict, optional
Additional keyword arguments for the NSGA2 algorithm
- kwargs: dict
Additional keyword arguments for the base class
- max_obj = 3¶
- setup_problem(problem, pymoo_verbose=False, **kwargs)¶
Registers a
cubnm.optimizer.BNMProblemwith the optimizer, so that the optimizer can optimize its free parameters.Parameters¶
- problem:
cubnm.optimizer.BNMProblem The problem to be set up with the algorithm.
- pymoo_verbose:
bool, optional Flag indicating whether to enable verbose output from pymoo. Default is False.
- **kwargs
Additional keyword arguments to be passed to the algorithm setup method.
- problem:
- optimize()¶
Optimizes the associated
cubnm.optimizer.BNMProblemfree parameters through an evolutionary optimization approach by running multiple generations of parallel simulations until the termination criteria is met or maximum number of iterations is reached.
- save(save_opt=True, save_obj=False)¶
Saves the output of the optimizer, including history of particles, history of optima, the optimal point, and its simulation data. The output will be saved to out_dir of the problem’s
cubnm.sim.SimGroup. If a directory with the same type of optimizer already exists, a new directory with a new index will be created.Parameters¶
- save_opt:
bool, optional reruns and saves the optimal simulation(s) data
- save_obj:
bool, optional saves the optimizer object which also includes the simulation data of all simulations and therefore can be large file. Warning: this file is very large.
- save_opt:
- class cubnm.optimize.BayesOptimizer(popsize, n_iter, seed=0)¶
Bases:
OptimizerBayesian optimizer
Parameters¶
- popsize:
int The population size for the optimizer
- n_iter:
int The number of iterations for the optimization process
- seed:
int, optional The seed value for the random number generator used by the optimizer.
- max_obj = 1¶
- setup_problem(problem, **kwargs)¶
Sets up the optimizer with the problem
Parameters¶
- problem:
cubnm.optimizer.BNMProblem The problem to be set up with the algorithm.
- **kwargs
Additional keyword arguments to be passed to
skopt.Optimizer
- problem:
- optimize()¶
Optimizes the associated
cubnm.optimizer.BNMProblemfree parameters through an evolutionary optimization approach by running multiple generations of parallel simulations until the termination criteria is met or maximum number of iterations is reached.
- save(save_opt=True, save_obj=False)¶
Saves the output of the optimizer, including history of particles, history of optima, the optimal point, and its simulation data. The output will be saved to out_dir of the problem’s
cubnm.sim.SimGroup. If a directory with the same type of optimizer already exists, a new directory with a new index will be created.Parameters¶
- save_opt:
bool, optional reruns and saves the optimal simulation(s) data
- save_obj:
bool, optional saves the optimizer object which also includes the simulation data of all simulations and therefore can be large file. Warning: this file is very large.
- save_opt:
- popsize:
- cubnm.optimize.batch_optimize(optimizers, problems, save=True, setup_kwargs={})¶
Optimize a batch of optimizers in parallel (without requiring multiple CPU cores when using GPUs).
Parameters¶
- optimizers:
listofcubnm.optimize.PymooOptimizerorcubnm.optimize.PymooOptimizer A (list of) optimizer instance(s) to be run in parallel. If not a list, the same optimizer will be used for all problems and problems must be a list.
- problems:
listofcubnm.optimize.BNMProblemorcubnm.optimize.BNMProblem A (list of) problem instance(s) to be set up with the optimizers. Will be mapped one-to-one with the optimizers. If not a list, the same problem will be used in all optimizers and optimizers must be a list.
- save:
bool, optional save the optimizers and their results. This is more efficient than saving each optimizer separately as saving involves rerunning the optimal simulations, which is done in a batch in this function.
- setup_kwargs:
dict, optional kwargs passed on to
cubnm.optimize.PymooOptimizer.setup_problem()
Returns¶
- optimizers:
listofcubnm.optimize.PymooOptimizer A list of optimizer instances which have been run in parallel
Example¶
Run CMAES for two subjects (with different SC and functional data) in a batch:
from cubnm import datasets, optimize # assuming sub1 and sub2 SC and BOLD are available as # numpy arrays `sc_sub1`, `sc_sub2`, `bold_sub1`, `bold_sub2` # shared problem configuration problem_kwargs = dict( model = 'rWW', params = { 'G': (1.0, 3.0), 'wEE': (0.05, 0.5), 'wEI': 0.15, }, duration = 60, TR = 1, ) # problem for subject 1 p_sub1 = optimize.BNMProblem( sc = sc_sub1, emp_bold = bold_sub1, **problem_kwargs ) # problem for subject 2 p_sub2 = optimize.BNMProblem( sc = sc_sub2, emp_bold = bold_sub2, **problem_kwargs ) # optimizer cmaes = optimize.CMAESOptimizer(popsize=20, n_iter=10, seed=1) # batch optimization optimizers = optimize.batch_optimize(cmaes, [p_sub1, p_sub2]) # print optima print(optimizers[0].opt) print(optimizers[1].opt)
- optimizers: