MCPcopy Create free account
hub / github.com/ahalev/python-microgrid / get_subcontainers

Function get_subcontainers

src/pymgrid/modules/module_container.py:452–517  ·  view source on GitHub ↗

:meta private:

(modules, set_names=True)

Source from the content-addressed store, hash-verified

450
451
452def get_subcontainers(modules, set_names=True):
453 """
454 :meta private:
455 """
456 source_sink_keys = ('sources', 'sinks', 'source_and_sinks')
457 fixed = {k: dict() for k in source_sink_keys}
458 flex = {k: dict() for k in source_sink_keys}
459 controllable = {k: dict() for k in source_sink_keys}
460
461 module_names = dict()
462
463 for module in modules:
464 try: # module is a tuple
465 module_name, module = module
466 fixed_flex_controllable = module.__class__.module_type[1]
467 except TypeError: # module is a module
468 try:
469 module_name, fixed_flex_controllable = module.__class__.module_type
470 except TypeError:
471 raise NotImplementedError(
472 f'Must define the class attribute module_type for class {module.__class__.__name__}')
473
474 assert isinstance(module, BaseMicrogridModule), 'Module must inherit from BaseMicrogridModule.'
475 assert module.is_sink or module.is_source, 'Module must be sink or source (or both).'
476
477 source_sink_both = 'source_and_sinks' if module.is_sink and module.is_source else \
478 'sources' if module.is_source else 'sinks'
479
480 if fixed_flex_controllable == 'fixed':
481 d = fixed
482 elif fixed_flex_controllable == 'flex':
483 d = flex
484 elif fixed_flex_controllable == 'controllable':
485 d = controllable
486 else:
487 raise TypeError(f'Cannot parse fixed_flex_controllable from module type {module.__class__.module_type}')
488
489 try:
490 module_names[module_name] = (fixed_flex_controllable, source_sink_both)
491 except KeyError:
492 raise NameError(
493 f'Attempted to add module {module_name} of type {(fixed_flex_controllable, source_sink_both)}, '
494 f'but there is an identically named module of type {module_names[module_name]}.')
495
496 try:
497 d[source_sink_both][module_name].append(module)
498 except KeyError:
499 d[source_sink_both][module_name] = ModuleList([module])
500
501 if set_names:
502 name = (module_name, len(d[source_sink_both][module_name]) - 1)
503
504 if name != module.name and module.name is not None:
505 warnings.warn(f"Overwriting module name '{module.name}' with name '{name}'.")
506
507 module.name = name
508
509 modules_dict = dict(fixed=fixed,

Callers 1

__init__Method · 0.85

Calls 3

ModuleListClass · 0.85
ContainerClass · 0.85
appendMethod · 0.45

Tested by

no test coverage detected