public List<Result> CalculateMandates()
{
_results = new List<Result>();
Logger.Info("Инициализациране на данни");
int mirsCount;
int partiesCountTable1;
bool[] workingPartyFlagsTable1;
int[,] votesTable1;
int[] _mirVotesCountTable1;
int[] _partyVotesCountTable1;
decimal[] _mirMandateQuotesTable1;
InitWorkingData(out mirsCount, out partiesCountTable1, out workingPartyFlagsTable1, out votesTable1, out _mirVotesCountTable1, out _partyVotesCountTable1, out _mirMandateQuotesTable1);
//Стъпка 0 - разпределяне на мандати за независими кандидати
GiveMandatesToInitiaitiveCandidatesInMirs(mirsCount, partiesCountTable1, workingPartyFlagsTable1, votesTable1, _mirMandateQuotesTable1);
//Стъпка 1 - разпределяне на мандати за партии и коалиции
//Изключване на партии, които не преминават 4%-та бариера
ExcludePartiesThatDoNotPass4PercentBarrier(partiesCountTable1, workingPartyFlagsTable1, _mirVotesCountTable1, _partyVotesCountTable1);
//Инициализиране на данни за рапределяне на мандатите на национално ниво
int[,] votesTable2;
Party[] partiesTable2;
int partiesCountInTable2, partiesCountTable2, allMandatesAfterStep0, allVotesTable2;
PrepareWorkingDataForNationalMandateGiving(mirsCount, partiesCountTable1, workingPartyFlagsTable1, votesTable1, out partiesCountInTable2, out votesTable2, out partiesTable2, out partiesCountTable2, out allMandatesAfterStep0, out allVotesTable2);
//==Разпределяне на мандати на национално ниво
List<PartyCalcInfo> partiesWithCalcInfo;
List<MirCalcInfo> mirsWithCalcInfo;
int mandatesLeft;
//Начални мандати на национално ниво
GiveInitialMandatesOnNationalLevel(mirsCount, partiesCountTable1, votesTable2, partiesTable2, partiesCountInTable2, partiesCountTable2, allMandatesAfterStep0, allVotesTable2, out partiesWithCalcInfo, out mirsWithCalcInfo, out mandatesLeft);
//Допълнителни мандати на национално ниво
GiveAdditionalMandatesOnNationalLevel(partiesCountTable2, ref partiesWithCalcInfo, ref mandatesLeft);
//==Разпределяне на мандати по райони
//Разпределяне на мандати по МИР-ове
MirPartyCalcInfo[,] mirPartyTable = GiveInitialAdditionalMandatesByMirs(mirsCount, votesTable2, partiesCountTable2, partiesWithCalcInfo, mirsWithCalcInfo);
//Удовлетворяване на всички партии, съобразено с мандатите на национално ниво
SatisfyAllParties(partiesWithCalcInfo, mirPartyTable);
//Генериране на резултатите
GenerateResultsByPartyAndMir(partiesWithCalcInfo, mirsWithCalcInfo, mirPartyTable);
return _results;
}