-module(dfs_init_matrix). -export([dfs_init_matrix/1]). dfs_init_matrix(Matrix)-> My_Elem = get_elem(a,Matrix), {Name, Node_Fault, PID, Neighbours, Current, _} = My_Elem, New_My_Elem = {Name, Node_Fault, PID, Neighbours, Current, [root]}, Rest_Matrix = lists:delete(My_Elem, Matrix), Stable_Matrix = [New_My_Elem], Path = [root], Iterative_List = [root], My_Children = get_children(Iterative_List, Matrix, a), [Next_Child|Other_Children] = My_Children, Receive = do_init(Next_Child, Path, Stable_Matrix, Rest_Matrix, Matrix, Iterative_List, Other_Children), Receive. do_init(My_Name, Path, Stable_Matrix, Rest_Matrix, Matrix, It_List, My_Brothers) -> My_Elem = get_elem(My_Name, Matrix), {Name, NFP, PID, Nei, Cur, _} = My_Elem, New_Path = lists:append(Path,[My_Name]), Stable_My_Elem = {Name, NFP, PID, Nei, Cur, New_Path}, New_Stable_Matrix = lists:append(Stable_Matrix, [Stable_My_Elem]), New_Rest_Matrix = lists:delete(My_Elem, Rest_Matrix), New_It_List = lists:append(It_List,[My_Name]), My_Children = get_children(New_It_List, Matrix, My_Name), if length(New_Rest_Matrix) > 0 -> if length(My_Children) > 0 -> [Next_Child|Other_Children] = My_Children, {New_New_Stable_Matrix, New_New_Rest_Matrix, New_New_It_List} = do_init(Next_Child, New_Path, New_Stable_Matrix, New_Rest_Matrix, Matrix, New_It_List, Other_Children); true -> New_New_Stable_Matrix = New_Stable_Matrix, New_New_Rest_Matrix = New_Rest_Matrix, New_New_It_List = New_It_List end, if length(My_Brothers) > 0 -> [Next_Brother|Other_Brothers] = My_Brothers, {New_New_New_Stable_Matrix, New_New_New_Rest_Matrix, New_New_New_It_List} = do_init(Next_Brother, Path, New_New_Stable_Matrix, New_New_Rest_Matrix, Matrix, New_New_It_List, Other_Brothers); true -> New_New_New_Stable_Matrix = New_New_Stable_Matrix, New_New_New_Rest_Matrix = New_New_Rest_Matrix, New_New_New_It_List = New_New_It_List end, {New_New_New_Stable_Matrix,New_New_New_Rest_Matrix,New_New_New_It_List}; true -> New_New_Stable_Matrix = lists:keysort(1,New_Stable_Matrix), Return_Value = {New_It_List, New_New_Stable_Matrix}, io:format("READ THIS!!!~p~n",[Return_Value]), Return_Value end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_children(Iterative_List, Matrix, Name)-> Elem = get_elem(Name,Matrix), {_, _, _, Neighbours, _, _} = Elem, Raw_Neighbours = raw_neighbours(Neighbours,[]), rip_neighbours(Raw_Neighbours,Iterative_List). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_elem(Elem, Client_List)-> [First|Rest] = Client_List, {Name, _,_,_,_,_} = First, if Name == Elem -> First; true -> get_elem(Elem, Rest) end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% raw_neighbours([],Neighbours)-> Neighbours; raw_neighbours(Full_List,Neighbours)-> [First|Rest] = Full_List, {Name,_} = First, New_Neighbours = lists:append(Neighbours,[Name]), raw_neighbours(Rest,New_Neighbours). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rip_neighbours(Raw_Neighbours,[])-> Raw_Neighbours; rip_neighbours(Raw_Neighbours,Iterative_List)-> [First|Rest] = Iterative_List, Bool = lists:member(First, Raw_Neighbours), if First == root -> New_Raw_Neighbours = Raw_Neighbours; true -> if Bool -> New_Raw_Neighbours = lists:delete(First, Raw_Neighbours); true -> New_Raw_Neighbours = Raw_Neighbours end end, rip_neighbours(New_Raw_Neighbours,Rest). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%