Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve code quality with static analysis #119

Merged
merged 6 commits into from
May 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions ema_workbench/analysis/dimensional_stacking.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def discretize(data, nbins=3, with_labels=False):
n_unique = column_data.unique().shape[0]
n = n_unique
column_data = column_data.cat.rename_categories(
[x for x in range(1, n + 1)]
list(range(1, n + 1))
)
indices = column_data

Expand Down Expand Up @@ -414,8 +414,8 @@ def create_pivot_plot(
n = nr_levels * 2

scores = scores.index.tolist()
rows = [entry for entry in scores[0:n:2]]
columns = [entry for entry in scores[1:n:2]]
rows = list(scores[0:n:2])
columns = list(scores[1:n:2])

discretized_x = discretize(x, nbins=nbins, with_labels=bin_labels)

Expand Down
10 changes: 4 additions & 6 deletions ema_workbench/analysis/plotting_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ def plot_violinplot(ax, values, log, group_labels=None):
if not group_labels:
group_labels = [""]

data = pd.DataFrame.from_records({k: v for k, v in zip(group_labels, values)})
data = pd.DataFrame.from_records(dict(zip(group_labels, values)))
data = pd.melt(data)

sns.violinplot(x="variable", y="value", data=data, order=group_labels, ax=ax)
Expand All @@ -246,7 +246,7 @@ def plot_boxenplot(ax, values, log, group_labels=None):
if not group_labels:
group_labels = [""]

data = pd.DataFrame.from_records({k: v for k, v in zip(group_labels, values)})
data = pd.DataFrame.from_records(dict(zip(group_labels, values)))
data = pd.melt(data)

sns.boxenplot(x="variable", y="value", data=data, order=group_labels, ax=ax)
Expand Down Expand Up @@ -771,7 +771,7 @@ def prepare_data(
if filter_scalar:
outcomes = filter_scalar_outcomes(outcomes)
if not outcomes_to_show:
outcomes_to_show = [o for o in outcomes.keys()]
outcomes_to_show = list(outcomes.keys())

# group the data if desired
if group_by:
Expand All @@ -783,9 +783,7 @@ def prepare_data(
)
else:
column_to_group_by = experiments[group_by]
if (column_to_group_by.dtype == object) or (
column_to_group_by.dtype == "category"
):
if column_to_group_by.dtype in (object, "category"):
grouping_specifiers = set(column_to_group_by)
else:
grouping_specifiers = make_continuous_grouping_specifiers(
Expand Down
2 changes: 1 addition & 1 deletion ema_workbench/analysis/prim_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ def __call__(self, box):

def is_significant(box, i, alpha=0.05):
qp = box.qp[i]
return not any([value > alpha for values in qp.values() for value in values])
return not any(value > alpha for values in qp.values() for value in values)


def is_pareto_efficient(data):
Expand Down
4 changes: 2 additions & 2 deletions ema_workbench/analysis/scenario_discovery_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def _get_sorted_box_lims(boxes, box_init):
# sort the uncertainties based on the normalized size of the
# restricted dimensions
uncs = uncs[np.argsort(box_size)]
box_lims = [box for box in boxes]
box_lims = list(boxes)

return box_lims, uncs.tolist()

Expand Down Expand Up @@ -454,7 +454,7 @@ def _setup_figure(uncs):
ax.add_patch(rect)
ax.set_xlim(left=-0.2, right=1.2)
ax.set_ylim(top=-0.5, bottom=nr_unc - 0.5)
ax.yaxis.set_ticks([y for y in range(nr_unc)])
ax.yaxis.set_ticks(list(range(nr_unc)))
ax.xaxis.set_ticks([0, 0.25, 0.5, 0.75, 1])
ax.set_yticklabels(uncs[::-1])
return fig, ax
Expand Down
13 changes: 1 addition & 12 deletions ema_workbench/connectors/vensim.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,17 +390,6 @@ def check_data(result):

return results

def cleanup(self):
super().cleanup()

def reset_model(self):
"""
Method for reseting the model to its initial state before runModel
was called
"""

super().reset_model()

def _delete_lookup_uncertainties(self):
"""
deleting lookup uncertainties from the uncertainty list
Expand Down Expand Up @@ -552,7 +541,7 @@ def _get_initial_lookup(self, name):
list2 = []
number = []
for c in b:
if (c != "(") and (c != ")"):
if c not in ("(", ")"):
list1.append(c)

list1.append(",")
Expand Down
2 changes: 0 additions & 2 deletions ema_workbench/em_framework/evaluators.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,6 @@ def robust_optimize(


class SequentialEvaluator(BaseEvaluator):
def __init__(self, models, **kwargs):
super().__init__(models, **kwargs)

def initialize(self):
pass
Expand Down
2 changes: 1 addition & 1 deletion ema_workbench/em_framework/optimization.py
Original file line number Diff line number Diff line change
Expand Up @@ -844,7 +844,7 @@ def _optimize(
"number of epsilon values does not match number " "of outcomes"
)

if all([isinstance(t, klass) for t in problem.types]):
if all(isinstance(t, klass) for t in problem.types):
variator = None
else:
variator = CombinedVariator()
Expand Down
2 changes: 1 addition & 1 deletion ema_workbench/em_framework/outcomes.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ def __eq__(self, other):
all(
hasattr(self, key) == hasattr(other, key)
and getattr(self, key) == getattr(other, key)
for key in self.__dict__.keys()
for key in self.__dict__
),
self.__class__ == other.__class__,
]
Expand Down
7 changes: 3 additions & 4 deletions ema_workbench/em_framework/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,7 @@ def __repr__(self, *args, **kwargs):


class Category(Constant):
def __init__(self, name, value):
super().__init__(name, value)
pass


def create_category(cat):
Expand Down Expand Up @@ -384,7 +383,7 @@ def __init__(
self._categories = NamedObjectMap(Category)

self.categories = cats
self.resolution = [i for i in range(len(self.categories))]
self.resolution = list(range(len(self.categories)))
self.multivalue = multivalue

def index_for_cat(self, category):
Expand Down Expand Up @@ -488,7 +487,7 @@ def parameters_to_csv(parameters, file_name):
else:
values = param.lower_bound, param.upper_bound

dict_repr = {j: value for j, value in enumerate(values)}
dict_repr = dict(enumerate(values))
dict_repr["name"] = param.name

params[i] = dict_repr
Expand Down
2 changes: 1 addition & 1 deletion ema_workbench/em_framework/points.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ def combine_cases_sampling(*point_collection):

# figure out the longest
def exhaust_cases(cases):
return [case for case in cases]
return list(cases)

point_collection = [exhaust_cases(case) for case in point_collection]
longest_cases = max(point_collection, key=len)
Expand Down
12 changes: 0 additions & 12 deletions ema_workbench/em_framework/samplers.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,6 @@ class AbstractSampler(metaclass=abc.ABCMeta):

"""

def __init__(self):
super().__init__()

def sample(self, distribution, size):
"""
method for sampling a number of samples from a particular distribution.
Expand Down Expand Up @@ -132,9 +129,6 @@ class LHSSampler(AbstractSampler):
generates a Latin Hypercube sample for each of the parameters
"""

def __init__(self):
super().__init__()

def sample(self, distribution, size):
"""
generate a Latin Hypercube Sample.
Expand Down Expand Up @@ -253,9 +247,6 @@ class MonteCarloSampler(AbstractSampler):

"""

def __init__(self):
super().__init__()

def sample(self, distribution, size):
"""
generate a Monte Carlo Sample.
Expand Down Expand Up @@ -286,9 +277,6 @@ class FullFactorialSampler(AbstractSampler):

"""

def __init__(self):
super().__init__()

def generate_samples(self, parameters, size):
"""
The main method of :class: `~sampler.Sampler` and its
Expand Down
2 changes: 1 addition & 1 deletion ema_workbench/examples/eijgenraam_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@
52: (49.2200, 1.6075, 0.0047, 0.036173, 0.304, 0.001716, 4025.6, 0.00171, 1 / 1250),
53: (69.4565, 1.1625, 0.0028, 0.031651, 0.336, 0.002700, 9819.5, 0.00171, 1 / 1250),
}
data = {i: {k: v for k, v in zip(params, raw_data[i])} for i in raw_data.keys()}
data = {i: dict(zip(params, raw_data[i])) for i in raw_data}

# Set the ring we are analyzing
ring = 15
Expand Down
10 changes: 5 additions & 5 deletions test/models/Sales_Agent_Market_Building_Dynamics.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def income():
tier_1_income()
+ tier_2_income()
+ if_then_else(
time() < startup_subsidy_length(), lambda: startup_subsidy(), lambda: 0
time() < startup_subsidy_length(), startup_subsidy, lambda: 0
)
)

Expand Down Expand Up @@ -1051,16 +1051,16 @@ def time_step():
return 0.0625


_integ_total_cumulative_sales = Integ(lambda: accumulating_sales(), lambda: 0)
_integ_total_cumulative_sales = Integ(accumulating_sales, lambda: 0)


_integ_tenure = Integ(lambda: accumulating_tenure(), lambda: 0)
_integ_tenure = Integ(accumulating_tenure, lambda: 0)


_integ_total_cumulative_income = Integ(lambda: accumulating_income(), lambda: 0)
_integ_total_cumulative_income = Integ(accumulating_income, lambda: 0)


_integ_months_of_buffer = Integ(lambda: income() - expenses(), lambda: initial_buffer())
_integ_months_of_buffer = Integ(lambda: income() - expenses(), initial_buffer)


_integ_tier_2_clients = Integ(
Expand Down
10 changes: 5 additions & 5 deletions test/models/Sales_Agent_Motivation_Dynamics.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ def income():
Technically in units of months of expenses earned per month
"""
return months_of_expenses_per_sale() * sales() + if_then_else(
time() < startup_subsidy_length(), lambda: startup_subsidy(), lambda: 0
time() < startup_subsidy_length(), startup_subsidy, lambda: 0
)


Expand Down Expand Up @@ -481,13 +481,13 @@ def time_step():
return 0.0625


_integ_total_cumulative_income = Integ(lambda: accumulating_income(), lambda: 0)
_integ_total_cumulative_income = Integ(accumulating_income, lambda: 0)


_integ_total_cumulative_sales = Integ(lambda: accumulating_sales(), lambda: 0)
_integ_total_cumulative_sales = Integ(accumulating_sales, lambda: 0)


_integ_tenure = Integ(lambda: accumulating_tenure(), lambda: 0)
_integ_tenure = Integ(accumulating_tenure, lambda: 0)


_integ_motivation = Integ(lambda: motivation_adjustment(), lambda: 1)
_integ_motivation = Integ(motivation_adjustment, lambda: 1)
2 changes: 1 addition & 1 deletion test/test_em_framework/test_callback.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def test_store_results(self):

_, out = callback.get_results()

self.assertIn(outcomes[0].name, {entry for entry in out.keys()})
self.assertIn(outcomes[0].name, set(out.keys()))
self.assertEqual(out[outcomes[0].name].shape, (3,))

# case 2 time series shape = (1, nr_time_steps)
Expand Down
2 changes: 1 addition & 1 deletion test/test_em_framework/test_ema_ipyparallel.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def add_engines(n=1, profile="iptest", total=False):
eps.append(ep)
tic = time.time()
while len(rc) < base + n:
if any([ep.poll() is not None for ep in eps]):
if any(ep.poll() is not None for ep in eps):
raise RuntimeError("A test engine failed to start.")
elif time.time() - tic > 15:
raise RuntimeError("Timeout waiting for engines to connect.")
Expand Down
3 changes: 1 addition & 2 deletions test/test_em_framework/test_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@


class FileModelTest(FileModel):
def run_model(self, scenario, policy):
super().run_model(scenario, policy)
pass


class TestFileModel(unittest.TestCase):
Expand Down
6 changes: 3 additions & 3 deletions test/test_em_framework/test_points.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ def test_experiment_gemerator(self):
experiments = points.experiment_generator(
scenarios, model_structures, policies, combine="factorial"
)
experiments = [e for e in experiments]
experiments = list(experiments)
self.assertEqual(
len(experiments), 6, ("wrong number of experiments " "for factorial")
)

experiments = points.experiment_generator(
scenarios, model_structures, policies, combine="sample"
)
experiments = [e for e in experiments]
experiments = list(experiments)
self.assertEqual(
len(experiments), 3, ("wrong number of experiments " "for zipover")
)
Expand All @@ -30,7 +30,7 @@ def test_experiment_gemerator(self):
experiments = points.experiment_generator(
scenarios, model_structures, policies, combine="adf"
)
_ = [e for e in experiments]
_ = list(experiments)

# def test_experiment_generator(self):
# sampler = LHSSampler()
Expand Down
2 changes: 1 addition & 1 deletion test/test_em_framework/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def test_namedict(self):
self.assertEqual(2, len(nd), "length not correct")

# test in
for entry in kwargs.keys():
for entry in kwargs:
self.assertIn(entry, nd, f"{entry} not in NamedDict")

# test addition
Expand Down
15 changes: 5 additions & 10 deletions test/test_util/test_utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ def test_save_results(self):
)
outcome_q = np.random.rand(nr_experiments, 1)

outcomes = {}
outcomes[ScalarOutcome("q").name] = outcome_q
outcomes = {ScalarOutcome("q").name: outcome_q}
results = (experiments, outcomes)

# test for 2d
Expand All @@ -61,8 +60,7 @@ def test_save_results(self):
)
outcome_r = np.zeros((nr_experiments, nr_timesteps))

outcomes = {}
outcomes[ArrayOutcome("r").name] = outcome_r
outcomes = {ArrayOutcome("r").name: outcome_r}
results = (experiments, outcomes)

save_results(results, fn)
Expand All @@ -78,8 +76,7 @@ def test_save_results(self):
)
outcome_s = np.zeros((nr_experiments, nr_timesteps, nr_replications))

outcomes = {}
outcomes[ArrayOutcome("s").name] = outcome_s
outcomes = {ArrayOutcome("s").name: outcome_s}
results = (experiments, outcomes)

save_results(results, fn)
Expand All @@ -104,8 +101,7 @@ def test_load_results(self):

outcome_a = np.zeros((nr_experiments, 1))

outcomes = {}
outcomes[ArrayOutcome("a").name] = outcome_a
outcomes = {ArrayOutcome("a").name: outcome_a}
results = (experiments, outcomes)

save_results(results, "../data/test.tar.gz")
Expand All @@ -129,8 +125,7 @@ def test_load_results(self):

outcome_b = np.zeros((nr_experiments, nr_timesteps, nr_replications))

outcomes = {}
outcomes[ArrayOutcome("b").name] = outcome_b
outcomes = {ArrayOutcome("b").name: outcome_b}
results = (experiments, outcomes)

save_results(results, "../data/test.tar.gz")
Expand Down