| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680 |
- # -*- coding: utf-8 -*-
- import logging
- import time
- from datetime import datetime
- from collections import defaultdict
- import string
- from utils.xml import StringToTree, TreeToFile, subelement, FileToTree
- from utils import pos2rgb
- import cPickle as pickle
- import scipy
- import simulate
- import evaluate
- import plotter
- log = logging.getLogger('lws')
- BASE = '''
- <html>
- <head>
- %(js)s
- <style type="text/css">
- a {color: #0000e0;}
- </style>
-
- <style type="text/css">
- %(css)s
- </style>
- </head>
- <body style="font-family: arial;">
- %(body)s
- </body>
- </html>
- '''
- def render(js=None, **kwargs):
- # prepare js definitions - optionally add a file given by @param js
- s = '<script type="text/javascript" src="/static/%s"> </script>'
- jsfiles = ['jquery-1.7.1.min.js', 'main.js', 'loco.js']
- if isinstance(js, basestring):
- jsfiles.append(js)
- elif isinstance(js, (list, tuple)):
- jsfiles.extend(js)
-
- jsdefs = [s % f for f in jsfiles]
-
- data = defaultdict(str)
- data.update(kwargs)
- data['js'] = '\n '.join(jsdefs)
- return BASE % data
-
- def renderView(lws, station):
- trs = []
- for mac, cfg in sorted(lws.mac2cfg.items(), key=lambda e: e[1].name):
- ap_css_id = cfg['mac'].replace(':', '_')
- tr = '''<tr id="%s" class="aprow" style="display:none"> <td>%s</td> <td class="mean"> <td class="sigma"> <td class="history"></td></tr>''' % (ap_css_id, cfg.name)
- trs.append(tr)
-
- s = ''
- for i in range(-100, -10):
- rgb = pos2rgb(120+i, 100, spread=0.35, saturation=0.45)
- s += '<span id="rgb_%s">%s</span>' % (i, rgb)
- rgbvals = '<div id="rgbvals">%s</div>' % s
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%s</span>
- <div id="stationinfo">
- <span id="name">%s</span>
- </div>
- %s
- </div>
- <table id="aps" style="border: 1px solid #ccc; float:left; font-size: 14">
- <thead>
- <tr class="header" style="font-weight:bold;background-color:#eee;">
- <td>AP</td>
- <td align="center">Mean</td>
- <td align="center">Sigma^2</td>
- <td align="center"><span id="clear_hist" style="color:blue;cursor:pointer;float:right">clear!</span><span>History</span></td>
- </tr
- </thead>
- %s
- </table>
- ''' % ('view2', station.name, rgbvals, '\n'.join(trs))
-
- return render(body=body)
- def getLastMeasurementRuns(lws, station, count):
- runs = []
- #~ print station, len(lws.stored_measurements[station])
- for locid in lws.stored_measurements[station]:
- ll = lws.stored_measurements[station][locid]
- # list of tuples (datetime, run dict)
- runs.extend([(e[0], e[1], locid) for e in ll])
-
- return [(e[1], e[2]) for e in list(sorted(runs))[-count:]]
-
- def renderMeasure(lws, station):
- trs = []
- locid_tds = ''
- if station is not None:
- lastruns = getLastMeasurementRuns(lws, station.name, 5)
-
- for ssid, mac, values in sorted((ssid, mac, values) for (mac, ssid), values in station.data.items()):
- rssi = values[-1].rssi
- delta = values[-1].delta
-
- try:
- apid = lws.mac2cfg[mac].name
- except Exception:
- apid = '?'
- continue
-
- avg_rssis_tds = ''
- for rssis, locid in lastruns:
- if mac in rssis:
- avg_rssi = '%.1f' % (sum(rssis[mac]) / float(len(rssis[mac])))
- else:
- avg_rssi = ''
- avg_rssis_tds += '<td>%s</td>' % avg_rssi
-
- tr = '''
- <tr class="aprow" id="%s">
- <td align="left">%s</td>
- <td align="left">%s/%s</td>
- <td align="left" class="rssi">%s</td>
- <td align="left" class="delta">%s</td>
- %s
- </tr>
- ''' % (mac.replace(':', '_'), apid, ssid[:6], mac[-6:], rssi, delta, avg_rssis_tds)
- trs.append(tr)
-
-
- for _, locid in lastruns:
- locid_tds += '<td>loc%s</td>' % locid
-
-
- activity_table = '''
- <table id="aplist" style="border: 1px solid #ccc; float:left; font-size: 14">
- <thead>
- <tr>
- <td>ID</td>
- <td>AccessPoint</td>
- <td>RSSI</td>
- <td>Delta</td>
- %s
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>''' % (locid_tds, '\n'.join(trs))
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%s</span>
- <div id="stationinfo">
- <span id="name">%s</span>
- </div>
- </div>
-
- <form id="locationinfo" style="float:left">
- <table>
- <tr>
- <td>locid</td>
- <td>
- <input type="text" id="locid" value="0"/>
- </td>
- </tr>
- <tr>
- <td>duration</td>
- <td>
- <input type="text" id="duration" value="30"/>
- </td>
- </tr>
- <tr>
- <td>startts</td>
- <td id="startts">n/a</td>
- </tr>
- <tr>
- <td>endts</td>
- <td id="endts">n/a</td>
- </tr>
- <tr>
- <td colspan="2">
- <input style="width:100%%" type="submit" name="startmeasure" value="start"/>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <span id="activity"/>
- </td>
- </tr>
- </table>
- </form>
- %s
- <div id="cutplots">
- <img class="cutplot" src="/plot2DMap/eg" style="margin-top:10px" width="100%%"/>
- <img class="cutplot" src="/plot2DMap/og1" style="margin-top:10px" width="100%%"/>
- <img class="cutplot" src="/plot2DMap/og2" style="margin-top:10px" width="100%%"/>
- </div>
- ''' % ('measure', station.name if station is not None else 'UNKNOWN', activity_table)
-
- return render(body=body)
-
- def renderIndex(lws):
-
- body = '<h3>%s known mobile stations:</h3>' % len(lws.config['knownStations'])
- body += '<a href="/measurements">all measurements</a>'
- for station in lws.config['knownStations']:
-
- body += '''
- <h4>%(station)s: </h4>
- <a href="/view/%(station)s">view</a>
- <a href="/measure/%(station)s">measure</a>
- <a href="/collect/%(station)s">collect path</a>
- <a href="/evaluate/%(station)s">evaluate</a>
- <a href="/buildOptimizefile/%(station)s">build optfile</a>
- <a href="/localize/%(station)s">localize</a>
- ''' % {'station': station}
-
- body += '''</br>'''
- return render(body=body)
- def renderLocate(lws, station):
- LAST_N = 3
-
- avg_rssis = {}
- trs = []
- for (mac, ssid), values in station.data.items():
- if not mac in lws.mac2cfg:
- continue
- apid = lws.mac2cfg[mac].name
- apinfos = values[-LAST_N:]
- avg_rssi = sum(e.rssi for e in apinfos) / float(len(apinfos))
-
- tr = '''
- <tr class="aprow" id="%s">
- <td align="left" class="apid">%s</td>
- <td align="left">%s/%s</td>
- <td align="left" class="rssi">%.1f</td>
- </tr>
- ''' % (mac.replace(':', '_'), apid, ssid[:6], mac, avg_rssi)
- trs.append(tr)
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%s</span>
- <div id="stationinfo">
- <span id="name">%s</span>
- </div>
- </div>
-
- <table id="aplist" style="border: 1px solid #ccc; float:left; font-size: 14">
- <thead>
- <tr>
- <td>ID</td>
- <td>AccessPoint</td>
- <td>RSSI</td>
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
- <img src="/static/localize.png"/>
-
- ''' % ('locate', station.name, '\n'.join(trs))
-
- return render(body=body)
- def renderCluster(lws):
- worker_trs = []
- for wname, worker in sorted(lws.simulator.workers.items()):
- total = sum(worker.durations)
- avg = total / len(worker.durations) if total > 0 else 0
- num_per_hour = worker.jobcount / (total / 3600) if total > 0 else 0
-
- color = 'green' if worker.active else 'red'
-
- available_hours = (time.time() - worker.firstseen) / 3600
- active_hours = worker.jobcount * avg / 3600
-
- tr = '''
- <tr>
- <td style="background-color:%s"> </td>
- <td>%s</td>
- <td align="center">%s</td>
- <td align="center">%s</td>
- <td align="center">%.1f</td>
- <td align="center">%.0f</td>
- <td align="center">%.2f</td>
- <td align="center">%.2f</td>
- <td align="center">%.1f</td>
- </tr>
- ''' % (color, wname, worker.jobcount, worker.failurecount, avg, num_per_hour, active_hours,
- available_hours, active_hours / available_hours * 100)
- worker_trs.append(tr)
-
- knownruns = simulate.Run.known
- waiting, running, finished = lws.simulator.queryRuns(set(knownruns.keys()))
- waiting_trs = []
- for runid in waiting:
- run = knownruns[runid]
- tr = '''
- <tr>
- <td>%s</td>
- <td align="center">%.1f</td>
- </tr>
- ''' % (run.id, time.time() - run.qts)
- waiting_trs.append(tr)
-
- running_trs = []
- for runid in running:
- run = knownruns[runid]
- tr = '''
- <tr>
- <td>%s</td>
- <td>%s</td>
- <td><a href="/brokenJob?worker=%s&runid=%s">requeue</a></td>
- <td align="center">%.1f</td>
- <td align="center">%.1f</td>
- </tr>
- ''' % (run.id, run.worker, run.worker, run.id, run.rts - run.qts, time.time()-run.rts)
- running_trs.append(tr)
-
- finished_trs = []
- # sort by finished ts
- finished = list(sorted(finished, key=lambda x: knownruns[x].fts))
- for runid in finished[-40:]:
- run = knownruns[runid]
- tr = '''
- <tr>
- <td>%s</td>
- <td>%s</td>
- <td align="center">%.1f</td>
- <td align="center">%.1f</td>
- </tr>
- ''' % (run.id, run.worker, run.rts - run.qts, run.fts - run.rts)
- finished_trs.append(tr)
-
-
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%s</span>
- </div>
- <table id="workerlist" style="border: 1px solid #ccc; font-size: 14; float:left;">
- <thead>
- <tr style="background-color:#ddd;">
- <td style="background-color:#ccc;" colspan="15" align="center">
- <span>Worker Nodes (%s) </span>
- <a href="/simulatorStatsPlot">Plot Stats</a>
- </td>
- </tr>
- <tr style="background-color:#ddd;">
- <td/>
- <td>Worker</td>
- <td>Count</td>
- <td>Fail</td>
- <td>s/Jobs</td>
- <td>Jobs/h</td>
- <td>Active</td>
- <td>Available</td>
- <td>Ratio</td>
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
-
- <table id="joblist" style="border: 1px solid #ccc; font-size: 14; float:left;">
- <thead>
- <tr>
- <td style="background-color:#ccc;" colspan="5" align="center">Waiting Jobs (%s)</td>
- </tr>
- <tr style="background-color:#ddd;">
- <td>Run-ID</td>
- <td style="padding-left:10px">Queuetime</td>
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
-
- <table id="joblist" style="border: 1px solid #ccc; font-size: 14; float:left;">
- <thead>
- <tr>
- <td style="background-color:#ccc;" colspan="5" align="center">Running Jobs (%s)</td>
- </tr>
- <tr style="background-color:#ddd;">
- <td>Run-ID</td>
- <td style="padding-left:10px">Worker</td>
- <td style="padding-left:10px">Requeue</td>
- <td style="padding-left:10px">Queuetime</td>
- <td style="padding-left:10px">Runtime</td>
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
-
- <table style="border: 1px solid #ccc; font-size: 14; float:left;">
- <thead>
- <tr style="background-color:#ddd;">
- <td style="background-color:#ccc;" colspan="5" align="center">Finished Jobs (%s)</td>
- </tr>
- <tr style="background-color:#ddd;">
- <td>Run-ID</td>
- <td style="padding-left:10px">Worker</td>
- <td style="padding-left:10px">Queuetime</td>
- <td style="padding-left:10px">Runtime</td>
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
-
- ''' % ('cluster',
- len(worker_trs),
- '\n'.join(worker_trs),
- len(waiting_trs),
- '\n'.join(waiting_trs),
- len(running_trs),
- '\n'.join(running_trs),
- len(finished),
- '\n'.join(finished_trs),
- )
- return render(body=body)
-
- def getInterestingOptruns(lws):
- return [d.name for d in lws.optimizer.tmpdir.dirs() if d.joinpath('.interested').exists()]
- def getAllOptruns(lws, filter=None):
- ''' return optruns that have reached at least a minimum'''
- dirs = [d for d in lws.optimizer.tmpdir.dirs() if d.joinpath('mins.txt').exists()]
- if filter is not None:
- _dirs = []
- for d in dirs:
- data = [s for s in d.joinpath('mins.txt').lines()[-1].split()]
- data_init = [s for s in d.joinpath('init.txt').lines() if s.strip()]
- allowed = []
- if 'gen' in filter:
- for s in data:
- if s.startswith('gen:'):
- allowed.append(int(s[4:]) > filter['gen'])
- if filter.get('station'):
- for s in data_init:
- if s.startswith('station:'):
-
- allowed.append(any(e in s[8:] for e in filter['station'].split(',') if e.strip()))
- if filter.get('ts'):
- allowed.append(data[0] >= filter['ts'])
-
- if all(allowed):
- _dirs.append(d)
-
- dirs = set(_dirs)
-
- return list(sorted(d.name for d in dirs))
-
- def renderOptimizer(lws):
- active_session = lws.optimizer.optsession if lws.optimizer.running else None
-
- session_trs = []
- lastinit = {}
-
- files = sorted(lws.optimizer.tmpdir.dirs(),
- key=lambda x: x.files('*.txt')[0].mtime if len(x.files('*.txt')) > 0 else 0)
-
- for i, d in enumerate(reversed(files)):
- f = d.joinpath('init.txt')
- if not f.exists():
- continue
- initparams = dict([(e.split(':')[0], e.split(':')[1].strip())
- for e in f.text().split('\n') if e.strip()])
- if i == 0:
- lastinit = initparams
-
- trdata = defaultdict(str)
-
- trdata.update({'name': d.name,
- 'ts': datetime.fromtimestamp(d.mtime).strftime('%d.%m %H:%M')})
- trdata.update(initparams)
-
-
- trdata['min_avg_delta'] = ''
- trdata['min_generation'] = ''
- trdata['curr_generation'] = ''
-
- f = d.joinpath('mins.txt')
- if f.exists():
-
- lastmin = f.text().strip().split('\n')[-1].split()
- generation, orgid, mindelta = lastmin[1].split(':')[1], lastmin[2].split(':')[1], lastmin[3].split(':')[1]
- trdata['min_avg_delta'] = '%s@%s' % (mindelta, generation)
-
- cmp = lambda x: int(x.namebase.split('_')[1]) if x.namebase.startswith('population_') else -1
- popfiles = list(sorted(d.files('*.txt'), key=cmp))
- # and again get the last line
- lastsim = popfiles[-1].text().strip().split('\n')[-1].split()
- generation, orgid = lastsim[1].split(':')[1], lastsim[2].split(':')[1]
- trdata['curr_generation'] = '%s' % generation
-
- trdata['isinterest'] = 'yes' if d.joinpath('.interested').exists() else 'no'
- station_evaluate = []
- for station in initparams['station'].split(','):
- a = '<a href="/evaluate/%s/%s">%s</a>' % (station, d.name, station)
- station_evaluate.append(a)
- trdata['stations'] = '\n'.join(station_evaluate)
-
- restarturl = '/'
- tr = '''
- <tr class="optrun">
- <td><a href="/optruns?optruns=%(name)s">%(name)s</a></td>
- <td>%(stations)s</td>
- <td>%(timelimit)s</td>
- <td>%(genlimit)s</td>
- <td align="left">%(min_avg_delta)s</td>
- <td>%(curr_generation)s</td>
- <td align="center">%(scene)s</td>
- <td>%(ts)s</td>
- <td>%(power)s</td>
- <td align="center" class="raytracerparam">%(density)s</td>
- <td class="raytracerparam">%(resolution)s</td>
- <td class="raytracerparam" align="center">%(numphotons)s</td>
- <td class="raytracerparam">%(bbox)s</td>
- <td align="center">%(startpop)s</td>
- <td align="center" class="genparam">%(childcount)s</td>
- <td align="center" class="genparam">%(childcull)s</td>
- <td align="center" class="genparam">%(mutprob)s</td>
- <td align="center" class="genparam">%(mutamt)s</td>
- <td align="center"><a href="/interestingOptrun/%(name)s">%(isinterest)s</a></td>
- <td align="center"><a href="/buildOptrun/%(name)s">build</a></td>
- </tr>
- ''' % trdata
- session_trs.append(tr)
-
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- </div>
- <table>
- <form action="/startOptimizer">
- <tr style="background-color:#ddd;">
- <td style="background-color:#ccc;" colspan="5" align="center">
- <span>Start Optimizer Session</span>
- </td>
- </tr>
- <tr>
- <td>Session</td>
- <td>
- <input type="text" value="%(session)s" name="optsession"/>
- </td>
- </tr>
- <tr>
- <td>Station</td>
- <td>
- <input type="text" value="%(station)s" name="station"/>
- </td>
- </tr>
- <tr>
- <td>Timelimit (sec)</td>
- <td>
- <input type="text" value="%(timelimit)s" name="timelimit"/>
- </td>
- </tr>
- <tr>
- <td>max Gens</td>
- <td>
- <input type="text" value="%(genlimit)s" name="genlimit"/>
- </td>
- </tr>
- <tr style="background-color:#ddd;">
- <td colspan="2" align="center">Photon Params</td>
- </tr>
- <tr>
- <td>Power</td>
- <td>
- <input type="text" value="%(power)s" name="power"/>
- </td>
- </tr>
- <tr>
- <td>Density</td>
- <td>
- <input type="text" value="%(density)s" name="density"/>
- </td>
- </tr>
- <tr>
- <td>Numphotons</td>
- <td>
- <input type="text" value="%(numphotons)s" name="numphotons"/>
- </td>
- </tr>
- <tr>
- <td>Resolution (X)</td>
- <td>
- <input type="text" value="%(resolution)s" name="resolution"/>
- </td>
- </tr>
- <tr>
- <td>Bounding Box</td>
- <td>
- <input type="text" value="%(bbox)s" name="bbox"/>
- </td>
- </tr>
- <tr>
- <td>Scene</td>
- <td>
- <input type="text" value="%(scene)s" name="scene"/>
- </td>
- </tr>
- <tr style="background-color:#ddd;">
- <td colspan="2" align="center">Genetic Sim Params</td>
- </tr>
- <tr>
- <td>Startpop</td>
- <td>
- <input type="text" value="%(startpop)s" name="startpop"/>
- </td>
- </tr>
- <tr>
- <td>Childcount</td>
- <td>
- <input type="text" value="%(childcount)s" name="childcount"/>
- </td>
- </tr>
- <tr>
- <td>Childcull</td>
- <td>
- <input type="text" value="%(childcull)s" name="childcull"/>
- </td>
- </tr>
- <tr>
- <td>Mutprob</td>
- <td>
- <input type="text" value="%(mutprob)s" name="mutprob"/>
- </td>
- </tr>
- <tr>
- <td>Mutamt</td>
- <td>
- <input type="text" value="%(mutamt)s" name="mutamt"/>
- </td>
- </tr>
- <tr style="background-color:#ddd;">
- <td colspan="2" align="center">Resume Population</td>
- </tr>
- <tr>
- <td>Session</td>
- <td>
- <input type="text" value="" name="resume"/>
- </td>
- </tr>
- <tr>
- <td>New Organisms</td>
- <td>
- <input type="text" value="0" name="neworgs"/>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <input type="submit" value="start" name="start" style="width:100%%"/>
- </td>
- </tr>
- </form>
- </table>
-
- <table>
- <thead>
- <tr style="background-color:#ccc;">
- <td style="background-color:#ccc;" colspan="20" align="center">
- <span>Optimizer Sessions [Active: %(active_session)s]</span>
- <a style="display: %(stoppable)s" href="/stopOptimizer">Stop!</a>
- </td>
- </tr>
- <tr style="background-color:#ddd;">
- <td>Session</td>
- <td>Station</td>
- <td>Timelimit</td>
- <td>Genlimit</td>
-
- <td>MinDelta</td>
- <td>CurrGen</td>
- <td>Scene</td>
- <td>Started</td>
-
- <td>Power <span title="show all genetic raytracer params" style="color:blue;cursor:pointer" onclick="$('td.raytracerparam').toggle()">[+/-]</span></td>
- <td class="raytracerparam">Density</td>
- <td class="raytracerparam">Resolution</td>
- <td class="raytracerparam">Photons</td>
- <td class="raytracerparam">BoundingBox</td>
- <td>Startpop <span title="show all genetic sim params" style="color:blue;cursor:pointer" onclick="$('td.genparam').toggle()">[+/-]</span></td>
- <td class="genparam">Childcount</td>
- <td class="genparam">Childcull</td>
- <td class="genparam">Mutprob</td>
- <td class="genparam">Mutamt</td>
- <td>Interest</td>
- <td>Build</td>
- </tr>
- </thead>
- <tbody>
- %(lastsessions)s
- </tbody>
- </table>
- ''' % {'pagename': 'optimize',
- 'active_session': active_session,
- 'stoppable': 'none' if active_session is None else 'inline',
- 'lastsessions': '\n'.join(session_trs),
- 'power': lastinit.get('power', '2.0e-6'),
- 'session': lastinit.get('session', 'optsession'),
- 'station': lastinit.get('station', lws.config['defaultDevice']),
- 'timelimit': lastinit.get('timelimit', '0'),
- 'genlimit': lastinit.get('genlimit', '0'),
- 'density': lastinit.get('density', str(lws.activeScene['density'])),
- 'resolution': lastinit.get('resolution', ','.join(str(e) for e in lws.activeScene['resolution'])),
- 'numphotons': lastinit.get('numphotons', str(lws.activeScene['numphotons'])),
- 'bbox': lastinit.get('bbox', ','.join(str(e) for e in lws.activeScene['bbox'])),
- 'scene': lastinit.get('scene', lws.activeScene.name),
- 'startpop': lastinit.get('startpop', '6'),
- 'childcount': lastinit.get('childcount', '8'),
- 'childcull': lastinit.get('childcull', '20'),
- 'mutprob': lastinit.get('mutprob', '0.1'),
- 'mutamt': lastinit.get('mutamt', '0.1'),
- }
- css = '''
- td.genparam, td.raytracerparam {
- display:none;
- }
- tr.optrun:hover { background:#DDF; }
-
- table{
- border-collapse:collapse;
- border: 1px solid #ccc;
- font-size: 14;
- float:left;
- };
-
- '''
- return render(body=body, css=css)
-
-
- def renderEvaluteOptruns(lws, optruns, compact=False, **kwargs):
- optruns = [e for e in optruns.split(',') if e]
- if 'all' in optruns:
- optruns = getAllOptruns(lws, filter={'gen': 20,
- 'station': kwargs.get('station', ''),
- 'ts': kwargs.get('ts')})
-
-
- optruns_a = []
- for o in sorted(getInterestingOptruns(lws)):
- _optruns = set(optruns)
- if o in _optruns:
- if len(_optruns) > 1:
- _optruns.discard(o)
- style = 'style="font-weight:bold"'
- else:
- _optruns.add(o)
- style = 'style="font-weight:normal"'
- _compact = '' if not compact else '?compact'
- a = '<a %s href="/optruns/%s%s">%s</a>' % (style, ','.join(sorted(_optruns)), _compact, o)
- optruns_a.append(a)
-
-
- optrun_containerdata = defaultdict(list)
-
- for optrun in optruns:
- odir = lws.optimizer.tmpdir.joinpath(optrun)
-
- if not compact:
- ww = 'width="%s%%"' % int(100 / len(optruns))
- else:
- ww = ''
-
- td = '''
- <td class="header" %(ww)s>
- %(optrun)s
- </td>
- ''' % {'optrun': optrun, 'ww': ww}
- optrun_containerdata[optrun].append(td)
-
-
- trs = []
- f = odir.joinpath('mins.txt')
- if not f.exists():
- continue
-
- lastmin = f.lines()[-1]
- for i, s in enumerate(lastmin.split()):
- if i == 0:
- name = 'timestamp'
- value = s
- else:
- name, value = s.split(':')
- name_css = name.replace('.', '_').replace('/', '_')
- tr = '''<tr class="p_%(name_css)s param" n="%(name_css)s">
- <td class="name">%(name)s</td>
- <td class="value">%(value)s</td>
- </tr>''' % {'name_css': name_css, 'name': name, 'value': value}
- trs.append(tr)
- td = '''
- <td class="cell">
- <table>
- <tr>
- <td class="header">Param</td>
- <td class="header">Value</td>
- </tr>
- %s
- </table>
- </td>
- ''' % '\n'.join(trs)
- optrun_containerdata[optrun].append(td)
-
- if not compact:
- if len(optruns) < 6:
- td = '''
- <td class="cell">
- <img src="/optimizePlot?session=%(optrun)s&onlymins=true" width="100%%"/>
- </td>
- ''' % {'optrun': optrun}
- optrun_containerdata[optrun].append(td)
-
- if len(optruns) < 3:
- td = '''
- <td class="cell">
- <img src="/optimizePlot?session=%(optrun)s" width="100%%"/>
- </td>
- ''' % {'optrun': optrun}
- optrun_containerdata[optrun].append(td)
-
- num_tds = len(optrun_containerdata.values()[0]) if optrun_containerdata else 0
-
- optrun_containers = []
- for i in range(num_tds):
- tds = [tds[i] for optrun, tds in optrun_containerdata.items()]
- tr = '''<tr>%s</tr>''' % '\n'.join(tds)
- optrun_containers.append(tr)
-
-
- if not compact:
- ww = 'width="100%"'
- else:
- ww = ''
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- </div>
- <div>
- <b>Evaluate <a href="/optimize">Optruns</a>: </b>
- %(optruns)s
- </div>
- <table %(ww)s>
- <tr>
- %(optrun_containers)s
- </tr>
- </table>
-
- ''' % { 'pagename': 'optruns',
- 'optrun_containers': '\n'.join(optrun_containers),
- 'optruns': '\n'.join(optruns_a),
- 'ww': ww,
- }
-
- css = '''
- table {
- border-collapse:collapse;
- border: 1px solid #ccc;
- font-size: 14;
- float:left
- }
-
- td.cell {
- border-right: 3px solid grey;
- vertical-align:top;
- }
-
- td.header{
- background-color:#ccc;
- text-align:center;
- font-weight:bold;
- }
-
- ''' % {'width': (int(100 / len(optruns)) if optruns else 0)}
-
- return render(body=body, css=css)
-
- def renderMeasurements(lws, stations, view):
- tables = []
-
- ## full data grouped by APs
- stats = defaultdict(int)
- for mac, cfg in sorted(lws.mac2cfg.items(), key=lambda e: e[1].name):
-
- s2m = {}
- for station in stations:
- measurements = lws.getMeasurements(station=station, apid=cfg.name)
- s2m[station] = measurements
-
-
- locrows = []
- for locid in sorted(lws.known_locations.keys()):
- str_station_values = []
- for station in stations:
- measurements = s2m[station]
- vals = []
- rssis = []
-
- if measurements is not None and str(locid) in measurements:
- m = measurements[str(locid)]
- rssis = m.rssis
- for _view in view:
- if _view == 'mean':
- vals.append(str(int(scipy.mean(rssis))))
-
- if _view == 'median':
- vals.append(str(int(scipy.median(rssis))))
-
- if _view == 'stddev':
- stddev = scipy.std(rssis)
- vals.append('%.1f' % stddev)
- else:
- m = None
-
- str_station_values.append(('/'.join(e for e in vals),
- ','.join('%.1f' % e for e in sorted(rssis)),
- m,
- cfg,
- (lws.known_locations[locid].x, lws.known_locations[locid].y, lws.known_locations[locid].z),
- station
- ))
-
-
- if len(stations) == 2:
- # HACK FOR COMPARING TWO MEASUREMENT-SETS
- try:
- # most ugly
- delta = '%.1f' % (float(str_station_values[0][0].split('/')[0]) - float(str_station_values[1][0].split('/')[0]))
- except ValueError:
- delta = ''
- str_station_values.append((delta, '', None, None, None, None))
-
-
- def styleFromMeasurement(m, apcfg, location, station, locid):
- MAX_REQUIRED_DISTANCE = 20 # mark location grey if distance exceeds MAX_REQUIRED_DISTANCE
- MIN_REQUIRED_DISTANCE = 10
- if location is not None:
- dist = ((location[0]-apcfg['x'])**2 + (location[1]-apcfg['y'])**2 + + (location[2]-apcfg['z'])**2)**0.5
- else:
- dist = None
-
- if m is not None and len(m.rssis) > 0:
- stats[(station, 'collected')] += 1
- stats[(station, 'ap_%s' % apcfg.name)] += 1
- stats[(station, 'locid_%s' % locid)] += 1
-
- if station == 'wispy' and 'asus' != apcfg['powerid'] and m is None:
- return "background-color:silver"
- if dist is not None and dist > MAX_REQUIRED_DISTANCE and m is None:
- #~ stats[(station, 'faraway')] += 1
- return "background-color:silver"
- if dist is not None and dist < MIN_REQUIRED_DISTANCE and m is None:
- #~ stats[(station, 'faraway')] += 1
- return "background-color:#FFCCCC"
- elif m is None:
- stats[(station, 'missing')] += 1
- return ''
- elif scipy.std(m.rssis) > 10:
- stats[(station, 'highstddev')] += 1
- stats[(station, 'brutalstddev')] += 1
- return "background-color:#FF8866"
- elif scipy.std(m.rssis) > 5:
- stats[(station, 'highstddev')] += 1
- return "background-color:yellow"
- elif scipy.std(m.rssis) > 4:
- stats[(station, 'highstddev')] += 1
- return "background-color:FFFFCC"
- elif len(m.rssis) <= 5:
- stats[(station, 'tosmall')] += 1
- return "background-color:#CCCCFF"
-
- else:
- if len(m.rssis) > 0:
- stats[(station, 'nice')] += 1
- return ''
-
- locrow = '''<tr>
- <td>%s</td>
- %s
- </tr>
- ''' % (
- locid,
- '\n'.join('<td align="center" title="%s" style="%s">%s</td>' % (
- e[1],
- styleFromMeasurement(e[2], e[3], e[4], e[5], locid),
- e[0]
- ) for e in str_station_values)
- )
- locrows.append(locrow)
-
- table = '''
- <table style="border: 1px solid #ccc; font-size: 14; float:left;">
- <thead>
- <tr>
- <td colspan="10" style="background-color:#ccc;" align="center">%s</td>
- </tr>
- <tr style="background-color:#ddd;">
- <td>LocID</td>
- %s
- </tr>
- </thead>
- %s
- </table>
- ''' % ( '%s/%s' % (cfg.name, mac),
- '\n'.join(['<td>%s</td>' % s for s in stations] + (['<td>Delta</td>'] if len(stations) == 2 else [])),
- '\n'.join(locrows),
- )
-
- tables.append(table)
-
- ## aggregated by APs
- trs = []
- for station in stations:
- nice = stats[(station, 'nice')]
- collected = stats[(station, 'collected')]
- missing = stats[(station, 'missing')]
- highstddev = stats[(station, 'highstddev')]
- brutalstddev = stats[(station, 'brutalstddev')]
- tosmall = stats[(station, 'tosmall')]
-
- ap_aggregated = []
- for mac, cfg in sorted(lws.mac2cfg.items(), key=lambda e: e[1].name):
- v = stats[(station, 'ap_%s' % cfg.name)]
- ap_aggregated.append('<td>%s</td>' % v)
-
- tr = '''<tr>
- <td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td>
- %s
- </tr>''' % (station, collected, missing, nice, highstddev, brutalstddev, tosmall, '\n'.join(ap_aggregated))
- trs.append(tr)
-
- apheader = []
- for mac, cfg in sorted(lws.mac2cfg.items(), key=lambda e: e[1].name):
- apid = cfg.name
- apheader.append('<td style="background-color:#ccc;">%s</td>' % apid)
-
-
- table = '''
- <table cellspacing="0px" style="border: 1px solid #ccc; font-size: 14;" width="100%%">
- <thead>
- <tr>
- <td style="background-color:#ccc;">device</td>
- <td style="background-color:#ccc;">collected</td>
- <td style="background-color:#ccc;">missing</td>
- <td style="background-color:#ccc;">nice</td>
- <td style="background-color:#ccc;">highstddev</td>
- <td style="background-color:#ccc;">brutalstddev</td>
- <td style="background-color:#ccc;">tosmall</td>
- %s
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
- ''' % ('\n'.join(apheader), '\n'.join(trs))
- tables.insert(0, table)
-
- ## aggregated by location
- trs = []
- for station in stations:
- locid_aggregated = []
- for locid in lws.known_locations:
- v = stats[(station, 'locid_%s' % locid)]
-
- style = 'background-color:#FFCCCC' if v == 0 else ''
-
- locid_aggregated.append('<td style="%s">%s</td>' % (style, v))
-
- tr = '''<tr>
- <td>%s</td><td>%s</td><td>%s</td>
- %s
- </tr>''' % (station, 0, 0, '\n'.join(locid_aggregated))
- trs.append(tr)
-
- locidheader = []
- for locid in lws.known_locations:
- locidheader.append('<td style="background-color:#ccc;">%s</td>' % locid)
-
- table = '''
- <table cellspacing="0px" style="border: 1px solid #ccc; font-size: 12;" width="100%%">
- <thead>
- <tr>
- <td style="background-color:#ccc;">device</td>
- <td style="background-color:#ccc;">avail</td>
- <td style="background-color:#ccc;">miss</td>
- %s
- </tr>
- </thead>
- <tbody>
- %s
- </tbody>
- </table>
- ''' % ('\n'.join(locidheader), '\n'.join(trs))
- tables.insert(1, table)
-
-
- ## the rest
- cutplanes = ['<a href="/plot2DMap/%s" style="margin-top:10px">cut %s</a>' % (s, s) for s in lws.activeScene['levels2d'].scalars]
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- </div>
- <div>
- <span>Examples: </span>
- <a href="/measurements?stations=%(stations)s&view=mean,median,stddev">All Stations with Mean/Median/Stddev</a>
- <a style="margin-left:20px" href="/measurements?stations=%(compare)s&view=mean">Compare mean of first 2 Stations</a>
- <a style="margin-left:20px" href="/measurements?stations=%(compare)s&view=stddev">Compare stdev of first 2 Stations</a>
- </div>
- <div>
- %(cutplanes)s
- </div>
- %(tables)s
- ''' % {'pagename': 'measurements',
- 'stations': ','.join(lws.config['knownStations']),
- 'compare': ','.join(lws.config['knownStations'][:2]),
- 'tables': '\n'.join(tables),
- 'cutplanes': '\n'.join(cutplanes),
- }
-
- return render(body=body)
-
-
- def renderCollectPath(lws, station):
- spans = []
- options = []
- for pathid in sorted(lws.activeScene['paths'].scalars):
- locids = ','.join(lws.activeScene['paths'][pathid])
- spans.append('<span class="path" id="%s">%s</span>' % (pathid, locids))
- options.append('<option value="%s">%s</option>' % (pathid, pathid))
-
- eval_on_optrun = []
- for optrun in 'all_5', 'all_31':
- a = '''<a style="margin-left:15px;padding:10px;background-color:#CCC;border:1px solid grey;" href="/evaluatePath/%(station)s/%(optrun)s/LASTCOLLECTED/LASTCOLLECTED/end?refresh">%(optrun)s</a>'''
- eval_on_optrun.append(a % {'optrun': optrun, 'station': station})
-
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- <div id="stationinfo">
- <span id="name">%(station)s</span>
- </div>
- %(configured_paths)s
- </div>
- <div id="feedback" style="padding:5px;opacity:0.0;position:absolute;top:30%%;left:45%%;background-color:#FFF">feedback</div>
- <div style="margin-bottom:5px">
- <span id="nextButton" style="float:right;background-color:#CCC;cursor:pointer;padding-right:40px;padding-left:40px;padding-bottom:12px;padding-top:12px;border:1px solid grey;">next</span>
- <div style="padding-left:10px;padding-top:15px" id="pushButtons">
- <select id="pathid">
- %(options_pathid)s
- </select>
- <span id="startButton" style="background-color:#52D017;cursor:pointer;padding:10px;border:1px solid grey;">start</span>
- </div>
- </div>
- <div style="margin-top:25px; margin-bottom:5px">
- <a href="/view/%(station)s">view %(station)s</a>
- %(eval_on_optrun)s
- </div>
- <div id="cutplots">
- <img class="cutplot" src="/plot2DMap/eg" style="margin-top:10px" width="100%%"/>
- <img class="cutplot" src="/plot2DMap/og1" style="margin-top:10px" width="100%%"/>
- <img class="cutplot" src="/plot2DMap/og2" style="margin-top:10px" width="100%%"/>
- </div>
- ''' % {'pagename': 'collect',
- 'station': station,
- 'configured_paths': '\n'.join(spans),
- 'options_pathid': '\n'.join(options),
- 'eval_on_optrun': '\n'.join(eval_on_optrun),
- }
-
- return render(body=body)
-
- def renderEvaluate(lws, optruns, stations, cubewidth, errtype='3d', filter=None, refresh=False, algo='hmm'):
- if optruns is None:
- optruns = ''
-
- station_divs = []
- for station in stations.split(','):
- pathids2runids = evaluate.getCollectedPathids2runids(station, lws.activeScene['paths'], lws.config['tmp_tracked'], filter)
- settings = ['end', 'seq']
-
- reload(evaluate)
- tables = []
- for optrun in sorted(optruns.split(',')):
- try:
- errors = evaluate.evaluate(lws, optrun, station, cubewidth, algo, pathids2runids, refresh)
- except Exception:
- log.exception('error during evaluate')
- errors = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: (0, 0))))
-
- rows = []
- all_avg_errors = defaultdict(list)
- for pathid, runs in sorted(pathids2runids.items()):
-
- avg_errors = defaultdict(list)
- runrows = []
- for runid in runs:
- setting_tds = []
- for s in settings:
- err3d, err2d = errors[pathid][runid][s]
- if (err3d, err2d) == (0, 0):
- e = 0.0
- else:
- if errtype == '3d':
- e = err3d
- else:
- e = err2d
-
- avg_errors[s].append(e)
-
- href = '/evaluatePath/%s/%s/%s/%s/%s?cubewidth=%s&algo=%s%s' % (station, optrun, pathid, runid, s, cubewidth, algo, '&refresh' if not e else '')
- setting_tds.append('<td><a href="%s">%.2f</a></td>' % (href, e))
-
-
- tr = '<tr class="run" id="%s"><td>%s</td>%s</tr>' % (pathid, runid, ''.join(setting_tds))
- runrows.append(tr)
-
- tds = []
- for s in settings:
- if len(avg_errors[s]) > 0:
- e = sum(avg_errors[s]) / float(len(avg_errors[s]))
- else:
- e = 0.0
- href = '/evaluate/%s/%s?filter=%s&algo=%s' % (station, optruns, pathid, algo)
- tds.append('<td><a href="%s">%.2f</a></td>' % (href, e))
-
- all_avg_errors[s].extend(avg_errors[s])
-
- tr = '<tr class="path" pathid="%s"><td>%s (%s)</td>%s</tr>' % (pathid, pathid, len(runrows), ''.join(tds))
- rows.append(tr)
- rows.extend(runrows)
-
- tds = []
- for s in settings:
- if len(all_avg_errors[s]) > 0:
- tds.append('<td>%.2f</td>' % (sum(all_avg_errors[s]) / float(len(all_avg_errors[s]))))
- else:
- tds.append('<td/>')
- tr = '<tr style="background-color:#CCC;font-weight:bold"><td>total avg</td>%s</tr>' % ''.join(tds)
- rows.append(tr)
-
-
- table = '''
- <table class="optrun">
- <thead>
- <tr>
- <td colspan="10" style="background-color:#bbb;" align="center">%s - %s</td>
- </tr>
- <tr>
- <td colspan="10" style="background-color:#ccc;" align="center">%s</td>
- </tr>
- <tr style="background-color:#ddd;">
- <td>Run</td>
- %s
- </tr>
- </thead>
- %s
- </table>
- ''' % ( optrun,
- station,
- 'device: %s with cubewidth: %s and errtype: %s' % (station, cubewidth, errtype),
- '\n'.join(['<td>%s</td>' % s for s in settings]),
- '\n'.join(rows),
- )
-
- tables.append(table)
-
- station_divs.append('<div style="clear:left">%s</div>' % '\n'.join(tables))
-
- optruns_a = []
- for o in sorted(getInterestingOptruns(lws)):
- _optruns = set(e for e in optruns.split(',') if e)
- if o in _optruns:
- if len(_optruns) > 1:
- _optruns.discard(o)
- style = 'style="font-weight:bold"'
- else:
- _optruns.add(o)
- style = 'style="font-weight:normal"'
- qs = '?algo=' + algo
- qs += '&filter=%s' % filter if filter else ''
- a = '<a %s href="/evaluate/%s/%s%s">%s</a>' % (style, stations, ','.join(sorted(_optruns)), qs, o)
- optruns_a.append(a)
-
- stations_a = []
- for s in sorted(lws.config['knownStations']):
- _stations = set(stations.split(','))
- if s in _stations:
- if len(_stations) > 1:
- _stations.discard(s)
- style = 'style="font-weight:bold"'
- else:
- _stations.add(s)
- style = 'style="font-weight:normal"'
- qs = '?algo=' + algo
- qs += '&filter=%s' % filter if filter else ''
- a = '<a %s href="/evaluate/%s/%s%s">%s</a>' % (style, ','.join(sorted(_stations)), optruns, qs, s)
- stations_a.append(a)
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- <div id="stationinfo">
- <span id="name">%(station)s</span>
- </div>
- </div>
- <div>
- <b>Evaluate <a href="/optimize">Optruns</a>: </b>
- %(optruns)s
- <b>Stations: </b>
- %(stations)s
- </div>
- %(station_divs)s
- ''' % {'pagename': 'evaluate',
- 'station': stations.split(',')[0],
- 'station_divs': '\n'.join(station_divs),
- 'optruns': '\n'.join(optruns_a),
- 'stations': '\n'.join(stations_a),
- }
-
- css = '''
- table {
- border-collapse:collapse;
- border: 1px solid #ccc;
- font-size: 14;
- float:left
- }
- tr.run {
- display:none;
- }
- tr.path {
- cursor:pointer;
- background-color: #EEE;
- }
- '''
- return render(body=body, css=css)
-
- def renderEvaluatePath(lws, optrun, station, pathid, runid, setting, cubewidth, algo, refresh=False):
-
- reload(evaluate)
- errors = evaluate.evaluate(lws, optrun, station, cubewidth, algo, {pathid: [runid]}, refresh)
-
- # exception case: should be handled better
- assert errors[pathid][runid][setting] != (0, 0), 'propbably error during in evalAll worker threads '
-
- cached_err_file = lws.config['tmp'].joinpath('evaluator', '%s/%s_%s_%s_%s_%s_%s.xml' % (optrun, station, cubewidth, algo, setting, pathid, runid))
-
- tree = FileToTree(cached_err_file)
-
- apids = set()
- for e in tree.xpath('//apdata'):
- apids.update(e.attrib.keys())
- apids = list(apids)
-
- pos_rows = []
- posEls = tree.getroot().xpath('pos')
-
- # move unseen aps backwards
- if len(posEls) > 0:
- apdata = posEls[0].xpath('apdata')[0].attrib
- def move_unseen_backward(apid1, apid2):
- if apdata[apid1].endswith('/2.0'):
- return 2
- elif apdata[apid2].endswith('/2.0'):
- return -2
- else:
- return -1 if apid1 < apid2 else 1
-
- apids.sort(cmp=move_unseen_backward)
-
- for i, pel in enumerate(posEls):
- tds = []
- hexval = pos2rgb(i, len(posEls))
- s = '<td style="width:10px;background-color:%s">%s</td>' % (hexval, i)
- fw = 'bold' if pel.attrib['interpolated'] == 'false' else 'normal'
- s += '<td style="font-weight:%s">%s,%s,%s</td>' % (fw, pel.attrib['x'], pel.attrib['y'], pel.attrib['z'])
- s += '<td align="center">%s</td>' % pel.attrib['ts']
- s += '<td align="center">%s</td>' % pel.attrib['err2d']
- s += '<td align="center">%s,%s,%s</td>' % (pel.attrib['sx'], pel.attrib['sy'], pel.attrib['sz'])
- s += '<td align="center">%s</td>' % pel.attrib['tp']
- s += '<td align="center">%s,%s,%s</td>' % (pel.attrib['dx'], pel.attrib['dy'], pel.attrib['dz'])
- s += '<td align="center">%s</td>' % pel.attrib['ep']
-
- apdata = pel.xpath('apdata')[0].attrib
-
-
- for apid in apids:
- values = apdata[apid]
- apid = apid[3:]
- #~ if values != '-100.0/-1.0':
- max_delta = 6.0
- if values.endswith('/2.0'):
- bgc = '#AAF'
- delta = 0
- continue
- elif values.endswith('/1.0'):
- bgc = '#DDD'
- delta = 0
- else:
- simulated, measured = values.split('/')
- delta = abs(float(simulated) - float(measured))
- bgc = pos2rgb(max(0, max_delta - delta), max_delta, spread=0.35, saturation=0.5)
-
- td = '<td style="background-color:%s" title="ap: %s, delta: %.1f">%s</td>' % (bgc, apid, delta, values)
- tds.append(td)
-
- cls = 'measured' if pel.attrib['interpolated'] == 'false' else 'interpolated'
-
- pos_rows.append('<tr class="%s">%s</tr>' % (cls, s + ''.join(tds)))
-
- ap_tds = ''.join('<td align="center">%s</td>' % apid[3:] for apid in apids if not posEls[0].xpath('apdata')[0].attrib[apid].endswith('/2.0'))
- table = '''
- <table style="border: 1px solid #ccc; font-size: 14;">
- <thead>
- <tr style="background-color:#ddd;">
- <td style="width:10px">#</td>
- <td>Pos</td>
- <td>TS</td>
- <td>Err2d</td>
- <td align="center">Cube</td>
- <td>Transition</td>
- <td>tx,ty,tz</td>
- <td>Emission</td>
- %s
- </tr>
- </thead>
- %s
- </table>
- ''' % (ap_tds, ''.join(pos_rows))
-
-
- plots = [
- ('end', '<img class="plots" src="/plotEvaluatedPath/%s/%s/%s/%s/%s?cubewidth=%s&algo=%s"/>' % (optrun, station, pathid, runid, 'end', cubewidth, algo)),
- ('seq', '<img class="plots" src="/plotEvaluatedPath/%s/%s/%s/%s/%s?cubewidth=%s&algo=%s"/>' % (optrun, station, pathid, runid, 'seq', cubewidth, algo)),
- ]
- levels = lws.activeScene['levels2d'].scalars
- plots.extend(('%s' % l, '<img class="plots" src="/plot2DMap/%s"/>' % l) for l in levels)
-
-
- plots_table = '''
- <table id="plots">
- <tr>
- <td id="imgs1" width="50%%">
- %(imgs)s
- </td>
- <td id="imgs2" width="50%%">
- %(imgs)s
- </td>
- </tr>
- <tr>
- <td id="switch1">
- %(switchs)s
- </td>
- <td id="switch2">
- %(switchs)s
- </td>
- </tr>
- </table>
- '''
-
- imgs = '\n'.join(e[1] for e in plots)
- switchs = ''.join('<span class="switch">%s</span>' % e[0] for e in plots)
- plots_table = plots_table % {'imgs': imgs, 'switchs': switchs}
-
- num_measurements = int(tree.getroot().xpath('count(//pos[@interpolated="false"])'))
- num_signals = int(tree.getroot().xpath('count(//pos)'))
- duration = float(tree.getroot().xpath('string(//pos[position()=last()]/@ts)'))
- sec_permeasurements = duration / num_measurements
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- <div id="stationinfo">
- <span id="name">%(station)s</span>
- </div>
- </div>
- <h3><a href="/evaluate/%(station)s/%(optrun)s?filter=%(pathid)s">%(pathid)s</a>/%(runid)s</h3>
- <div> err2d: <b>%(err2d)s </b>seq-err2d: <b>%(seqerr2d)s</b> duration: <b>%(duration)s sec</b>
- measurements: <b>%(num_measurements)s</b> [%(num_signals)s] sec/measurements: <b>%(sec_permeasurements).2f sec</b></div>
- %(plots_table)s
- %(table)s
-
- ''' % {'pagename': 'evaluatePath',
- 'station': station,
- 'plots_table': plots_table,
- 'table': table,
- 'pathid': pathid,
- 'runid': runid,
- 'err2d': tree.getroot().attrib['err2d'],
- 'seqerr2d': tree.getroot().attrib['seqerr2d'],
- 'duration': duration,
- 'num_measurements': num_measurements,
- 'sec_permeasurements': sec_permeasurements,
- 'num_signals': num_signals,
- 'optrun': optrun,
- }
-
- css = '''
- table {
- border-collapse:collapse;
- width: 100%;
- }
- tr.measured td {
- border-top: 1px solid #999;
- }
- img.plots {
- display: none;
- width: 100%;
- }
- span.switch {
- margin-left: 10px;
- cursor: pointer;
- }
- '''
- return render(body=body, css=css)
-
- def renderLocalize(lws, device, refresh=False):
- numcolors = 256
-
- rgbdata = ','.join(pos2rgb(i, numcolors, spread=0.75, saturation=0.85) for i in range(0, numcolors))
-
- from utils.tiles import createLog2Tiles
- for level in lws.activeScene['levels2d']:
- destfile = lws.config['tmp'].joinpath('tiling_%s.png' % level)
- plotter.plot2DMap(lws.activeScene, level, {}, {}, destfile=destfile, resizeFactor=8, refresh=refresh)
- destdir = lws.config['tmp'].joinpath('tiles_%s' % level)
- if not destdir.exists() or refresh:
- createLog2Tiles(destfile, destdir, logger=log)
-
- aptrs = []
- aptds = []
- for i, apcfg in enumerate(sorted(lws.mac2cfg.values(), key=lambda e: e.name)):
- apid, x, y, z = apcfg.name, apcfg['x'], apcfg['y'], apcfg['z']
- x, y, z = lws.intoMapSpace(x, y, z)
-
- activeness = ' inactive_ap' if apid in lws.localizeSessionInactiveAPs[device] else 'active_ap'
-
- s = '''<td style="font-weight:bold;padding-left:2px">
- <span class="apdisable %s" apid="%s">[x]</span>
- <span class="apid " apid="%s">%s:</span>
- <span class="apinfo" id="api_%s" apid="%s" x="%s" y="%s" z ="%s"> </span>
- </td>''' % (activeness, apid, apid, apid, apid, apid, x, y, z)
- aptds.append(s)
- if i % 7 == 6:
- aptrs.append('<tr>%s</tr>' % ''.join(aptds))
- aptds[:] = []
- aptrs.append('<tr>%s</tr>' % ''.join(aptds))
-
- body = '''
- <div id="meta" style="display:none">
- <span id="pagename">%(pagename)s</span>
- <div id="stationinfo">
- <span id="name">%(station)s</span>
- </div>
- <span id="rgbdata" numcolors="%(numcolors)s">%(rgbdata)s</span>
- </div>
- <div id="info" style="position:absolute;left:10px;z-index:1000;background-color:white;font-size:small;border: 1px solid #EEE;">
- <span> session ID: </span>
- <span id="session_id"></span>
- <span id="queuesize">queuesize: </span>
- <span id="clientqueuesize">client: </span>
- <span id="debug"></span>
- <span> z: </span>
- <span id="top_z"></span>
- <span> hight (m): </span>
- <span id="pos_hight"></span>
- <table id="aptable">
- %(aptrs)s
- </table>
- </div>
-
- <div id="buttons" style="top:20px;position:absolute;right:20px; z-index:1001">
- <div class="layer" layer="topn_vlayer">Top N</div>
- <br/>
- <div class="layer" layer="ap_vlayer">APs</div>
- <br/>
- <div class="layer" layer="pos_vlayer">Positions</div>
- <br/>
- <br/>
- <div class="baselayer" layer="eg_layer" style="background-color:#CFC">EG</div>
- <br/>
- <div class="baselayer" layer="og1_layer">OG1</div>
- <br/>
- <div class="baselayer" layer="og2_layer">OG2</div>
- <br/>
- <br/>
- <div id="startstop">Start</div>
- </div>
-
- <div id="map"/>
- ''' % {'pagename': 'localize',
- 'station': device,
- 'rgbdata':rgbdata,
- 'numcolors': numcolors,
- 'aptrs': '\n'.join(aptrs),
- }
-
- css = '''
- table {
- border-collapse:collapse;
- width: 100%;
- }
-
- div#buttons div {
- padding-left: 10px;
- padding-right: 10px;
- padding-top: 5px;
- padding-bottom: 5px;
- background-color: #EEE;
- border: 2px solid #AAA;
- cursor:pointer;
- font-weight:bold;
- }
-
- div#buttons div:hover {
- border: 2px solid #444;
- }
-
- div#buttons div#startstop {
- background-color: #25BB25;
- }
- table#aptable {
- font-size: small;
- width: 1250px;
- }
- span.apinfo {
- font-weight: normal;
- float:right;
- }
- span.apid {
- cursor: pointer;
- }
-
- span.apdisable {
- cursor: pointer;
- font-weight: normal;
- }
-
- span.inactive_ap {
- color: red;
- }
-
- span.show_ap_data {
- color: green;
- }
- '''
-
-
- js = ['/OpenLayers-2.12/OpenLayers.js', 'localize.js']
- #~ js = ['OpenLayers-2.8/OpenLayers.js', 'localize.js']
-
- return render(body=body, css=css, js=js)
|