:meta private:
(modules, set_names=True)
| 450 | |
| 451 | |
| 452 | def 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, |
no test coverage detected