private void handleSolvePartialProblemsMessage(SolvePartialProblemsMessage message)
        {
            //number of PartialProblems shouldn't be bigger than the number of idle threads.
            int numberOfPartialProblems = message.PartialProblems.Count();
            int partialProblemCounter = 0;
            for (int i = 0; i < systemTracker.Node.ParallelThreads && partialProblemCounter < numberOfPartialProblems; i++)
            {
                if (systemTracker.Node.TaskThreads[i].StatusThread.State == StatusThreadState.Idle)
                {

                    DVRPSolver dvrpSolver = new DVRPSolver(message.PartialProblems[partialProblemCounter].Data);
                    systemTracker.Node.TaskThreads[i].StatusThread.State = StatusThreadState.Busy;

                    systemTracker.Node.TaskThreads[i].CurrentTask = new Cluster.Task((int)message.Id, message.ProblemType, 
                                    message.PartialProblems[i].Data) { Status = Cluster.TaskStatus.Solving };

                    systemTracker.Node.TaskThreads[i].TaskSolver = dvrpSolver;
                    systemTracker.Node.TaskThreads[i].Thread = new Thread(new ThreadStart(systemTracker.Node.TaskThreads[i].Start));
                    systemTracker.Node.TaskThreads[i].Thread.Start();

                    partialProblemCounter++;
                    SmartConsole.PrintLine("Thread number: " + i + " is solving partial problemŁ " + partialProblemCounter, SmartConsole.DebugLevel.Advanced);
                }
            }
            ///WE SHOULD CHECK HERE WHETHER THERE WAS IDLE THREAD AVALIABLE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            // start computations
        }
        public static SolvePartialProblemsMessage CreateSolvePartialProblemsMessage()
        {
            string problemType = "TSP";
            ulong id = 12;
            byte[] commonData = { 1, 23, 25, 2, 5, 5, 5, 5, 2, 26, 87 };
            ulong solvingTimeout = 1000;

            // fields for PartialProblem1
            ulong taskId1 = 123;
            byte[] data1 = { 24, 252, 6, 43, 57, 88 };
            ulong nodeId1 = 1;
            PartialProblem partialProblem1 = new PartialProblem(taskId1, data1, nodeId1);

            // fields for PartialProblem2
            ulong taskId2 = 321;
            byte[] data2 = { 24, 252, 6, 43, 57, 88 };
            ulong nodeId2 = 2;
            PartialProblem partialProblem2 = new PartialProblem(taskId2, data2, nodeId2);

            PartialProblem[] partialProblems = { partialProblem1, partialProblem2 };

            SolvePartialProblemsMessage expectedMessage = new SolvePartialProblemsMessage(problemType, id, commonData,
                                            solvingTimeout, partialProblems);
            return expectedMessage;
        }
        public override bool Equals(object obj)
        {
            SolvePartialProblemsMessage message = obj as SolvePartialProblemsMessage;


            return(Id == message.Id && ProblemType == message.ProblemType &&
                   SolvingTimeout == message.SolvingTimeout &&
                   Enumerable.SequenceEqual(CommonData, message.CommonData) &&
                   Enumerable.SequenceEqual(PartialProblems, message.PartialProblems));
        }
        public void Parse_XMLString_SolvePartialProblemsMessage()
        {
            /*********** Actual message ***********/
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"xml_samples\SolvePartialProblems.xml");

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            string xmlStr = xmlDoc.OuterXml;

            string name = Message.GetMessageName(xmlStr);
            SolvePartialProblemsMessage actualMessage = null;

            if (name == SolvePartialProblemsMessage.ELEMENT_NAME)
                actualMessage = SolvePartialProblemsMessage.Construct(xmlStr);

            /*********** Expected message ***********/
            string problemType = "TSP";
            ulong id = 12;
            byte[] commonData = { 1, 23, 25, 2, 5, 5, 5, 5, 2, 26, 87 };
            ulong solvingTimeout = 1000;

            // fields for PartialProblem1
            ulong taskId1 = 123;
            byte[] data1 = { 24, 252, 6, 43, 57, 88 };
            ulong nodeId1 = 1;
            PartialProblem partialProblem1 = new PartialProblem(taskId1, data1, nodeId1);

            // fields for PartialProblem2
            ulong taskId2 = 321;
            byte[] data2 = { 24, 252, 6, 43, 57, 88 };
            ulong nodeId2 = 2;
            PartialProblem partialProblem2 = new PartialProblem(taskId2, data2, nodeId2);

            PartialProblem[] partialProblems = { partialProblem1, partialProblem2 };

            SolvePartialProblemsMessage expectedMessage = new SolvePartialProblemsMessage(problemType, id, commonData,
                                            solvingTimeout, partialProblems);

            Assert.AreEqual(expectedMessage, actualMessage);
        }
        public void Parse_SolvePartialProblemMessage_XMLString()
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"xml_samples\SolvePartialProblems.xml");

            string problemType = "TSP";
            ulong id = 12;
            byte[] commonData = { 1, 23, 25, 2, 5, 5, 5, 5, 2, 26, 87 };
            ulong solvingTimeout = 1000;

            // fields for PartialProblem1
            ulong taskId1 = 123;
            byte[] data1 = { 24, 252, 6, 43, 57, 88 };
            ulong nodeId1= 1;
            PartialProblem partialProblem1 = new PartialProblem(taskId1, data1, nodeId1);

            // fields for PartialProblem2
            ulong taskId2 = 321;
            byte[] data2 = { 24, 252, 6, 43, 57, 88 };
            ulong nodeId2 = 2;
            PartialProblem partialProblem2 = new PartialProblem(taskId2, data2, nodeId2);

            PartialProblem[] partialProblems = { partialProblem1, partialProblem2 };

            SolvePartialProblemsMessage message = new SolvePartialProblemsMessage(problemType, id, commonData, 
                                            solvingTimeout, partialProblems);

            string actualXmlStr = message.ToXmlString();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            string expectedXmlStr = xmlDoc.OuterXml;

            Assert.AreEqual(expectedXmlStr, actualXmlStr);
        }
        /// <summary>
        /// function sending PartialProblems message
        /// </summary>
        /// <param name="numOfTask"></param>
        /// <param name="partialList"></param>
        /// <param name="messagePackage"></param>
        /// <returns></returns>
        private bool SendPartialProblemsMessage(int numOfTask, List<PartialProblem> partialList, MessagePackage messagePackage)
        {
            PartialProblem[] partialProblems = new PartialProblem[partialList.Count];
            for (int j = 0; j < partialList.Count; j++)
            {
                partialProblems[j] = partialList[j];
            }
            SolvePartialProblemsMessage solvePartialProblemsMessage = new SolvePartialProblemsMessage(taskTracker.Tasks[numOfTask].Type, (ulong)taskTracker.Tasks[numOfTask].ID, taskTracker.Tasks[numOfTask].CommonData, (ulong)4, partialProblems);
            server.Send(messagePackage.Socket, solvePartialProblemsMessage);

            SmartConsole.PrintLine("Solve Partial Problems Message has been send (to Computational node). Number of subTasks." + partialList.Count, SmartConsole.DebugLevel.Advanced);

            return true;
        }
        /*******************************************************************/
        /************************ PRIVATE METHODS **************************/
        /*******************************************************************/

        /*******************************************************************/
        /************************* PUBLIC METHODS **************************/
        /*******************************************************************/

        public void Start()
        {
            switch (currentTask.Status)
            {
                case TaskStatus.Dividing:

                    byte[][] dividedProblems =  taskSolver.DivideProblem(4);

                    PartialProblem[] partialProblems = new PartialProblem[dividedProblems.Count()];
                    for (int i = 0; i < dividedProblems.Count(); i++)
                    {
                        partialProblems[i] = new PartialProblem((ulong)currentTask.ID, dividedProblems[i], (ulong)NodeID);
                    }
                    SolvePartialProblemsMessage solvePartialProblemsMessage = new SolvePartialProblemsMessage(currentTask.Type, (ulong) currentTask.ID, currentTask.CommonData, (ulong)4, partialProblems);
                    Console.Write(">>Sending solve partial problems message. ");
                    messageProcessor.Communicate(solvePartialProblemsMessage);
                    this.statusThread.State = StatusThreadState.Idle;
                    this.currentTask = null;
                    
                        break;
                    
                case TaskStatus.Solving:

                    byte[] solvedPartialProblem = taskSolver.Solve(currentTask.BaseData, new TimeSpan(0, 0, 5));
                    Solution[] solutions = new Solution[1];
                    //TODO subTask id, timeout checking , computations time
                    solutions[0] = new Solution((ulong)currentTask.ID, false, SolutionsSolutionType.Partial, 4000, solvedPartialProblem);

                    SolutionsMessage solutionMessage = new SolutionsMessage(currentTask.Type, (ulong)currentTask.ID, currentTask.CommonData, solutions);
                    Console.WriteLine(">>Sending solution message. ");
                    messageProcessor.Communicate(solutionMessage);
                    statusThread.State = StatusThreadState.Idle;
                    this.currentTask = null;
                    break;

                case TaskStatus.Merging:
                    byte[][] partialSolutions = new byte[currentTask.subTasks.Count()][];
                    for(int i=0;i<currentTask.subTasks.Count();i++){
                        partialSolutions[i] = currentTask.subTasks[i].BaseData;
                    }
                    byte[] mergedSolution = taskSolver.MergeSolution(partialSolutions);

                    Solution[] solution = new Solution[1];
                    //TODO subTask id, timeout checking , computations time
                    solution[0] = new Solution((ulong)currentTask.ID, false, SolutionsSolutionType.Final, 4000, mergedSolution);
                    SolutionsMessage finalSolutionMessage = new SolutionsMessage(currentTask.Type, (ulong)currentTask.ID, currentTask.CommonData, solution);
                    messageProcessor.Communicate(finalSolutionMessage);
                    this.statusThread.State = StatusThreadState.Idle;
                    this.currentTask = null;
                    break;
                
            }
            // Implement in private methods:
            // Depending on what has to be computed
            // run a task solver method.

            // TODO collect result.
        }