~sjdv1982/hivesystem/trunk

« back to all changes in this revision

Viewing changes to hiveguilib/worker/WorkerManager.py

  • Committer: Sjoerd de Vries
  • Date: 2014-06-09 10:19:38 UTC
  • mfrom: (182.1.43 hive-view)
  • Revision ID: sjdv1982@gmail.com-20140609101938-7ji5g0buo09r0se6
merged with hive-view branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
"""
7
7
import os, functools
8
8
from . import WorkerFinder
9
 
from ..params import parse_paramtypelist
 
9
from ..params import parse_paramtypelist, get_param_pullantennas
10
10
 
11
11
class WorkerManager(object):
12
12
  _workerfinderclass = WorkerFinder
13
13
  def __init__(self, 
14
 
   workerbuilder, workerinstancemanager, pmanager, 
 
14
   workerbuilder, workerinstancemanager, pmanager,
15
15
   pworkercreator, pdronecreator = None,
16
16
   with_blocks = True
17
17
  ):
26
26
    self._workerfinder_local = None 
27
27
    self._worker_parameters = {}
28
28
    self._worker_metaparameters = {}
 
29
    self._antennafoldstate = None
29
30
    self._typelist_listeners = []
30
31
    self._used_typelist = set()
31
32
    self._with_blocks = with_blocks
32
 
 
 
33
  def set_antennafoldstate(self, antennafoldstate):
 
34
    self._antennafoldstate = antennafoldstate
 
35
    
33
36
  def _remove_workerfinder(self, wf):
34
37
    if wf is not None:
35
38
      workers = wf.workers
225
228
      args = parse_paramtypelist(wi.paramtypelist, arglist)
226
229
      for paramname, a in zip(wi.paramnames,args):
227
230
        if a is not None: pvalues[paramname] = a
228
 
    self._worker_parameters[workerid] = [workertype, wi.paramnames, wi.paramtypelist, pvalues]
 
231
    self._worker_parameters[workerid] = [workertype, wi.paramnames, wi.paramtypelist, pvalues, wi.guiparams]
 
232
    if self._antennafoldstate is not None: 
 
233
      gp = {}
 
234
      pullantennas = []
 
235
      if wi.guiparams is not None:
 
236
        gp = wi.guiparams.get("guiparams", {})
 
237
        antennas = wi.guiparams.get("antennas", {})
 
238
        pullantennas = get_param_pullantennas(antennas)
 
239
      self._antennafoldstate.create_worker(
 
240
       workerid, 
 
241
       pullantennas,
 
242
       gp,
 
243
      )
229
244
    self._wim.set_parameters(workerid, pvalues)
230
245
  
231
246
  def _select(self, workerids):
252
267
      
253
268
  def _pwindow_select_worker_params(self, workerid):
254
269
    params = self._worker_parameters[workerid]
 
270
    workertype = params[0]
 
271
    pullantennas = []
 
272
    wi = self._wim.get_workerinstance(workerid)
 
273
    if wi.guiparams is not None:
 
274
      pullantennas = get_param_pullantennas(wi.guiparams.get("antennas", {}))
 
275
      pullantennas = [p[0] for p in pullantennas]
 
276
    pureparams = [p for p in params[1] if p not in pullantennas]
255
277
    up = functools.partial(
256
 
      self._update_worker_parameters, workerid
257
 
    )
258
 
    self._pmanager.select_pwidget(workerid, "params",
259
 
     params[1], params[2], params[3], up
260
 
    )
 
278
      self._update_worker_parameters, workerid, pureparams
 
279
    )
 
280
    metaparams = None
 
281
    if workerid in self._worker_metaparameters:
 
282
      metaparams = self._worker_metaparameters[workerid][4]
 
283
    form_manipulators = self._workerbuilder.get_form_manipulators(workertype, metaparams)
 
284
    if self._antennafoldstate is not None:
 
285
      f = functools.partial(self._antennafoldstate.init_form, workerid)
 
286
      form_manipulators = form_manipulators + [f]
 
287
    widget, controller = self._pmanager.select_pwidget(workerid, "params",
 
288
     params[1], params[2], params[3], up, [], form_manipulators
 
289
    )
 
290
    if widget is not None and self._antennafoldstate is not None:
 
291
      self._antennafoldstate.init_widget(workerid, widget, controller)
261
292
 
262
293
  def _pwindow_select_worker_metaparams(self, workerid):
263
294
    params = self._worker_metaparameters[workerid]
268
299
    up = functools.partial(
269
300
      self._update_worker_metaparameters, workerid
270
301
    )
 
302
    form_manipulators = self._workerbuilder.get_form_manipulators(params[0], None)
271
303
    self._pmanager.select_pwidget(workerid, "metaparams",
272
 
     params[2], params[3], params[4], up, buttons
273
 
    )
 
304
     params[2], params[3], params[4], up, buttons, form_manipulators
 
305
    )    
274
306
  
275
307
  def get_new_empty_workerid(self):
276
308
    n = 0
355
387
      workerid = self.get_new_workerid(workertype)
356
388
            
357
389
    self.instantiate(workerid, workertype, x, y, metaparamvalues)
 
390
    if self._antennafoldstate is not None:
 
391
      self._antennafoldstate.sync(workerid, onload=False)
358
392
    self.select([workerid])
359
 
    
 
393
  
 
394
  def _meta_autocreate(self, workertype, workerid, x, y):
 
395
    t = self._workerbuilder.get_metaworker(workertype)
 
396
    metaguiparams = t[0].metaguiparams
 
397
    paramnames = t[1]
 
398
    if "autocreate" not in metaguiparams: return False
 
399
    autocreate = metaguiparams["autocreate"]
 
400
    if not isinstance(autocreate, dict):
 
401
      raise ValueError("%s.metaguiparams[\"autocreate\"] must be a dict with default values for all metaparameters, not '%s'" % (workertype, autocreate))
 
402
    for p in paramnames:
 
403
      if p not in autocreate:
 
404
        raise ValueError("%s.metaguiparams[\"autocreate\"] must be a dict with default values for all metaparameters; missing parameter '%s'" % (workertype, p))
 
405
    self.instantiate(workerid, workertype, x, y, autocreate)
 
406
    return True
 
407
 
360
408
  def create(self, 
361
409
   workerid, workertype, x, y, metaparamvalues = None, paramvalues = None
362
410
  ):
369
417
        
370
418
    if metaparamvalues is None and self._workerbuilder.has_metaworker(workertype):
371
419
      assert paramvalues is None
 
420
      autocreate = self._meta_autocreate(workertype, workerid, x, y)
 
421
      if autocreate: 
 
422
        if self._antennafoldstate is not None:
 
423
          self._antennafoldstate.sync(workerid, onload=False)      
 
424
        return workerid
372
425
      empty_workerid = self.get_new_empty_workerid()
373
426
      self.meta_empty_instantiate(empty_workerid, workertype, x, y)
374
427
      return empty_workerid
375
428
    else:
376
429
      self.instantiate(workerid, workertype, x, y, metaparamvalues, paramvalues)
 
430
      if self._antennafoldstate is not None:
 
431
        self._antennafoldstate.sync(workerid, onload=False)
377
432
      return workerid
378
433
 
379
434
  def create_drone(self,workerid, dronetype, x, y, paramvalues = None):
392
447
  def _remove(self, workerid):
393
448
    self._pmanager.delete_pwidget(workerid)
394
449
    self._worker_parameters.pop(workerid, None)
 
450
    if self._antennafoldstate is not None:
 
451
      self._antennafoldstate.remove_worker(workerid)
395
452
    m = self._worker_metaparameters.pop(workerid, None)
396
453
    if m is not None:
397
454
      worker = m[1]
420
477
      raise ValueError("workerid already exists: '%s'" % new_workerid)
421
478
    self._pmanager.rename_pwidget(old_workerid, new_workerid)
422
479
    self._wim.rename_workerinstance(old_workerid, new_workerid)
 
480
    if self._antennafoldstate is not None:
 
481
      self._antennafoldstate.rename_worker(old_workerid, new_workerid)
423
482
 
424
483
  def gui_renames_worker(self, old_workerid, new_workerid):
425
484
    """
428
487
    ok = self._rename_worker(old_workerid, new_workerid)
429
488
    if not ok: return False
430
489
    self._wim.rename_workerinstance(old_workerid, new_workerid)
 
490
    if self._antennafoldstate is not None:
 
491
      self._antennafoldstate.rename_worker(old_workerid, new_workerid)
431
492
    return True
432
493
    
433
 
  def _update_worker_parameters(self, workerid, parameters):
 
494
  def _update_worker_parameters(self, workerid, paramnames, parameters):
434
495
    #print("UP", workerid, parameters)
435
496
    params_old = self._worker_parameters[workerid][3]    
436
497
    if parameters is None: 
437
498
      if params_old is None: return 
438
499
      parameters = {}
439
500
    else:
440
 
      if params_old is None: params_old = {}
441
 
    new_parameters = {}
442
 
    for param,value in parameters.items():
443
 
      if param not in params_old or value != params_old[param]:
444
 
        new_parameters[param] = value
445
 
    self._wim.set_parameters(workerid, new_parameters)  
 
501
      paramcopy = {}
 
502
      for p in parameters: 
 
503
        if p in paramnames: paramcopy[p] = parameters[p]
 
504
      parameters = paramcopy  
 
505
    self._wim.set_parameters(workerid, parameters)  
446
506
    self._worker_parameters[workerid][3] = parameters  
447
507
  
448
508
  def _update_worker_metaparameters(self, workerid, parameters):
450
510
    if parameters is None: return #TODO: may not be the sane thing to do
451
511
    self._worker_metaparameters[workerid][4] = parameters  
452
512
  
 
513
  def _update_variable(self, varid, value):
 
514
    self._update_worker_parameters(varid, ["value"], {"value":value})
 
515
  
453
516
  def get_worker_descriptor(self, workerid):
454
517
    node, mapping = self._wim.get_node(workerid)    
455
518
    if node.empty: return None
456
 
    profile = self._wim.get_workerinstance(workerid).curr_profile
 
519
    inst = self._wim.get_workerinstance(workerid)
 
520
    profile = inst.curr_profile
 
521
    gp = inst.guiparams
457
522
    workertype, params, metaparams = self.get_parameters(workerid)
458
523
    x,y = node.position
459
 
    desc = (workerid,workertype,x,y,metaparams,params, profile)
 
524
    desc = (workerid,workertype,x,y,metaparams,params, profile, gp)
460
525
    return desc
461
526
  
462
527
  def workerids(self):
476
541
    if workerid in self._worker_parameters:
477
542
      p = self._worker_parameters[workerid]
478
543
      workertype = p[0]
479
 
      params = p[3]
 
544
      params = p[3]      
480
545
      if len(params) == 0: params = None      
481
546
    if workerid in self._worker_metaparameters:
482
547
      p = self._worker_metaparameters[workerid]
537
602
    
538
603
    self._workerfinder_local = None
539
604
 
 
605
  def sync_antennafoldstate(self):
 
606
    if self._antennafoldstate is None: return
 
607
    for workerid in self._wim.get_workerinstances():
 
608
      self._antennafoldstate.sync(workerid, onload=True)
 
 
b'\\ No newline at end of file'