-module(markov). -include_lib("stdlib/include/qlc.hrl"). -include("markov.hrl"). -export([init/0]). init() -> receive {markov, X, P} -> P ! markov_respond(X) end, init(). markov_respond_x(X, P) -> P ! markov_respond(X), io:write(standard_io, "Generating response..."). markov_respond(M) -> markov_feed(M), markov_generate_response(M). markov_feed_r([], _, _) -> []; markov_feed_r([H|T], N, M) -> X=mnesia:transaction(fun() -> X = qlc:q([P#states.state_id || P <- states, P#states.state == H, P#states.type == 0]), qlc:e(X) end), Y=mnesia:transaction(fun() -> Y = qlc:q([P#states.state_id || P <- states, P#states.state == hd(T), P#states.type==0]), qlc:e(Y) end), Z= mnesia:transaction(fun() -> Z = qlc:q([P || P <- links, P#links.state_id1 == X, P#links.state_id2 == Y, P#links.distance == 1]), qlc:e(Z) end), mnesia:write(Z#links{weight = Z#links.weight + 1}), Q = mnesia:transaction(fun() -> Q = qlc:q([P#states.state_id || P <- states, P#states.state == hd(M), P#states.type==0]), qlc:e(Q) end), R = mnesia:transaction(fun() -> R = qlc:q([P#links.weight || P <- links, P#links.state_id1 == Q, P#links.state_id2 == X, P#links.distance == N]), qlc:e(R) end), mnesia:write(links, {state_id1 = Q, state_id2 = X, distance = N, weight = R + 1}), markov_feed_r(T, N+1, lists:append(M, H)), markov_feed_r(tl(M), 1, []). markov_feed(M) -> markov_feed_r(M, 1, []). sum([]) -> 0; sum(F) -> hd(F) + sum(tl(F)). weighting({N, W, S}, N) -> {W, S}. markov_generate_chain_r([], _) -> {0, ''}; markov_generate_chain_r(X, N) -> lists:append(hd(lists:sort(lists:append(weighting(hd(X), N), markov_generate_chain_r(tl(X), N)))), lists:sort(markov_generate_chain_r(X, N + 1))). markov_generate_chain(Y) -> X = mnesia:transaction(fun() -> X = qlc:q([P#states.state_id || P <- states, P#states.state == Y, P#states.type==0]), qlc:e(X) end), D = lists:sort(mnesia:transaction(fun() -> V = qlc:q([{ P#links.distance, P#links.weight, P#links.state_id2 } || P <- links, P#links.state_id1 == X, P#links.distance < 3]), qlc:e(V) end)), hd(lists:sort(markov_generate_chain_r(D, 1))). markov_generate_response_r([]) -> []; markov_generate_response_r(M) -> X = mnesia:transaction(fun() -> X = qlc:q([P#states.state_id || P <- states, P#states.state == hd(M), P#states.type==0]), qlc:e(X) end), Y = sum(lists:append(mnesia:transaction(fun() -> V = qlc:q([P#links.weight || P <- links, P#links.state_id1 ==X]), qlc:q([P#links.weight || P <- links, P#links.state_id2 == X]), qlc:e(V) end) )), lists:append([{Y, hd(M)}], markov_generate_response_r(tl(M))). markov_generate_response(M) -> X = lists:sort(markov_generate_response_r(M)), Y = lists:nth(X, length(X) / 2), markov_generate_chain(Y).