private void DivideProblem(DivideProblemMessage msg, TaskSolver taskSolver) { var partialProblemsData = taskSolver.DivideProblem((int)msg.ComputationalNodes); var messagesList = new List <SolvePartialProblemsMessage>(); for (int i = partialProblemsData.Length - 1; i >= 0; i -= PartialProblemsPackageSize) { var packageSize = i + 1 < PartialProblemsPackageSize ? i + 1 : PartialProblemsPackageSize; var partialProblemsPackage = new byte[packageSize][]; for (int j = 0; j < packageSize; j++) { partialProblemsPackage[j] = partialProblemsData[i - j]; } var partialProblemsObjects = new List <PartialProblem>(); foreach (var partialData in partialProblemsPackage) { partialProblemsObjects.Add(new PartialProblem() { Data = partialData, TaskId = ++_maxTaskId }); } _problems[msg.Id].PartialProblems.AddRange(partialProblemsObjects); //TODO: NA PEWNO NIE MILIJON TAJMAŁTUW var partialProblemsMsg = new SolvePartialProblemsMessage(msg.ProblemType, msg.Id, new byte[0], 100000000, partialProblemsObjects); messagesList.Add(partialProblemsMsg); } foreach (var partialProblemsMessage in messagesList) { var serialized = partialProblemsMessage.Serialize(); SendMessage(serialized); } var thread = GetThreadByProblemInstanceId(msg.Id); thread.State = EState.Idle; }
private void SendPartialProblems(ulong id) { try { taskSolver = new DVRPTaskSolver(problem.Data); var dividedProblems = taskSolver.DivideProblem((int) problem.ComputationalNodes); var solvePartialProblemsPartialProblem = new SolvePartialProblemsPartialProblem[dividedProblems.Length]; for (int i = 0; i < dividedProblems.Length; i++) { solvePartialProblemsPartialProblem[i] = new SolvePartialProblemsPartialProblem {Data = dividedProblems[i], TaskId = ++taskId}; } var partialProblems = new SolvePartialProblems { CommonData = problem.Data, Id = id, ProblemType = "DVRP", PartialProblems = solvePartialProblemsPartialProblem, SolvingTimeout = 100000, SolvingTimeoutSpecified = true }; networkAdapter.Send(partialProblems, true); Console.WriteLine("SendSolvePartialProblems"); } catch (Exception e) { Console.WriteLine("Cannot send partial problems to server: " + e.Message); } }
private void DivideProblem(DivideProblem _problem) { bool isEnd = false; /* var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); * List<string> loadedP=new List<string>(); * foreach (var asembly in loadedAssemblies) * { * try * { * string s = asembly.Location; * loadedP.Add(s); * } * catch (Exception) { } * } * * * var loadedPaths = loadedP.ToArray(); * var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll"); * var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList(); * toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));*/ List <Assembly> list = AppDomain.CurrentDomain.GetAssemblies().ToList(); Type myType = null; foreach (var asem in list) { foreach (var type in asem.GetTypes()) { if (type.BaseType == typeof(TaskSolver)) { TaskSolver solv = (TaskSolver)Activator.CreateInstance(type, new byte[0]); if (solv.Name == _problem.ProblemType) { myType = type; isEnd = true; break; } } } if (isEnd) { break; } } taskSolver = (UCCTaskSolver.TaskSolver)Activator.CreateInstance(myType, _problem.Data); byte[][] partials = taskSolver.DivideProblem((int)_problem.ComputationalNodes); SendPartialProblem(_problem, partials); m_lockStatus.WaitOne(); m_lastChangeTime = DateTime.Now; m_status.Threads[0] = new StatusThread() { State = StatusThreadState.Idle, HowLong = 0, ProblemInstanceIdSpecified = false, ProblemType = "", TaskIdSpecified = false }; m_lockStatus.Release(); //List<List<List<List<int>>>> permutationForNodes = new List<List<List<List<int>>>>(); //for (int i = 0; i < (int)_problem.ComputationalNodes; i++) // permutationForNodes.Add(new List<List<List<int>>>()); //int ind = 0; //foreach (var set in allDevisions) // { // permutationForNodes[ind].Add(set); // ind = (ind + 1) % (int)_problem.ComputationalNodes; // } // SendPartialProblem(_problem, permutationForNodes); }