├── .ckr.json ├── .cm ├── alias-a-module ├── alias-a-wfe ├── alias-u-032630d041b4fd8a └── alias-u-1e4e644996b7f2a0 ├── .gitignore ├── AUTHORS ├── CHANGES ├── CONTRIBUTIONS ├── COPYRIGHT.txt ├── LICENSE.txt ├── README.md ├── module ├── .cm │ ├── alias-a-dashboard │ ├── alias-a-qr-code │ ├── alias-a-user │ ├── alias-a-wfe │ ├── alias-u-1e4e644996b7f2a0 │ ├── alias-u-31945a474d940ab0 │ ├── alias-u-4a4581c2dddde890 │ └── alias-u-5fd6485380ef9ff2 ├── dashboard │ ├── .cm │ │ ├── desc.json │ │ ├── info.json │ │ ├── meta.json │ │ └── updates.json │ └── module.py ├── qr-code │ ├── .cm │ │ ├── info.json │ │ └── meta.json │ ├── PyQRNative.py │ └── module.py ├── user │ ├── .cm │ │ ├── desc.json │ │ ├── info.json │ │ ├── meta.json │ │ └── updates.json │ └── module.py └── wfe │ ├── .cm │ ├── desc.json │ ├── info.json │ ├── meta.json │ ├── meta.json.arc1 │ └── updates.json │ └── module.py └── wfe ├── .cm ├── alias-a-dashboard ├── alias-a-default ├── alias-u-0c59982d4480b4ee └── alias-u-6b411f75e774059b ├── dashboard ├── .cm │ ├── desc.json │ ├── info.json │ └── meta.json ├── ck-repo-widget │ ├── widget.css │ ├── widget.js │ └── workflows.json ├── css │ ├── plugins │ │ └── plugins.css │ └── style.css ├── fonts │ ├── LeagueSpartan-Bold.otf │ ├── raleway │ │ ├── Raleway-Bold.ttf │ │ └── Raleway-ExtraBold.ttf │ └── roboto │ │ ├── Roboto-Bold.ttf │ │ ├── Roboto-Medium.ttf │ │ └── Roboto-Regular.ttf ├── images │ └── dividiti │ │ └── logo.png ├── js │ ├── d3.v5.min.js │ └── plugins │ │ └── plugins.js └── template.html └── default ├── .cm ├── info.json └── meta.json ├── css └── layout-fixed.css ├── images ├── ck-logo-small.png ├── ck-logo.png ├── ck-logo1.png ├── ctuning-logo.png ├── ctuning-logo1.png ├── ctuning-logo2.png ├── email_50px.png ├── linkedin_34px.png ├── linkedin_50px.png ├── logo_sunrise5.png ├── stamp-validated-by-the-community.png ├── twitter_32px.png └── twitter_50px.png ├── template.html ├── template.v0.html ├── template.v1.html └── template.v2.html /.ckr.json: -------------------------------------------------------------------------------- 1 | { 2 | "data_alias": "ck-web", 3 | "data_name": "CK web", 4 | "data_uid": "215d441c19db1fed", 5 | "data_uoa": "ck-web", 6 | "dict": { 7 | "desc": "Portable CK web server and web front-end with a unified JSON API for dashboards, benchmark scoreboards, interactive articles, graphs, crowdsourced experiments, etc (see demo).", 8 | "shared": "git", 9 | "sync": "yes", 10 | "url": "https://github.com/ctuning/ck-web" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.cm/alias-a-module: -------------------------------------------------------------------------------- 1 | 032630d041b4fd8a 2 | -------------------------------------------------------------------------------- /.cm/alias-a-wfe: -------------------------------------------------------------------------------- 1 | 1e4e644996b7f2a0 2 | -------------------------------------------------------------------------------- /.cm/alias-u-032630d041b4fd8a: -------------------------------------------------------------------------------- 1 | module 2 | -------------------------------------------------------------------------------- /.cm/alias-u-1e4e644996b7f2a0: -------------------------------------------------------------------------------- 1 | wfe 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | ======================================================================= 2 | N: Grigori Fursin 3 | E: Grigori.Fursin@cTuning.org 4 | H: http://fursin.net 5 | O: cTuning foundation 6 | C: original concept and design 7 | W: since Nov.1, 2014 8 | -------------------------------------------------------------------------------- /CHANGES: -------------------------------------------------------------------------------- 1 | * 2019.06.20 - [FGG] added SCC-SC19 scenario 2 | 3 | * 2019.03.20 - [FGG] added crowd-scenario for MLPerf SysML'19 demo 4 | 5 | * 2019.03.01 - [FGG] added module user 6 | 7 | * 2019.02.11 - fixed http://cknowledge.org/repo -> /repo in JS script to allow https 8 | 9 | * 2018.02.19 - fixing possible issue if tag is not a string in CK entry 10 | 11 | * 2017.10.06 - minor fix to HTML selector 12 | 13 | * 2017.09.16 - added possibility to search by tags with OR (|) 14 | 15 | * 2017.09.05 - added possibility for bold font in top menus & target="_blank" 16 | 17 | * 2017.07.26 - improvements in interactive D3 graphs (multiple in the same report) 18 | 19 | * 2017.04.02 - removed template from QR-code (nice URL) 20 | 21 | * 2016.11.04 - making os.getcwd() safer 22 | 23 | * 2016.07.14 * added 'new_window' meta in top menu to add link in a new window 24 | 25 | * 2016.06.06 * fixed template parsing in some cases (when using internal CK server) 26 | 27 | * 2016.05.30 * support for new CK web server 28 | 29 | * 2016.05.20 * allowing style extensions from native modules 30 | 31 | * 2016.05.16 * enhancing browsing configuration when using web templates 32 | 33 | * 2016.05.15 * adding customization for top menu 34 | 35 | * 2016.03.29 * adding support for directory hierarchy in off-line sites (cTuning.org) 36 | 37 | * 2016.03.25 * do not show/download tmp files/directories when viewing entries 38 | 39 | * 2016.02.15 * adding extra_brower_text in ck.cfg 40 | 41 | * 2016.02.05 * enhancing top menu functionality and adding results from CrowdTuning 42 | 43 | * 2016.01.16 * adding possibility to skip sorting when creating HTML selectors 44 | (required in ck-crowdtuning) 45 | 46 | * 2015.12.08 * adding repo UID when viewing entries (otherwise can have ambiguities in broken repos) 47 | 48 | * 2015.10.27 * automatically detecting server host and port, if used! 49 | 50 | * 2015.09.17 * supporting both ISO and human readable date during search 51 | 52 | * 2015.08.12 * improving interactive graphs for interactive articles 53 | 54 | * 2015.08.09 * Fixing html_viewer if error (output error to html) 55 | -------------------------------------------------------------------------------- /CONTRIBUTIONS: -------------------------------------------------------------------------------- 1 | CK uses standard 3-clause (new) BSD license. Contributions are welcome to 2 | either improve existing functionality or add new functionality possibly using 3 | new modules. 4 | 5 | Contributors should clearly mark their contributions including date and remark. 6 | 7 | This is still a relatively new project so we still discuss how to make 8 | contributions easy and efficient. 9 | 10 | For now, patches can be sent directly to the collective-knowledge@googlegroups.com 11 | 12 | Bugs can be reported here: 13 | * https://github.com/ctuning/ck/issues 14 | 15 | Thank you for your interest! 16 | 17 | ================================================================================= 18 | Acknowledgments: 19 | 20 | N: Grigori Fursin 21 | E: Grigori.Fursin@cTuning.org 22 | H: http://fursin.net 23 | O: cTuning foundation 24 | C: original concept and design 25 | W: since Nov.1, 2014 26 | 27 | N: Dave Butcher 28 | E: 29 | O: ARM 30 | C: reporting a few bugs when intergrating ARM's workload automation to CK 31 | W: 2016 32 | -------------------------------------------------------------------------------- /COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-2021 cTuning foundation 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) cTuning foundation 2 | All rights reserved 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, 8 | this list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in the 12 | documentation and/or other materials provided with the distribution. 13 | 14 | 3. Neither the name of the cTuning foundation 15 | nor the names of its contributors may be used to endorse 16 | or promote products derived from this software without 17 | specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 23 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![compatibility](https://github.com/ctuning/ck-guide-images/blob/master/ck-compatible.svg)](https://github.com/ctuning/ck) 2 | [![DOI](https://zenodo.org/badge/26590461.svg)](https://zenodo.org/badge/latestdoi/26590461) 3 | [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) 4 | 5 | **All CK components can be found at [cKnowledge.io](https://cKnowledge.io) and in [one GitHub repository](https://github.com/ctuning/ck-mlops)!** 6 | 7 | *This project is hosted by the [cTuning foundation](https://cTuning.org).* 8 | 9 | This repository contains Collective Knowledge extension modules 10 | to browse CK repositories, visualize interactive graphs and articles, 11 | render CK-based websites, implement simple web services with JSON API 12 | (for example to crowdsource experiments or unify access to DNN). 13 | 14 | For example, it is used to power the following websites: 15 | * [public CK repository of optimization knowledge](http://cKnowledge.org/repo) 16 | * [cTuning foundation](http://cTuning.org) 17 | * [Artifact evaluation website for computer systems' conferences](http://cTuning.org/ae) 18 | 19 | You can reuse above example to build your own websites, JSON web services 20 | (such as DNN-as-a-service), and [experiment crowd-sourcing web servers](http://cKnowledge.org/repo). 21 | 22 | These extensions help users integrate CK artifacts and research workflows 23 | with other frameworks includin Django, Mediawiki, Drupal and Apache. 24 | 25 | Prerequisites 26 | ============= 27 | [Collective Knowledge Framework](http://github.com/ctuning/ck) 28 | 29 | Python Pillow or PIL module to generate QR images: 30 | 31 | You may need to install easysetup: 32 | * Linux: wget https://bootstrap.pypa.io/ez_setup.py -O - | python 33 | 34 | * https://github.com/python-pillow 35 | or 36 | * http://www.pythonware.com/products/pil/ 37 | 38 | Authors 39 | ======= 40 | 41 | * [Grigori Fursin](https://fursin.net) 42 | 43 | License 44 | ======= 45 | * BSD, 3-clause 46 | 47 | Installation 48 | ============ 49 | 50 | ``` 51 | $ ck pull repo:ck-web 52 | ``` 53 | 54 | Modules with actions 55 | ==================== 56 | 57 | qr-code - generating QR codes 58 | 59 | * generate - generate QR code 60 | 61 | wfe - CK web front-end (browsing repository and entries, visualizing experiments, viewing interactive graphs and articles, etc) 62 | 63 | * clean - clean tmp cache of a CK web service 64 | * convert_ck_list_to_select_data - convert CK list to html to select data 65 | * create_button - create html button 66 | * create_input - create html search 67 | * create_selector - create html universal selector 68 | * index - browse CK repositories 69 | * parse_txt - parse text or json files to process, high-light and cross-link special CK words including $#cm_, $#ck_, http ... 70 | * process_all_pages - process all pages and convert them into static ones (to create static websites) 71 | * process_ck_page - process special CK words in html pages 72 | * start_form - start html form 73 | * view_page - view a given CK page 74 | * webadd - add/update CK entries via html 75 | 76 | dashboard - new CK web front-end. Provides more modern Look and Feel and targets to replace wfe module. 77 | 78 | * display - start web service and open web-browser with widget. Arguments: 79 | 80 | * --global - data will be retrieved from cKnowledge.org. Example: `ck display dashboard --global` - show web-page with data retrieved from global repository 81 | * --scenario - specify scenario as module_uoa. Only workflows with this module will be shown in this scenario. Example: `ck display dashboard --scenario=hackathon.20181006` - show web-page with Quantum Hackathon 2018-10-06 workflows only 82 | 83 | Publications 84 | ============ 85 | 86 | ``` 87 | @inproceedings{ck-date16, 88 | title = {{Collective Knowledge}: towards {R\&D} sustainability}, 89 | author = {Fursin, Grigori and Lokhmotov, Anton and Plowman, Ed}, 90 | booktitle = {Proceedings of the Conference on Design, Automation and Test in Europe (DATE'16)}, 91 | year = {2016}, 92 | month = {March}, 93 | url = {https://www.researchgate.net/publication/304010295_Collective_Knowledge_Towards_RD_Sustainability} 94 | } 95 | 96 | @inproceedings{Fur2009, 97 | author = {Grigori Fursin}, 98 | title = {{Collective Tuning Initiative}: automating and accelerating development and optimization of computing systems}, 99 | booktitle = {Proceedings of the GCC Developers' Summit}, 100 | year = {2009}, 101 | month = {June}, 102 | location = {Montreal, Canada}, 103 | keys = {http://www.gccsummit.org/2009} 104 | url = {https://scholar.google.com/citations?view_op=view_citation&hl=en&user=IwcnpkwAAAAJ&cstart=20&citation_for_view=IwcnpkwAAAAJ:8k81kl-MbHgC} 105 | } 106 | ``` 107 | 108 | * http://arxiv.org/abs/1506.06256 109 | * http://hal.inria.fr/hal-01054763 110 | * https://hal.inria.fr/inria-00436029 111 | * http://arxiv.org/abs/1407.4075 112 | * https://scholar.google.com/citations?view_op=view_citation&hl=en&user=IwcnpkwAAAAJ&citation_for_view=IwcnpkwAAAAJ:LkGwnXOMwfcC 113 | 114 | Feedback 115 | ======== 116 | 117 | * https://groups.google.com/forum/#!forum/collective-knowledge 118 | -------------------------------------------------------------------------------- /module/.cm/alias-a-dashboard: -------------------------------------------------------------------------------- 1 | 4a4581c2dddde890 2 | -------------------------------------------------------------------------------- /module/.cm/alias-a-qr-code: -------------------------------------------------------------------------------- 1 | 5fd6485380ef9ff2 2 | -------------------------------------------------------------------------------- /module/.cm/alias-a-user: -------------------------------------------------------------------------------- 1 | 31945a474d940ab0 2 | -------------------------------------------------------------------------------- /module/.cm/alias-a-wfe: -------------------------------------------------------------------------------- 1 | 1e4e644996b7f2a0 2 | -------------------------------------------------------------------------------- /module/.cm/alias-u-1e4e644996b7f2a0: -------------------------------------------------------------------------------- 1 | wfe 2 | -------------------------------------------------------------------------------- /module/.cm/alias-u-31945a474d940ab0: -------------------------------------------------------------------------------- 1 | user 2 | -------------------------------------------------------------------------------- /module/.cm/alias-u-4a4581c2dddde890: -------------------------------------------------------------------------------- 1 | dashboard 2 | -------------------------------------------------------------------------------- /module/.cm/alias-u-5fd6485380ef9ff2: -------------------------------------------------------------------------------- 1 | qr-code 2 | -------------------------------------------------------------------------------- /module/dashboard/.cm/desc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /module/dashboard/.cm/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "backup_data_uid": "4a4581c2dddde890", 3 | "backup_module_uid": "032630d041b4fd8a", 4 | "backup_module_uoa": "module", 5 | "control": { 6 | "engine": "CK", 7 | "iso_datetime": "2018-10-18T13:18:36.807476", 8 | "user_name": "cTuning foundation", 9 | "version": [ 10 | "1", 11 | "9", 12 | "6" 13 | ] 14 | }, 15 | "data_name": "dashboard" 16 | } 17 | -------------------------------------------------------------------------------- /module/dashboard/.cm/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": { 3 | "display": { 4 | "desc": "display webpage with interactive dashboard widget", 5 | "for_web": "yes" 6 | } 7 | }, 8 | "copyright": "See CK COPYRIGHT.txt for copyright details", 9 | "desc": "CK web front-end with interactive widget", 10 | "developer": "cTuning foundation", 11 | "license": "See CK LICENSE.txt for licensing details" 12 | } 13 | -------------------------------------------------------------------------------- /module/dashboard/.cm/updates.json: -------------------------------------------------------------------------------- 1 | { 2 | "control": [ 3 | { 4 | "author": "Grigori Fursin", 5 | "author_email": "Grigori.Fursin@cTuning.org", 6 | "author_webpage": "http://fursin.net", 7 | "copyright": "See CK COPYRIGHT.txt for copyright details", 8 | "engine": "CK", 9 | "iso_datetime": "2015-06-18T10:16:38.803000", 10 | "license": "See CK LICENSE.txt for licensing details", 11 | "version": [ 12 | "1", 13 | "2", 14 | "0605" 15 | ] 16 | }, 17 | { 18 | "author": "Grigori Fursin", 19 | "author_email": "Grigori.Fursin@cTuning.org", 20 | "author_webpage": "http://fursin.net", 21 | "copyright": "See CK COPYRIGHT.txt for copyright details", 22 | "engine": "CK", 23 | "iso_datetime": "2015-07-10T12:27:14.397000", 24 | "license": "See CK LICENSE.txt for licensing details", 25 | "version": [ 26 | "1", 27 | "2", 28 | "0605" 29 | ] 30 | }, 31 | { 32 | "author": "Grigori Fursin", 33 | "author_email": "Grigori.Fursin@cTuning.org", 34 | "author_webpage": "http://fursin.net", 35 | "copyright": "See CK COPYRIGHT.txt for copyright details", 36 | "engine": "CK", 37 | "iso_datetime": "2016-05-30T12:23:48.123000", 38 | "license": "See CK LICENSE.txt for licensing details", 39 | "version": [ 40 | "1", 41 | "7", 42 | "2dev" 43 | ] 44 | }, 45 | { 46 | "engine": "CK", 47 | "iso_datetime": "2018-10-18T13:25:05.720861", 48 | "version": [ 49 | "1", 50 | "9", 51 | "6" 52 | ] 53 | } 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /module/dashboard/module.py: -------------------------------------------------------------------------------- 1 | # 2 | # Collective Knowledge (CK web front-end) 3 | # 4 | # See CK LICENSE.txt for licensing details 5 | # See CK COPYRIGHT.txt for copyright details 6 | # 7 | # Developer: cTuning foundation 8 | # 9 | 10 | cfg={} # Will be updated by CK (meta description of this module) 11 | work={} # Will be updated by CK (temporal data) 12 | ck=None # Will be updated by CK (initialized CK kernel) 13 | 14 | # Local settings 15 | 16 | import os 17 | 18 | fdata_name='ck_top_data' 19 | fmodule_name='ck_top_module' 20 | frepo_name='ck_top_repo' 21 | 22 | form_name='ck_top_form' 23 | onchange='document.'+form_name+'.submit();' 24 | 25 | ############################################################################## 26 | # Initialize module 27 | 28 | def init(i): 29 | """ 30 | 31 | Input: {} 32 | 33 | Output: { 34 | return - return code = 0, if successful 35 | > 0, if error 36 | (error) - error text if return > 0 37 | } 38 | 39 | """ 40 | return {'return':0} 41 | 42 | 43 | ############################################################################## 44 | # display webpage with interactive dashboard widget 45 | 46 | def display(args): 47 | """ 48 | Input: { 49 | (host) - Internal web server host 50 | (port) - Internal web server port 51 | 52 | (wfe_host) - External web server host 53 | (wfe_port) - External web server port 54 | 55 | (extra_url) - extra URL 56 | } 57 | 58 | Output: { 59 | return - return code = 0, if successful 60 | > 0, if error 61 | (error) - error text if return > 0 62 | } 63 | 64 | """ 65 | 66 | # Filter and pass some arguments from command line to browser 67 | extra_url = { key:args[key] for key in args if key in ['scenario', 'global'] } 68 | extra_url = "&".join("{0}={1}".format(key, extra_url[key]) for key in extra_url) 69 | 70 | args['action'] = 'start' 71 | args['module_uoa'] = 'web' 72 | args['browser'] = 'yes' 73 | args['template'] = 'dashboard' 74 | args['cid'] = '' 75 | args['extra_url'] = extra_url 76 | 77 | return ck.access(args) 78 | -------------------------------------------------------------------------------- /module/qr-code/.cm/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "backup_data_uid": "5fd6485380ef9ff2", 3 | "backup_module_uid": "032630d041b4fd8a", 4 | "backup_module_uoa": "module", 5 | "control": { 6 | "engine": "CK", 7 | "iso_datetime": "2014-11-13T15:48:10.452000", 8 | "user_name": "cTuning foundation", 9 | "version": [ 10 | "0", 11 | "1", 12 | "140810", 13 | "beta" 14 | ] 15 | }, 16 | "data_name": "qr-code" 17 | } 18 | -------------------------------------------------------------------------------- /module/qr-code/.cm/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": { 3 | "generate": { 4 | "desc": "generate QR code", 5 | "for_web": "yes" 6 | } 7 | }, 8 | "copyright": "See CK COPYRIGHT.txt for copyright details", 9 | "desc": "generating QR codes", 10 | "developer": "cTuning foundation", 11 | "license": "See CK LICENSE.txt for licensing details; includes PyQRNative.py with MIT license (see python code for details)" 12 | } 13 | -------------------------------------------------------------------------------- /module/qr-code/PyQRNative.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | from PIL import Image, ImageDraw 4 | 5 | #QRCode for Python 6 | # 7 | #Ported from the Javascript library by Sam Curren 8 | # 9 | #QRCode for Javascript 10 | #http://d-project.googlecode.com/svn/trunk/misc/qrcode/js/qrcode.js 11 | # 12 | #Copyright (c) 2009 Kazuhiko Arase 13 | # 14 | #URL: http://www.d-project.com/ 15 | # 16 | #Licensed under the MIT license: 17 | # http://www.opensource.org/licenses/mit-license.php 18 | # 19 | # The word "QR Code" is registered trademark of 20 | # DENSO WAVE INCORPORATED 21 | # http://www.denso-wave.com/qrcode/faqpatent-e.html 22 | 23 | 24 | class QR8bitByte: 25 | 26 | def __init__(self, data): 27 | self.mode = QRMode.MODE_8BIT_BYTE 28 | self.data = data 29 | 30 | def getLength(self): 31 | return len(self.data) 32 | 33 | def write(self, buffer): 34 | for i in range(len(self.data)): 35 | #// not JIS ... 36 | buffer.put(ord(self.data[i]), 8) 37 | def __repr__(self): 38 | return self.data 39 | 40 | class QRCode: 41 | def __init__(self, typeNumber, errorCorrectLevel): 42 | self.typeNumber = typeNumber 43 | self.errorCorrectLevel = errorCorrectLevel 44 | self.modules = None 45 | self.moduleCount = 0 46 | self.dataCache = None 47 | self.dataList = [] 48 | def addData(self, data): 49 | newData = QR8bitByte(data) 50 | self.dataList.append(newData) 51 | self.dataCache = None 52 | def isDark(self, row, col): 53 | if (row < 0 or self.moduleCount <= row or col < 0 or self.moduleCount <= col): 54 | raise Exception("%s,%s - %s" % (row, col, self.moduleCount)) 55 | return self.modules[row][col] 56 | def getModuleCount(self): 57 | return self.moduleCount 58 | def make(self): 59 | self.makeImpl(False, self.getBestMaskPattern() ) 60 | def makeImpl(self, test, maskPattern): 61 | 62 | self.moduleCount = self.typeNumber * 4 + 17 63 | self.modules = [None for x in range(self.moduleCount)] 64 | 65 | for row in range(self.moduleCount): 66 | 67 | self.modules[row] = [None for x in range(self.moduleCount)] 68 | 69 | for col in range(self.moduleCount): 70 | self.modules[row][col] = None #//(col + row) % 3; 71 | 72 | self.setupPositionProbePattern(0, 0) 73 | self.setupPositionProbePattern(self.moduleCount - 7, 0) 74 | self.setupPositionProbePattern(0, self.moduleCount - 7) 75 | self.setupPositionAdjustPattern() 76 | self.setupTimingPattern() 77 | self.setupTypeInfo(test, maskPattern) 78 | 79 | if (self.typeNumber >= 7): 80 | self.setupTypeNumber(test) 81 | 82 | if (self.dataCache == None): 83 | self.dataCache = QRCode.createData(self.typeNumber, self.errorCorrectLevel, self.dataList) 84 | self.mapData(self.dataCache, maskPattern) 85 | 86 | def setupPositionProbePattern(self, row, col): 87 | 88 | for r in range(-1, 8): 89 | 90 | if (row + r <= -1 or self.moduleCount <= row + r): continue 91 | 92 | for c in range(-1, 8): 93 | 94 | if (col + c <= -1 or self.moduleCount <= col + c): continue 95 | 96 | if ( (0 <= r and r <= 6 and (c == 0 or c == 6) ) 97 | or (0 <= c and c <= 6 and (r == 0 or r == 6) ) 98 | or (2 <= r and r <= 4 and 2 <= c and c <= 4) ): 99 | self.modules[row + r][col + c] = True; 100 | else: 101 | self.modules[row + r][col + c] = False; 102 | 103 | def getBestMaskPattern(self): 104 | 105 | minLostPoint = 0 106 | pattern = 0 107 | 108 | for i in range(8): 109 | 110 | self.makeImpl(True, i); 111 | 112 | lostPoint = QRUtil.getLostPoint(self); 113 | 114 | if (i == 0 or minLostPoint > lostPoint): 115 | minLostPoint = lostPoint 116 | pattern = i 117 | 118 | return pattern 119 | 120 | def createMovieClip(self): 121 | raise Exception("Method not relevant to Python port") 122 | def makeImage(self): 123 | boxsize = 10 #pixels per box 124 | offset = 4 #boxes as border 125 | pixelsize = (self.getModuleCount() + offset + offset) * boxsize 126 | 127 | im = Image.new("RGB", (pixelsize, pixelsize), "white") 128 | d = ImageDraw.Draw(im) 129 | 130 | for r in range(self.getModuleCount()): 131 | for c in range(self.getModuleCount()): 132 | if (self.isDark(r, c) ): 133 | x = (c + offset) * boxsize 134 | y = (r + offset) * boxsize 135 | b = [(x,y),(x+boxsize,y+boxsize)] 136 | d.rectangle(b,fill="black") 137 | del d 138 | return im 139 | 140 | def setupTimingPattern(self): 141 | 142 | for r in range(8, self.moduleCount - 8): 143 | if (self.modules[r][6] != None): 144 | continue 145 | self.modules[r][6] = (r % 2 == 0) 146 | 147 | for c in range(8, self.moduleCount - 8): 148 | if (self.modules[6][c] != None): 149 | continue 150 | self.modules[6][c] = (c % 2 == 0) 151 | 152 | def setupPositionAdjustPattern(self): 153 | 154 | pos = QRUtil.getPatternPosition(self.typeNumber) 155 | 156 | for i in range(len(pos)): 157 | 158 | for j in range(len(pos)): 159 | 160 | row = pos[i] 161 | col = pos[j] 162 | 163 | if (self.modules[row][col] != None): 164 | continue 165 | 166 | for r in range(-2, 3): 167 | 168 | for c in range(-2, 3): 169 | 170 | if (r == -2 or r == 2 or c == -2 or c == 2 or (r == 0 and c == 0) ): 171 | self.modules[row + r][col + c] = True 172 | else: 173 | self.modules[row + r][col + c] = False 174 | 175 | def setupTypeNumber(self, test): 176 | 177 | bits = QRUtil.getBCHTypeNumber(self.typeNumber) 178 | 179 | for i in range(18): 180 | mod = (not test and ( (bits >> i) & 1) == 1) 181 | self.modules[i // 3][i % 3 + self.moduleCount - 8 - 3] = mod; 182 | 183 | for i in range(18): 184 | mod = (not test and ( (bits >> i) & 1) == 1) 185 | self.modules[i % 3 + self.moduleCount - 8 - 3][i // 3] = mod; 186 | 187 | def setupTypeInfo(self, test, maskPattern): 188 | 189 | data = (self.errorCorrectLevel << 3) | maskPattern 190 | bits = QRUtil.getBCHTypeInfo(data) 191 | 192 | #// vertical 193 | for i in range(15): 194 | 195 | mod = (not test and ( (bits >> i) & 1) == 1) 196 | 197 | if (i < 6): 198 | self.modules[i][8] = mod 199 | elif (i < 8): 200 | self.modules[i + 1][8] = mod 201 | else: 202 | self.modules[self.moduleCount - 15 + i][8] = mod 203 | 204 | #// horizontal 205 | for i in range(15): 206 | 207 | mod = (not test and ( (bits >> i) & 1) == 1); 208 | 209 | if (i < 8): 210 | self.modules[8][self.moduleCount - i - 1] = mod 211 | elif (i < 9): 212 | self.modules[8][15 - i - 1 + 1] = mod 213 | else: 214 | self.modules[8][15 - i - 1] = mod 215 | 216 | #// fixed module 217 | self.modules[self.moduleCount - 8][8] = (not test) 218 | 219 | def mapData(self, data, maskPattern): 220 | 221 | inc = -1 222 | row = self.moduleCount - 1 223 | bitIndex = 7 224 | byteIndex = 0 225 | 226 | for col in range(self.moduleCount - 1, 0, -2): 227 | 228 | if (col == 6): col-=1 229 | 230 | while (True): 231 | 232 | for c in range(2): 233 | 234 | if (self.modules[row][col - c] == None): 235 | 236 | dark = False 237 | 238 | if (byteIndex < len(data)): 239 | dark = ( ( (data[byteIndex] >> bitIndex) & 1) == 1) 240 | 241 | mask = QRUtil.getMask(maskPattern, row, col - c) 242 | 243 | if (mask): 244 | dark = not dark 245 | 246 | self.modules[row][col - c] = dark 247 | bitIndex-=1 248 | 249 | if (bitIndex == -1): 250 | byteIndex+=1 251 | bitIndex = 7 252 | 253 | row += inc 254 | 255 | if (row < 0 or self.moduleCount <= row): 256 | row -= inc 257 | inc = -inc 258 | break 259 | PAD0 = 0xEC 260 | PAD1 = 0x11 261 | 262 | @staticmethod 263 | def createData(typeNumber, errorCorrectLevel, dataList): 264 | 265 | rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel) 266 | 267 | buffer = QRBitBuffer(); 268 | 269 | for i in range(len(dataList)): 270 | data = dataList[i] 271 | buffer.put(data.mode, 4) 272 | buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ) 273 | data.write(buffer) 274 | 275 | #// calc num max data. 276 | totalDataCount = 0; 277 | for i in range(len(rsBlocks)): 278 | totalDataCount += rsBlocks[i].dataCount 279 | 280 | if (buffer.getLengthInBits() > totalDataCount * 8): 281 | raise Exception("code length overflow. (" 282 | + buffer.getLengthInBits() 283 | + ">" 284 | + totalDataCount * 8 285 | + ")") 286 | 287 | #// end code 288 | if (buffer.getLengthInBits() + 4 <= totalDataCount * 8): 289 | buffer.put(0, 4) 290 | 291 | #// padding 292 | while (buffer.getLengthInBits() % 8 != 0): 293 | buffer.putBit(False) 294 | 295 | #// padding 296 | while (True): 297 | 298 | if (buffer.getLengthInBits() >= totalDataCount * 8): 299 | break 300 | buffer.put(QRCode.PAD0, 8) 301 | 302 | if (buffer.getLengthInBits() >= totalDataCount * 8): 303 | break 304 | buffer.put(QRCode.PAD1, 8) 305 | 306 | return QRCode.createBytes(buffer, rsBlocks) 307 | 308 | @staticmethod 309 | def createBytes(buffer, rsBlocks): 310 | 311 | offset = 0 312 | 313 | maxDcCount = 0 314 | maxEcCount = 0 315 | 316 | dcdata = [0 for x in range(len(rsBlocks))] 317 | ecdata = [0 for x in range(len(rsBlocks))] 318 | 319 | for r in range(len(rsBlocks)): 320 | 321 | dcCount = rsBlocks[r].dataCount 322 | ecCount = rsBlocks[r].totalCount - dcCount 323 | 324 | maxDcCount = max(maxDcCount, dcCount) 325 | maxEcCount = max(maxEcCount, ecCount) 326 | 327 | dcdata[r] = [0 for x in range(dcCount)] 328 | 329 | for i in range(len(dcdata[r])): 330 | dcdata[r][i] = 0xff & buffer.buffer[i + offset] 331 | offset += dcCount 332 | 333 | rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount) 334 | rawPoly = QRPolynomial(dcdata[r], rsPoly.getLength() - 1) 335 | 336 | modPoly = rawPoly.mod(rsPoly) 337 | ecdata[r] = [0 for x in range(rsPoly.getLength()-1)] 338 | for i in range(len(ecdata[r])): 339 | modIndex = i + modPoly.getLength() - len(ecdata[r]) 340 | if (modIndex >= 0): 341 | ecdata[r][i] = modPoly.get(modIndex) 342 | else: 343 | ecdata[r][i] = 0 344 | 345 | totalCodeCount = 0 346 | for i in range(len(rsBlocks)): 347 | totalCodeCount += rsBlocks[i].totalCount 348 | 349 | data = [None for x in range(totalCodeCount)] 350 | index = 0 351 | 352 | for i in range(maxDcCount): 353 | for r in range(len(rsBlocks)): 354 | if (i < len(dcdata[r])): 355 | data[index] = dcdata[r][i] 356 | index+=1 357 | 358 | for i in range(maxEcCount): 359 | for r in range(len(rsBlocks)): 360 | if (i < len(ecdata[r])): 361 | data[index] = ecdata[r][i] 362 | index+=1 363 | 364 | return data 365 | 366 | 367 | class QRMode: 368 | MODE_NUMBER = 1 << 0 369 | MODE_ALPHA_NUM = 1 << 1 370 | MODE_8BIT_BYTE = 1 << 2 371 | MODE_KANJI = 1 << 3 372 | 373 | class QRErrorCorrectLevel: 374 | L = 1 375 | M = 0 376 | Q = 3 377 | H = 2 378 | 379 | class QRMaskPattern: 380 | PATTERN000 = 0 381 | PATTERN001 = 1 382 | PATTERN010 = 2 383 | PATTERN011 = 3 384 | PATTERN100 = 4 385 | PATTERN101 = 5 386 | PATTERN110 = 6 387 | PATTERN111 = 7 388 | 389 | class QRUtil(object): 390 | PATTERN_POSITION_TABLE = [ 391 | [], 392 | [6, 18], 393 | [6, 22], 394 | [6, 26], 395 | [6, 30], 396 | [6, 34], 397 | [6, 22, 38], 398 | [6, 24, 42], 399 | [6, 26, 46], 400 | [6, 28, 50], 401 | [6, 30, 54], 402 | [6, 32, 58], 403 | [6, 34, 62], 404 | [6, 26, 46, 66], 405 | [6, 26, 48, 70], 406 | [6, 26, 50, 74], 407 | [6, 30, 54, 78], 408 | [6, 30, 56, 82], 409 | [6, 30, 58, 86], 410 | [6, 34, 62, 90], 411 | [6, 28, 50, 72, 94], 412 | [6, 26, 50, 74, 98], 413 | [6, 30, 54, 78, 102], 414 | [6, 28, 54, 80, 106], 415 | [6, 32, 58, 84, 110], 416 | [6, 30, 58, 86, 114], 417 | [6, 34, 62, 90, 118], 418 | [6, 26, 50, 74, 98, 122], 419 | [6, 30, 54, 78, 102, 126], 420 | [6, 26, 52, 78, 104, 130], 421 | [6, 30, 56, 82, 108, 134], 422 | [6, 34, 60, 86, 112, 138], 423 | [6, 30, 58, 86, 114, 142], 424 | [6, 34, 62, 90, 118, 146], 425 | [6, 30, 54, 78, 102, 126, 150], 426 | [6, 24, 50, 76, 102, 128, 154], 427 | [6, 28, 54, 80, 106, 132, 158], 428 | [6, 32, 58, 84, 110, 136, 162], 429 | [6, 26, 54, 82, 110, 138, 166], 430 | [6, 30, 58, 86, 114, 142, 170] 431 | ] 432 | 433 | G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0) 434 | G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0) 435 | G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1) 436 | 437 | @staticmethod 438 | def getBCHTypeInfo(data): 439 | d = data << 10; 440 | while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0): 441 | d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) ) ) 442 | 443 | return ( (data << 10) | d) ^ QRUtil.G15_MASK 444 | @staticmethod 445 | def getBCHTypeNumber(data): 446 | d = data << 12; 447 | while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0): 448 | d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) ) ) 449 | return (data << 12) | d 450 | @staticmethod 451 | def getBCHDigit(data): 452 | digit = 0; 453 | while (data != 0): 454 | digit += 1 455 | data >>= 1 456 | return digit 457 | @staticmethod 458 | def getPatternPosition(typeNumber): 459 | return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1] 460 | @staticmethod 461 | def getMask(maskPattern, i, j): 462 | if maskPattern == QRMaskPattern.PATTERN000 : return (i + j) % 2 == 0 463 | if maskPattern == QRMaskPattern.PATTERN001 : return i % 2 == 0 464 | if maskPattern == QRMaskPattern.PATTERN010 : return j % 3 == 0 465 | if maskPattern == QRMaskPattern.PATTERN011 : return (i + j) % 3 == 0 466 | if maskPattern == QRMaskPattern.PATTERN100 : return (math.floor(i / 2) + math.floor(j / 3) ) % 2 == 0 467 | if maskPattern == QRMaskPattern.PATTERN101 : return (i * j) % 2 + (i * j) % 3 == 0 468 | if maskPattern == QRMaskPattern.PATTERN110 : return ( (i * j) % 2 + (i * j) % 3) % 2 == 0 469 | if maskPattern == QRMaskPattern.PATTERN111 : return ( (i * j) % 3 + (i + j) % 2) % 2 == 0 470 | raise Exception("bad maskPattern:" + maskPattern); 471 | @staticmethod 472 | def getErrorCorrectPolynomial(errorCorrectLength): 473 | a = QRPolynomial([1], 0); 474 | for i in range(errorCorrectLength): 475 | a = a.multiply(QRPolynomial([1, QRMath.gexp(i)], 0) ) 476 | return a 477 | @staticmethod 478 | def getLengthInBits(mode, type): 479 | 480 | if 1 <= type and type < 10: 481 | 482 | #// 1 - 9 483 | 484 | if mode == QRMode.MODE_NUMBER : return 10 485 | if mode == QRMode.MODE_ALPHA_NUM : return 9 486 | if mode == QRMode.MODE_8BIT_BYTE : return 8 487 | if mode == QRMode.MODE_KANJI : return 8 488 | raise Exception("mode:" + mode) 489 | 490 | elif (type < 27): 491 | 492 | #// 10 - 26 493 | 494 | if mode == QRMode.MODE_NUMBER : return 12 495 | if mode == QRMode.MODE_ALPHA_NUM : return 11 496 | if mode == QRMode.MODE_8BIT_BYTE : return 16 497 | if mode == QRMode.MODE_KANJI : return 10 498 | raise Exception("mode:" + mode) 499 | 500 | elif (type < 41): 501 | 502 | #// 27 - 40 503 | 504 | if mode == QRMode.MODE_NUMBER : return 14 505 | if mode == QRMode.MODE_ALPHA_NUM : return 13 506 | if mode == QRMode.MODE_8BIT_BYTE : return 16 507 | if mode == QRMode.MODE_KANJI : return 12 508 | raise Exception("mode:" + mode) 509 | 510 | else: 511 | raise Exception("type:" + type) 512 | @staticmethod 513 | def getLostPoint(qrCode): 514 | 515 | moduleCount = qrCode.getModuleCount(); 516 | 517 | lostPoint = 0; 518 | 519 | #// LEVEL1 520 | 521 | for row in range(moduleCount): 522 | 523 | for col in range(moduleCount): 524 | 525 | sameCount = 0; 526 | dark = qrCode.isDark(row, col); 527 | 528 | for r in range(-1, 2): 529 | 530 | if (row + r < 0 or moduleCount <= row + r): 531 | continue 532 | 533 | for c in range(-1, 2): 534 | 535 | if (col + c < 0 or moduleCount <= col + c): 536 | continue 537 | if (r == 0 and c == 0): 538 | continue 539 | 540 | if (dark == qrCode.isDark(row + r, col + c) ): 541 | sameCount+=1 542 | if (sameCount > 5): 543 | lostPoint += (3 + sameCount - 5) 544 | 545 | #// LEVEL2 546 | 547 | for row in range(moduleCount - 1): 548 | for col in range(moduleCount - 1): 549 | count = 0; 550 | if (qrCode.isDark(row, col ) ): count+=1 551 | if (qrCode.isDark(row + 1, col ) ): count+=1 552 | if (qrCode.isDark(row, col + 1) ): count+=1 553 | if (qrCode.isDark(row + 1, col + 1) ): count+=1 554 | if (count == 0 or count == 4): 555 | lostPoint += 3 556 | 557 | #// LEVEL3 558 | 559 | for row in range(moduleCount): 560 | for col in range(moduleCount - 6): 561 | if (qrCode.isDark(row, col) 562 | and not qrCode.isDark(row, col + 1) 563 | and qrCode.isDark(row, col + 2) 564 | and qrCode.isDark(row, col + 3) 565 | and qrCode.isDark(row, col + 4) 566 | and not qrCode.isDark(row, col + 5) 567 | and qrCode.isDark(row, col + 6) ): 568 | lostPoint += 40 569 | 570 | for col in range(moduleCount): 571 | for row in range(moduleCount - 6): 572 | if (qrCode.isDark(row, col) 573 | and not qrCode.isDark(row + 1, col) 574 | and qrCode.isDark(row + 2, col) 575 | and qrCode.isDark(row + 3, col) 576 | and qrCode.isDark(row + 4, col) 577 | and not qrCode.isDark(row + 5, col) 578 | and qrCode.isDark(row + 6, col) ): 579 | lostPoint += 40 580 | 581 | #// LEVEL4 582 | 583 | darkCount = 0; 584 | 585 | for col in range(moduleCount): 586 | for row in range(moduleCount): 587 | if (qrCode.isDark(row, col) ): 588 | darkCount+=1 589 | 590 | ratio = abs(100 * darkCount / moduleCount / moduleCount - 50) / 5 591 | lostPoint += ratio * 10 592 | 593 | return lostPoint 594 | 595 | class QRMath: 596 | 597 | @staticmethod 598 | def glog(n): 599 | if (n < 1): 600 | raise Exception("glog(" + n + ")") 601 | return LOG_TABLE[n]; 602 | @staticmethod 603 | def gexp(n): 604 | while n < 0: 605 | n += 255 606 | while n >= 256: 607 | n -= 255 608 | return EXP_TABLE[n]; 609 | 610 | EXP_TABLE = [x for x in range(256)] 611 | 612 | LOG_TABLE = [x for x in range(256)] 613 | 614 | for i in range(8): 615 | EXP_TABLE[i] = 1 << i; 616 | 617 | for i in range(8, 256): 618 | EXP_TABLE[i] = EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8] 619 | 620 | for i in range(255): 621 | LOG_TABLE[EXP_TABLE[i] ] = i 622 | 623 | class QRPolynomial: 624 | 625 | def __init__(self, num, shift): 626 | 627 | if (len(num) == 0): 628 | raise Exception(num.length + "/" + shift) 629 | 630 | offset = 0 631 | 632 | while offset < len(num) and num[offset] == 0: 633 | offset += 1 634 | 635 | self.num = [0 for x in range(len(num)-offset+shift)] 636 | for i in range(len(num) - offset): 637 | self.num[i] = num[i + offset] 638 | 639 | 640 | def get(self, index): 641 | return self.num[index] 642 | def getLength(self): 643 | return len(self.num) 644 | def multiply(self, e): 645 | num = [0 for x in range(self.getLength() + e.getLength() - 1)]; 646 | 647 | for i in range(self.getLength()): 648 | for j in range(e.getLength()): 649 | num[i + j] ^= QRMath.gexp(QRMath.glog(self.get(i) ) + QRMath.glog(e.get(j) ) ) 650 | 651 | return QRPolynomial(num, 0); 652 | def mod(self, e): 653 | 654 | if (self.getLength() - e.getLength() < 0): 655 | return self; 656 | 657 | ratio = QRMath.glog(self.get(0) ) - QRMath.glog(e.get(0) ) 658 | 659 | num = [0 for x in range(self.getLength())] 660 | 661 | for i in range(self.getLength()): 662 | num[i] = self.get(i); 663 | 664 | for i in range(e.getLength()): 665 | num[i] ^= QRMath.gexp(QRMath.glog(e.get(i) ) + ratio) 666 | 667 | # recursive call 668 | return QRPolynomial(num, 0).mod(e); 669 | 670 | class QRRSBlock: 671 | 672 | RS_BLOCK_TABLE = [ 673 | 674 | #// L 675 | #// M 676 | #// Q 677 | #// H 678 | 679 | #// 1 680 | [1, 26, 19], 681 | [1, 26, 16], 682 | [1, 26, 13], 683 | [1, 26, 9], 684 | 685 | #// 2 686 | [1, 44, 34], 687 | [1, 44, 28], 688 | [1, 44, 22], 689 | [1, 44, 16], 690 | 691 | #// 3 692 | [1, 70, 55], 693 | [1, 70, 44], 694 | [2, 35, 17], 695 | [2, 35, 13], 696 | 697 | #// 4 698 | [1, 100, 80], 699 | [2, 50, 32], 700 | [2, 50, 24], 701 | [4, 25, 9], 702 | 703 | #// 5 704 | [1, 134, 108], 705 | [2, 67, 43], 706 | [2, 33, 15, 2, 34, 16], 707 | [2, 33, 11, 2, 34, 12], 708 | 709 | #// 6 710 | [2, 86, 68], 711 | [4, 43, 27], 712 | [4, 43, 19], 713 | [4, 43, 15], 714 | 715 | #// 7 716 | [2, 98, 78], 717 | [4, 49, 31], 718 | [2, 32, 14, 4, 33, 15], 719 | [4, 39, 13, 1, 40, 14], 720 | 721 | #// 8 722 | [2, 121, 97], 723 | [2, 60, 38, 2, 61, 39], 724 | [4, 40, 18, 2, 41, 19], 725 | [4, 40, 14, 2, 41, 15], 726 | 727 | #// 9 728 | [2, 146, 116], 729 | [3, 58, 36, 2, 59, 37], 730 | [4, 36, 16, 4, 37, 17], 731 | [4, 36, 12, 4, 37, 13], 732 | 733 | #// 10 734 | [2, 86, 68, 2, 87, 69], 735 | [4, 69, 43, 1, 70, 44], 736 | [6, 43, 19, 2, 44, 20], 737 | [6, 43, 15, 2, 44, 16], 738 | 739 | # 11 740 | [4, 101, 81], 741 | [1, 80, 50, 4, 81, 51], 742 | [4, 50, 22, 4, 51, 23], 743 | [3, 36, 12, 8, 37, 13], 744 | 745 | # 12 746 | [2, 116, 92, 2, 117, 93], 747 | [6, 58, 36, 2, 59, 37], 748 | [4, 46, 20, 6, 47, 21], 749 | [7, 42, 14, 4, 43, 15], 750 | 751 | # 13 752 | [4, 133, 107], 753 | [8, 59, 37, 1, 60, 38], 754 | [8, 44, 20, 4, 45, 21], 755 | [12, 33, 11, 4, 34, 12], 756 | 757 | # 14 758 | [3, 145, 115, 1, 146, 116], 759 | [4, 64, 40, 5, 65, 41], 760 | [11, 36, 16, 5, 37, 17], 761 | [11, 36, 12, 5, 37, 13], 762 | 763 | # 15 764 | [5, 109, 87, 1, 110, 88], 765 | [5, 65, 41, 5, 66, 42], 766 | [5, 54, 24, 7, 55, 25], 767 | [11, 36, 12], 768 | 769 | # 16 770 | [5, 122, 98, 1, 123, 99], 771 | [7, 73, 45, 3, 74, 46], 772 | [15, 43, 19, 2, 44, 20], 773 | [3, 45, 15, 13, 46, 16], 774 | 775 | # 17 776 | [1, 135, 107, 5, 136, 108], 777 | [10, 74, 46, 1, 75, 47], 778 | [1, 50, 22, 15, 51, 23], 779 | [2, 42, 14, 17, 43, 15], 780 | 781 | # 18 782 | [5, 150, 120, 1, 151, 121], 783 | [9, 69, 43, 4, 70, 44], 784 | [17, 50, 22, 1, 51, 23], 785 | [2, 42, 14, 19, 43, 15], 786 | 787 | # 19 788 | [3, 141, 113, 4, 142, 114], 789 | [3, 70, 44, 11, 71, 45], 790 | [17, 47, 21, 4, 48, 22], 791 | [9, 39, 13, 16, 40, 14], 792 | 793 | # 20 794 | [3, 135, 107, 5, 136, 108], 795 | [3, 67, 41, 13, 68, 42], 796 | [15, 54, 24, 5, 55, 25], 797 | [15, 43, 15, 10, 44, 16], 798 | 799 | # 21 800 | [4, 144, 116, 4, 145, 117], 801 | [17, 68, 42], 802 | [17, 50, 22, 6, 51, 23], 803 | [19, 46, 16, 6, 47, 17], 804 | 805 | # 22 806 | [2, 139, 111, 7, 140, 112], 807 | [17, 74, 46], 808 | [7, 54, 24, 16, 55, 25], 809 | [34, 37, 13], 810 | 811 | # 23 812 | [4, 151, 121, 5, 152, 122], 813 | [4, 75, 47, 14, 76, 48], 814 | [11, 54, 24, 14, 55, 25], 815 | [16, 45, 15, 14, 46, 16], 816 | 817 | # 24 818 | [6, 147, 117, 4, 148, 118], 819 | [6, 73, 45, 14, 74, 46], 820 | [11, 54, 24, 16, 55, 25], 821 | [30, 46, 16, 2, 47, 17], 822 | 823 | # 25 824 | [8, 132, 106, 4, 133, 107], 825 | [8, 75, 47, 13, 76, 48], 826 | [7, 54, 24, 22, 55, 25], 827 | [22, 45, 15, 13, 46, 16], 828 | 829 | # 26 830 | [10, 142, 114, 2, 143, 115], 831 | [19, 74, 46, 4, 75, 47], 832 | [28, 50, 22, 6, 51, 23], 833 | [33, 46, 16, 4, 47, 17], 834 | 835 | # 27 836 | [8, 152, 122, 4, 153, 123], 837 | [22, 73, 45, 3, 74, 46], 838 | [8, 53, 23, 26, 54, 24], 839 | [12, 45, 15, 28, 46, 16], 840 | 841 | # 28 842 | [3, 147, 117, 10, 148, 118], 843 | [3, 73, 45, 23, 74, 46], 844 | [4, 54, 24, 31, 55, 25], 845 | [11, 45, 15, 31, 46, 16], 846 | 847 | # 29 848 | [7, 146, 116, 7, 147, 117], 849 | [21, 73, 45, 7, 74, 46], 850 | [1, 53, 23, 37, 54, 24], 851 | [19, 45, 15, 26, 46, 16], 852 | 853 | # 30 854 | [5, 145, 115, 10, 146, 116], 855 | [19, 75, 47, 10, 76, 48], 856 | [15, 54, 24, 25, 55, 25], 857 | [23, 45, 15, 25, 46, 16], 858 | 859 | # 31 860 | [13, 145, 115, 3, 146, 116], 861 | [2, 74, 46, 29, 75, 47], 862 | [42, 54, 24, 1, 55, 25], 863 | [23, 45, 15, 28, 46, 16], 864 | 865 | # 32 866 | [17, 145, 115], 867 | [10, 74, 46, 23, 75, 47], 868 | [10, 54, 24, 35, 55, 25], 869 | [19, 45, 15, 35, 46, 16], 870 | 871 | # 33 872 | [17, 145, 115, 1, 146, 116], 873 | [14, 74, 46, 21, 75, 47], 874 | [29, 54, 24, 19, 55, 25], 875 | [11, 45, 15, 46, 46, 16], 876 | 877 | # 34 878 | [13, 145, 115, 6, 146, 116], 879 | [14, 74, 46, 23, 75, 47], 880 | [44, 54, 24, 7, 55, 25], 881 | [59, 46, 16, 1, 47, 17], 882 | 883 | # 35 884 | [12, 151, 121, 7, 152, 122], 885 | [12, 75, 47, 26, 76, 48], 886 | [39, 54, 24, 14, 55, 25], 887 | [22, 45, 15, 41, 46, 16], 888 | 889 | # 36 890 | [6, 151, 121, 14, 152, 122], 891 | [6, 75, 47, 34, 76, 48], 892 | [46, 54, 24, 10, 55, 25], 893 | [2, 45, 15, 64, 46, 16], 894 | 895 | # 37 896 | [17, 152, 122, 4, 153, 123], 897 | [29, 74, 46, 14, 75, 47], 898 | [49, 54, 24, 10, 55, 25], 899 | [24, 45, 15, 46, 46, 16], 900 | 901 | # 38 902 | [4, 152, 122, 18, 153, 123], 903 | [13, 74, 46, 32, 75, 47], 904 | [48, 54, 24, 14, 55, 25], 905 | [42, 45, 15, 32, 46, 16], 906 | 907 | # 39 908 | [20, 147, 117, 4, 148, 118], 909 | [40, 75, 47, 7, 76, 48], 910 | [43, 54, 24, 22, 55, 25], 911 | [10, 45, 15, 67, 46, 16], 912 | 913 | # 40 914 | [19, 148, 118, 6, 149, 119], 915 | [18, 75, 47, 31, 76, 48], 916 | [34, 54, 24, 34, 55, 25], 917 | [20, 45, 15, 61, 46, 16] 918 | 919 | ] 920 | 921 | def __init__(self, totalCount, dataCount): 922 | self.totalCount = totalCount 923 | self.dataCount = dataCount 924 | 925 | @staticmethod 926 | def getRSBlocks(typeNumber, errorCorrectLevel): 927 | rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); 928 | if rsBlock == None: 929 | raise Exception("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel) 930 | 931 | length = int(len(rsBlock) / 3) 932 | 933 | list = [] 934 | 935 | for i in range(length): 936 | 937 | count = rsBlock[i * 3 + 0] 938 | totalCount = rsBlock[i * 3 + 1] 939 | dataCount = rsBlock[i * 3 + 2] 940 | 941 | for j in range(count): 942 | list.append(QRRSBlock(totalCount, dataCount)) 943 | 944 | return list; 945 | 946 | @staticmethod 947 | def getRsBlockTable(typeNumber, errorCorrectLevel): 948 | if errorCorrectLevel == QRErrorCorrectLevel.L: 949 | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; 950 | elif errorCorrectLevel == QRErrorCorrectLevel.M: 951 | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; 952 | elif errorCorrectLevel == QRErrorCorrectLevel.Q: 953 | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; 954 | elif errorCorrectLevel == QRErrorCorrectLevel.H: 955 | return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; 956 | else: 957 | return None; 958 | 959 | class QRBitBuffer: 960 | def __init__(self): 961 | self.buffer = [] 962 | self.length = 0 963 | def __repr__(self): 964 | return ".".join([str(n) for n in self.buffer]) 965 | def get(self, index): 966 | bufIndex = math.floor(index / 8) 967 | val = ( (self.buffer[bufIndex] >> (7 - index % 8) ) & 1) == 1 968 | print ("get "+str(val)) 969 | return ( (self.buffer[bufIndex] >> (7 - index % 8) ) & 1) == 1 970 | def put(self, num, length): 971 | for i in range(length): 972 | self.putBit( ( (num >> (length - i - 1) ) & 1) == 1) 973 | def getLengthInBits(self): 974 | return self.length 975 | def putBit(self, bit): 976 | bufIndex = self.length // 8 977 | if len(self.buffer) <= bufIndex: 978 | self.buffer.append(0) 979 | if bit: 980 | self.buffer[bufIndex] |= (0x80 >> (self.length % 8) ) 981 | self.length+=1 982 | -------------------------------------------------------------------------------- /module/qr-code/module.py: -------------------------------------------------------------------------------- 1 | # 2 | # Collective Knowledge (QR code) 3 | # 4 | # See CK LICENSE.txt for licensing details 5 | # See CK COPYRIGHT.txt for copyright details 6 | # 7 | # Developer: cTuning foundation 8 | # 9 | 10 | cfg={} # Will be updated by CK (meta description of this module) 11 | work={} # Will be updated by CK (temporal data) 12 | ck=None # Will be updated by CK (initialized CK kernel) 13 | 14 | # Local settings 15 | import os 16 | 17 | ############################################################################## 18 | # Initialize module 19 | 20 | def init(i): 21 | """ 22 | 23 | Input: {} 24 | 25 | Output: { 26 | return - return code = 0, if successful 27 | > 0, if error 28 | (error) - error text if return > 0 29 | } 30 | 31 | """ 32 | return {'return':0} 33 | 34 | ############################################################################## 35 | # generate QR code 36 | 37 | def generate(i): 38 | """ 39 | Input: { 40 | string - string to convert to qr-code 41 | (qr_level) - qr_level (default=3) 42 | (image_size) - picture size (default=512) 43 | (image_type) - picture type (default=PNG) 44 | 45 | (web) - if 'yes', return as web output 46 | (filename) - file to write (if not web) (default - qr-code.png) 47 | } 48 | 49 | Output: { 50 | return - return code = 0, if successful 51 | > 0, if error 52 | (error) - error text if return > 0 53 | 54 | 55 | full_filename - file with image 56 | } 57 | """ 58 | 59 | o=i.get('con','') 60 | 61 | s=i.get('string','') 62 | if s=='': return {'return':1, 'error':'string is not defined'} 63 | 64 | qrl=i.get('qr_level','3') # default 3 65 | ims=i.get('image_size','512') 66 | imt=i.get('image_type','PNG') 67 | 68 | web=i.get('web','') 69 | fn=i.get('filename','qr-code.png') 70 | 71 | # Import PyQRNative module 72 | r=ck.load_module_from_path({'path':work['path'], 73 | 'module_code_name':'PyQRNative', 74 | 'cfg':None, 75 | 'skip_init':'yes'}) 76 | if r['return']>0: return r 77 | qrm=r['code'] 78 | 79 | # Prepare QR code 80 | qr = qrm.QRCode(int(qrl), qrm.QRErrorCorrectLevel.L) 81 | qr.addData(s) 82 | qr.make() 83 | im = qr.makeImage() 84 | im1=im.resize((int(ims), int(ims))) 85 | 86 | # Check how to output 87 | rr={'return':0} 88 | 89 | if web=='yes' or o=='json' or o=='json_out': 90 | # Generate tmp file 91 | import tempfile 92 | fd, fn=tempfile.mkstemp(suffix='.tmp', prefix='ck-') 93 | os.close(fd) 94 | os.remove(fn) 95 | 96 | if os.path.isfile(fn): 97 | return {'return':1, 'error': 'file '+fn+' already exists'} 98 | 99 | # Save image 100 | try: 101 | im1.save(fn, imt) 102 | except Exception as e: 103 | return {'return':1, 'error':'problem writing image ('+format(e)+')'} 104 | 105 | # Finish web 106 | if web=='yes' or o=='json' or o=='json_out': 107 | r=ck.convert_file_to_upload_string({'filename':fn}) 108 | if r['return']>0: return r 109 | 110 | rr['file_content_base64']=r['file_content_base64'] 111 | rr['filename']='qr-code.'+imt.lower() 112 | 113 | os.remove(fn) 114 | 115 | return rr 116 | -------------------------------------------------------------------------------- /module/user/.cm/desc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /module/user/.cm/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "backup_data_uid": "31945a474d940ab0", 3 | "backup_module_uid": "032630d041b4fd8a", 4 | "backup_module_uoa": "module", 5 | "control": { 6 | "engine": "CK", 7 | "iso_datetime": "2019-03-01T09:42:31.595293", 8 | "version": [ 9 | "1", 10 | "9", 11 | "7", 12 | "1" 13 | ] 14 | }, 15 | "data_name": "user" 16 | } 17 | -------------------------------------------------------------------------------- /module/user/.cm/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": { 3 | "auth": { 4 | "desc": "authentication of a user", 5 | "for_web": "yes" 6 | }, 7 | "create": { 8 | "desc": "create account", 9 | "for_web": "yes" 10 | }, 11 | "renew": { 12 | "desc": "renew user", 13 | "for_web": "yes" 14 | } 15 | }, 16 | "desc": "web-based user auth" 17 | } 18 | -------------------------------------------------------------------------------- /module/user/.cm/updates.json: -------------------------------------------------------------------------------- 1 | { 2 | "control": [ 3 | { 4 | "engine": "CK", 5 | "iso_datetime": "2019-03-01T11:39:28.710071", 6 | "version": [ 7 | "1", 8 | "9", 9 | "7", 10 | "1" 11 | ] 12 | }, 13 | { 14 | "engine": "CK", 15 | "iso_datetime": "2019-03-01T12:09:49.869841", 16 | "version": [ 17 | "1", 18 | "9", 19 | "7", 20 | "1" 21 | ] 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /module/user/module.py: -------------------------------------------------------------------------------- 1 | # 2 | # Collective Knowledge (web-based user auth) 3 | # 4 | # 5 | # 6 | # 7 | # Developer: 8 | # 9 | 10 | cfg={} # Will be updated by CK (meta description of this module) 11 | work={} # Will be updated by CK (temporal data) 12 | ck=None # Will be updated by CK (initialized CK kernel) 13 | 14 | # Local settings 15 | 16 | ############################################################################## 17 | # Initialize module 18 | 19 | def init(i): 20 | """ 21 | 22 | Input: {} 23 | 24 | Output: { 25 | return - return code = 0, if successful 26 | > 0, if error 27 | (error) - error text if return > 0 28 | } 29 | 30 | """ 31 | return {'return':0} 32 | 33 | ############################################################################## 34 | # authentication of a user 35 | 36 | def auth(i): 37 | """ 38 | Input: { 39 | (web_vars_post) 40 | (web_vars_get) 41 | (web_vars_session) 42 | } 43 | 44 | Output: { 45 | return - return code = 0, if successful 46 | > 0, if error 47 | (error) - error text if return > 0 48 | 49 | user_id 50 | session_id 51 | } 52 | 53 | """ 54 | 55 | import re 56 | import hashlib 57 | 58 | rr={'return':0} 59 | 60 | wvp=i.get('web_vars_post',{}) 61 | 62 | # Check username 63 | username=wvp.get('username','').strip() 64 | if username=='': 65 | return {'return':1, 'error':'username is empty'} 66 | 67 | if not re.match("^[A-Za-z0-9.@_-]*$", username): 68 | return {'return':1, 'error':'username contains forbidden characters'} 69 | 70 | # Check password 71 | password=wvp.get('password','').strip() 72 | if password=='': 73 | return {'return':1, 'error':'password is empty'} 74 | 75 | password_md5=hashlib.md5(password.encode('utf8')).hexdigest() 76 | 77 | # Check if entry exists 78 | default_repo=ck.cfg.get('default_repo_to_write','') 79 | if default_repo=='': default_repo='local' 80 | 81 | r=ck.access({'action':'load', 82 | 'module_uoa':work['self_module_uid'], 83 | 'repo_uoa':default_repo, 84 | 'data_uoa':username}) 85 | if r['return']>0: 86 | if r['return']==16: return {'return':16, 'error':'Username not registered'} 87 | return r 88 | 89 | d=r['dict'] 90 | 91 | load_password_md5=d.get('password_md5','') 92 | if password_md5!=load_password_md5: 93 | return {'return':1, 'error':'password did not match'} 94 | 95 | # Generate random token for the session 96 | r=ck.gen_uid({}) 97 | if r['return']>0: return r 98 | 99 | rr['session_id']=r['data_uid'] 100 | rr['user_id']=username 101 | 102 | return rr 103 | 104 | ############################################################################## 105 | # create account 106 | 107 | def create(i): 108 | """ 109 | Input: { 110 | (web_vars_post) 111 | (web_vars_get) 112 | (web_vars_session) 113 | } 114 | 115 | Output: { 116 | return - return code = 0, if successful 117 | > 0, if error 118 | (error) - error text if return > 0 119 | 120 | user_id 121 | session_id 122 | } 123 | 124 | """ 125 | 126 | import re 127 | import hashlib 128 | 129 | rr={'return':0} 130 | 131 | wvp=i.get('web_vars_post',{}) 132 | 133 | # Check username 134 | username=wvp.get('username','').strip() 135 | if username=='': 136 | return {'return':1, 'error':'username is empty'} 137 | 138 | if not re.match("^[A-Za-z0-9.@_-]*$", username): 139 | return {'return':1, 'error':'username contains forbidden characters'} 140 | 141 | # Check password 142 | password=wvp.get('password','').strip() 143 | if password=='': 144 | return {'return':1, 'error':'password is empty'} 145 | 146 | password_md5=hashlib.md5(password.encode('utf8')).hexdigest() 147 | 148 | # Check email 149 | email=wvp.get('email','').strip() 150 | if email=='': 151 | return {'return':1, 'error':'email is empty'} 152 | 153 | realname=wvp.get('realname','').strip() 154 | 155 | # Check if entry exists 156 | default_repo=ck.cfg.get('default_repo_to_write','') 157 | if default_repo=='': default_repo='local' 158 | 159 | r=ck.access({'action':'load', 160 | 'module_uoa':work['self_module_uid'], 161 | 'repo_uoa':default_repo, 162 | 'data_uoa':username}) 163 | if r['return']==0: 164 | return {'return':32, 'error':'Username already registered'} 165 | 166 | if r['return']!=16: return r 167 | 168 | # Create entry 169 | d={'password_md5':password_md5, 170 | 'email':email, 171 | 'realname':realname} 172 | 173 | r=ck.access({'action':'add', 174 | 'module_uoa':work['self_module_uid'], 175 | 'repo_uoa':default_repo, 176 | 'data_uoa':username, 177 | 'dict':d, 178 | 'sort_key':'yes'}) 179 | if r['return']>0: return r 180 | 181 | # Generate random token for the session 182 | r=ck.gen_uid({}) 183 | if r['return']>0: return r 184 | 185 | rr['session_id']=r['data_uid'] 186 | rr['user_id']=username 187 | 188 | return rr 189 | 190 | ############################################################################## 191 | # renew user 192 | 193 | def renew(i): 194 | """ 195 | Input: { 196 | (web_vars_post) 197 | (web_vars_get) 198 | (web_vars_session) 199 | } 200 | 201 | Output: { 202 | return - return code = 0, if successful 203 | > 0, if error 204 | (error) - error text if return > 0 205 | 206 | user_id 207 | session_id 208 | } 209 | 210 | """ 211 | 212 | import re 213 | import hashlib 214 | 215 | rr={'return':0} 216 | 217 | wvp=i.get('web_vars_post',{}) 218 | 219 | # Check username 220 | username=wvp.get('username','').strip() 221 | if username=='': 222 | return {'return':1, 'error':'username is empty'} 223 | 224 | if not re.match("^[A-Za-z0-9.@_-]*$", username): 225 | return {'return':1, 'error':'username contains forbidden characters'} 226 | 227 | # Load user 228 | default_repo=ck.cfg.get('default_repo_to_write','') 229 | if default_repo=='': default_repo='local' 230 | 231 | r=ck.access({'action':'load', 232 | 'module_uoa':work['self_module_uid'], 233 | 'repo_uoa':default_repo, 234 | 'data_uoa':username}) 235 | if r['return']>0: return r 236 | 237 | d=r['dict'] 238 | 239 | # Check password 240 | password=wvp.get('password','').strip() 241 | if password!='': 242 | password_md5=hashlib.md5(password.encode('utf8')).hexdigest() 243 | d['password_md5']=password_md5 244 | 245 | # Check email 246 | email=wvp.get('email','').strip() 247 | if email!='': 248 | d['email']=email 249 | 250 | realname=wvp.get('realname','').strip() 251 | if realname!='': 252 | d['realname']=realname 253 | 254 | # Update entry 255 | r=ck.access({'action':'update', 256 | 'module_uoa':work['self_module_uid'], 257 | 'repo_uoa':default_repo, 258 | 'data_uoa':username, 259 | 'dict':d, 260 | 'substitute':'yes', 261 | 'sort_key':'yes'}) 262 | if r['return']>0: return r 263 | 264 | return {'return':0} 265 | -------------------------------------------------------------------------------- /module/wfe/.cm/desc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /module/wfe/.cm/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "backup_data_uid": "1e4e644996b7f2a0", 3 | "backup_module_uid": "032630d041b4fd8a", 4 | "backup_module_uoa": "module", 5 | "control": { 6 | "engine": "CK", 7 | "iso_datetime": "2014-11-13T15:16:14.195000", 8 | "user_name": "cTuning foundation", 9 | "version": [ 10 | "0", 11 | "1", 12 | "140810", 13 | "beta" 14 | ] 15 | }, 16 | "data_name": "wfe" 17 | } 18 | -------------------------------------------------------------------------------- /module/wfe/.cm/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": { 3 | "clean": { 4 | "desc": "clean tmp cache of a CK web service" 5 | }, 6 | "convert_ck_list_to_select_data": { 7 | "desc": "convert CK list to html to select data" 8 | }, 9 | "create_button": { 10 | "desc": "create html button" 11 | }, 12 | "create_input": { 13 | "desc": "create html search" 14 | }, 15 | "create_selector": { 16 | "desc": "create html universal selector" 17 | }, 18 | "form_url_prefix": { 19 | "desc": "form URL prefix (if used via CK web server or via third-party web server and PHP)" 20 | }, 21 | "index": { 22 | "desc": "browse CK repositories", 23 | "for_web": "yes" 24 | }, 25 | "parse_txt": { 26 | "desc": "parse text or json files to process, high-light and cross-link special CK words including $#cm_, $#ck_, http ...", 27 | "for_web": "yes" 28 | }, 29 | "process_all_pages": { 30 | "desc": "process all pages and convert them into static ones (to create static websites)" 31 | }, 32 | "process_ck_page": { 33 | "desc": "process special CK words in html pages", 34 | "for_web": "yes" 35 | }, 36 | "start_form": { 37 | "desc": "start html form" 38 | }, 39 | "view_page": { 40 | "desc": "view a given CK page", 41 | "for_web": "yes" 42 | }, 43 | "webadd": { 44 | "desc": "add/update CK entries via html", 45 | "for_web": "yes" 46 | } 47 | }, 48 | "copyright": "See CK COPYRIGHT.txt for copyright details", 49 | "desc": "CK web front-end (browsing repository and entries, visualizing experiments, viewing interactive graphs and articles, etc)", 50 | "developer": "cTuning foundation", 51 | "license": "See CK LICENSE.txt for licensing details", 52 | "top_menu": [ 53 | { 54 | "module_uoa": "report", 55 | "module_uoas": [ 56 | "report", 57 | "1e348bd6ab43ce8a" 58 | ], 59 | "name": "Reports" 60 | }, 61 | { 62 | "module_uoa": "graph", 63 | "module_uoas": [ 64 | "graph", 65 | "2d41f89bcf32d4d4" 66 | ], 67 | "name": "Graphs" 68 | }, 69 | { 70 | "module_uoa": "experiment", 71 | "module_uoas": [ 72 | "experiment", 73 | "bc0409fb61f0aa82" 74 | ], 75 | "name": "Experiments" 76 | }, 77 | { 78 | "module_uoa": "program", 79 | "module_uoas": [ 80 | "program", 81 | "b0ac08fe1d3c2615" 82 | ], 83 | "name": "Programs" 84 | }, 85 | { 86 | "module_uoa": "dataset", 87 | "module_uoas": [ 88 | "dataset", 89 | "8a7141c59cd335f5" 90 | ], 91 | "name": "Datasets" 92 | }, 93 | { 94 | "module_uoa": "model", 95 | "module_uoas": [ 96 | "model", 97 | "f92b25ca2f1a98ae" 98 | ], 99 | "name": "Models" 100 | }, 101 | { 102 | "module_uoa": "", 103 | "module_uoas": [ 104 | "" 105 | ], 106 | "name": "Browse" 107 | }, 108 | { 109 | "name": "Discussions", 110 | "url": "https://groups.google.com/forum/#!forum/collective-knowledge" 111 | }, 112 | { 113 | "name": "Get CK", 114 | "url": "http://github.com/ctuning/ck" 115 | } 116 | ] 117 | } 118 | -------------------------------------------------------------------------------- /module/wfe/.cm/meta.json.arc1: -------------------------------------------------------------------------------- 1 | { 2 | "actions": { 3 | "clean": { 4 | "desc": "clean tmp cache of a CK web service" 5 | }, 6 | "convert_ck_list_to_select_data": { 7 | "desc": "convert CK list to html to select data" 8 | }, 9 | "create_button": { 10 | "desc": "create html button" 11 | }, 12 | "create_input": { 13 | "desc": "create html search" 14 | }, 15 | "create_selector": { 16 | "desc": "create html universal selector" 17 | }, 18 | "form_url_prefix": { 19 | "desc": "form URL prefix (if used via CK web server or via third-party web server and PHP)" 20 | }, 21 | "index": { 22 | "desc": "browse CK repositories", 23 | "for_web": "yes" 24 | }, 25 | "parse_txt": { 26 | "desc": "parse text or json files to process, high-light and cross-link special CK words including $#cm_, $#ck_, http ...", 27 | "for_web": "yes" 28 | }, 29 | "process_all_pages": { 30 | "desc": "process all pages and convert them into static ones (to create static websites)" 31 | }, 32 | "process_ck_page": { 33 | "desc": "process special CK words in html pages", 34 | "for_web": "yes" 35 | }, 36 | "start_form": { 37 | "desc": "start html form" 38 | }, 39 | "view_page": { 40 | "desc": "view a given CK page", 41 | "for_web": "yes" 42 | }, 43 | "webadd": { 44 | "desc": "add/update CK entries via html", 45 | "for_web": "yes" 46 | } 47 | }, 48 | "copyright": "See CK COPYRIGHT.txt for copyright details", 49 | "desc": "CK web front-end (browsing repository and entries, visualizing experiments, viewing interactive graphs and articles, etc)", 50 | "developer": "cTuning foundation", 51 | "license": "See CK LICENSE.txt for licensing details", 52 | "top_menu": [ 53 | { 54 | "name": "CrowdResults", 55 | "native_module_uoa": "program.optimization", 56 | "url_extra": "action=index&module_uoa=wfe&native_action=show&native_module_uoa=program.optimization" 57 | }, 58 | { 59 | "module_uoa": "report", 60 | "module_uoas": [ 61 | "report", 62 | "1e348bd6ab43ce8a" 63 | ], 64 | "name": "Reports" 65 | }, 66 | { 67 | "module_uoa": "graph", 68 | "module_uoas": [ 69 | "graph", 70 | "2d41f89bcf32d4d4" 71 | ], 72 | "name": "Graphs" 73 | }, 74 | { 75 | "module_uoa": "experiment", 76 | "module_uoas": [ 77 | "experiment", 78 | "bc0409fb61f0aa82" 79 | ], 80 | "name": "Experiments" 81 | }, 82 | { 83 | "module_uoa": "program", 84 | "module_uoas": [ 85 | "program", 86 | "b0ac08fe1d3c2615" 87 | ], 88 | "name": "Benchmarks" 89 | }, 90 | { 91 | "module_uoa": "dataset", 92 | "module_uoas": [ 93 | "dataset", 94 | "8a7141c59cd335f5" 95 | ], 96 | "name": "Datasets" 97 | }, 98 | { 99 | "module_uoa": "model", 100 | "module_uoas": [ 101 | "model", 102 | "f92b25ca2f1a98ae" 103 | ], 104 | "name": "Models" 105 | }, 106 | { 107 | "module_uoa": "", 108 | "module_uoas": [ 109 | "" 110 | ], 111 | "name": "Browse" 112 | }, 113 | { 114 | "name": "Discussions", 115 | "url": "https://groups.google.com/forum/#!forum/collective-knowledge" 116 | }, 117 | { 118 | "name": "Get CK", 119 | "url": "http://github.com/ctuning/ck" 120 | } 121 | ] 122 | } 123 | -------------------------------------------------------------------------------- /module/wfe/.cm/updates.json: -------------------------------------------------------------------------------- 1 | { 2 | "control": [ 3 | { 4 | "author": "Grigori Fursin", 5 | "author_email": "Grigori.Fursin@cTuning.org", 6 | "author_webpage": "http://fursin.net", 7 | "copyright": "See CK COPYRIGHT.txt for copyright details", 8 | "engine": "CK", 9 | "iso_datetime": "2015-06-18T10:16:38.803000", 10 | "license": "See CK LICENSE.txt for licensing details", 11 | "version": [ 12 | "1", 13 | "2", 14 | "0605" 15 | ] 16 | }, 17 | { 18 | "author": "Grigori Fursin", 19 | "author_email": "Grigori.Fursin@cTuning.org", 20 | "author_webpage": "http://fursin.net", 21 | "copyright": "See CK COPYRIGHT.txt for copyright details", 22 | "engine": "CK", 23 | "iso_datetime": "2015-07-10T12:27:14.397000", 24 | "license": "See CK LICENSE.txt for licensing details", 25 | "version": [ 26 | "1", 27 | "2", 28 | "0605" 29 | ] 30 | }, 31 | { 32 | "author": "Grigori Fursin", 33 | "author_email": "Grigori.Fursin@cTuning.org", 34 | "author_webpage": "http://fursin.net", 35 | "copyright": "See CK COPYRIGHT.txt for copyright details", 36 | "engine": "CK", 37 | "iso_datetime": "2016-05-30T12:23:48.123000", 38 | "license": "See CK LICENSE.txt for licensing details", 39 | "version": [ 40 | "1", 41 | "7", 42 | "2dev" 43 | ] 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /wfe/.cm/alias-a-dashboard: -------------------------------------------------------------------------------- 1 | 0c59982d4480b4ee 2 | -------------------------------------------------------------------------------- /wfe/.cm/alias-a-default: -------------------------------------------------------------------------------- 1 | 6b411f75e774059b 2 | -------------------------------------------------------------------------------- /wfe/.cm/alias-u-0c59982d4480b4ee: -------------------------------------------------------------------------------- 1 | dashboard 2 | -------------------------------------------------------------------------------- /wfe/.cm/alias-u-6b411f75e774059b: -------------------------------------------------------------------------------- 1 | default 2 | -------------------------------------------------------------------------------- /wfe/dashboard/.cm/desc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /wfe/dashboard/.cm/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "backup_data_uid": "0c59982d4480b4ee", 3 | "backup_module_uid": "1e4e644996b7f2a0", 4 | "backup_module_uoa": "wfe", 5 | "control": { 6 | "engine": "CK", 7 | "iso_datetime": "2018-10-18T13:27:40.934710", 8 | "version": [ 9 | "1", 10 | "9", 11 | "6" 12 | ] 13 | }, 14 | "data_name": "dashboard" 15 | } 16 | -------------------------------------------------------------------------------- /wfe/dashboard/.cm/meta.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /wfe/dashboard/ck-repo-widget/widget.css: -------------------------------------------------------------------------------- 1 | .ck-repo-widget-plot-axis path, .ck-repo-widget-plot-axis line { 2 | fill: none; 3 | stroke: #000; 4 | shape-rendering: crispEdges; 5 | } 6 | 7 | .ck-repo-widget-plot-dot { 8 | cursor: pointer; 9 | } 10 | 11 | .ck-repo-widget-plot-tooltip { 12 | position: absolute; 13 | border: 0.5px solid gray; 14 | border-radius: 5px; 15 | padding: 5px; 16 | background: white; 17 | } 18 | 19 | .ck-repo-widget-plot-tooltip-link { 20 | color: #1F5A9F; 21 | text-decoration: underline; 22 | cursor: pointer; 23 | } 24 | 25 | .ck-repo-widget { 26 | font: 12px sans-serif; 27 | display: -webkit-box; 28 | display: -ms-flexbox; 29 | display: flex; 30 | -webkit-box-orient: vertical; 31 | -webkit-box-direction: normal; 32 | -ms-flex-direction: column; 33 | flex-direction: column; 34 | padding-bottom: 74px; 35 | } 36 | 37 | .ck-repo-widget-selectors-container { 38 | margin-bottom: 10px; 39 | margin-right: auto; 40 | margin-left: auto; 41 | } 42 | 43 | .ck-repo-widget-plot-container { 44 | margin-right: auto; 45 | margin-left: auto; 46 | margin-top: 24px; 47 | margin-bottom: 48px; 48 | } 49 | 50 | @media screen and (max-width: 960px) { 51 | .ck-repo-widget-plot-container { 52 | display: none; 53 | } 54 | } 55 | 56 | .ck-repo-widget-selectors-container_filters { 57 | margin-bottom: 40px; 58 | } 59 | 60 | .ck-repo-widget-selectors-container_filters:last-child {} 61 | 62 | /* 63 | .ck-repo-widget-plot-center-btn { 64 | background: #fff; 65 | border-radius: 15px; 66 | border: 1px solid lightgray; 67 | height: 30px; 68 | position: absolute; 69 | right: 15px; 70 | top: 15px; 71 | width: 30px; 72 | } 73 | */ 74 | 75 | /* 76 | thead th { 77 | position: -webkit-sticky; 78 | position: sticky; 79 | top: -1px; 80 | z-index: 1; 81 | } 82 | */ 83 | 84 | .ck-repo-widget-table-container { 85 | overflow: auto; 86 | margin-left: auto; 87 | margin-right: auto; 88 | max-width: 100%; 89 | } 90 | 91 | .ck-repo-widget-table { 92 | border-collapse: collapse; 93 | font-size: 12px; 94 | } 95 | 96 | .ck-repo-widget-thead {} 97 | 98 | .ck-repo-widget-tbody {} 99 | 100 | .ck-repo-widget-tr { 101 | background: #FFFFFF; 102 | } 103 | 104 | .ck-repo-widget-tr-selected { 105 | background: #FFFFCC; 106 | } 107 | 108 | .ck-repo-widget-th { 109 | background: rgb(244, 247, 250); 110 | border: 1px solid #E0E0E0; 111 | color: #383838; 112 | font-family: Roboto; 113 | font-size: 14px; 114 | font-style: normal; 115 | font-weight: bold; 116 | letter-spacing: 0.03em; 117 | line-height: 16px; 118 | padding: 10px; 119 | text-align: left; 120 | vertical-align: top; 121 | } 122 | 123 | .ck-repo-widget-th:not(:first-child) { 124 | min-width: 80px; 125 | } 126 | 127 | .ck-repo-widget-td { 128 | border: 1px solid #E0E0E0; 129 | color: #383838; 130 | font-family: Roboto; 131 | font-size: 14px; 132 | font-style: normal; 133 | font-weight: normal; 134 | line-height: 20px; 135 | padding: 10px; 136 | vertical-align: top; 137 | } 138 | 139 | /* 140 | .ck-repo-widget-tr td:first-child { 141 | position: -webkit-sticky; 142 | position: sticky; 143 | left: -1px; 144 | } 145 | */ 146 | 147 | .ck-repo-widget-filter { 148 | display: inline-block; 149 | margin-right: 25px; 150 | margin-bottom: 16px; 151 | } 152 | 153 | .ck-repo-widget-th:first-child, .ck-repo-widget-td:first-child { 154 | border-left: none; 155 | } 156 | 157 | .ck-repo-widget-th:last-child, .ck-repo-widget-td:last-child { 158 | border-right: none; 159 | } 160 | 161 | .ck-repo-widget-th-sort { 162 | background-image: linear-gradient(transparent,transparent), 163 | url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%229%22 viewBox=%220 0 21 9%22%3E %3Cpath d=%22M14.5 5l-4 4-4-4zM14.5 4l-4-4-4 4z%22/%3E %3C/svg%3E"); 164 | cursor: pointer; 165 | background-repeat: no-repeat; 166 | background-position: center right; 167 | padding-right: 21px; 168 | } 169 | 170 | .ck-repo-widget-th-sort-down { 171 | background-image: linear-gradient(transparent,transparent), 172 | url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%229%22 viewBox=%220 0 21 9%22%3E %3Cpath d=%22M14.5 5l-4 4-4-4z%22/%3E %3C/svg%3E"); 173 | cursor: pointer; 174 | background-repeat: no-repeat; 175 | background-position: center right; 176 | padding-right: 21px; 177 | } 178 | 179 | .ck-repo-widget-th-sort-up { 180 | background-image: linear-gradient(transparent,transparent), 181 | url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%229%22 viewBox=%220 0 21 9%22%3E %3Cpath d=%22M14.5 4l-4-4-4 4z%22/%3E %3C/svg%3E"); 182 | cursor: pointer; 183 | background-repeat: no-repeat; 184 | background-position: center right; 185 | padding-right: 21px; 186 | } 187 | 188 | .ck-repo-widget-plot-variation-x, .ck-repo-widget-plot-variation-y { 189 | stroke-width: 1px; 190 | } 191 | 192 | .ck-repo-widget-plot-line { 193 | fill: none; 194 | stroke: black; 195 | } 196 | 197 | .ck-repo-widget-cmd-btn { 198 | font-family: Roboto; 199 | font-style: normal; 200 | font-weight: 500; 201 | line-height: 20px; 202 | font-size: 14px; 203 | color: #1F5A9F; 204 | cursor: pointer; 205 | } 206 | 207 | .ck-repo-widget-cmd-btn-label { 208 | border-bottom: 1px dotted #1F5A9F; 209 | } 210 | 211 | .ck-repo-widget-side-panel { 212 | width: 368px; 213 | height: 100%; 214 | background: #FFFFFF; 215 | -webkit-box-shadow: -4px 0px 0px rgba(56, 56, 56, 0.2), -1px 0px 0px rgba(0, 0, 0, 0.08); 216 | box-shadow: -4px 0px 0px rgba(56, 56, 56, 0.2), -1px 0px 0px rgba(0, 0, 0, 0.08); 217 | position: fixed; 218 | right: -372px; 219 | top: 0; 220 | display: -webkit-box; 221 | display: -ms-flexbox; 222 | display: flex; 223 | -webkit-box-orient: vertical; 224 | -webkit-box-direction: normal; 225 | -ms-flex-direction: column; 226 | flex-direction: column; 227 | z-index: 2000; 228 | -webkit-transform: translate(0px, 0px); 229 | transform: translate(0px, 0px); 230 | font: 12px sans-serif; 231 | } 232 | 233 | .ck-repo-widget-side-panel-header { 234 | height: 68px; 235 | min-height: 68px; 236 | background: #FFFFFF; 237 | border-bottom: 1px solid rgba(0, 0, 0, 0.08); 238 | display: -webkit-box; 239 | display: -ms-flexbox; 240 | display: flex; 241 | -webkit-box-orient: horizontal; 242 | -webkit-box-direction: normal; 243 | -ms-flex-direction: row; 244 | flex-direction: row; 245 | -webkit-box-align: center; 246 | -ms-flex-align: center; 247 | align-items: center; 248 | -webkit-box-pack: justify; 249 | -ms-flex-pack: justify; 250 | justify-content: space-between; 251 | padding-left: 24px; 252 | padding-right: 24px; 253 | } 254 | 255 | .ck-repo-widget-side-panel-header-tabs-layout { 256 | display: -webkit-box; 257 | display: -ms-flexbox; 258 | display: flex; 259 | -webkit-box-orient: horizontal; 260 | -webkit-box-direction: normal; 261 | -ms-flex-direction: row; 262 | flex-direction: row; 263 | } 264 | 265 | .ck-repo-widget-side-panel-header-tab { 266 | font-family: League Spartan; 267 | font-size: 12px; 268 | letter-spacing: 0.05em; 269 | line-height: 16px; 270 | text-transform: uppercase; 271 | } 272 | 273 | .ck-repo-widget-side-panel-header-tab-btn { 274 | color: #1F5A9F; 275 | font-family: League Spartan; 276 | font-size: 12px; 277 | letter-spacing: 0.05em; 278 | line-height: 16px; 279 | text-transform: uppercase; 280 | cursor: pointer; 281 | } 282 | 283 | .ck-repo-widget-side-panel-header-tab-btn_active { 284 | color: #EF4E4E; 285 | border-bottom: 1px solid #EF4E4E; 286 | } 287 | 288 | .ck-repo-widget-side-panel-header-tab-btn:not(:first-child) { 289 | margin-left: 32px; 290 | } 291 | 292 | .ck-repo-widget-side-panel-header-close-btn { 293 | color: #383838; 294 | opacity: 0.7; 295 | cursor: pointer; 296 | font-size: 14px; 297 | } 298 | 299 | .ck-repo-widget-side-panel-body { 300 | overflow-x: hidden; 301 | overflow-y: auto; 302 | padding-bottom: 8px; 303 | padding: 24px; 304 | } 305 | 306 | .ck-repo-widget-filter-title { 307 | font-family: Roboto; 308 | font-style: normal; 309 | font-weight: bold; 310 | line-height: 16px; 311 | font-size: 12px; 312 | letter-spacing: 0.03em; 313 | color: #383838; 314 | margin-bottom: 6px; 315 | } 316 | 317 | .ck-repo-widget-filter-title-link { 318 | font-family: Roboto; 319 | font-style: normal; 320 | font-weight: bold; 321 | line-height: 16px; 322 | font-size: 12px; 323 | letter-spacing: 0.03em; 324 | color: #1F5A9F; 325 | margin-bottom: 16px; 326 | text-decoration: underline; 327 | cursor: pointer; 328 | } 329 | 330 | .ck-repo-widget-select { 331 | -moz-appearance: none; 332 | -webkit-appearance: none; 333 | appearance: none; 334 | background-color: #FFFFFF; 335 | background-image: url("data:image/svg+xml;utf8,"); 336 | background-position: calc(100% - 8px) center; 337 | background-repeat: no-repeat; 338 | border-radius: 0; 339 | border: 1px solid #C4C4C4; 340 | -webkit-box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); 341 | box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); 342 | -webkit-box-sizing: border-box; 343 | box-sizing: border-box; 344 | color: #383838; 345 | font-family: Roboto; 346 | font-size: 13px; 347 | font-style: normal; 348 | font-weight: normal; 349 | height: 32px; 350 | line-height: normal; 351 | max-width: 320px; 352 | min-width: 120px; 353 | overflow: hidden; 354 | padding-left: 8px; 355 | padding-right: 24px; 356 | text-overflow: ellipsis; 357 | } 358 | 359 | .ck-repo-widget-select_number { 360 | background-image: none; 361 | padding-right: 8px; 362 | width: 120px; 363 | } 364 | 365 | .ck-repo-widget-select_workflow-container { 366 | -webkit-box-flex: 1; 367 | -ms-flex-positive: 1; 368 | flex-grow: 1; 369 | } 370 | 371 | .ck-repo-widget-select_workflow { 372 | font-size: 13px; 373 | width: 100%; 374 | min-width: 100%; 375 | } 376 | 377 | .ck-repo-widget-filter-variation { 378 | display: -webkit-box; 379 | display: -ms-flexbox; 380 | display: flex; 381 | -webkit-box-orient: horizontal; 382 | -webkit-box-direction: normal; 383 | -ms-flex-direction: row; 384 | flex-direction: row; 385 | -webkit-box-align: center; 386 | -ms-flex-align: center; 387 | align-items: center; 388 | margin-top: 12px; 389 | cursor: pointer; 390 | } 391 | 392 | .ck-repo-widget-filter-variation input { 393 | margin-right: 8px; 394 | cursor: pointer; 395 | pointer-events: none; 396 | } 397 | 398 | .ck-repo-widget-side-panel-btn { 399 | color: #1F5A9F; 400 | cursor: pointer; 401 | display: block; 402 | font-size: 22px; 403 | height: 22px; 404 | margin-left: 24px; 405 | min-height: 22px; 406 | min-width: 22px; 407 | width: 22px; 408 | margin-bottom:6px; 409 | } 410 | 411 | .ck-repo-widget-side-panel-btn_info { 412 | border: 2px solid #1F5A9F; 413 | border-radius: 22px; 414 | display: -webkit-box; 415 | display: -ms-flexbox; 416 | display: flex; 417 | -ms-flex-pack: distribute; 418 | justify-content: space-around; 419 | -webkit-box-align: center; 420 | -ms-flex-align: center; 421 | align-items: center; 422 | font-size: 12px; 423 | } 424 | 425 | .ck-repo-widget-side-panel-btn_info i { 426 | padding-left: 1px; 427 | } 428 | 429 | .ck-repo-widget-workflow-panel { 430 | -webkit-box-align: center; 431 | -ms-flex-align: center; 432 | align-items: flex-end; 433 | display: -webkit-box; 434 | display: -ms-flexbox; 435 | display: flex; 436 | -webkit-box-orient: horizontal; 437 | -webkit-box-direction: normal; 438 | -ms-flex-direction: row; 439 | flex-direction: row; 440 | margin-bottom: 10px; 441 | margin-top: 16px; 442 | margin-left: auto; 443 | margin-right: auto; 444 | max-width: 880px; 445 | width: 100%; 446 | } 447 | 448 | .ck-repo-widget-info-section { 449 | margin-bottom: 32px; 450 | } 451 | 452 | .ck-repo-widget-info-title-container { 453 | margin-bottom: 12px; 454 | } 455 | 456 | .ck-repo-widget-info-title { 457 | font-family: Roboto; 458 | font-style: normal; 459 | font-weight: bold; 460 | line-height: 16px; 461 | font-size: 14px; 462 | letter-spacing: 0.03em; 463 | color: #383838; 464 | } 465 | 466 | .ck-repo-widget-info-link { 467 | font-family: Roboto; 468 | font-style: normal; 469 | font-weight: 500; 470 | line-height: 20px; 471 | font-size: 14px; 472 | color: #1F5A9F; 473 | text-decoration: underline; 474 | cursor: pointer; 475 | display: block; 476 | } 477 | 478 | .ck-repo-widget-info-link_small { 479 | line-height: 16px; 480 | font-size: 12px; 481 | margin-left: 4px; 482 | } 483 | 484 | .ck-repo-widget-info-link_divided { 485 | margin-bottom: 20px; 486 | } 487 | 488 | .ck-repo-widget-info-value-container { 489 | display: -webkit-box; 490 | display: -ms-flexbox; 491 | display: flex; 492 | -webkit-box-orient: horizontal; 493 | -webkit-box-direction: normal; 494 | -ms-flex-direction: row; 495 | flex-direction: row; 496 | -webkit-box-pack: justify; 497 | -ms-flex-pack: justify; 498 | justify-content: space-between; 499 | -webkit-box-align: center; 500 | -ms-flex-align: center; 501 | align-items: center; 502 | } 503 | 504 | .ck-repo-widget-info-value { 505 | font-family: Roboto; 506 | font-style: normal; 507 | font-weight: normal; 508 | line-height: 20px; 509 | font-size: 14px; 510 | text-align: right; 511 | color: #383838; 512 | opacity: 0.5; 513 | } 514 | 515 | .ck-repo-widget-info-github-link-container { 516 | display: -webkit-box; 517 | display: -ms-flexbox; 518 | display: flex; 519 | -webkit-box-orient: horizontal; 520 | -webkit-box-direction: normal; 521 | -ms-flex-direction: row; 522 | flex-direction: row; 523 | -webkit-box-align: center; 524 | -ms-flex-align: center; 525 | align-items: center; 526 | color: #1F5A9F; 527 | cursor: pointer; 528 | text-decoration: none; 529 | } 530 | 531 | #ck-repo-widget-loading-layer { 532 | position: absolute; 533 | width: 100%; 534 | height: 100%; 535 | display: -webkit-box; 536 | display: -ms-flexbox; 537 | display: flex; 538 | -webkit-box-pack: center; 539 | -ms-flex-pack: center; 540 | justify-content: center; 541 | -webkit-box-align: center; 542 | -ms-flex-align: center; 543 | align-items: center; 544 | left: 0; 545 | top: 0; 546 | } 547 | 548 | /* Dialog window */ 549 | .ck-repo-widget-dialog-wnd { 550 | position: fixed; 551 | left: 50%; 552 | top: 50%; 553 | box-shadow: 0px 20px 40px rgba(0, 0, 0, 0.08); 554 | border: 1px solid #C4C4C4; 555 | margin: auto; 556 | transform: translate(-50%, -50%); 557 | padding: 10px; 558 | background: #ffffff; 559 | font-size: 12px; 560 | line-height: 15px; 561 | } 562 | 563 | .ck-repo-widget-dialog-code { 564 | font-family: monospace; 565 | box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); 566 | border: 1px solid #ccc; 567 | padding: 9.5px; 568 | margin: 0 0 10px; 569 | color: #333; 570 | width: 160ch; 571 | height: 15em; 572 | } 573 | 574 | .ck-repo-widget-dialog-btn { 575 | float: right; 576 | box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); 577 | border: 1px solid #C4C4C4; 578 | padding: 5px; 579 | margin: 0 0 10px 10px; 580 | right: 10px; 581 | } 582 | 583 | /* loading animation */ 584 | 585 | .lds-ellipsis { 586 | display: inline-block; 587 | position: relative; 588 | width: 64px; 589 | height: 64px; 590 | } 591 | 592 | .lds-ellipsis div { 593 | position: absolute; 594 | top: 27px; 595 | width: 11px; 596 | height: 11px; 597 | border-radius: 50%; 598 | background: #4782d3; 599 | -webkit-animation-timing-function: cubic-bezier(0, 1, 1, 0); 600 | animation-timing-function: cubic-bezier(0, 1, 1, 0); 601 | } 602 | 603 | .lds-ellipsis div:nth-child(1) { 604 | left: 6px; 605 | -webkit-animation: lds-ellipsis1 0.6s infinite; 606 | animation: lds-ellipsis1 0.6s infinite; 607 | } 608 | 609 | .lds-ellipsis div:nth-child(2) { 610 | left: 6px; 611 | -webkit-animation: lds-ellipsis2 0.6s infinite; 612 | animation: lds-ellipsis2 0.6s infinite; 613 | } 614 | 615 | .lds-ellipsis div:nth-child(3) { 616 | left: 26px; 617 | -webkit-animation: lds-ellipsis2 0.6s infinite; 618 | animation: lds-ellipsis2 0.6s infinite; 619 | } 620 | 621 | .lds-ellipsis div:nth-child(4) { 622 | left: 45px; 623 | -webkit-animation: lds-ellipsis3 0.6s infinite; 624 | animation: lds-ellipsis3 0.6s infinite; 625 | } 626 | 627 | @-webkit-keyframes lds-ellipsis1 { 628 | 0% { 629 | -webkit-transform: scale(0); 630 | transform: scale(0); 631 | } 632 | 100% { 633 | -webkit-transform: scale(1); 634 | transform: scale(1); 635 | } 636 | } 637 | 638 | @keyframes lds-ellipsis1 { 639 | 0% { 640 | -webkit-transform: scale(0); 641 | transform: scale(0); 642 | } 643 | 100% { 644 | -webkit-transform: scale(1); 645 | transform: scale(1); 646 | } 647 | } 648 | 649 | @-webkit-keyframes lds-ellipsis3 { 650 | 0% { 651 | -webkit-transform: scale(1); 652 | transform: scale(1); 653 | } 654 | 100% { 655 | -webkit-transform: scale(0); 656 | transform: scale(0); 657 | } 658 | } 659 | 660 | @keyframes lds-ellipsis3 { 661 | 0% { 662 | -webkit-transform: scale(1); 663 | transform: scale(1); 664 | } 665 | 100% { 666 | -webkit-transform: scale(0); 667 | transform: scale(0); 668 | } 669 | } 670 | 671 | @-webkit-keyframes lds-ellipsis2 { 672 | 0% { 673 | -webkit-transform: translate(0, 0); 674 | transform: translate(0, 0); 675 | } 676 | 100% { 677 | -webkit-transform: translate(19px, 0); 678 | transform: translate(19px, 0); 679 | } 680 | } 681 | 682 | @keyframes lds-ellipsis2 { 683 | 0% { 684 | -webkit-transform: translate(0, 0); 685 | transform: translate(0, 0); 686 | } 687 | 100% { 688 | -webkit-transform: translate(19px, 0); 689 | transform: translate(19px, 0); 690 | } 691 | } 692 | -------------------------------------------------------------------------------- /wfe/dashboard/ck-repo-widget/workflows.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultWorkflowIndex": 1, 3 | "workflows": [ 4 | { 5 | "name": "ReQuEST @ ASPLOS'18 tournament (Pareto-efficient image classification)", 6 | "moduleUoa": "request.asplos18", 7 | "xDimension": "##characteristics#run#inference_throughput", 8 | "yDimension": "##characteristics#run#accuracy_top1", 9 | "colorDimension": "experiment", 10 | "sizeDimension": "##features#model_size", 11 | "xVariationVisible": true, 12 | "yVariationVisible": false 13 | }, 14 | { 15 | "name": "MLPerf Inference v0.5 - Image Classification - SingleStream (milliseconds per sample)", 16 | "moduleUoa": "mlperf.inference", 17 | "xDimension": "P_IC1", 18 | "yDimension": "A_IC1", 19 | "xVariationVisible": false, 20 | "yVariationVisible": false, 21 | "colorDimension": "Accelerator #", 22 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 23 | "sizeDimension": "Processor #", 24 | "sizeRange": [4,6], 25 | "markerDimension": "Submitter", 26 | "markerDimensionSets": { 27 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 28 | }, 29 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_IC1", "A_IC1"], 30 | "props": { 31 | "__delta": 0.0 32 | }, 33 | "refLines": [ 34 | { 35 | "name": "ResNet", 36 | "dimension": "A_IC1", 37 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_resnet" 38 | }, 39 | { 40 | "name": "MobileNet", 41 | "dimension": "A_IC1", 42 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_mobilenet" 43 | } 44 | ], 45 | "call_attribs": { 46 | "prefilter_mode": "image_classification_singlestream" 47 | }, 48 | "filters": { 49 | "Task": "Image Classification", 50 | "Scenario": "SingleStream" 51 | } 52 | }, 53 | { 54 | "name": "MLPerf Inference v0.5 - Image Classification - MultiStream (number of streams)", 55 | "moduleUoa": "mlperf.inference", 56 | "xDimension": "P_IC1", 57 | "yDimension": "A_IC1", 58 | "xVariationVisible": false, 59 | "yVariationVisible": false, 60 | "colorDimension": "Accelerator #", 61 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 62 | "sizeDimension": "Processor #", 63 | "sizeRange": [4,6], 64 | "markerDimension": "Submitter", 65 | "markerDimensionSets": { 66 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 67 | }, 68 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_IC1", "A_IC1"], 69 | "props": { 70 | "__delta": 0.0 71 | }, 72 | "refLines": [ 73 | { 74 | "name": "ResNet", 75 | "dimension": "A_IC1", 76 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_resnet" 77 | }, 78 | { 79 | "name": "MobileNet", 80 | "dimension": "A_IC1", 81 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_mobilenet" 82 | } 83 | ], 84 | "call_attribs": { 85 | "prefilter_mode": "image_classification_multistream" 86 | }, 87 | "filters": { 88 | "Task": "Image Classification", 89 | "Scenario": "MultiStream" 90 | } 91 | }, 92 | { 93 | "name": "MLPerf Inference v0.5 - Image Classification - Server (queries per second)", 94 | "moduleUoa": "mlperf.inference", 95 | "xDimension": "P_IC1", 96 | "yDimension": "A_IC1", 97 | "xVariationVisible": false, 98 | "yVariationVisible": false, 99 | "colorDimension": "Accelerator #", 100 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 101 | "sizeDimension": "Processor #", 102 | "sizeRange": [4,6], 103 | "markerDimension": "Submitter", 104 | "markerDimensionSets": { 105 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 106 | }, 107 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_IC1", "A_IC1"], 108 | "props": { 109 | "__delta": 0.0 110 | }, 111 | "refLines": [ 112 | { 113 | "name": "ResNet", 114 | "dimension": "A_IC1", 115 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_resnet" 116 | }, 117 | { 118 | "name": "MobileNet", 119 | "dimension": "A_IC1", 120 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_mobilenet" 121 | } 122 | ], 123 | "call_attribs": { 124 | "prefilter_mode": "image_classification_server" 125 | }, 126 | "filters": { 127 | "Task": "Image Classification", 128 | "Scenario": "Server" 129 | } 130 | }, 131 | { 132 | "name": "MLPerf Inference v0.5 - Image Classification - Offline (samples per second)", 133 | "moduleUoa": "mlperf.inference", 134 | "xDimension": "P_IC1", 135 | "yDimension": "A_IC1", 136 | "xVariationVisible": false, 137 | "yVariationVisible": false, 138 | "colorDimension": "Accelerator #", 139 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 140 | "sizeDimension": "Processor #", 141 | "sizeRange": [4,6], 142 | "markerDimension": "Submitter", 143 | "markerDimensionSets": { 144 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 145 | }, 146 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_IC1", "A_IC1"], 147 | "props": { 148 | "__delta": 0.0 149 | }, 150 | "refLines": [ 151 | { 152 | "name": "ResNet", 153 | "dimension": "A_IC1", 154 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_resnet" 155 | }, 156 | { 157 | "name": "MobileNet", 158 | "dimension": "A_IC1", 159 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_mobilenet" 160 | } 161 | ], 162 | "call_attribs": { 163 | "prefilter_mode": "image_classification_offline" 164 | }, 165 | "filters": { 166 | "Task": "Image Classification", 167 | "Scenario": "Offline" 168 | } 169 | }, 170 | { 171 | "name": "MLPerf Inference v0.5 - Object Detection - SingleStream (milliseconds per sample)", 172 | "moduleUoa": "mlperf.inference", 173 | "xDimension": "P_OD1", 174 | "yDimension": "A_OD1", 175 | "xVariationVisible": false, 176 | "yVariationVisible": false, 177 | "colorDimension": "Accelerator #", 178 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 179 | "sizeDimension": "Processor #", 180 | "sizeRange": [4,6], 181 | "markerDimension": "Submitter", 182 | "markerDimensionSets": { 183 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 184 | }, 185 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_OD1", "A_OD1"], 186 | "props": { 187 | "__delta": 0.0 188 | }, 189 | "refLines": [ 190 | { 191 | "name": "SSD-Large", 192 | "dimension": "A_OD1", 193 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_large" 194 | }, 195 | { 196 | "name": "SSD-Small", 197 | "dimension": "A_OD1", 198 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_small" 199 | } 200 | ], 201 | "call_attribs": { 202 | "prefilter_mode": "object_detection_singlestream" 203 | }, 204 | "filters": { 205 | "Task": "Object Detection", 206 | "Scenario": "SingleStream" 207 | } 208 | }, 209 | { 210 | "name": "MLPerf Inference v0.5 - Object Detection - MultiStream (number of streams)", 211 | "moduleUoa": "mlperf.inference", 212 | "xDimension": "P_OD1", 213 | "yDimension": "A_OD1", 214 | "xVariationVisible": false, 215 | "yVariationVisible": false, 216 | "colorDimension": "Accelerator #", 217 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 218 | "sizeDimension": "Processor #", 219 | "sizeRange": [4,6], 220 | "markerDimension": "Submitter", 221 | "markerDimensionSets": { 222 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 223 | }, 224 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_OD1", "A_OD1"], 225 | "props": { 226 | "__delta": 0.0 227 | }, 228 | "refLines": [ 229 | { 230 | "name": "SSD-Large", 231 | "dimension": "A_OD1", 232 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_large" 233 | }, 234 | { 235 | "name": "SSD-Small", 236 | "dimension": "A_OD1", 237 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_small" 238 | } 239 | ], 240 | "call_attribs": { 241 | "prefilter_mode": "object_detection_multistream" 242 | }, 243 | "filters": { 244 | "Task": "Object Detection", 245 | "Scenario": "MultiStream" 246 | } 247 | }, 248 | { 249 | "name": "MLPerf Inference v0.5 - Object Detection - Server (queries per second)", 250 | "moduleUoa": "mlperf.inference", 251 | "xDimension": "P_OD1", 252 | "yDimension": "A_OD1", 253 | "xVariationVisible": false, 254 | "yVariationVisible": false, 255 | "colorDimension": "Accelerator #", 256 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 257 | "sizeDimension": "Processor #", 258 | "sizeRange": [4,6], 259 | "markerDimension": "Submitter", 260 | "markerDimensionSets": { 261 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 262 | }, 263 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_OD1", "A_OD1"], 264 | "props": { 265 | "__delta": 0.0 266 | }, 267 | "refLines": [ 268 | { 269 | "name": "SSD-Large", 270 | "dimension": "A_OD1", 271 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_large" 272 | }, 273 | { 274 | "name": "SSD-Small", 275 | "dimension": "A_OD1", 276 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_small" 277 | } 278 | ], 279 | "call_attribs": { 280 | "prefilter_mode": "object_detection_server" 281 | }, 282 | "filters": { 283 | "Task": "Object Detection", 284 | "Scenario": "Server" 285 | } 286 | }, 287 | { 288 | "name": "MLPerf Inference v0.5 - Object Detection - Offline (samples per second)", 289 | "moduleUoa": "mlperf.inference", 290 | "xDimension": "P_OD1", 291 | "yDimension": "A_OD1", 292 | "xVariationVisible": false, 293 | "yVariationVisible": false, 294 | "colorDimension": "Accelerator #", 295 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 296 | "sizeDimension": "Processor #", 297 | "sizeRange": [4,6], 298 | "markerDimension": "Submitter", 299 | "markerDimensionSets": { 300 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 301 | }, 302 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_OD1", "A_OD1"], 303 | "props": { 304 | "__delta": 0.0 305 | }, 306 | "refLines": [ 307 | { 308 | "name": "SSD-Large", 309 | "dimension": "A_OD1", 310 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_large" 311 | }, 312 | { 313 | "name": "SSD-Small", 314 | "dimension": "A_OD1", 315 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_ssd_small" 316 | } 317 | ], 318 | "call_attribs": { 319 | "prefilter_mode": "object_detection_offline" 320 | }, 321 | "filters": { 322 | "Task": "Object Detection", 323 | "Scenario": "Offline" 324 | } 325 | }, 326 | { 327 | "name": "MLPerf Inference v0.5 - Machine Translation - SingleStream (milliseconds per sample)", 328 | "moduleUoa": "mlperf.inference", 329 | "xDimension": "P_NMT", 330 | "yDimension": "A_NMT", 331 | "xVariationVisible": false, 332 | "yVariationVisible": false, 333 | "colorDimension": "Accelerator #", 334 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 335 | "sizeDimension": "Processor #", 336 | "sizeRange": [4,6], 337 | "markerDimension": "Submitter", 338 | "markerDimensionSets": { 339 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 340 | }, 341 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_NMT", "A_NMT"], 342 | "props": { 343 | "__delta": 0.0 344 | }, 345 | "refLines": [ 346 | { 347 | "name": "GNMT", 348 | "dimension": "A_NMT", 349 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_gnmt" 350 | } 351 | ], 352 | "call_attribs": { 353 | "prefilter_mode": "machine_translation_singlestream" 354 | }, 355 | "filters": { 356 | "Task": "Machine Translation", 357 | "Scenario": "SingleStream" 358 | } 359 | }, 360 | { 361 | "name": "MLPerf Inference v0.5 - Machine Translation - MultiStream (number of streams)", 362 | "moduleUoa": "mlperf.inference", 363 | "xDimension": "P_NMT", 364 | "yDimension": "A_NMT", 365 | "xVariationVisible": false, 366 | "yVariationVisible": false, 367 | "colorDimension": "Accelerator #", 368 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 369 | "sizeDimension": "Processor #", 370 | "sizeRange": [4,6], 371 | "markerDimension": "Submitter", 372 | "markerDimensionSets": { 373 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 374 | }, 375 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_NMT", "A_NMT"], 376 | "props": { 377 | "__delta": 0.0 378 | }, 379 | "refLines": [ 380 | { 381 | "name": "GNMT", 382 | "dimension": "A_NMT", 383 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_gnmt" 384 | } 385 | ], 386 | "call_attribs": { 387 | "prefilter_mode": "machine_translation_multistream" 388 | }, 389 | "filters": { 390 | "Task": "Machine Translation", 391 | "Scenario": "MultiStream" 392 | } 393 | }, 394 | { 395 | "name": "MLPerf Inference v0.5 - Machine Translation - Server (queries per second)", 396 | "moduleUoa": "mlperf.inference", 397 | "xDimension": "P_NMT", 398 | "yDimension": "A_NMT", 399 | "xVariationVisible": false, 400 | "yVariationVisible": false, 401 | "colorDimension": "Accelerator #", 402 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 403 | "sizeDimension": "Processor #", 404 | "sizeRange": [4,6], 405 | "markerDimension": "Submitter", 406 | "markerDimensionSets": { 407 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 408 | }, 409 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_NMT", "A_NMT"], 410 | "props": { 411 | "__delta": 0.0 412 | }, 413 | "refLines": [ 414 | { 415 | "name": "GNMT", 416 | "dimension": "A_NMT", 417 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_gnmt" 418 | } 419 | ], 420 | "call_attribs": { 421 | "prefilter_mode": "machine_translation_server" 422 | }, 423 | "filters": { 424 | "Task": "Machine Translation", 425 | "Scenario": "Server" 426 | } 427 | }, 428 | { 429 | "name": "MLPerf Inference v0.5 - Machine Translation - Offline (samples per second)", 430 | "moduleUoa": "mlperf.inference", 431 | "xDimension": "P_NMT", 432 | "yDimension": "A_NMT", 433 | "xVariationVisible": false, 434 | "yVariationVisible": false, 435 | "colorDimension": "Accelerator #", 436 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 437 | "sizeDimension": "Processor #", 438 | "sizeRange": [4,6], 439 | "markerDimension": "Submitter", 440 | "markerDimensionSets": { 441 | "Default": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "triangle", "triangle_down", "sector_1_4", "rect", "pentagon", "hexagon", "sector_1_4", "star", "diamond"] 442 | }, 443 | "tooltipValues": ["Division", "Submitter", "System", "Processor", "Processor #", "Accelerator", "Accelerator #", "Benchmark", "P_NMT", "A_NMT"], 444 | "props": { 445 | "__delta": 0.0 446 | }, 447 | "refLines": [ 448 | { 449 | "name": "GNMT", 450 | "dimension": "A_NMT", 451 | "get_value": "CkRepoWidgetUtils.mlperf.get_reference_accuracy_gnmt" 452 | } 453 | ], 454 | "call_attribs": { 455 | "prefilter_mode": "machine_translation_offline" 456 | }, 457 | "filters": { 458 | "Task": "Machine Translation", 459 | "Scenario": "Offline" 460 | } 461 | }, 462 | { 463 | "name": "MLPerf Inference - Image Classification - MobileNets demo 2018 (highlights)", 464 | "moduleUoa": "mlperf.mobilenets", 465 | "xDimension": "time_min_ms", 466 | "yDimension": "accuracy_top1", 467 | "colorDimension": "rate_max_s", 468 | "sizeDimension": "resolution", 469 | "markerDimension": "multiplier", 470 | "markerOverlayDimension": "convolution_method", 471 | "xVariationVisible": false, 472 | "yVariationVisible": false, 473 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 474 | "markerDimensionSets": { 475 | "Polygons": ["triangle", "triangle_down", "rect", "pentagon", "hexagon", "diamond", "star", "circle"], 476 | "Sectors v1": ["sector_1_4", "sector_1_2", "sector_3_4", "circle"], 477 | "Sectors v2": ["sector_1_3", "sector_1_2", "sector_3_4", "circle", "diamond", "star"], 478 | "Sectors v1/v2": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "diamond", "star"], 479 | "Circles": ["circle"] 480 | }, 481 | "markerOverlayDimensionSets": { 482 | "1 X N": ["none", "dot", "hline", "vline", "plus", "cross"] 483 | }, 484 | "sizeRange": [4, 6], 485 | "tooltipValues": ["model", "rate_max_s", "time_min_ms", "time_avg_ms", "accuracy_top1", "accuracy_top5"], 486 | "call_attribs": { 487 | "prefilter_mode": "highlights" 488 | } 489 | }, 490 | { 491 | "name": "MLPerf Inference - Image Classification - MobileNets demo 2018 (all)", 492 | "moduleUoa": "mlperf.mobilenets", 493 | "xDimension": "time_min_ms", 494 | "yDimension": "accuracy_top1", 495 | "colorDimension": "rate_max_s", 496 | "sizeDimension": "resolution", 497 | "markerDimension": "multiplier", 498 | "markerOverlayDimension": "convolution_method", 499 | "xVariationVisible": false, 500 | "yVariationVisible": false, 501 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFCC00", "#FF0000"], 502 | "markerDimensionSets": { 503 | "Polygons": ["triangle", "triangle_down", "rect", "pentagon", "hexagon", "diamond", "star", "circle"], 504 | "Sectors v1": ["sector_1_4", "sector_1_2", "sector_3_4", "circle"], 505 | "Sectors v2": ["sector_1_3", "sector_1_2", "sector_3_4", "circle", "diamond", "star"], 506 | "Sectors v1/v2": ["sector_1_4", "sector_1_3", "sector_1_2", "sector_3_4", "circle", "diamond", "star"], 507 | "Circles": ["circle"] 508 | }, 509 | "markerOverlayDimensionSets": { 510 | "1 X N": ["none", "dot", "hline", "vline", "plus", "cross"], 511 | "2 X 2": ["none", "dot", 512 | "hline", "vline"], 513 | "2 X 3": ["none", "hline", "vline", 514 | "dot", "plus", "cross"], 515 | "3 X 2": ["none", "dot", 516 | "hline", "vline", 517 | "plus", "cross"] 518 | }, 519 | "sizeRange": [4, 6], 520 | "tooltipValues": ["model", "rate_max_s", "time_min_ms", "time_avg_ms", "accuracy_top1", "accuracy_top5"], 521 | "call_attribs": { 522 | "prefilter_mode": "all" 523 | } 524 | }, 525 | { 526 | "name": "Student Cluster Competition @ SuperComputing'19", 527 | "moduleUoa": "scc.sc19", 528 | "xDimension": "team", 529 | "yDimension": "##characteristics#run#execution_time", 530 | "colorDimension": "team", 531 | "sizeDimension": "##features#model_size", 532 | "xVariationVisible": true, 533 | "yVariationVisible": false 534 | }, 535 | { 536 | "name": "NNTest (collaboratively benchmarking and optimizing neural network operations)", 537 | "moduleUoa": "nntest", 538 | "xDimension": "experiment", 539 | "yDimension": "##characteristics#run#execution_time", 540 | "colorDimension": "experiment", 541 | "xVariationVisible": false, 542 | "yVariationVisible": false 543 | }, 544 | { 545 | "name": "Quantum Open Challenge (Variational Quantum Eigensolver) - Solution Convergence", 546 | "moduleUoa": "challenge.vqe", 547 | "xDimension": "__fevs", 548 | "yDimension": "__energies", 549 | "colorDimension": "_point", 550 | "sizeDimension": "fun_exact", 551 | "xVariationVisible": false, 552 | "yVariationVisible": false, 553 | "dataPrefix": "full_", 554 | "configPrefix": "full_" 555 | }, 556 | { 557 | "name": "Quantum Open Challenge (Variational Quantum Eigensolver) - Time To Solution", 558 | "moduleUoa": "challenge.vqe", 559 | "xDimension": "T_ave", 560 | "yDimension": "__energies", 561 | "colorDimension": "_sample_number", 562 | "sizeDimension": "t_ave", 563 | "xVariationVisible": false, 564 | "yVariationVisible": false, 565 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF0000"], 566 | "dataPrefix": "metrics_", 567 | "configPrefix": "metrics_", 568 | "tableProcessor": "CkRepoWidgetUtils.quantum.benchmarkTableProcessor", 569 | "props": { 570 | "__fun_key": "fun_exact", 571 | "__time_key": "total_q_shots", 572 | "__delta": 0.1, 573 | "__prob": 0.8 574 | }, 575 | "refLines": [ 576 | { 577 | "name": "H₂*", 578 | "dimension": "__energies", 579 | "get_value": "CkRepoWidgetUtils.quantum.get_exact_answer_qiskit_hydrogen" 580 | }, 581 | { 582 | "name": "H₂", 583 | "dimension": "__energies", 584 | "get_value": "CkRepoWidgetUtils.quantum.get_exact_answer_hydrogen" 585 | }, 586 | { 587 | "name": "He", 588 | "dimension": "__energies", 589 | "get_value": "CkRepoWidgetUtils.quantum.get_exact_answer_helium" 590 | } 591 | ] 592 | }, 593 | { 594 | "name": "Quantum Hackathon 2019-03-15 (Quantum Machine Learning : Oxford)", 595 | "moduleUoa": "hackathon.20190315", 596 | "xDimension": "problem_index", 597 | "yDimension": "hours_since_start", 598 | "sizeDimension": "training_accuracy", 599 | "colorDimension": "test_accuracy", 600 | "markerDimension": "team", 601 | "colorRange": ["#0000ff", "#00ffff", "#00dd00", "#ffbb00", "#ff0000"], 602 | "sizeRange": [4, 8], 603 | "markerDimensionSets": { 604 | "Polygons": ["triangle", "triangle_down", "rect", "pentagon", "hexagon", "diamond", "star", "circle"] 605 | }, 606 | "xVariationVisible": false, 607 | "yVariationVisible": false, 608 | "call_attribs": { 609 | } 610 | }, 611 | { 612 | "name": "Quantum Hackathon 2019-01-27 (Quantum Machine Learning : Paris)", 613 | "moduleUoa": "hackathon.20190127", 614 | "xDimension": "problem_index", 615 | "yDimension": "hours_since_start", 616 | "sizeDimension": "training_accuracy", 617 | "colorDimension": "test_accuracy", 618 | "markerDimension": "team", 619 | "colorRange": ["#0000ff", "#00ffff", "#00dd00", "#ffbb00", "#ff0000"], 620 | "sizeRange": [4, 8], 621 | "markerDimensionSets": { 622 | "Polygons": ["triangle", "triangle_down", "rect", "pentagon", "hexagon", "diamond", "star", "circle"] 623 | }, 624 | "xVariationVisible": false, 625 | "yVariationVisible": false, 626 | "call_attribs": { 627 | } 628 | }, 629 | { 630 | "name": "Quantum Hackathon 2018-10-06 (Variational Quantum Eigensolver on IBM) - Solution Convergence", 631 | "moduleUoa": "hackathon.20181006", 632 | "xDimension": "__fevs", 633 | "yDimension": "__energies", 634 | "colorDimension": "_point", 635 | "sizeDimension": "fun_exact", 636 | "xVariationVisible": false, 637 | "yVariationVisible": false, 638 | "dataPrefix": "full_", 639 | "configPrefix": "full_", 640 | "filters": { 641 | "_platform": "local_qasm_simulator", 642 | "_minimizer_method": "my_cobyla" 643 | } 644 | }, 645 | { 646 | "name": "Quantum Hackathon 2018-10-06 (Variational Quantum Eigensolver on IBM) - Time To Solution", 647 | "moduleUoa": "hackathon.20181006", 648 | "xDimension": "T_ave", 649 | "yDimension": "__energies", 650 | "colorDimension": "_sample_number", 651 | "sizeDimension": "t_ave", 652 | "xVariationVisible": false, 653 | "yVariationVisible": false, 654 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF0000"], 655 | "dataPrefix": "metrics_", 656 | "configPrefix": "metrics_", 657 | "tableProcessor": "CkRepoWidgetUtils.quantum.benchmarkTableProcessor", 658 | "props": { 659 | "__fun_key": "fun_exact", 660 | "__time_key": "total_q_shots", 661 | "__delta": 0.01, 662 | "__prob": 0.8 663 | }, 664 | "refLines": [ 665 | { 666 | "name": "H₂*", 667 | "dimension": "__energies", 668 | "get_value": "CkRepoWidgetUtils.quantum.get_exact_answer_qiskit_hydrogen" 669 | }, 670 | { 671 | "name": "H₂", 672 | "dimension": "__energies", 673 | "get_value": "CkRepoWidgetUtils.quantum.get_exact_answer_hydrogen" 674 | }, 675 | { 676 | "name": "He", 677 | "dimension": "__energies", 678 | "get_value": "CkRepoWidgetUtils.quantum.get_exact_answer_helium" 679 | } 680 | ], 681 | "tooltipValues": ["T_ave", "t_ave"] 682 | }, 683 | { 684 | "name": "Quantum Hackathon 2018-06-15 (Variational Quantum Eigensolver on Rigetti) - Solution Convergence", 685 | "moduleUoa": "hackathon.20180615", 686 | "xDimension": "__fevs", 687 | "yDimension": "__energies", 688 | "colorDimension": "_point", 689 | "sizeDimension": "fun_exact", 690 | "xVariationVisible": false, 691 | "yVariationVisible": false, 692 | "dataPrefix": "full_", 693 | "configPrefix": "full_", 694 | "filters": { 695 | "_platform": "8q-agave", 696 | "_minimizer_method": "my_cobyla" 697 | } 698 | }, 699 | { 700 | "name": "Quantum Hackathon 2018-06-15 (Variational Quantum Eigensolver on Rigetti) - Time To Solution", 701 | "moduleUoa": "hackathon.20180615", 702 | "xDimension": "T_ave", 703 | "yDimension": "__energies", 704 | "colorDimension": "_sample_number", 705 | "sizeDimension": "t_ave", 706 | "xVariationVisible": false, 707 | "yVariationVisible": false, 708 | "colorRange": ["#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF0000"], 709 | "dataPrefix": "metrics_", 710 | "configPrefix": "metrics_", 711 | "tableProcessor": "CkRepoWidgetUtils.quantum.benchmarkTableProcessor", 712 | "props": { 713 | "__fun_key": "fun_exact", 714 | "__time_key": "total_q_shots", 715 | "__delta": 0.1, 716 | "__prob": 0.5 717 | } 718 | } 719 | ] 720 | } 721 | -------------------------------------------------------------------------------- /wfe/dashboard/fonts/LeagueSpartan-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/fonts/LeagueSpartan-Bold.otf -------------------------------------------------------------------------------- /wfe/dashboard/fonts/raleway/Raleway-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/fonts/raleway/Raleway-Bold.ttf -------------------------------------------------------------------------------- /wfe/dashboard/fonts/raleway/Raleway-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/fonts/raleway/Raleway-ExtraBold.ttf -------------------------------------------------------------------------------- /wfe/dashboard/fonts/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/fonts/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /wfe/dashboard/fonts/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/fonts/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /wfe/dashboard/fonts/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/fonts/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /wfe/dashboard/images/dividiti/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/dashboard/images/dividiti/logo.png -------------------------------------------------------------------------------- /wfe/dashboard/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Results 8 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 59 | 60 | 61 | 62 | 63 |
64 |
65 |
66 | 67 |
68 | 69 | 116 | 117 |
118 |
119 |
120 |
121 | 122 | 123 | 124 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /wfe/default/.cm/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "backup_data_uid": "6b411f75e774059b", 3 | "backup_module_uid": "1e4e644996b7f2a0", 4 | "backup_module_uoa": "wfe", 5 | "control": { 6 | "author": "Grigori Fursin", 7 | "author_email": "Grigori.Fursin@cTuning.org", 8 | "author_webpage": "http://fursin.net", 9 | "copyright": "See CK COPYRIGHT.txt for copyright details", 10 | "engine": "CK", 11 | "iso_datetime": "2015-01-29T20:22:13.847000", 12 | "license": "See CK LICENSE.txt for licensing details", 13 | "version": [ 14 | "1", 15 | "0", 16 | "1215", 17 | "beta" 18 | ] 19 | }, 20 | "data_name": "default" 21 | } 22 | -------------------------------------------------------------------------------- /wfe/default/.cm/meta.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /wfe/default/css/layout-fixed.css: -------------------------------------------------------------------------------- 1 | html, body 2 | { 3 | margin:0; 4 | padding:0; 5 | font-family:Tahoma; 6 | font-size:91%; 7 | min-width: 1050px; 8 | } 9 | 10 | a {text-decoration: none} 11 | 12 | #ck_top 13 | { 14 | /* background-color:#00002F; */ 15 | width:100%; 16 | height:64px; 17 | color:#ffffff; 18 | text-align:left; 19 | font-size:24px; 20 | /* border-bottom: 1px solid #cfcfcf; */ 21 | 22 | background-color: #00003f; 23 | -webkit-box-shadow: 0 75px 40px -40px #00000f inset; 24 | box-shadow: 0 75px 40px -30px #00000f inset; 25 | 26 | overflow:hidden; 27 | 28 | } 29 | 30 | #ck_go_back 31 | { 32 | width:98%; 33 | text-align:center; 34 | padding:6px; 35 | } 36 | 37 | #ck_entries 38 | { 39 | width:97%; 40 | background-color:#E4E5E6; 41 | color:#00009F; 42 | text-align:left; 43 | padding:6px; 44 | margin:6px; 45 | 46 | border: 1px solid #AFAFAF; 47 | -moz-border-radius: 4px; 48 | -webkit-border-radius: 4px; 49 | border-radius: 4px; 50 | background-color: #FFFFFF; 51 | border-spacing: 0px; 52 | 53 | -webkit-box-shadow: 2px 2px 4px 1px #bbb; 54 | box-shadow: 2px 2px 4px 1px #bbb; 55 | } 56 | 57 | #ck_entries1 58 | { 59 | color:#000000; 60 | text-align:left; 61 | padding:0px; 62 | margin:0px; 63 | font-family:arial; 64 | font-size:125%; 65 | } 66 | 67 | #ck_entries1a 68 | { 69 | color:#00004F; 70 | text-align:left; 71 | padding:0px; 72 | margin:0px; 73 | font-family:arial; 74 | font-size:25px; 75 | } 76 | 77 | #ck_text51 78 | { 79 | font-size:100%; 80 | color:#000000; 81 | } 82 | 83 | #ck_text55 84 | { 85 | color:#000000; 86 | font-size:100%; 87 | margin:15px; 88 | } 89 | 90 | #ck_entries_space4 91 | { 92 | padding:4px 0px 0px 0px; 93 | } 94 | 95 | #ck_entries_space8 96 | { 97 | padding:8px 0px 0px 0px; 98 | } 99 | 100 | #ck_entries2 101 | { 102 | color:#000000; 103 | text-align:left; 104 | font-family:arial; 105 | margin:10px; 106 | font-size:90%; 107 | } 108 | 109 | #ck_entries3 110 | { 111 | color:#00000F; 112 | text-align:left; 113 | font-family:arial; 114 | margin:20px; 115 | font-size:100%; 116 | } 117 | 118 | #ck_downloads 119 | { 120 | color:#000000; 121 | text-align:right; 122 | font-size:100%; 123 | } 124 | 125 | #ck_prune 126 | { 127 | width:98%; 128 | color:#00009F; 129 | text-align:center; 130 | padding:5px; 131 | } 132 | 133 | #ck_bottom 134 | { 135 | /* background-color:#E4E5E6; */ 136 | width:100%; 137 | height:70px; 138 | /* border-top: 1px solid #cfcfcf; */ 139 | } 140 | 141 | table.ck_round_table 142 | { 143 | border: 1px solid #00009f; 144 | -moz-border-radius: 6px; 145 | -webkit-border-radius: 6px; 146 | border-radius: 6px; 147 | background-color: #FFFFFF; 148 | margin: 5px; 149 | padding: 1px; 150 | border-spacing: 0px; 151 | } 152 | 153 | table.ck_round_table td 154 | { 155 | spacing:0px; 156 | padding:4px; 157 | } 158 | 159 | table.ck_table 160 | { 161 | border: 1px solid #00009f; 162 | background-color: #FFFFFF; 163 | margin: 5px; 164 | padding: 0px; 165 | border-spacing: 0px; 166 | } 167 | 168 | table.ck_table td 169 | { 170 | spacing:0px; 171 | padding:4px; 172 | } 173 | 174 | .light_right_in_table 175 | { 176 | border-right:solid; 177 | border-right-width:1px; 178 | } 179 | 180 | .light_bottom_in_table 181 | { 182 | border-bottom:solid; 183 | border-bottom-width:1px; 184 | } 185 | 186 | .light_green_in_table 187 | { 188 | background-color: #ffffcf; 189 | } 190 | 191 | .light_green_in_table1 192 | { 193 | background-color: #ffffdf; 194 | } 195 | 196 | .ck_hr 197 | { 198 | border:none; 199 | border: 0px; 200 | background-color:#00009F; 201 | color:#00009F; 202 | height:1px; 203 | } 204 | 205 | .ck_small_button 206 | { 207 | color:#00009f; 208 | height: 20px; 209 | font-size:10px; 210 | } 211 | 212 | /************************** Menu 0 **************************/ 213 | 214 | #ck_menu_0 215 | { 216 | background-color:#ffffff; 217 | width:98%; 218 | height:30px; 219 | color:#0f4f7f; 220 | text-align:center; 221 | font-size:16px; 222 | padding:2px; 223 | margin:3px; 224 | } 225 | 226 | /************************** Menu 0 Text **************************/ 227 | 228 | #ck_menu_text_0 229 | { 230 | background-color:#ffffff; 231 | color:#0f4f7f; 232 | height:36px; 233 | vertical-align:middle; 234 | padding:4px; 235 | margin:10px; 236 | } 237 | 238 | #ck_menu_text_0 a:link { color: #116fb1; } 239 | #ck_menu_text_0 a:visited { color: #116fb1; } 240 | #ck_menu_text_0 a:hover { color: #af0000; } 241 | #ck_menu_text_0 a:active { color: #116fb1; } 242 | 243 | #ck_menu_text_0_selected 244 | { 245 | background-color:#ffffff; 246 | color:#bf0000; 247 | font-weight: bold; 248 | height:36px; 249 | vertical-align:middle; 250 | padding:4px; 251 | margin:10px; 252 | } 253 | 254 | #ck_menu_text_0_selected a:link { color: #af0000; } 255 | #ck_menu_text_0_selected a:visited { color: #af0000; } 256 | #ck_menu_text_0_selected a:hover { color: #af0000; } 257 | #ck_menu_text_0_selected a:active { color: #af0000; } 258 | 259 | #ck_menu_text_0:hover 260 | { 261 | background-color:#ffffff; 262 | color:#cf0000; 263 | height:100%; 264 | vertical-align:middle; 265 | 266 | padding:3px; 267 | margin:10px; 268 | 269 | border: 1px solid #AFAFAF; 270 | -moz-border-radius: 3px; 271 | -webkit-border-radius: 3px; 272 | border-radius: 3px; 273 | border-spacing: 0px; 274 | 275 | -webkit-box-shadow: 2px 2px 3px 1px #bbb; 276 | box-shadow: 2px 2px 3px 1px #bbb; 277 | } 278 | 279 | /************************** Articles/reports **************************/ 280 | 281 | #ck_article_title 282 | { 283 | color:#000000; 284 | font-weight: bold; 285 | font-family:Arial; 286 | font-size:24px; 287 | } 288 | 289 | #ck_article_authors 290 | { 291 | color:#000000; 292 | font-style: italic; 293 | font-family:Arial; 294 | font-size:14px; 295 | } 296 | 297 | #ck_article_affiliations 298 | { 299 | color:#000000; 300 | font-family:Arial; 301 | font-size:14px; 302 | } 303 | 304 | #ck_article_cauthor 305 | { 306 | color:#000000; 307 | font-family:Arial; 308 | font-size:12px; 309 | } 310 | 311 | #ck_article_text 312 | { 313 | color:#000000; 314 | font-family:Calibri;Tahoma;Arial; 315 | font-size:16px; 316 | } 317 | 318 | /*****************************************************************/ 319 | #ck_box_with_shadow 320 | { 321 | width:95%; 322 | color:#3f3f3f; 323 | text-align:left; 324 | padding:6px; 325 | margin:6px; 326 | 327 | border: 1px solid #AFAFAF; 328 | -moz-border-radius: 4px; 329 | -webkit-border-radius: 4px; 330 | border-radius: 4px; 331 | background-color: #FFFFFF; 332 | border-spacing: 0px; 333 | 334 | -webkit-box-shadow: 2px 2px 4px 1px #bbb; 335 | box-shadow: 2px 2px 4px 1px #bbb; 336 | } 337 | 338 | #ck_box_with_shadow1 339 | { 340 | background-color:#DFFFDF; 341 | color:#3f3f3f; 342 | border: 1px solid #CFFFCF; 343 | border-spacing: 0px; 344 | text-align:left; 345 | padding:6px; 346 | margin:6px; 347 | font-size:12px; 348 | -webkit-box-shadow: 2px 2px 4px 1px #bbb; 349 | box-shadow: 2px 2px 4px 1px #bbb; 350 | } 351 | 352 | #ck_box_with_shadow2 353 | { 354 | background-color:#DFFFDF; 355 | color:#3f3f3f; 356 | border: 1px solid #CFFFCF; 357 | border-spacing: 0px; 358 | text-align:left; 359 | padding:6px; 360 | margin:6px; 361 | font-size:12px; 362 | -webkit-box-shadow: 2px 2px 4px 1px #bbb; 363 | box-shadow: 2px 2px 4px 1px #bbb; 364 | } 365 | 366 | #ck_box_with_shadow3 367 | { 368 | background-color:#DFFFDF; 369 | color:#3f3f3f; 370 | border: 1px solid #CFFFCF; 371 | border-spacing: 0px; 372 | text-align:left; 373 | padding:6px; 374 | margin:6px; 375 | font-size:12px; 376 | -webkit-box-shadow: 2px 2px 4px 1px #bbb; 377 | box-shadow: 2px 2px 4px 1px #bbb; 378 | } 379 | -------------------------------------------------------------------------------- /wfe/default/images/ck-logo-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/ck-logo-small.png -------------------------------------------------------------------------------- /wfe/default/images/ck-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/ck-logo.png -------------------------------------------------------------------------------- /wfe/default/images/ck-logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/ck-logo1.png -------------------------------------------------------------------------------- /wfe/default/images/ctuning-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/ctuning-logo.png -------------------------------------------------------------------------------- /wfe/default/images/ctuning-logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/ctuning-logo1.png -------------------------------------------------------------------------------- /wfe/default/images/ctuning-logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/ctuning-logo2.png -------------------------------------------------------------------------------- /wfe/default/images/email_50px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/email_50px.png -------------------------------------------------------------------------------- /wfe/default/images/linkedin_34px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/linkedin_34px.png -------------------------------------------------------------------------------- /wfe/default/images/linkedin_50px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/linkedin_50px.png -------------------------------------------------------------------------------- /wfe/default/images/logo_sunrise5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/logo_sunrise5.png -------------------------------------------------------------------------------- /wfe/default/images/stamp-validated-by-the-community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/stamp-validated-by-the-community.png -------------------------------------------------------------------------------- /wfe/default/images/twitter_32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/twitter_32px.png -------------------------------------------------------------------------------- /wfe/default/images/twitter_50px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctuning/ck-web/c4c077f6b1a6e348ae68d6dfb6e9cab46d2bb39a/wfe/default/images/twitter_50px.png -------------------------------------------------------------------------------- /wfe/default/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | $#title#$ 9 | 10 | $#ck_styles#$ 11 | 12 | 13 | 14 | 15 |
16 |
17 |
 Collective Knowledge Aggregator beta
18 |
19 | 20 | $#template_top#$ 21 | 22 |
23 | $#template_middle#$ 24 | 25 | $#template_middle_finish#$ 26 |
27 | 28 |
29 | 30 |
31 |
32 | 33 | 34 | 35 | 39 | 42 | 45 | 48 | 51 | 54 | 57 | 58 |
36 |
37 | Powered by Collective Knowledge Engine 38 |
40 |            41 | 43 |
44 |
46 |     47 | 49 |
50 |
52 |     53 | 55 |
56 |
59 |
60 |
61 |
62 | 63 | $#template_end#$ 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /wfe/default/template.v0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | $#title#$ 9 | 10 | 11 | 12 | 13 |
14 |
15 |
 Collective Knowledge Browser beta
16 |
17 | 18 | 19 | $#template_top#$ 20 | 21 |
22 | $#template_middle#$ 23 | 24 | $#template_middle_finish#$ 25 |
26 | 27 |
28 | 29 |
30 |
31 | 32 | 33 | 34 | 38 | 41 | 45 | 46 |
35 |
36 | Powered by Collective Knowledge Engine 37 |
39 |            40 | 42 |
43 | Supported by non-profit cTuning Foundation 44 |
47 |
48 |
49 |
50 | 51 | $#template_end#$ 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /wfe/default/template.v1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | $#title#$ 9 | 10 | 11 | 12 | 13 |
14 |
15 |
 Collective Knowledge Browser beta
16 |
17 | 18 | 19 | $#template_top#$ 20 | 21 |
22 | $#template_middle#$ 23 | 24 | $#template_middle_finish#$ 25 |
26 | 27 |
28 | 29 |
30 |
31 | 32 |
33 | Powered by Collective Knowledge Engine 34 |
35 |
36 |
37 | 38 | $#template_end#$ 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /wfe/default/template.v2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | $#title#$ 9 | 10 | $#ck_styles#$ 11 | 12 | 13 | 14 | 15 |
16 |
17 |
 Collective Knowledge Browser beta
18 |
19 | 20 | $#template_top#$ 21 | 22 |
23 | $#template_middle#$ 24 | 25 | $#template_middle_finish#$ 26 |
27 | 28 |
29 | 30 |
31 |
32 | 33 | 34 | 35 | 39 | 42 | 45 | 48 | 51 | 54 | 57 | 58 |
36 |
37 | Powered by Collective Knowledge Engine 38 |
40 |            41 | 43 |
44 |
46 |     47 | 49 |
50 |
52 |     53 | 55 |
56 |
59 |
60 |
61 |
62 | 63 | $#template_end#$ 64 | 65 | 66 | 67 | --------------------------------------------------------------------------------