{"id":20982572,"url":"https://github.com/imtjl/fp-interpolation-cli","last_synced_at":"2026-05-18T13:05:56.473Z","repository":{"id":262354032,"uuid":"886289470","full_name":"Imtjl/fp-interpolation-cli","owner":"Imtjl","description":"Command line utility to interpolate your data using Lagrande and segment methods, written in Elixir","archived":false,"fork":false,"pushed_at":"2024-11-12T17:56:20.000Z","size":59,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-30T22:45:06.757Z","etag":null,"topics":["actor-model","elixir","genserver","lagrange-interpolation","linear-interpolation","supervisor"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Imtjl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-11-10T17:20:49.000Z","updated_at":"2024-11-21T01:25:01.000Z","dependencies_parsed_at":"2025-03-13T10:30:56.929Z","dependency_job_id":"ccec4a46-1582-4948-8ac3-b52ef5efeed0","html_url":"https://github.com/Imtjl/fp-interpolation-cli","commit_stats":null,"previous_names":["imtjl/fp-linear-interpolation-cli","imtjl/fp-interpolation-cli"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Imtjl/fp-interpolation-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imtjl%2Ffp-interpolation-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imtjl%2Ffp-interpolation-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imtjl%2Ffp-interpolation-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imtjl%2Ffp-interpolation-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Imtjl","download_url":"https://codeload.github.com/Imtjl/fp-interpolation-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Imtjl%2Ffp-interpolation-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33178749,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["actor-model","elixir","genserver","lagrange-interpolation","linear-interpolation","supervisor"],"created_at":"2024-11-19T05:45:59.939Z","updated_at":"2026-05-18T13:05:56.431Z","avatar_url":"https://github.com/Imtjl.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Imtjl/fp-interpolation-cli\"\u003e\n    \u003cpicture\u003e\n      \u003cimg src=\"resources/logo.png\" height=\"200\"\u003e\n    \u003c/picture\u003e\n\u003ch1 align=\"center\"\u003e\n  Лабораторная работа №3\u003cbr\u003e\n  (CLI-утилита для интерполяции)\n\u003c/h1\u003e\n\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e  \n \u003ca aria-label=\"Elixir Version\" href=\"https://elixir-lang.org/\"\u003e\n  \u003cimg alt=\"Elixir Version\" src=\"https://img.shields.io/badge/Elixir-1.15.7-purple?style=for-the-badge\u0026labelColor=000000\u0026logo=elixir\u0026logoColor=white\"\u003e\n\u003c/a\u003e\n\u003ca aria-label=\"Erlang/OTP Version\" href=\"https://www.erlang.org/\"\u003e\n  \u003cimg alt=\"Erlang/OTP Version\" src=\"https://img.shields.io/badge/Erlang%2FOTP-26.0-red?style=for-the-badge\u0026labelColor=000000\u0026logo=rocket\u0026logoColor=white\"\u003e\n\u003c/a\u003e\n\u003ca aria-label=\"Elixir CI\" href=\"https://github.com/Imtjl/fp-interpolation-cli/actions\"\u003e\n  \u003cimg alt=\"Elixir CI\" src=\"https://img.shields.io/github/actions/workflow/status/Imtjl/fp-interpolation-cli/ci.yml?branch=main\u0026style=for-the-badge\u0026logo=github-actions\u0026labelColor=000000\u0026color=teal\"\u003e\n\u003c/a\u003e\n  \u003ca aria-label=\"Coverage Status\" href=\"https://coveralls.io/github/Imtjl/fp-interpolation-cli?branch=main\"\u003e\n    \u003cimg alt=\"Coverage Status\" src=\"https://img.shields.io/coveralls/github/Imtjl/fp-interpolation-cli/main?style=for-the-badge\u0026labelColor=000000\u0026logo=coveralls\u0026color=green\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n  \n\u003cdetails open\u003e\n   \u003csummary\u003e\u003cb\u003eTable of Contents\u003c/b\u003e\u003c/summary\u003e\n\n- [Title](#title)\n- [Architecture](#arch)\n- [Conclusion](#end)\n\n\u003c/details\u003e\n\n---\n\n\u003ca id=\"title\"\u003e\u003c/a\u003e\n\n- Студент: `Дворкин Борис Александрович`\n- Группа: `P3331`\n- ИСУ: `368090`\n- Функциональный язык программирования: `Elixir`\n\n---\n\n\u003ca id=\"usage\"\u003e\u003c/a\u003e\n\n## Использование\n\n### Потоковый режим\n\n\u003e Шаг дискретизации `s` - step\n\n```bash\n╭─boris at fedora in ⌁/dev/functional-programming-course/fp-lab3 (main ✚5…2)\n╰─λ cat ./resources/large_input_data.csv\n  | ./interpolation_cli -a linear,lagrange -s 1.0\n  \u003e ./resources/large_output_data.md\n```\n\n### Ручной ввод\n\n\u003e Шаг дискретизации `s` - step\n\n```bash\n╭─boris at fedora in ⌁/dev/functional-programming-course/fp-lab3 (main ✚4…2)\n╰─λ ./interpolation_cli -a linear,lagrange -s 1.0       130 (37.076s) \u003c 14:21:11\n0 0\n1.571 1\n\nLinear (going from point 0.0 with step 1.0, covering all input X (1.57 \u003c 2.0))\n:\n0.0     1.0     2.0\n0.0     0.64    1.27\n\n3.142 0\n\nLinear (going from point 1.57 with step 1.0, covering all input X (3.14 \u003c 3.57))\n:\n1.57    2.57    3.57\n1.0     0.36    -0.27\n\n4.712 -1\n\nLinear (going from point 3.14 with step 1.0, covering all input X (4.71 \u003c 5.14))\n:\n3.14    4.14    5.14\n0.0     -0.64   -1.27\n\n\nLagrange (from point 0.0 with step 1.0, covering all input X (4.71 \u003c 5.0))\n:\n0.0     1.0     2.0     3.0     4.0     5.0\n0.0     0.97    0.84    0.12    -0.67   -1.03\n\n12.568 0\n\nLinear (going from point 4.71 with step 1.0, covering all input X (12.57 \u003c 12.71))\n:\n4.71    5.71    6.71    7.71    8.71    9.71    10.71   11.71   12.71\n-1.0    -0.87   -0.75   -0.62   -0.49   -0.36   -0.24   -0.11   0.02\n\n\nLagrange (from point 1.57 with step 1.0, covering all input X (12.57 \u003c 12.57))\n:\n1.57    2.57    3.57    4.57    5.57    6.57    7.57    8.57    9.57    10.57  11.57    12.57\n1.0     0.37    -0.28   -0.91   -1.49   -1.95   -2.26   -2.38   -2.25   -1.84  -1.11    0.0\n```\n\n\u003ca id=\"arch\"\u003e\u003c/a\u003e\n\n## Архитектура\n\nМодель акторов используется в модулях `Application`, `InputHandler`,\n`LinearInterpolator`, `LagrangeInterpolator` и `OutputHandler`.\n\n- **Supervisor** — центральный процесс, который управляет жизненным циклом\n  дочерних процессов (`InputHandler`, `LinearInterpolator`,\n  `LagrangeInterpolator` и `OutputHandler`). При сбоях `Supervisor`\n  перезапускает только те процессы, которые завершились аварийно, используя\n  стратегию `:one_for_one`.\n\n- **GenServer** - это абстракция Elixir для реализации акторов. Это процесс,\n  хранящий состояние и обрабатывающий запросы. По принципу своей работы это\n  похоже на брокеров сообщений, по типу RabbitMQ или Kafka - по сути, просто луп\n  эрланговского процесса, который ждёт сообщение, исполняет релевантный ему код,\n  обновляет состояние если нужно и обратно возвращается в ожиданию сообщения.\n\nТаким образом, для CLI она не нужна, т.к. это точка входа, не имеющая состояния,\nкоторое можно было сохранить между вызовами, и оно не требует какого-то\nпараллельного взаимодействия.\n\nВ то время как остальные модули работают в изолированных процессах GenServer и\nобщаются между собой через асинхронные сообщения `cast` и `call`, что позволяет\nизбежать блокировки и синхронизации, а также компоненты могут обрабатывать\nданные параллельно, независимо друг от друга. Например, OutputHandler может\nвводить данные в то время, как InputHandler уже обрабатывает новую порцию\nданных. Для другого алгоритма интерполяции можно просто добавить ещё один ген\nсервер.\n\n```\n+--------------------------------------+\n|                CLI                   |\n|--------------------------------------|\n| Чтение и парсинг ввода               |\n| Запуск и настройка компонентов       |\n| Передача точек в InputHandler        |\n+--------------------------------------+\n                    |\n                    v\n+--------------------------------------+\n|           InputHandler               |\n|--------------------------------------|\n| (GenServer)                          |\n| Приём данных и сортировка            |\n| Хранение входных точек               |\n| Передача точек в интерполяторы       |\n+--------------------------------------+\n                    |\n                    v\n+--------------------------------------+\n|      Linear/Lagrange Interpolator    |\n|--------------------------------------|\n| (GenServer)                          |\n| Линейная / полином Лагранжа          |\n| Получение точек от InputHandler      |\n| Генерация промежуточных точек        |\n| Передача результатов в OutputHandler |\n+--------------------------------------+\n                    |\n                    v\n+--------------------------------------+\n|           OutputHandler              |\n|--------------------------------------|\n| (GenServer)                          |\n| Приём интерполированных данных       |\n| Форматирование и вывод результатов   |\n+--------------------------------------+\n```\n\n## Интерполяция\n\nВ моей программе реализованы два метода интерполяции: линейная и интерполяция с\nпомощью полинома Лагранжа. Оба метода выражены в виде математических формул и\nреализованы на Elixir.\n\n### Линейная интерполяция\n\nЛинейная интерполяция между двумя точками `(x_1, y_1)` и `(x_2, y_2)` выражается\nкак:\n\n$$\ny = y_1 + \\frac{{y_2 - y_1}}{{x_2 - x_1}} \\cdot (x - x_1)\n$$\n\nВ Elixir реализация разбивает отрезок между двумя точками на заданные промежутки\nс шагом `step`, а затем вычисляет значения по формуле для каждого промежуточного\n`x`:\n\n```elixir\ndef perform_linear_interpolation([{x1, y1}, {x2, y2}], step) do\n  xs = Stream.iterate(x1, \u0026(\u00261 + step)) |\u003e Enum.take_while(\u0026(\u00261 \u003c= x2))\n  ys = Enum.map(xs, fn x -\u003e y1 + (y2 - y1) / (x2 - x1) * (x - x1) end)\n  Enum.zip(xs, ys)\nend\n```\n\n### Интерполяция полиномом Лагранжа\n\nИнтерполяция полиномом Лагранжа для набора точек\n$(x_0, y_0), (x_1, y_1), \\dots, (x_n, y_n)$ вычисляется с помощью полинома\nстепени \\( n \\):\n\n$$\nL(x) = \\sum_{i=0}^{n} y_i \\cdot l_i(x)\n$$\n\nгде $l_i(x)$ — базисный полином, определяемый как:\n\n$$\nl_i(x) = \\prod_{\\substack{0 \\leq j \\leq n \\\\ j \\neq i}} \\frac{{x - x_j}}{{x_i - x_j}}\n$$\n\nРеализация на Elixir строит этот полином, используя функции для вычисления\nзначений каждого базисного полинома `l_i(x)`:\n\n```elixir\ndef lagrange_value(points, x) do\n  Enum.reduce(points, 0.0, fn {x_i, y_i}, acc -\u003e\n    acc + y_i * basis_polynomial(points, x, x_i)\n  end)\nend\n\ndefp basis_polynomial(points, x, x_i) do\n  Enum.reduce(points, 1.0, fn {x_j, _}, prod -\u003e\n    if x_i != x_j do\n      prod * (x - x_j) / (x_i - x_j)\n    else\n      prod\n    end\n  end)\nend\n```\n\n\u003ca id=\"end\"\u003e\u003c/a\u003e\n\n## Вывод\n\nПознакомился с математической моделью акторов, с её реализацией в Elixir,\nпорадовался как тут всё прикольно, нет проблем с бесконечными блокировками и\nсинхронизациями, ведь общение между Эрланговскими процессами происходит простыми\nсообщениями, как в брокерах сообщений с которыми довелось работать, по типу\nRabbitMQ и Kafka. Также интересна работа Супервизора - легко создать и наполнить\nген серверами, и в случае возникновения любого эксепшена не падает всё\nприложение, а продолжает работу в штатном режиме. Стратегий супервизора не так\nмного и легко изучаются, язык прямо сделан для создания хорошей нагруженной\nсистемы. Поигрался с обработкой сообщений и общением с супервизором. Модули для\nработы с потоками I/O предоставляют достаточно интуитивный и простой интерфейс\nдля работы, поэтому было интересно и не слишком больно работать с потоковыми\nрежимами.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimtjl%2Ffp-interpolation-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimtjl%2Ffp-interpolation-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimtjl%2Ffp-interpolation-cli/lists"}