1 | using HeuristicLab.Clients.Hive.WebJobManager.Services;
|
---|
2 | using HeuristicLab.Optimization;
|
---|
3 | using Microsoft.AspNet.SignalR;
|
---|
4 | using System;
|
---|
5 | using System.Collections.Generic;
|
---|
6 | using System.Linq;
|
---|
7 | using System.Threading.Tasks;
|
---|
8 | using HeuristicLab.Data;
|
---|
9 | using System.Reflection;
|
---|
10 |
|
---|
11 | namespace HeuristicLab.Clients.Hive.WebJobManager
|
---|
12 | {
|
---|
13 | /// <summary>
|
---|
14 | /// SignalR Hub for displaying the progress when uploading a Job.
|
---|
15 | /// Also used to change child distribution and priority for inner tasks.
|
---|
16 | /// </summary>
|
---|
17 | public class ProgressHub : Hub
|
---|
18 | {
|
---|
19 | private WebLoginService weblog;
|
---|
20 | private Guid userId;
|
---|
21 | private FileOpeningService fileopener;
|
---|
22 | private void loader()
|
---|
23 | {
|
---|
24 | weblog = WebLoginService.Instance;
|
---|
25 | string uid = Context.QueryString["userid"];
|
---|
26 | if (uid == null || uid == "" || Guid.Parse(uid) == Guid.Empty)
|
---|
27 | {
|
---|
28 | userId = Guid.Empty;
|
---|
29 | }
|
---|
30 | else
|
---|
31 | {
|
---|
32 | userId = Guid.Parse(uid);
|
---|
33 | fileopener = weblog.getFileOpener(userId);
|
---|
34 | }
|
---|
35 | }
|
---|
36 |
|
---|
37 | /// <summary>
|
---|
38 | /// First message from client
|
---|
39 | /// </summary>
|
---|
40 | /// <param name="receivedString">Client message</param>
|
---|
41 | public void HandleMessage(string receivedString)
|
---|
42 | {
|
---|
43 | loader();
|
---|
44 | Clients.Caller.processMessage("Connection Established");
|
---|
45 | fileopener.Job.Progress.StatusChanged += runHub;
|
---|
46 | }
|
---|
47 | /// <summary>
|
---|
48 | /// Changes name for the current job to be created
|
---|
49 | /// </summary>
|
---|
50 | /// <param name="name">Job name</param>
|
---|
51 | public void ChangeNameResource(string name, string resource)
|
---|
52 | {
|
---|
53 | loader();
|
---|
54 | if (name != null)
|
---|
55 | fileopener.Job.Job.Name = name;
|
---|
56 | if (resource != null && resource != "")
|
---|
57 | {
|
---|
58 | fileopener.Job.Job.ResourceNames += "/" + resource;
|
---|
59 | }
|
---|
60 | }
|
---|
61 | /// <summary>
|
---|
62 | /// Toggles distribute child task for a current task
|
---|
63 | /// </summary>
|
---|
64 | /// <param name="arr">2-dimensional int array.
|
---|
65 | /// First dimension is depth (arr.length == 4 means the item is 4 nodes deep)
|
---|
66 | /// Second contains expirement info or batch info. (arr[][0] contains index to select the right experiment sub task,
|
---|
67 | /// arr[][1] contains index to select right batch run subtask)</param>
|
---|
68 | public void ToggleChild(int[][] arr)
|
---|
69 | {
|
---|
70 | loader();
|
---|
71 | HiveTask current = fileopener.Job.HiveTasks.ToList()[0];
|
---|
72 | if (arr.Length == 0)
|
---|
73 | {//check if upper job
|
---|
74 | current.ItemTask.ComputeInParallel = !current.ItemTask.ComputeInParallel;
|
---|
75 |
|
---|
76 | }
|
---|
77 | else
|
---|
78 | {
|
---|
79 | for (var i = 0; i < arr.Length; i++)
|
---|
80 | {
|
---|
81 | //loop for depth
|
---|
82 |
|
---|
83 | if (i == arr.Length - 1)//end of depth loop, right current is selected
|
---|
84 | {
|
---|
85 | if (current.ItemTask.Item is BatchRun)
|
---|
86 | {
|
---|
87 | current.ChildHiveTasks[arr[i][1]].ItemTask.ComputeInParallel = !current.ChildHiveTasks[arr[i][1]].ItemTask.ComputeInParallel;
|
---|
88 | }
|
---|
89 | else if (current.ItemTask.Item is Experiment)
|
---|
90 | {
|
---|
91 | current.ChildHiveTasks[arr[i][0]].ItemTask.ComputeInParallel = !current.ChildHiveTasks[arr[i][0]].ItemTask.ComputeInParallel;
|
---|
92 | }
|
---|
93 |
|
---|
94 | }
|
---|
95 | else
|
---|
96 | {//not deep enough, select right path
|
---|
97 | if (current.ItemTask.Item is BatchRun)
|
---|
98 | current = current.ChildHiveTasks[arr[i][1]]; // select right batch
|
---|
99 | else if (current.ItemTask.Item is Experiment)
|
---|
100 | current = current.ChildHiveTasks[arr[i][0]]; // select right sub task from experiment
|
---|
101 | }
|
---|
102 | }
|
---|
103 | }
|
---|
104 | }
|
---|
105 | /// <summary>
|
---|
106 | /// Change priority for a node
|
---|
107 | /// </summary>
|
---|
108 | /// <param name="arr">2-dimensional int array.
|
---|
109 | /// First dimension is depth (arr.length == 4 means the item is 4 nodes deep)
|
---|
110 | /// Second contains expirement info or batch info. (arr[][0] contains index to select the right experiment sub task,
|
---|
111 | /// arr[][1] contains index to select right batch run subtask)</param>
|
---|
112 | /// <param name="prior">Selected priority</param>
|
---|
113 | public void ChangePriority(int[][] arr, int prior)
|
---|
114 | {
|
---|
115 | loader();
|
---|
116 | HiveTask current = fileopener.Job.HiveTasks.ToList()[0];
|
---|
117 | if (arr.Length == 0)
|
---|
118 | {//check if upper job
|
---|
119 | current.Task.Priority = prior;
|
---|
120 |
|
---|
121 | }
|
---|
122 | else
|
---|
123 | {
|
---|
124 | for (var i = 0; i < arr.Length; i++)
|
---|
125 | {//loop for depth
|
---|
126 |
|
---|
127 |
|
---|
128 | if (i == arr.Length - 1)
|
---|
129 | {//Right depth reached, change priority for current
|
---|
130 | if (current.ItemTask.Item is BatchRun)
|
---|
131 | {
|
---|
132 | current.ChildHiveTasks[arr[i][1]].Task.Priority = prior;
|
---|
133 | }
|
---|
134 | else if (current.ItemTask.Item is Experiment)
|
---|
135 | {
|
---|
136 | current.ChildHiveTasks[arr[i][0]].Task.Priority = prior;
|
---|
137 | }
|
---|
138 |
|
---|
139 | }
|
---|
140 | else
|
---|
141 | {//not deep enough, choose right path
|
---|
142 | if (current.ItemTask.Item is BatchRun)
|
---|
143 | current = current.ChildHiveTasks[arr[i][1]]; // select right batch
|
---|
144 | else if (current.ItemTask.Item is Experiment)
|
---|
145 | current = current.ChildHiveTasks[arr[i][0]]; // select right sub task from experiment
|
---|
146 | }
|
---|
147 | }
|
---|
148 | }
|
---|
149 | }
|
---|
150 | /// <summary>
|
---|
151 | /// Used by event 'ProgressChanged' from current uploading Job
|
---|
152 | /// </summary>
|
---|
153 | /// <param name="sender"></param>
|
---|
154 | /// <param name="e"></param>
|
---|
155 | public void runHub(object sender, EventArgs e)
|
---|
156 | {
|
---|
157 | loader();
|
---|
158 | int value = 0;
|
---|
159 |
|
---|
160 | switch (fileopener.Job.Progress.Status)
|
---|
161 | {
|
---|
162 | case "Connecting to server...":
|
---|
163 | value = 0;
|
---|
164 | break;
|
---|
165 | case "Uploading Job...":
|
---|
166 | value = 10;
|
---|
167 | break;
|
---|
168 | case "Uploading plugins...":
|
---|
169 | value = 30;
|
---|
170 | break;
|
---|
171 | case "Uploading tasks...":
|
---|
172 | value = 50;
|
---|
173 | break;
|
---|
174 | case "Upload finished":
|
---|
175 | value = 100;
|
---|
176 | break;
|
---|
177 | default://Tasks are uploading individually
|
---|
178 | value = (int)(50 + (40 * fileopener.Job.Progress.ProgressValue));
|
---|
179 | break;
|
---|
180 |
|
---|
181 | }
|
---|
182 | //send info to client
|
---|
183 | Clients.Caller.processMessage(fileopener.Job.Progress.Status, value);
|
---|
184 |
|
---|
185 | }
|
---|
186 | public void paraEdit(int[][] arr, string problem, string name, string type, string value)
|
---|
187 | {
|
---|
188 |
|
---|
189 |
|
---|
190 | loader();
|
---|
191 | HiveTask current = fileopener.Job.HiveTasks.ToList()[0];
|
---|
192 | if (arr.Length == 0)
|
---|
193 | {//check if upper job
|
---|
194 | if (current.ItemTask.Item is Algorithm)
|
---|
195 | {
|
---|
196 | searchEditPara(current, problem, name, type, value);
|
---|
197 | }
|
---|
198 | }
|
---|
199 | else
|
---|
200 | {
|
---|
201 | for (var i = 0; i < arr.Length; i++)
|
---|
202 | {//loop for depth
|
---|
203 | if (i == arr.Length - 1)
|
---|
204 | {//Right depth reached, change priority for current
|
---|
205 | if (current.ItemTask.Item is BatchRun)
|
---|
206 | {
|
---|
207 | current = current.ChildHiveTasks[arr[i][1]];
|
---|
208 | }
|
---|
209 | else if (current.ItemTask.Item is Experiment)
|
---|
210 | {
|
---|
211 | current = current.ChildHiveTasks[arr[i][0]];
|
---|
212 | }
|
---|
213 | if (current.ItemTask.Item is Algorithm)
|
---|
214 | {
|
---|
215 | searchEditPara(current, problem, name, type, value);
|
---|
216 | }
|
---|
217 | }
|
---|
218 | else
|
---|
219 | {//not deep enough, choose right path
|
---|
220 | if (current.ItemTask.Item is BatchRun)
|
---|
221 | current = current.ChildHiveTasks[arr[i][1]]; // select right batch
|
---|
222 | else if (current.ItemTask.Item is Experiment)
|
---|
223 | current = current.ChildHiveTasks[arr[i][0]]; // select right sub task from experiment
|
---|
224 | }
|
---|
225 | }
|
---|
226 | }
|
---|
227 | }
|
---|
228 | /// <summary>
|
---|
229 | /// Generic parameter setter
|
---|
230 | /// </summary>
|
---|
231 | /// <param name="curr">Current task to edit </param>
|
---|
232 | /// <param name="problem">Problem parameter or normal parameter</param>
|
---|
233 | /// <param name="name">Property name</param>
|
---|
234 | /// <param name="type">Datatype</param>
|
---|
235 | /// <param name="value">New value</param>
|
---|
236 | private void searchEditPara(HiveTask curr, string problem, string name, string type, string value)
|
---|
237 | {
|
---|
238 | var prob = problem == "True" ? true : false;
|
---|
239 |
|
---|
240 | var dattype = Type.GetType(type);
|
---|
241 | if (dattype == null)
|
---|
242 | {//Use assemblies to find correct datatype
|
---|
243 | foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
|
---|
244 | {
|
---|
245 | dattype = a.GetType(type);
|
---|
246 | if (dattype != null)
|
---|
247 | break;
|
---|
248 | }
|
---|
249 | }
|
---|
250 | //find parse method
|
---|
251 | var parse = dattype.GetMethod("Parse", new[] { typeof(string) });
|
---|
252 |
|
---|
253 | if (parse != null)
|
---|
254 | {
|
---|
255 | //Parses string to correct datatype
|
---|
256 | var val = parse.Invoke(null, new object[] { value });
|
---|
257 |
|
---|
258 | //BUGGERS
|
---|
259 | if (name == "ReevaluateElites")
|
---|
260 | name = "ReevaluteElites";
|
---|
261 | if (name == "DominateOnEqualQualities" || name == "PlusSelection" || name == "ReevaluteElites")
|
---|
262 | val = ((BoolValue)val).Value;
|
---|
263 |
|
---|
264 | // if (name == "ReduceToPopulationSize")
|
---|
265 | //name += "Parameter";
|
---|
266 |
|
---|
267 | try
|
---|
268 | {
|
---|
269 | Algorithm alg = (Algorithm)curr.ItemTask.Item;
|
---|
270 | if (prob)
|
---|
271 | alg.Problem.GetType().GetProperty(name).SetValue(alg, val);
|
---|
272 | else
|
---|
273 | alg.GetType().GetProperty(name).SetValue(alg, val);
|
---|
274 | }
|
---|
275 | catch (NullReferenceException e)
|
---|
276 | {
|
---|
277 | Console.WriteLine("NullRefException: " + name + " - " + type);
|
---|
278 | }
|
---|
279 | catch(TargetException e)
|
---|
280 | {
|
---|
281 | Console.WriteLine("TargetException: " + name + " - " + type);
|
---|
282 | }
|
---|
283 | }
|
---|
284 |
|
---|
285 | }
|
---|
286 |
|
---|
287 | }
|
---|
288 | }
|
---|