LINC-BIT's picture
Upload 1912 files
b84549f verified
raw
history blame
4.76 kB
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
import numpy as np
from .runtime.env_vars import trial_env_vars
from . import trial
from . import parameter_expressions as param_exp
from .common.nas_utils import classic_mode, enas_mode, oneshot_mode, darts_mode
__all__ = [
'choice',
'randint',
'uniform',
'quniform',
'loguniform',
'qloguniform',
'normal',
'qnormal',
'lognormal',
'qlognormal',
'function_choice',
'mutable_layer'
]
if trial_env_vars.NNI_PLATFORM is None:
def choice(*options, name=None):
return param_exp.choice(options, np.random.RandomState())
def randint(lower, upper, name=None):
return param_exp.randint(lower, upper, np.random.RandomState())
def uniform(low, high, name=None):
return param_exp.uniform(low, high, np.random.RandomState())
def quniform(low, high, q, name=None):
assert high > low, 'Upper bound must be larger than lower bound'
return param_exp.quniform(low, high, q, np.random.RandomState())
def loguniform(low, high, name=None):
assert low > 0, 'Lower bound must be positive'
return param_exp.loguniform(low, high, np.random.RandomState())
def qloguniform(low, high, q, name=None):
return param_exp.qloguniform(low, high, q, np.random.RandomState())
def normal(mu, sigma, name=None):
return param_exp.normal(mu, sigma, np.random.RandomState())
def qnormal(mu, sigma, q, name=None):
return param_exp.qnormal(mu, sigma, q, np.random.RandomState())
def lognormal(mu, sigma, name=None):
return param_exp.lognormal(mu, sigma, np.random.RandomState())
def qlognormal(mu, sigma, q, name=None):
return param_exp.qlognormal(mu, sigma, q, np.random.RandomState())
def function_choice(*funcs, name=None):
return param_exp.choice(funcs, np.random.RandomState())()
def mutable_layer():
raise RuntimeError('Cannot call nni.mutable_layer in this mode')
else:
def choice(options, name=None, key=None):
return options[_get_param(key)]
def randint(lower, upper, name=None, key=None):
return _get_param(key)
def uniform(low, high, name=None, key=None):
return _get_param(key)
def quniform(low, high, q, name=None, key=None):
return _get_param(key)
def loguniform(low, high, name=None, key=None):
return _get_param(key)
def qloguniform(low, high, q, name=None, key=None):
return _get_param(key)
def normal(mu, sigma, name=None, key=None):
return _get_param(key)
def qnormal(mu, sigma, q, name=None, key=None):
return _get_param(key)
def lognormal(mu, sigma, name=None, key=None):
return _get_param(key)
def qlognormal(mu, sigma, q, name=None, key=None):
return _get_param(key)
def function_choice(funcs, name=None, key=None):
return funcs[_get_param(key)]()
def mutable_layer(
mutable_id,
mutable_layer_id,
funcs,
funcs_args,
fixed_inputs,
optional_inputs,
optional_input_size,
mode='classic_mode',
tf=None):
'''execute the chosen function and inputs.
Below is an example of chosen function and inputs:
{
"mutable_id": {
"mutable_layer_id": {
"chosen_layer": "pool",
"chosen_inputs": ["out1", "out3"]
}
}
}
Parameters:
---------------
mutable_id: the name of this mutable_layer block (which could have multiple mutable layers)
mutable_layer_id: the name of a mutable layer in this block
funcs: dict of function calls
funcs_args:
fixed_inputs:
optional_inputs: dict of optional inputs
optional_input_size: number of candidate inputs to be chosen
tf: tensorflow module
'''
args = (mutable_id, mutable_layer_id, funcs, funcs_args, fixed_inputs, optional_inputs, optional_input_size)
if mode == 'classic_mode':
return classic_mode(*args)
assert tf is not None, 'Internal Error: Tensorflow should not be None in modes other than classic_mode'
if mode == 'enas_mode':
return enas_mode(*args, tf)
if mode == 'oneshot_mode':
return oneshot_mode(*args, tf)
if mode == 'darts_mode':
return darts_mode(*args, tf)
raise RuntimeError('Unrecognized mode: %s' % mode)
def _get_param(key):
if trial.get_current_parameter() is None:
trial.get_next_parameter()
return trial.get_current_parameter(key)