private static MirPartyCalcInfo[,] GiveInitialAdditionalMandatesByMirs(int mirsCount, int[,] votesTable2, int partiesCountTable2, List<PartyCalcInfo> partiesWithCalcInfo, List<MirCalcInfo> mirsWithCalcInfo)
{
Logger.logger.Info("\r\n== Разпределяне на мандати по райони== ");
//calculate per mir mandates
MirPartyCalcInfo[,] mirPartyTable = new MirPartyCalcInfo[mirsCount, partiesCountTable2];
for (int i = 0; i < mirsCount; i++)
{
for (int j = 0; j < partiesCountTable2; j++)
{
int votes = votesTable2[i, j];
decimal mandateCoefHare = mirsWithCalcInfo[i].MandateHareQuote != 0 ? decimal.Divide(votes, mirsWithCalcInfo[i].MandateHareQuote) : 0;
int mandatesInit = (int)mandateCoefHare;
decimal mandateCoefHareR = mandateCoefHare - mandatesInit;
var mirparty = new MirPartyCalcInfo()
{
MandateCoefHareR = mandateCoefHareR,
MandatesInit = mandatesInit,
IsMandateCoefHareRUsed = false,
};
mirsWithCalcInfo[i].MandatesGivenInit += mandatesInit;
partiesWithCalcInfo[j].MandatesGivenByMirsInit += mandatesInit;
mirPartyTable[i, j] = mirparty;//for indexed table access
}
//additional mandates
while (mirsWithCalcInfo[i].MandatesGivenAll < mirsWithCalcInfo[i].MandatesLimit)
{
int maxInd = 0;
decimal maxR = 0;
for (int j = 0; j < partiesCountTable2; j++)
{
if (!mirPartyTable[i, j].IsMandateCoefHareRUsed && maxR < mirPartyTable[i, j].MandateCoefHareR)
{
maxR = mirPartyTable[i, j].MandateCoefHareR;
maxInd = j;
}
}
mirPartyTable[i, maxInd].MandatesAdditional++;
mirPartyTable[i, maxInd].IsMandateCoefHareRUsed = true;
partiesWithCalcInfo[maxInd].MandatesGivenByMirsAdditional++;
mirsWithCalcInfo[i].MandatesGivenAdditional++;
}
}
Logger.logger.Info("Разпределени мандати по райони:");
for (int i = 0; i < mirsCount; i++)
{
StringBuilder sbLine = new StringBuilder();
int sum = 0;
for (int j = 0; j < partiesCountTable2; j++)
{
sbLine.AppendFormat("{0, 6}", mirPartyTable[i, j].MandatesInit);
sum += mirPartyTable[i, j].MandatesInit;
}
sbLine.AppendFormat("[{0,2}]", sum);
sbLine.AppendFormat(" от максимални [{0,2}]", mirsWithCalcInfo[i].MandatesLimit);
Logger.logger.Info(sbLine.ToString());
}
Logger.logger.Info("Остатъци по райони - R:");
Logger.logger.Info("* - получават допълнителен мандат");
for (int i = 0; i < mirsCount; i++)
{
StringBuilder sbLine = new StringBuilder();
for (int j = 0; j < partiesCountTable2; j++)
{
sbLine.AppendFormat("{0, 6}", (mirPartyTable[i, j].IsMandateCoefHareRUsed ? "*" : "") + mirPartyTable[i, j].MandateCoefHareR.ToString("0.00"));
}
Logger.logger.Info(sbLine.ToString());
}
Logger.logger.Info("Допълнителни мандати по райони:");
for (int i = 0; i < mirsCount; i++)
{
StringBuilder sbLine = new StringBuilder();
int sum = 0;
for (int j = 0; j < partiesCountTable2; j++)
{
sbLine.AppendFormat("{0, 6}", mirPartyTable[i, j].MandatesAdditional);
sum += mirPartyTable[i, j].MandatesAdditional;
}
sbLine.AppendFormat("[{0,2}]", sum);
sbLine.AppendFormat(" от максимални [{0,2}]", mirsWithCalcInfo[i].MandatesLimit); ;
Logger.logger.Info(sbLine.ToString());
}
Logger.logger.Info("Мандати по райони:");
for (int i = 0; i < mirsCount; i++)
{
StringBuilder sbLine = new StringBuilder();
int sum = 0;
for (int j = 0; j < partiesCountTable2; j++)
{
sbLine.AppendFormat("{0, 6}", mirPartyTable[i, j].MandatesGiven);
sum += mirPartyTable[i, j].MandatesGiven;
}
sbLine.AppendFormat("[{0,2}]", sum);
sbLine.AppendFormat(" от [{0,2}]", mirsWithCalcInfo[i].MandatesLimit);
Logger.logger.Info(sbLine.ToString());
}
return mirPartyTable;
}