/// <summary> /// Simulates stage one of the SIMPLIFIED realist network formation simulation. /// </summary> /// <param name="C">Capability matrix</param> /// <param name="R">Policy relevance matrix (SRG)</param> /// <param name="M">MID matrix</param> /// <returns>Expected alliance matrix</returns> private static Matrix SimulateSimplifiedRealistStageOne(Matrix C, Matrix R, Matrix M, string outputFile, double br) { int n = C.Rows; Matrix SRC = R * C; Vector SRGC = new Vector(n); for (int i = 0; i < n; ++i) SRGC[i] = SRC.GetRowSum(i) * br; Vector AOC = new Vector(n); for (int i = 0; i < n; ++i) { if (SRGC[i] <= C[i, i]) AOC[i] = 0; else AOC[i] = 1 - C[i, i] / SRGC[i]; } Matrix F = Matrix.Ones(n, n); F.ZeroDiagonal(); Matrix PAN = F - R; Matrix PAC = PAN * C; Matrix EE = M * M; EE.ZeroDiagonal(); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (EE[i, j] != 0) EE[i, j] = 1; Matrix EEC = EE * C; Vector EEM = new Vector(n); for (int i = 0; i < n; ++i) EEM[i] = Algorithms.MaxValue<double>(EEC.GetRowEnumerator(i)); Matrix EA = new Matrix(n, n); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (EEC[i, j] == EEM[i] && PAN[i, j] == 1 && AOC[i] != 0) EA[i, j] = EEC[i, j]; else EA[i, j] = 0; Vector SEA = new Vector(n); Matrix previousEA = new Matrix(n); do { EA.CloneTo(previousEA); for (int i = 0; i < n; ++i) SEA[i] = EA.GetRowSum(i) + C[i, i]; for (int i = 0; i < n; ++i) { if (SRGC[i] <= SEA[i]) AOC[i] = 0; else AOC[i] = 1 - SEA[i] / SRGC[i]; } for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (EEC[i, j] == EEM[i]) EEC[i, j] = 0; for (int i = 0; i < n; ++i) EEM[i] = Algorithms.MaxValue<double>(EEC.GetRowEnumerator(i)); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { //if (AOC[i] != 0 && EEC[i, j] == EEM[i] && EA[i, j] == 0) // EA[i, j] = EEC[i, j]; if (AOC[i] == 0 || EA[i, j] != 0); else if (PAN[i, j] > 0 && EEC[i, j] == EEM[i]) EA[i, j] = EEC[i, j]; else EA[i, j] = 0; } } while ((!previousEA.IsSameAs(EA)) && !EEC.IsAllZero && !AOC.IsZeroVector); if (!AOC.IsZeroVector) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (PAC[i, j] > 0 && EEC[i, j] != 0) PAC[i, j] = 0; Vector PAM = new Vector(n); for (int i = 0; i < n; ++i) PAM[i] = Algorithms.MaxValue<double>(PAC.GetRowEnumerator(i)); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (AOC[i] != 0 && PAC[i, j] == PAM[i] && EA[i, j] == 0) EA[i, j] = PAC[i, j]; EA.CopyLabelsFrom(C); do { EA.CloneTo(previousEA); for (int i = 0; i < n; ++i) SEA[i] = EA.GetRowSum(i) + C[i, i]; for (int i = 0; i < n; ++i) { if (SRGC[i] <= SEA[i]) AOC[i] = 0; else AOC[i] = 1 - SEA[i] / SRGC[i]; } for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (PAC[i, j] == PAM[i]) PAC[i, j] = 0; for (int i = 0; i < n; ++i) PAM[i] = Algorithms.MaxValue<double>(PAC.GetRowEnumerator(i)); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (AOC[i] != 0 && PAC[i, j] == PAM[i] && EA[i, j] == 0) EA[i, j] = PAC[i, j]; EA.CopyLabelsFrom(C); } while ((!previousEA.IsSameAs(EA)) && !PAC.IsAllZero && !AOC.IsZeroVector); }//if AOC is not all zero Matrix EAT = EA.GetTranspose(); Matrix EAF = new Matrix(n); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) EAF[i, j] = EA[i, j] * EAT[i, j]; Matrix BEA = new Matrix(n); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { if (EAF[i, j] != 0) BEA[i, j] = 1; else BEA[i, j] = 0; } return BEA; }
public Matrix calcDyadicTransitivity(Matrix s) { // initialize the dt matrix with s Matrix dt = new Matrix(s.Rows, s.Cols); dt.CopyLabelsFrom(s); dt.NetworkId = s.NetworkId; for (int i = 0; i < s.Rows; i++) { for (int j = 0; j < s.Cols; j++) { if (i == j) { dt[i, j] = 0; continue; } if (s[i, j] == 0) dt[i, j] = -9; else { int totalTriangles = 0; int triangleCount = 0; int secondNode = j; for (int k = 0; k < triangleList[secondNode].Count; k++) { int lastNode = triangleList[secondNode][k]; // check if last node is same as first if (lastNode != i) { if (triangleList[i].Contains(lastNode)) { triangleCount++; // number of actual triangles that contribute to t_i_jk } totalTriangles++; } } dt[i, j] = (double)triangleCount / (double)totalTriangles; } } } return dt; }