{"id":28405580,"url":"https://github.com/decargroup/robust_observer_koopman","last_synced_at":"2025-08-25T05:24:28.928Z","repository":{"id":275232978,"uuid":"854667419","full_name":"decargroup/robust_observer_koopman","owner":"decargroup","description":"Companion code for Uncertainty Modelling and Robust Observer Synthesis using the Koopman Operator","archived":false,"fork":false,"pushed_at":"2025-02-14T22:44:13.000Z","size":72,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-29T06:39:33.907Z","etag":null,"topics":["control","dynamical-systems","koopman","machine-learning","robust-control","state-estimation","system-identification"],"latest_commit_sha":null,"homepage":"https://arxiv.org/abs/2410.01057","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/decargroup.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-09T15:16:15.000Z","updated_at":"2025-06-19T08:43:02.000Z","dependencies_parsed_at":"2025-02-01T02:34:03.703Z","dependency_job_id":"b67d58e7-4e83-4501-ba51-bdd93651a7a3","html_url":"https://github.com/decargroup/robust_observer_koopman","commit_stats":null,"previous_names":["decargroup/robust_observer_koopman"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/decargroup/robust_observer_koopman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decargroup%2Frobust_observer_koopman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decargroup%2Frobust_observer_koopman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decargroup%2Frobust_observer_koopman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decargroup%2Frobust_observer_koopman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/decargroup","download_url":"https://codeload.github.com/decargroup/robust_observer_koopman/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decargroup%2Frobust_observer_koopman/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272008787,"owners_count":24857658,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-25T02:00:12.092Z","response_time":1107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["control","dynamical-systems","koopman","machine-learning","robust-control","state-estimation","system-identification"],"created_at":"2025-06-01T21:37:15.531Z","updated_at":"2025-08-25T05:24:28.885Z","avatar_url":"https://github.com/decargroup.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Uncertainty Modelling and Robust Observer Synthesis using the Koopman Operator\n\nThis repository contains the companion code for [Uncertainty Modelling and\nRobust Observer Synthesis using the Koopman\nOperator](https://arxiv.org/abs/2410.01057). All the code required to generate\nthe paper's plots from raw data is included here.\n\nThe regression methods detailed in the paper are implemented using\n[`pykoop`](https://github.com/decarsg/pykoop), the authors' Koopman operator\nidentification library.\n\nThis software relies on [`doit`](https://pydoit.org/) to automate experiment\nexecution and plot generation.\n\n## Requirements\n\nThis software is compatible with Linux, macOS, and Windows. It was developed on\nArch Linux with Python 3.12.6, while the experiments used in the corresponding\npaper were run on Windows 10 with Python 3.10.9. The `pykoop` library supports\nany version of Python above 3.7.12. You can install Python from your package\nmanager or from the [official website](https://www.python.org/downloads/).\n\n## Installation\n\nTo clone the repository, run\n```sh\n$ git clone git@github.com:decargroup/robust_koopman_observer.git\n```\n\nThe recommended way to use Python is through a [virtual\nenvironment](https://docs.python.org/3/library/venv.html). Create a virtual\nenvironment (in this example, named `venv`) using\n```sh\n$ virtualenv venv\n```\nActivate the virtual environment with[^1]\n```sh\n$ source ./venv/bin/activate\n```\nTo use a specific version of Python in the virtual environment, instead use\n```sh\n$ source ./venv/bin/activate --python \u003cPATH_TO_PYTHON_BINARY\u003e\n```\nIf the virtual environment is active, its name will appear at the beginning of\nyour terminal prompt in parentheses:\n```sh\n(venv) $\n```\n\nTo install the required dependencies in the virtual environment, including\n`pykoop`, run\n```sh\n(venv) $ pip install -r ./requirements.txt\n```\n\nThe LMI solver used, MOSEK, requires a license to use. You can request personal\nacademic license [here](https://www.mosek.com/products/academic-licenses/). You\nwill be emailed a license file which must be placed in `~/mosek/mosek.lic`[^2].\n\n[^1]: On Windows, use `\u003e \\venv\\Scripts\\activate`.\n[^2]: On Windows, place the license in `C:\\Users\\\u003cUSER\u003e\\mosek\\mosek.lic`.\n\n## Usage\n\nTo automatically generate all the plots used in the paper, first download the\n[Quantifying Manufacturing Variation in Motor\nDrives](https://doi.org/10.20383/103.01057) dataset from the Federated Research\nData Repository and place it in a directory called `dataset/` in the root of the\nrepository. The `raw/` and `preprocessed/` directories of the dataset should be\nplaced directly inside the `dataset/` directory.\nThe command `ls ./dataset` should show\n```\nexample.py  preprocessed  preprocess.py  raw  README.md  requirements.txt\n```\n\nOnce the dataset is downloaded, run\n```sh\n(venv) $ doit\n```\nin the repository root. This command will preprocess the raw data located in\n`dataset/`, run all the required experiments, and generate figures, placing\nall the results in a directory called `build/`.\n\nTo execute just one task and its dependencies, run\n```sh\n(venv) $ doit \u003cTASK_NAME\u003e\n```\nTo see a list of all available task names, run\n```sh\n(venv) $ doit list --all\n```\nFor example, to generate only the Koopman uncertainty plots, run\n```sh\n(venv) $ doit plot_uncertainty:koopman\n```\n\nIf you have a pre-built copy of `build/` or other build products, `doit` will\nthink they are out-of-date and try to rebuild them. To prevent this, run\n```sh\n(venv) $ doit reset-dep\n```\nafter placing the folders in the right locations. This will force `doit` to\nrecognize the build products as up-to-date and prevent it from trying to\nre-generate them. This is useful when moving the `build/` directory between\nmachines.\n\n## Repository Layout\n\nThe files and folders of the repository are described here:\n\n| Path | Description |\n| --- | --- |\n| `dataset/` | Motor drive dataset must be downloaded here. |\n| `build/` | Generated by `doit`. Contains all `doit` build products. |\n| `figures/` | Generated by `doit`. Contains all the paper plots.|\n| `dodo.py` | Describes all of `doit`'s tasks, like a `Makefile`. |\n| `actions.py` | Contains the actual implementations of the `doit` tasks. |\n| `obs_syn.py` | Module containing observer synthesis code. |\n| `onesine.py` | Module containing sinusoidal Koopman lifting functions. |\n| `tf_cover.py` | Module containing code to bound transfer function residuals. |\n| `LICENSE` | Repository license |\n| `requirements.txt` | Contains the required Python packages and versions. |\n| `README.md` | This file. |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecargroup%2Frobust_observer_koopman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdecargroup%2Frobust_observer_koopman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecargroup%2Frobust_observer_koopman/lists"}