public MatrixTable loadFromInputFile(string inputFile, bool sign, bool selfTies) { string filename = inputFile; Dictionary <int, Dictionary <string, List <int> > > networkSpec = new Dictionary <int, Dictionary <string, List <int> > >(); // Unsigned should have 5 cols, while signed 6 cols var reader = new StreamReader(filename); var headers = reader.ReadLine().Split(','); int num_items = headers.Length; int net_ID; int net_count = 0; int node_index; int[] nodes = null; int degree; int pos_degree; int neg_degree; int min_val; int max_val; int i = 0; if (sign == true && num_items == 6) { int tempNetID = -1; int tempNode = -1; while (!reader.EndOfStream) { var items = reader.ReadLine().Split(','); if (int.TryParse(items[0], out net_ID) && int.TryParse(items[1], out node_index) && int.TryParse(items[2], out pos_degree) && int.TryParse(items[3], out neg_degree) && int.TryParse(items[4], out min_val) && int.TryParse(items[5], out max_val)) { if ((net_ID > 0) && (node_index >= 0) && (((pos_degree > 0) && (max_val > 0)) || ((pos_degree == 0) && (max_val == 0))) && (((neg_degree > 0) && (min_val < 0)) || ((neg_degree == 0) && (min_val == 0)))) { // Identify a new network ID and add it to the list if ((net_ID != tempNetID) && (node_index == 1)) { net_count++; tempNetID = net_ID; tempNode = node_index; networkSpec.Add(net_ID, new Dictionary <string, List <int> >()); networkSpec[net_ID].Add("Pos. Degree", new List <int>() { pos_degree }); networkSpec[net_ID].Add("Neg. Degree", new List <int>() { neg_degree }); networkSpec[net_ID].Add("Min", new List <int>() { min_val }); networkSpec[net_ID].Add("Max", new List <int>() { max_val }); } else if ((net_ID == tempNetID) && (node_index == (tempNode + 1))) { networkSpec[tempNetID]["Pos. Degree"].Add(pos_degree); networkSpec[tempNetID]["Neg. Degree"].Add(neg_degree); networkSpec[tempNetID]["Min"].Add(min_val); networkSpec[tempNetID]["Max"].Add(max_val); tempNode = node_index; } else { throw new Exception("Inconsistent Network ID or Node Index!"); } } else { throw new Exception("Invalid input values!"); } } else { throw new Exception("Invalid input format!"); } } NumNetID = networkSpec.Count; nodes = new int[NumNetID]; int counter = 0; foreach (KeyValuePair <int, Dictionary <string, List <int> > > kvp in networkSpec) { int temp_node = 0; // int edges = 0; nodes[counter] = kvp.Value["Pos. Degree"].Count; temp_node = nodes[counter++]; // Constraints on degrees: Each node cannot have a degree larger than the total number of nodes // degree (pos_degree + neg_degree) [i] < Sum(degree [i]) if (selfTies) { for (i = 0; i < temp_node; i++) { if (Math.Ceiling((double)kvp.Value["Pos. Degree"][i] / (kvp.Value["Max"][i] == 0 ? 1 : kvp.Value["Max"][i])) + Math.Ceiling((double)kvp.Value["Neg. Degree"][i] / (kvp.Value["Min"][i] == 0 ? 1 : Math.Abs(kvp.Value["Min"][i]))) > temp_node) { throw new Exception("Degree of the node in Network is out of range!"); } //else //{ // edges += kvp.Value["Pos. Degree"][i] + kvp.Value["Neg. Degree"][i]; //} } } // For unselftied case, the total degree can only be as many as (nodes[i] - 1). else { for (i = 0; i < temp_node; i++) { if (Math.Ceiling((double)kvp.Value["Pos. Degree"][i] / (kvp.Value["Max"][i] == 0?1: kvp.Value["Max"][i])) + Math.Ceiling((double)kvp.Value["Neg. Degree"][i] / (kvp.Value["Min"][i] == 0 ? 1 : Math.Abs(kvp.Value["Min"][i]))) > (temp_node - 1)) { throw new Exception("Degree of the node in Network is out of range!"); } //else //{ // edges += kvp.Value["Pos. Degree"][i] + kvp.Value["Neg. Degree"][i]; //} } } //// Constraint the total number of edges according to the given type of networks //if (!(((selfTies == false) && (edges <= (temp_node * temp_node - temp_node))) ^ ((selfTies == true) && (edges <= temp_node * temp_node)))) //{ // throw new Exception("The number of edges is out of range!"); //} } } else if (sign == false && num_items == 5) { int tempNetID = -1; int tempNode = -1; while (!reader.EndOfStream) { var items = reader.ReadLine().Split(','); if (int.TryParse(items[0], out net_ID) && int.TryParse(items[1], out node_index) && int.TryParse(items[2], out degree) && int.TryParse(items[3], out min_val) && int.TryParse(items[4], out max_val)) { if ((net_ID > 0) && (node_index > 0) && (((degree > 0) && (max_val > 0)) || ((degree == 0) && (max_val == 0)))) { // Console.WriteLine("net_ID: " + net_ID.ToString() + " " + "node_index: " + node_index.ToString()); // Identify a new network ID and add it to the list if ((net_ID != tempNetID) && (node_index == 1)) { net_count++; tempNetID = net_ID; tempNode = node_index; networkSpec.Add(net_ID, new Dictionary <string, List <int> >()); networkSpec[net_ID].Add("Degree", new List <int>() { degree }); networkSpec[net_ID].Add("Min", new List <int>() { min_val }); networkSpec[net_ID].Add("Max", new List <int>() { max_val }); } else if ((net_ID == tempNetID) && (node_index == (tempNode + 1))) { networkSpec[tempNetID]["Degree"].Add(degree); networkSpec[tempNetID]["Min"].Add(min_val); networkSpec[tempNetID]["Max"].Add(max_val); tempNode = node_index; } else { throw new Exception("Inconsistent Network ID or Node Index!"); } } else { throw new Exception("Invalid input values!"); } } else { throw new Exception("Invalid input format!"); } } NumNetID = networkSpec.Count; nodes = new int[NumNetID]; int counter = 0; foreach (KeyValuePair <int, Dictionary <string, List <int> > > kvp in networkSpec) { int temp_node = 0; nodes[counter] = kvp.Value["Degree"].Count; temp_node = nodes[counter++]; // Constraints on degrees: Each node cannot have a degree larger than the total number of nodes // degree (pos_degree + neg_degree) [i] < Sum(degree [i]) if (selfTies) { for (i = 0; i < temp_node; i++) { if (kvp.Value["Degree"][i] > (kvp.Value["Max"][i] * temp_node)) { throw new Exception("Degree of the node in Network is out of range!"); } } } else { for (i = 0; i < temp_node; i++) { if (kvp.Value["Degree"][i] > (kvp.Value["Max"][i] * (temp_node - 1))) { throw new Exception("Degree of the node in Network is out of range!"); } } } } } else { throw new IOException("Incorrect input format!"); } reader.Close(); // Create a Matrix Table to store the input data MatrixTable networkSpec_data = new MatrixTable(); i = 0; foreach (KeyValuePair <int, Dictionary <string, List <int> > > kvp in networkSpec) { string s = kvp.Key.ToString(); int cols = kvp.Value.Count; networkSpec_data.AddMatrix(s, nodes[i++], cols); networkSpec_data[s].Name = s; networkSpec_data[s].NetworkId = int.Parse(s); Algorithms.Iota(networkSpec_data[s].RowLabels, 1); if (sign) { string[] colLabels = { "Pos. Degree", "Neg. Degree", "Min", "Max" }; networkSpec_data[s].ColLabels.SetLabels(colLabels); int j = 0; foreach (KeyValuePair <string, List <int> > sub_kvp in kvp.Value) { int k = 0; foreach (int x in sub_kvp.Value) { networkSpec_data[s][k++, j] = x; } j++; } } else { string[] colLabels = { "Degree", "Min", "Max" }; networkSpec_data[s].ColLabels.SetLabels(colLabels); int j = 0; foreach (KeyValuePair <string, List <int> > sub_kvp in kvp.Value) { int k = 0; foreach (int x in sub_kvp.Value) { networkSpec_data[s][k++, j] = x; //if (sub_kvp.Key.Equals("Degree")) //{ // Console.WriteLine("Degree: " + x.ToString()); //} } j++; } } // Console.WriteLine("Network ID: " + networkSpec_data[s].Name + " Row: " + networkSpec_data[s].RowLabels); } return(networkSpec_data); }