{"id":34552830,"url":"https://github.com/pyomeca/cocofest","last_synced_at":"2025-12-24T08:04:46.873Z","repository":{"id":263041474,"uuid":"849929475","full_name":"pyomeca/cocofest","owner":"pyomeca","description":"Cocofest is an optimal control python package for functional electrical stimulation models","archived":false,"fork":false,"pushed_at":"2025-12-10T09:24:38.000Z","size":35588,"stargazers_count":2,"open_issues_count":4,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-10T12:33:27.526Z","etag":null,"topics":["bioptim","casadi","ding-models","fatigue-dynamics","fes","forward-simulation","functional-electrical-stimulation","muscle-model-identification","musculoskeletal-models","musculoskeletal-simulations","optimal-control"],"latest_commit_sha":null,"homepage":"","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/pyomeca.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":"docs/code_of_conduct.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-08-30T14:34:48.000Z","updated_at":"2025-12-10T09:24:42.000Z","dependencies_parsed_at":"2024-11-15T19:32:15.172Z","dependency_job_id":"fe1512a0-9915-41ec-b976-fd0b1ab6e38c","html_url":"https://github.com/pyomeca/cocofest","commit_stats":null,"previous_names":["pyomeca/cocofest"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/pyomeca/cocofest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyomeca%2Fcocofest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyomeca%2Fcocofest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyomeca%2Fcocofest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyomeca%2Fcocofest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pyomeca","download_url":"https://codeload.github.com/pyomeca/cocofest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyomeca%2Fcocofest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27998473,"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-12-24T02:00:07.193Z","response_time":83,"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":["bioptim","casadi","ding-models","fatigue-dynamics","fes","forward-simulation","functional-electrical-stimulation","muscle-model-identification","musculoskeletal-models","musculoskeletal-simulations","optimal-control"],"created_at":"2025-12-24T08:04:05.833Z","updated_at":"2025-12-24T08:04:46.865Z","avatar_url":"https://github.com/pyomeca.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\u003ca name=\"readme\"\u003e\u003c/a\u003e\n\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"https://i.imgur.com/Gsj0JtN.jpeg\" alt=\"\"\u003e\n\u003c/p\u003e\n\n# Cocofest\n\nAn Open-Source Python Package for Functional Electrical Stimulation (FES) Optimization in Optimal Control.\u003cbr/\u003e\nSupports predictive musculoskeletal simulation driven by FES, moving time horizon, and model identification.\u003cbr/\u003e\n\"Prototype today’s FES to power tomorrow’s rehab.\"\n\n[![Made-with-python](https://img.shields.io/badge/Made%20with-Python%203.11-1f425f.svg?style=for-the-badge)](https://www.python.org/)\n[![OS](https://img.shields.io/badge/OS-windows%20%7C%20linux-blue?style=for-the-badge)]()\n[![Last commit](https://img.shields.io/github/last-commit/pyomeca/cocofest.svg?style=for-the-badge)]()\u003cbr/\u003e\n[![Coverage](https://img.shields.io/codecov/c/github/pyomeca/cocofest?style=for-the-badge\u0026logo=codecov\u0026branch=main\u0026token=GPBRI2U4CO)](https://codecov.io/gh/pyomeca/cocofest)\n[![Maintainability](https://img.shields.io/badge/Maintainability-B-green?style=for-the-badge\u0026logo=codeclimate)](https://qlty.sh/gh/pyomeca/projects/cocofest)\n[![Tests](https://img.shields.io/github/actions/workflow/status/pyomeca/cocofest/run_tests_win.yml?branch=main\u0026style=for-the-badge\u0026label=Tests\u0026logo=githubactions)](https://github.com/pyomeca/cocofest/actions/workflows/run_tests_win.yml)\u003cbr/\u003e\n[![Discord](https://img.shields.io/discord/1340640457327247460.svg?label=chat\u0026logo=discord\u0026color=7289DA\u0026style=for-the-badge)](https://discord.gg/s3g2ATpvDs)\n[![Licence](https://img.shields.io/github/license/pyomeca/cocofest.svg?style=for-the-badge)](https://opensource.org/licenses/MIT)\n\n\u003c/div\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003ckbd\u003eTable of contents\u003c/kbd\u003e\u003c/summary\u003e\n\n- [About](#about)\n- [Installation](#installation)\n- [Features](#features)\n  - [Available FES models](#available-fes-models)\n  - [Musculoskeletal model driven by FES](#musculoskeletal-model-driven-by-fes)\n  - [Moving time horizons](#moving-time-horizons)\n  - [Identification](#identification)\n  - [Initial value problem](#initial-value-problem)\n  - [Summation truncation](#summation-truncation)\n- [Other](#other)\n  - [Want to contribute?](#want-to-contribute)\n  - [Contributors](#contributors)\n  - [Citing](#citing)\n  - [Cited in](#cited-in)\n  - [Other related projects](#other-related-projects)\n  - [Acknowledgements](#acknowledgements)\n\n\u003c/details\u003e\n\n\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"\" alt=\"\"\u003e\n\u003c/p\u003e\n\n\u003ca id=\"about\"\u003e\u003c/a\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/cocofest_logo.png\" width=\"150\" alt=\"\"\n       style=\"vertical-align: middle; margin-right: .5rem;\" /\u003e\n  About\n\u003c/h1\u003e\n\nFunctional electrical stimulation (FES) is a neurorehabilitation technique that promotes motor recovery after neurological injury.\nBy delivering coordinated electrical pulses to targeted muscles, FES elicits functional movements such as walking, reaching, and grasping.\nBecause responses to stimulation vary across individuals and muscle groups, most FES protocols still rely on empirically tuned parameters.\nThese settings can cause over stimulation, early muscle fatigue on-set, and reduce therapeutic gains.\n\nAdvanced control approaches like optimal control-driven FES can improve FES rehabilitation efficiency by personalizing stimulation parameters to a specific task and patient.\nTherefore, we designed `Cocofest` (Custom Optimal COntrol for Functional Electrical STimulation) an open-source Python package for optimal control-driven FES.\n`Cocofest` relies on [bioptim](https://github.com/pyomeca/bioptim), an optimal control program framework for biomechanics.\n[bioptim](https://github.com/pyomeca/bioptim) uses [biorbd](https://github.com/pyomeca/biorbd) a biomechanics library, benefits from powerful algorithmic differentiation provided by [CasADi](https://web.casadi.org/)\nand robust solver like [Ipopt](https://github.com/coin-or/Ipopt).\n\u003c/br\u003e\n\n\u003e \\[!IMPORTANT]\n\u003e\n\u003e `Cocofest` as no clinical clearance and should not be used for rehabilitation purposes. \u003c/br\u003e\n\u003e Don't forget to \u003ca href=\"https://github.com/pyomeca/cocofest/stargazers\"\u003e\u003cimg src=\"https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2nn6mhp57inp6rdxarzt.png\" align=\"center\" width=\"80\" alt=\"Star the repository\"\u003e \u003c/a\u003e\n\u003e the repository to show your support and help us grow the community!\n\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"https://i.imgur.com/zXE9tC6.png\" alt=\"\"\u003e\n\u003c/p\u003e\n\n\u003ca id=\"installation\"\u003e\u003c/a\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://i.imgur.com/BEyEL43.png\" width=\"100\" alt=\"\"\n       style=\"vertical-align: middle; margin-right: .5rem;\" /\u003e\n  Installation\n\u003c/h1\u003e\n\nCurrently, no anaconda installation is available. The installation must be done from the sources. \u003cbr\u003e\n**Cloning** the repository is the first step to be able to use the package.\n\n### Dependencies\n`Cocofest` relies on several libraries. \nSo carefully follow these steps to get everything installed to use `Cocofest`.\n\u003c/br\u003e\nFirst, create a new conda environment\n```bash\nconda create -n YOUR_ENV_NAME python=3.11\n```\n\nThen, activate the environment\n```bash\nconda activate YOUR_ENV_NAME\n```\n\nAfter, install the dependencies\n```bash\nconda install numpy matplotlib pytest casadi biorbd pyorerun bioptim==3.4.0 -c conda-forge\n```\n\nYou are now ready to use `Cocofest`!\n\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"https://i.imgur.com/zXE9tC6.png\" alt=\"\"\u003e\n\u003c/p\u003e\n\n\u003ca id=\"features\"\u003e\u003c/a\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://i.imgur.com/OFVqYpy.png\" width=\"100\" alt=\"\"\n       style=\"vertical-align: middle; margin-right: .5rem;\" /\u003e\n  Features\n\u003c/h1\u003e\n\n\u003ca id=\"available-fes-models\"\u003e\u003c/a\u003e\n## 📊 Available FES models\nAll models are implemented at the muscle actuator level, making them applicable to a wide range of problems regardless of the specific optimal control problem.\n\n| **Model Name**  | **Citation**                                                                                                                                                                                                                                    | **Description / Focus**                                             |\n| --------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------------- |\n| **Veltink1992** | Veltink, P. H., Chizeck, H. J., Crago, P. E., \u0026 El-Bialy, A. (1992). *Nonlinear joint angle control for artificially stimulated muscle*. IEEE Transactions on Biomedical Engineering, 39(4), 368–380.                                           | Nonlinear control of joint angles via electrical stimulation.       |\n| **Riener1996**  | Riener, R., Quintern, J., \u0026 Schmidt, G. (1996). *Biomechanical model of the human knee evaluated by neuromuscular stimulation*. Journal of Biomechanics, 29(9), 1157–1167.                                                                      | Biomechanical knee model validated using neuromuscular stimulation. |\n| **Ding2003**    | Ding, J., Wexler, A. S., \u0026 Binder-Macleod, S. A. (2003). *Mathematical models for fatigue minimization during functional electrical stimulation*. Journal of Electromyography and Kinesiology, 13(6), 575–588.                                  | Focus on mathematical models for minimising fatigue.                |\n| **Ding2007**    | Ding, J., Chou, L. W., Kesar, T. M., et al. (2007). *Mathematical model that predicts the force–intensity and force–frequency relationships after spinal cord injuries*. Muscle \u0026 Nerve, 36(2), 214–222.                                        | Predicts force–intensity and force–frequency responses post-SCI.    |\n| **Marion2009**  | Marion, M. S., Wexler, A. S., Hull, M. L., \u0026 Binder-Macleod, S. A. (2009). *Predicting the effect of muscle length on fatigue during electrical stimulation*. Muscle \u0026 Nerve, 40(4), 573–581.                                                   | Examines muscle length impact on fatigue under stimulation.         |\n| **Marion2013**  | Marion, M. S., Wexler, A. S., \u0026 Hull, M. L. (2013). *Predicting non-isometric fatigue induced by electrical stimulation pulse trains as a function of pulse duration*. Journal of NeuroEngineering and Rehabilitation, 10, 1–16.                | Predicts non-isometric fatigue based on pulse duration.             |\n| **Hmed2018**    | Hmed, A. B., Bakir, T., Garnier, Y. M., Sakly, A., Lepers, R., \u0026 Binczak, S. (2018). An approach to a muscle force model with force-pulse amplitude relationship of human quadriceps muscles. Computers in Biology and Medicine, 101, 218-228.  | Models the relationship between pulse amplitude and force.          |\n\n\n\u003e \\[!NOTE]\n\u003e\n\u003e It is possible to implement more FES models into Cocofest.\n\u003e Adventurous enough to code it by yourself, we are looking forward to read your [pull request](how-to-contribute).\n\u003e Feel free to reach out on discord or submit an issue if you need help.\n\n\u003ca id=\"musculoskeletal-model-driven-by-fes\"\u003e\u003c/a\u003e\n## 🦴 Musculoskeletal model driven by FES\n\nIn conventional Hill-type muscle model, muscle force ($F_m$) is the product of $a$ the muscle activation, $F_{max}$ the maximal\nisometric muscle force, $f_l$ the force-length, $f_v$ the force-velocity and $f_{pas}$ the passive force-length relationship:\n```math\nF_m(t) = a(t)\\, F_{\\max}\\, f_l(\\tilde{l}_m)\\, f_v(\\tilde{v}_m) + f_{pas}(\\tilde{l}_m)\n```\n\n`Cocofest` replaces $a(t)$ × $F_{max}$ by the force obtained using [FES models](#available-fes-models).\nThis approach allows motions driven-FES simulations, meanwhile benefiting from musculoskeletal model properties (e.g., muscle insertion, weight, inertial).\n\n\u003e \\[!NOTE]\n\u003e\n\u003e Used force-length ($f_l$), force-velocity ($f_v$) and passive force-length ($f_{pas}$) are those published by [De Groot et al., (2016)](https://link.springer.com/article/10.1007/s10439-016-1591-9).\n\u003e Those relationships can be activated or not when initializing your OCP. Modification to the following [file](cocofest/models/hill_coefficients.py) can be done to have more/different relationships. \n\n### 💻 A short musculoskeletal FES-driven example\nThe following example displays a reaching task using the [Arm26](https://opensimconfluence.atlassian.net/wiki/spaces/OpenSim/pages/53090607/Musculoskeletal+Models) model driven by the [Ding2007](https://onlinelibrary.wiley.com/doi/full/10.1002/mus.20806) FES model.\n\n```math\n\\begin{aligned}\n\\min_{x(\\cdot),\\,u(\\cdot)} \\quad \n\u0026 \\int_{0}^{T} \\sum_{i=1}^{n} F_{m,i}(t)\\,dt \\\\[4pt]\n\\text{s.t.:}\\quad\n\u0026 q_{\\text{arm}}(t) \\in [-0.5,\\, 3.14], \u0026\u0026 \\forall t \\in [0,T],\\\\\n\u0026 q_{\\text{forearm}}(t) \\in [0,\\, 3.14], \u0026\u0026 \\forall t \\in [0,T],\\\\\n\u0026 \\text{(last node)}\\;\\; \\|p_{\\text{hand\\_marker}}(T) - p_{\\text{target\\_marker}}\\| \\le \\varepsilon,\\\\\n\u0026 u(t) = \\begin{bmatrix}\n  \\mathrm{pw}_{1}(t)\\\\ \\mathrm{pw}_{2}(t)\\\\ \\vdots\\\\ \\mathrm{pw}_{n}(t)\n\\end{bmatrix}\n\\;\\; \\text{(pulse widths per muscle)}.\n\\end{aligned}\n```\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"800\" src=docs/assets/reaching.gif\u003e \u003cbr\u003e\n  Figure 1: Motion performed for the reaching task and associated muscle force production.\n\u003c/p\u003e\n\n\u003e \\[!NOTE]\n\u003e\n\u003e Solved in 6.7 second, computer with an AMD Ryzen Threadripper PRO 7965WXs x 48 processor. \u003cbr\u003e\n\u003e Additional information: frequency = 30Hz, n_shooting = 30, step = 0.033s, final time = 1s, integration = Collocation radau method, polynomial_order = 3, solver = IPOPT.\n\nYou can find more examples of musculoskeletal model driven by FES in the following [file](https://github.com/pyomeca/cocofest/tree/main/examples/fes_multibody).\n\n\u003ca id=\"moving-time-horizons\"\u003e\u003c/a\u003e\n## ⏳ Moving time horizons\n\nFor longer time span simulation and apprehend muscle fatigue apparition, `Cocofest` implements moving time horizons (MHE).\n\n### 💻 A short MHE hand cycling FES-driven example\n\n```math\n\\begin{aligned}\n\\min_{x(\\cdot),\\,u(\\cdot)} \\quad \n\u0026 \\int_{0}^{T} \\sum_{i=1}^{n} F_{m,i}(t)\\,dt \\\\[4pt]\n\\text{s.t.:}\\quad\n\u0026 q_{\\text{arm}}(t) \\in [0,\\, 1.5], \u0026\u0026 \\forall\\, t \\in [0,T],\\\\\n\u0026 q_{\\text{forearm}}(t) \\in [0.5,\\, 2.5], \u0026\u0026 \\forall\\, t \\in [0,T],\\\\\n\u0026 q_{\\text{pedal}}(t) \\in [0,\\, 6.28], \u0026\u0026 \\forall\\, t \\in [0,T],\\\\\n\u0026 \\text{(first node)}\\;\\; \\left\\|\\,\\mathrm{center}_{\\text{wheel}}(t_{0}) -\n\\begin{bmatrix} 0.35 \\\\ 0 \\end{bmatrix}\\right\\| \\le \\varepsilon,\\\\\n\u0026 \\text{(first node)}\\;\\; \\left\\|\\,\\dot{\\mathrm{center}}_{\\text{wheel}}(t_{0}) - 0\\right\\| \\le \\varepsilon,\\\\\n\u0026 \\text{(last node)}\\;\\; \\left\\|\\,q_{\\text{pedal}}(T) - 6.28\\right\\| \\le \\varepsilon,\\\\\n\u0026 u(t) = \\begin{bmatrix} \\mathrm{pw}_{1}(t)\\\\ \\mathrm{pw}_{2}(t)\\\\ \\vdots\\\\ \\mathrm{pw}_{n}(t) \\end{bmatrix}\n\\;\\; \\text{(pulse widths per muscle)}.\n\\end{aligned}\n```\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"800\" src=docs/assets/cycling.gif\u003e \u003cbr\u003e\n  Figure 2: Motion performed for the cycling task, muscle force contribution per section inspired by\n  \u003ca href=\"https://www.frontiersin.org/journals/sports-and-active-living/articles/10.3389/fspor.2025.1581301/full\"\u003e\n    Quittmann et al. (2025)\n  \u003c/a\u003e\n  and muscle force production above 10% of the maximal force.\n\u003c/p\u003e\n\n\u003e \\[!NOTE]\n\u003e\n\u003e Solved in 1.02 second, computer with an AMD Ryzen Threadripper PRO 7965WXs x 48 processor. \u003cbr\u003e\n\u003e Additional information: frequency = 30Hz, n_shooting = 60, step = 0.033s, final time = 2s, integration = Collocation radau method, polynomial_order = 3, solver = IPOPT, simultaneous turn per optimization = 2. \n\n\u003ca id=\"initial-value-problem\"\u003e\u003c/a\u003e\n## 🎯 Initial value problem\n\nThe initial value problem feature enables forward nonlinear dynamic integration to simulate the model’s behavior from given initial state and controls (i.e., series of pulse trains). \nThis also permits comparison between FES models without using optimal control methods.\n\nFor that, the IvpFes class is used to build the problem.\n\n```python\nfrom cocofest import IvpFes, DingModelFrequencyWithFatigue\n\nfes_parameters = {\"model\": DingModelFrequencyWithFatigue(), \"n_stim\": 10}\nivp_parameters = {\"n_shooting\": 20, \"final_time\": 1}\n\nivp = IvpFes(fes_parameters, ivp_parameters)\n\nresult, time = ivp.integrate()\n```\n\n\u003ca id=\"identification\"\u003e\u003c/a\u003e\n## 🔎 Identification\n\nTo personalize FES models to simulated or experimental force, `Cocofest` supports model identification using optimal control.\n\n### 💻 A short model identification example\n\n```math\n\\begin{aligned}\n\\min_{x(\\cdot),\\,p(\\cdot)} \\quad \n\u0026 \\int_{0}^{T} \\bigl(F(t) - F_{\\text{sim/exp}}(t)\\bigr)\\,dt \\\\[4pt]\n\\text{s.t.:}\\quad\n\u0026 u(t) = \\begin{bmatrix} \\mathrm{pw}_{1}(t)\\\\ \\mathrm{pw}_{2}(t)\\\\ \\vdots\\\\ \\mathrm{pw}_{n}(t) \\end{bmatrix}\n= \\begin{bmatrix} \\mathrm{pw}_{\\text{exp}1}(t)\\\\ \\mathrm{pw}_{\\text{exp}2}(t)\\\\ \\vdots\\\\ \\mathrm{pw}_{\\text{exp}n}(t) \\end{bmatrix}.\n\\end{aligned}\n```\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"800\" src=docs/assets/identification.gif\u003e \u003cbr\u003e\n  Figure 3: Model identification optimization\n\u003c/p\u003e\n\n\u003e \\[!NOTE]\n\u003e\n\u003e Solved in 0.343 second, computer with an AMD Ryzen Threadripper PRO 7965WXs x 48 processor. \u003cbr\u003e\n\u003e Additional information: frequency = 33Hz, n_shooting = 66, step = 0.03s, final time = 2s, integration = Runge-Kutta 4, integration steps = 10, solver = IPOPT. \n\n\u003ca id=\"summation-truncation\"\u003e\u003c/a\u003e\n## ✂️ Summation truncation\n\n`Cocofest` also incorporates the recent numerical truncation method to speed up convergence.\nThis method limits the number of past stimulations considered in the dynamics to reduce the dependency on time-varying states.\n\n```python\nmodel = ModelMaker.create_model(\"ding2007\", stim_time=stim_time, sum_stim_truncation=10)\n```\n\n\u003e \\[!TIP]\n\u003e\n\u003e To determine the value to use for `sum_stim_truncation`, you can refer to [Tiago et al. (2025)](https://inria.hal.science/hal-05165086/) or [Co et al. (2024)](https://umontreal.scholaris.ca/items/a94c280a-98dc-48ad-888c-e11c7c6a0d55).\n\n\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"https://i.imgur.com/zXE9tC6.png\" alt=\"\"\u003e\n\u003c/p\u003e\n\n\u003ca id=\"other\"\u003e\u003c/a\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://i.imgur.com/ksk1C7F.png\" width=\"100\" alt=\"\"\n       style=\"vertical-align: middle; margin-right: .5rem;\" /\u003e\n  Other\n\u003c/h1\u003e\n\n\u003ca id=\"want-to-contribute\"\u003e\u003c/a\u003e\n## 🙌 Want to contribute?\n\nWe are always looking for new contributors to help us improve `Cocofest`. \u003cbr\u003e\nFeel free to check our [contributing guidelines](docs/contributing.md) to get started.\n\nDon't know where to start? [Issues](https://github.com/pyomeca/cocofest/issues) tagged with \"Good first issues\" are a great place to begin!\n\n\u003ca id=\"contributors\"\u003e\u003c/a\u003e\n## 🤝 Contributors\n\n\u003ca href=\"https://github.com/Kev1CO\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/78259038?v=4\" title=\"Kev1CO\" width=\"50\" height=\"50\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Ipuch\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/40755537?v=4\" title=\"Ipuch\" width=\"50\" height=\"50\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Florine353\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/112490846?v=4\" title=\"Florine353\" width=\"50\" height=\"50\"\u003e\u003c/a\u003e\n\n\u003ca id=\"citing\"\u003e\u003c/a\u003e\n## 📝 Citing\n`Cocofest` is not yet published. \u003cbr\u003e\nMeanwhile, if you use `Cocofest`, please cite the following zenodo link: [10.5281/zenodo.17068808](https://doi.org/10.5281/zenodo.17068808).\n\n\u003ca id=\"cited-in\"\u003e\u003c/a\u003e\n## 📚 Cited in\n\u003e \\[!NOTE]\n\u003e If you used `Cocofest` in your research, please let us know by submitting an issue or a pull request to add your publication to this list.\n\n\u003ca id=\"other-related-projects\"\u003e\u003c/a\u003e\n## \u003cimg src=\"https://avatars.githubusercontent.com/u/36738416?s=200\u0026v=4\" width=\"25\"\u003e  Other related projects \u003cimg src=\"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV1sVJMT3ICWt09iYCfGOXjQhhW1ryMehoBw\u0026s\" width=\"25\"\u003e \n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pyomeca/bioptim\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/pyomeca/biorbd_design/main/logo_png/bioptim_full.png\" alt=\"Bioptim\" height=\"56\"\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pyomeca/biorbd\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/pyomeca/biorbd_design/main/logo_png/biorbd_full.png\" alt=\"Biorbd\" height=\"56\"\u003e \n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pyomeca/pyorerun\"\u003e\u003cimg src=\"docs/assets/Pyorerun.gif\" alt=\"Pyomeca\" height=\"56\"\u003e \n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pyomeca/biobuddy\"\u003e\u003cimg src=\"docs/assets/BioBuddy.gif\" alt=\"Biobuddy\" height=\"56\"\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/s2mLab/pyScienceMode\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/s2mLab/pyScienceMode/main/docs/how_to_use_pysciencemode.png\" alt=\"pyScienceMode\" height=\"56\"\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ca id=\"acknowledgements\"\u003e\u003c/a\u003e\n## 🙏 Acknowledgements\n\n### 🌱 Funding\n\u003ca href=\"https://regroupementinter.com/fr/mandat/160-optistim/\"\u003e\u003cimg src=\"https://regroupementinter.com/wp-content/uploads/2023/11/INTER_logo-600x208.png\" title=\"INTER\" width=\"100\"\u003e\u003c/a\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\u003ca href=\"https://frq.gouv.qc.ca\"\u003e\u003cimg src=\"https://cmqtr.qc.ca/wp-content/uploads/2022/09/FRQNT-logo-frqnt-COULEURS.png\" title=\"FRQNT\" width=\"100\"\u003e\u003c/a\u003e\n\n### \u003cimg src=\"docs/assets/cocofest_logo.png\" width=\"30\"\u003e Logo and assets design\n\u003ca href=\"https://www.instagram.com/maxmvpainting/\"\u003e\u003cimg src=\"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQrO9f_QqjajojjcNJo8FDUdROLwLx-SQ7uVw\u0026s\" title=\"MaxMV\" width=\"65\"\u003e\u003c/a\u003e\n\n\u003cp align=\"center\"\u003e \n  \u003cimg src=\"https://i.imgur.com/zXE9tC6.png\" alt=\"\"\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyomeca%2Fcocofest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyomeca%2Fcocofest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyomeca%2Fcocofest/lists"}