-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathanti_turing.erl
More file actions
135 lines (115 loc) · 5.56 KB
/
Copy pathanti_turing.erl
File metadata and controls
135 lines (115 loc) · 5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
% Программа моделирования на Erlang решения квадратного уравнения в потоке данных
-module(anti_turing).
-export([start_a/0, start_b/0, start_c/0, get_x1/0, get_x2/0]).
-vsn(1.0).
% Построение дерева решения и распределение машины исполнения
% Запуск асинхронных процессов считывания начальных данных
start_a() ->
start_d(), start_x1(), start_x2(),
loop_a(1).
start_b() ->
loop_b(1).
start_c() ->
loop_c(1).
% Запуск узлов вычислителей
start_d() ->
register(d, spawn(fun() -> loop_d(undefined, undefined, undefined) end )),
start_sqrt().
start_sqrt() ->
register(sqrt, spawn(fun() -> loop_sqrt() end )).
% Запуск узлав результатов
start_x1() ->
register(x1_memo, spawn(fun() -> loop_x1(undefined, undefined, undefined, undefined) end )).
start_x2() ->
register(x2_memo, spawn(fun() -> loop_x2(undefined, undefined, undefined, undefined) end )).
% Содержательная часть движка
loop_a(N) -> % Передается счетчик выборок
io:format("Выборка ~w. ",[N]),
case io:fread("Введите множитель A > ", "~f") of
{ok, [Num]} when Num == 0.0 -> io:format("Завершаем цепочку расчетов~n",[]),
d ! sqrt ! x1_memo ! x2_memo ! stop;
{ok, [Num]} when (Num < 0.0) or (Num > 0.0) -> d ! {a, Num},
x1_memo ! {a, Num},
x2_memo ! {a, Num},
loop_a(N+1);
{error, FreadError} -> io:format("Ошибка ввода ~w~n", [FreadError]), loop_a(N)
end.
loop_b(N) -> % Передается счетчик выборок
io:format("Выборка ~w. ",[N]),
case io:fread("Введите множитель B > ", "~f") of
{ok,[Num]} -> {d, a@localhost} ! {b, Num},
{x1_memo, a@localhost} ! {b, Num},
{x2_memo, a@localhost} ! {b, Num},
loop_b(N+1);
{error, FreadError} -> io:format("Ошибка ввода~w~n", [FreadError]),
loop_b(N);
stop -> true
end.
loop_c(N) -> % Передается счетчик выборок
io:format("Выборка ~w. ",[N]),
case io:fread("Введите множитель C > ", "~f") of
{ok, [Num]} -> {d, a@localhost} ! {c, Num},
loop_c(N+1);
{error, FreadError} -> io:format("Ошибка ввода ~w~n", [FreadError]),
loop_c(N);
stop -> true
end.
loop_d(A,B,C) ->
receive
{a, Acur} when (B == undefined) or (C == undefined) -> loop_d(Acur,B,C);
{b, Bcur} when (A == undefined) or (C == undefined) -> loop_d(A,Bcur,C);
{c, Ccur} when (A == undefined) or (B == undefined) -> loop_d(A,B,Ccur);
{a, Acur} when (B /= undefined) and (C /= undefined) ->
Dt = B*B - 4*Acur*C,
sqrt ! {d, Dt};
{b, Bcur} when (A /= undefined) and (C /= undefined) ->
Dt = Bcur*Bcur - 4*A*C,
sqrt ! {d, Dt};
{c, Ccur} when (A /= undefined) and (B /= undefined) ->
Dt = B*B - 4*A*Ccur,
sqrt ! {d, Dt};
stop -> true
end,
% Возврат начального состояния
loop_d(undefined, undefined, undefined).
loop_sqrt() ->
receive
{d,D} when D >=0 -> Sqrt = math:sqrt(D),
x1_memo ! x2_memo ! {sqrt, Sqrt},
loop_sqrt();
{d,D} when D < 0 -> io:format("Дискреминант отрицательный. Поменяйте начальные данные.",[]);
stop -> true
end.
loop_x1(A, B, Sqrt, X) -> % X-сохраняемое значение memo
receive
{a, Acur} -> loop_x1(Acur, B, Sqrt, X);
{b, Bcur} -> loop_x1(A, Bcur, Sqrt, X);
{sqrt, Sqrtcur} when (A /= undefined) and (B /= undefined) ->
Xcur = -(B + Sqrtcur)/2/A ,
x1_memo ! {save, Xcur},
loop_x1(undefined, undefined, undefined, Xcur);
{get, Pid} -> Pid ! {reply, X}, loop_x1(A, B, Sqrt, X);
stop -> true
end.
loop_x2(A, B, Sqrt, X) -> % X-сохраняемое значение memo
receive
{a,Acur} -> loop_x2(Acur, B, Sqrt, X);
{b,Bcur} -> loop_x2(A, Bcur, Sqrt, X);
{sqrt, Sqrtcur} when (A /= undefined) and (B /= undefined)->
Xcur = (-B + Sqrtcur)/2/A ,
x2_memo ! {save, Xcur },
loop_x2(undefined, undefined, undefined, Xcur);
{get, Pid} -> Pid ! {reply, X}, loop_x2(A, B, Sqrt, X);
stop -> true
end.
% функции для внешего доступа данным memo
get_x1() ->
{x1_memo, a@localhost } ! {get, self()},
receive
{reply, Answer} -> Answer
end.
get_x2() ->
{x2_memo, a@localhost } ! {get, self()},
receive
{reply, Answer} -> Answer
end.