Source code for pychopmarg.matlab

"""
General MATLAB utilities for PyChOpMarg.

Original author: David Banas <capn.freako@gmail.com>

Original date:   January 17, 2025

Copyright (c) 2025 David Banas; all rights reserved World wide.
"""

from pathlib    import Path
import subprocess
from typing     import Any, TypeAlias

from pychopmarg.common import ChnlSet, ChnlGrpName, ChnlSetName

COM_MATLAB_RESULTS: TypeAlias = dict[str, Any]


[docs] def run_com_matlab( chnl_sets: list[tuple[ChnlGrpName, ChnlSet]], cfg_sheet: Path, matlab_exec: Path ) -> dict[ChnlGrpName, dict[ChnlSetName, COM_MATLAB_RESULTS]]: """ Run COM on a list of grouped channel sets, using the MATLAB code. Args: chnl_sets: List of pairs, each consisting of: - ch_grp_name: The group name for this list of channel sets. - ch_sets: List of channel sets to run. cfg_sheet: Path to MS Excel configuration spreadsheet. matlab_exec: Path to MATLAB executable. Returns: Dictionary, indexed by channel group name, containing dictionaries of MATLAB COM results, indexed by channel set name. """ results: dict[ChnlGrpName, dict[ChnlSetName, COM_MATLAB_RESULTS]] = {} for grp, ch_set in chnl_sets: lbl = ch_set['THRU'][0].stem cmd_str = ", ".join([ f"com_ieee8023_93a('{cfg_sheet}'", f"{len(ch_set['FEXT'])}, {len(ch_set['NEXT'])}, '{ch_set['THRU'][0]}'", ", ".join(list(map(lambda ch: f"'{str(ch)}'", ch_set['FEXT'] + ch_set['NEXT'])))]) + ");" print(f"\nCommand:\n{cmd_str}") result = subprocess.run([matlab_exec, "-nodisplay", "-batch", cmd_str], capture_output=True, text=True) if grp in results: results[grp].update({lbl: {"proc_rslt": result}}) else: results.update({grp: {lbl: {"proc_rslt": result}}}) return results