Skip to content

Commit 24ea2cf

Browse files
committed
docs: 📚 update README
1 parent 3ec02e5 commit 24ea2cf

File tree

1 file changed

+276
-7
lines changed

1 file changed

+276
-7
lines changed

README.md

Lines changed: 276 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,279 @@ o o o o o o . . x x x
150150

151151
### Архитектура приложения
152152

153-
...
153+
```txt
154+
+---------------------------+
155+
| Обработка конфигурации |
156+
| и аргументов программы |
157+
+---------------------------+
158+
|
159+
| Конфигурация шага и точности
160+
v
161+
+---------------------------+
162+
| Обработка входного потока |<----+
163+
+---------------------------+ |
164+
| |
165+
+--------------------+
166+
|
167+
| Новая точка
168+
v
169+
+---------------------------+
170+
| Валидация новой точки |
171+
+---------------------------+ +-----------------+
172+
| |<------------| Генерация точек |
173+
| Интерполяция | +-----------------+
174+
| |-----------+
175+
+---------------------------+ Метод 1 |
176+
| |-----------------+
177+
| | Метод 2 |
178+
| |-----------------+
179+
| | ... |
180+
| |-----------------+
181+
|
182+
|
183+
| Результаты вычислений
184+
v
185+
+---------------------------+
186+
| Печать выходных значений |
187+
+---------------------------+
188+
```
154189

155190
### Ключевые элементы реализации
156191

157-
...
192+
Линейная интерполяция:
193+
194+
```elixir
195+
defmodule InterpolationApp.Algo.LinearInterpolation do
196+
use InterpolationApp.Algo.Interpolation
197+
198+
@impl true
199+
def get_name, do: "Линейная интерполяция"
200+
201+
@impl true
202+
def get_enough_points_count, do: 2
203+
204+
@impl true
205+
def need_concrete_number_of_points?, do: true
206+
207+
@impl true
208+
def interpolate(points, x) when not is_list(x) do
209+
[{x0, y0}, {x1, y1}] = points
210+
211+
a = (y1 - y0) / (x1 - x0)
212+
b = y0 - a * x0
213+
214+
{x, a * x + b}
215+
end
216+
end
217+
```
218+
219+
REPL:
220+
221+
```elixir
222+
defmodule InterpolationApp.CLI.Repl do
223+
alias InterpolationApp.CLI.{Applier, Interpolator, Printer}
224+
225+
def start(config) do
226+
IO.puts("Введите 'quit', чтобы закончить ввод.")
227+
IO.puts("Введите узлы интерполяции:")
228+
229+
{:ok, printer_pid} = Printer.start_link(config)
230+
{:ok, interpolator_pid} = Interpolator.start_link(config, printer_pid)
231+
{:ok, applier_pid} = Applier.start_link(interpolator_pid)
232+
233+
loop(applier_pid)
234+
end
235+
236+
defp loop(applier_pid) do
237+
:io.setopts(:standard_io, active: true)
238+
input = IO.gets("") |> check_quit
239+
240+
GenServer.cast(applier_pid, {:apply_input, String.trim(input)})
241+
loop(applier_pid)
242+
end
243+
244+
...
245+
end
246+
```
247+
248+
GenServer интерполяции:
249+
250+
```elixir
251+
defmodule InterpolationApp.CLI.Interpolator do
252+
use GenServer
253+
254+
alias InterpolationApp.Utils.PointGenerator
255+
256+
# Client API
257+
258+
def start_link(config, printer_pid) do
259+
GenServer.start_link(__MODULE__, {config, printer_pid}, name: __MODULE__)
260+
end
261+
262+
def add_point(point) do
263+
GenServer.cast(__MODULE__, {:add_point, point})
264+
end
265+
266+
# Server Callbacks
267+
268+
@impl true
269+
def init({config, printer_pid}) do
270+
{:ok, {[], config, printer_pid}}
271+
end
272+
273+
@impl true
274+
def handle_cast({:add_point, point}, {points, config, printer_pid}) do
275+
points = Enum.reverse([point | Enum.reverse(points)])
276+
277+
Enum.each(config.methods, fn method ->
278+
handle_method(method, points, printer_pid, config)
279+
end)
280+
281+
{:noreply, {points, config, printer_pid}}
282+
end
283+
284+
# Helper Functions
285+
286+
defp handle_method(method, points, printer_pid, config) do
287+
if method.points_enough?(points) do
288+
limit = method.get_enough_points_count()
289+
290+
interpolation_points =
291+
if method.need_concrete_number_of_points?(),
292+
do: Enum.slice(points, -limit, limit),
293+
else: points
294+
295+
generated_points = PointGenerator.generate(interpolation_points, config.step)
296+
297+
GenServer.cast(printer_pid, {
298+
:print,
299+
method,
300+
method.interpolate(interpolation_points, generated_points)
301+
})
302+
end
303+
304+
:ok
305+
end
306+
end
307+
```
158308

159309
### Как запустить?
160310

161-
...
311+
**1.** Склонировать репозиторий:
312+
313+
```bash
314+
git clone git@github.com:maxbarsukov-itmo/functional-programming-3.git
315+
```
316+
317+
**2.** Установить зависимости:
318+
319+
```bash
320+
mix deps.get
321+
mix deps.compile
322+
```
323+
324+
**3.** Собрать `escript` — исполняемый файл, который может быть запущен на любой системе с установленным Erlang.:
325+
326+
```bash
327+
mix escript.build
328+
```
329+
330+
**4.** Линтинг:
331+
332+
```bash
333+
mix check
334+
```
335+
336+
**5.** Тестирование:
337+
338+
```bash
339+
mix test --trace
340+
```
341+
342+
**6.** Запустить приложение: `./out/interpolation-app`
343+
344+
Help message:
345+
346+
```man
347+
usage: interpolation-app [options] --methods=<method1,method2,...> --step=<step>
348+
options:
349+
-h, --help Prints this message
350+
--accuracy=<accuracy> Set printing accuracy
351+
352+
methods:
353+
* linear
354+
* lagrange3
355+
* lagrange4
356+
* newton
357+
```
162358

163359
### Пример работы программы
164360

165-
...
361+
Для значений из [data/sin_x.csv](./data/sinx.csv):
362+
363+
```bash
364+
cat data/sinx.csv | ./out/interpolation-app --methods=linear,newton,lagrange4 --step=1 --accuracy=3
365+
```
366+
367+
```txt
368+
❯ ./out/interpolation-app --methods=linear,newton,lagrange4 --step=1
369+
Введите 'quit', чтобы закончить ввод.
370+
Введите узлы интерполяции:
371+
0 0
372+
1.571 1
373+
>> Линейная интерполяция (идем от точки из введенных 0.0 с шагом 1.0, покрывая все введенные X)
374+
0.000 1.000 2.000
375+
0.000 0.637 1.273
376+
377+
>> Интерполяция по Ньютону (идем от точки из введенных 0.0 с шагом 1.0, покрывая все введенные X)
378+
0.000 1.000 2.000
379+
0.000 0.637 1.273
380+
381+
3.142 0
382+
>> Линейная интерполяция (идем от точки из введенных 1.571 с шагом 1.0, покрывая все введенные X)
383+
1.571 2.571 3.571
384+
1.000 0.363 -0.273
385+
386+
>> Интерполяция по Ньютону (идем от точки из введенных 0.0 с шагом 1.0, покрывая все введенные X)
387+
0.000 1.000 2.000 3.000 4.000
388+
0.000 0.868 0.925 0.173 -1.391
389+
390+
4.712 -1
391+
>> Линейная интерполяция (идем от точки из введенных 3.142 с шагом 1.0, покрывая все введенные X)
392+
3.142 4.142 5.142
393+
0.000 -0.637 -1.274
394+
395+
>> Интерполяция по Ньютону (идем от точки из введенных 0.0 с шагом 1.0, покрывая все введенные X)
396+
0.000 1.000 2.000 3.000 4.000 5.000
397+
0.000 0.973 0.841 0.120 -0.674 -1.026
398+
399+
>> Интерполяционный многочлен Лагранжа для 4 точек (идем от точки из введенных 0.0 с шагом 1.0, покрывая все введенные X)
400+
0.000 1.000 2.000 3.000 4.000 5.000
401+
0.000 0.973 0.841 0.120 -0.674 -1.026
402+
403+
12.568 0
404+
>> Линейная интерполяция (идем от точки из введенных 4.712 с шагом 1.0, покрывая все введенные X)
405+
4.712 5.712 6.712 7.712 8.712 9.712 10.712 11.712 12.712
406+
-1.000 -0.873 -0.745 -0.618 -0.491 -0.364 -0.236 -0.109 0.018
407+
408+
>> Интерполяция по Ньютону (идем от точки из введенных 0.0 с шагом 1.0, покрывая все введенные X)
409+
0.000 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000
410+
0.000 1.001 0.825 0.114 -0.637 -1.083 -1.031 -0.436 0.595 1.806 2.792 2.996 1.712 -1.916
411+
412+
>> Интерполяционный многочлен Лагранжа для 4 точек (идем от точки из введенных 1.571 с шагом 1.0, покрывая все введенные X)
413+
1.571 2.571 3.571 4.571 5.571 6.571 7.571 8.571 9.571 10.571 11.571 12.571
414+
1.000 0.373 -0.280 -0.915 -1.486 -1.950 -2.262 -2.378 -2.254 -1.845 -1.107 0.004
415+
416+
quit
417+
418+
Спасибо за использование программы!
419+
420+
| _,,,---,,_
421+
ZZZzz /,`.-'`' -. ;-;;,_
422+
|,4- ) )-,_. , ( `'-'
423+
'---''(_/--' `-'_)
424+
425+
```
166426

167427
### Форматирование, линтинг и тестирование
168428

@@ -171,13 +431,22 @@ o o o o o o . . x x x
171431
* [ExUnit](https://hexdocs.pm/ex_unit/ExUnit.html) - для модульного тестирования;
172432
* [Quixir](https://github.com/pragdave/quixir) - для тестирования свойств (property-based).
173433
* [Credo](https://github.com/rrrene/credo) - инструмент статического анализа кода для языка Elixir;
174-
* [Dialyxir](https://github.com/jeremyjh/dialyxir) - Dialyz~~er~~xir is a **DI**screpancy **A**na**LY**zer for ~~**ER**lang~~ Eli**XIR** programs.
434+
* [Dialyxir](https://github.com/jeremyjh/dialyxir) - Dialy~~zer~~xir is a **DI**screpancy **A**na**LY**zer for ~~**ER**lang~~ Eli**XIR** programs.
175435

176436
---
177437

178438
## Выводы
179439

180-
В данной лабораторной работе ...
440+
В данной лабораторной работе я поработал с параллелизмом и серверами OTP
441+
442+
В ходе работы были разработаны и протестированы алгоритмы для различных методов интерполяции и вспомогательные утилиты.
443+
444+
Достигнуты следующие результаты:
445+
446+
* С использованием параллелизма и серверов OTP была разработана утилита для асинхронного подсчёта интерполяции.
447+
* Реализованы алгоритмы интерполяции (линейная, Лагранжа и Ньютона) с использованием подходов для работы с заданным количеством точек.
448+
* Созданы утилиты для генерации промежуточных точек, проверки входных данных и конфигурации CLI.
449+
* Подтверждена корректность работы модулей при различных входных данных, в том числе при случайных значениях (property-based тесты).
181450

182451
---
183452

@@ -188,9 +457,9 @@ o o o o o o . . x x x
188457
| [github.com/maxbarsukov/itmo/4 вычмат/лабораторные/lab5](https://github.com/maxbarsukov/itmo/tree/master/4%20%D0%B2%D1%8B%D1%87%D0%BC%D0%B0%D1%82/%D0%BB%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B5/lab5) | **Вычмат**: ЛР 5 по **интерполяции** функции |
189458
| [en.wikipedia.org/wiki/Interpolation](https://en.wikipedia.org/wiki/Interpolation) | Что такое интерполяция? |
190459
| [elixirschool.com/ru/lessons/intermediate/concurrency](https://elixirschool.com/ru/lessons/intermediate/concurrency) | Параллелизм в Elixir |
460+
| [elixirschool.com/ru/lessons/advanced/otp_concurrency](https://elixirschool.com/ru/lessons/advanced/otp_concurrency) | Параллелизм в OTP |
191461
| [habr.com/ru/articles/114232/](https://habr.com/ru/articles/114232/) | Erlang и его процессы |
192462
| [perso.ens-lyon.fr/laurent.modolo/unix/7_streams_and_pipes.html](https://perso.ens-lyon.fr/laurent.modolo/unix/7_streams_and_pipes.html) | Unix Streams and pipes |
193-
| [habr.com/ru/companies/ruvds/articles/656567/](https://habr.com/ru/companies/ruvds/articles/656567/) | Конвейеры в Linux |
194463

195464
## Лицензия <a name="license"></a>
196465

0 commit comments

Comments
 (0)