├── .bowerrc ├── .gitignore ├── LICENSE ├── README.md ├── app ├── assets │ ├── compare.css │ ├── compare.css.map │ ├── compare.scss │ ├── run.css │ ├── run.css.map │ ├── run.scss │ └── tabs.scss ├── compare.html ├── data │ ├── edison │ │ └── runs-edison.csv │ ├── pacvis │ │ ├── alldata.csv │ │ └── fix.sh │ ├── sim │ │ ├── alldata.csv │ │ ├── dump_net.py │ │ ├── fix_comm.sh │ │ ├── fix_sim.sh │ │ ├── header │ │ ├── list_edison.sh │ │ ├── list_links.sh │ │ ├── list_runs.sh │ │ ├── runs-1blue.csv │ │ ├── runs-2blacks.csv │ │ ├── runs-4jobs-1.csv │ │ ├── runs-4jobs-2.csv │ │ ├── runs-8jobs-1.csv │ │ ├── runs-8jobs-2.csv │ │ ├── runs-DAT.csv │ │ ├── runs-edison.csv │ │ ├── runs-links.csv │ │ ├── runs-multi.csv │ │ ├── runs-single-bak.csv │ │ ├── runs-single.csv │ │ ├── runs-state.csv │ │ └── substitute.sh │ └── staci_sep_29 │ │ ├── Screen Shot 2016-04-06 at 1.49.37 PM.png │ │ ├── alldata.csv │ │ ├── dnd_jobs.21.csv │ │ ├── dnd_net_counters.21.csv │ │ └── runs.csv ├── index.html ├── lib-code │ └── jquery-element-onresize.js ├── run.html └── src │ ├── app.js │ ├── cmap.js │ ├── compare.js │ ├── components │ └── cmap_swath.js │ ├── config.js │ ├── counters_view.js │ ├── data.js │ ├── graph │ ├── graph.js │ └── graph_view.js │ ├── init.js │ ├── jobs_view.js │ ├── matrix │ ├── adj_matrix.js │ ├── cluster.js │ └── matrix_view.js │ ├── model.js │ ├── radial │ ├── bg_view.js │ ├── black_green.js │ ├── channel_view.js │ ├── closeup.js │ ├── group_view2.js │ ├── layout.js │ ├── layout_gb.js │ ├── radial.js │ └── radial_view.js │ ├── run.js │ ├── svg │ ├── histogram.js │ ├── histogram_g.js │ └── slider.js │ └── views.js ├── bower.json ├── run └── server.py /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "app/lib", 3 | "json": "bower.json" 4 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 4 | app/lib 5 | links 6 | .idea 7 | .sass-cache 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Yarden, SCI Institution, University of Utah 2 | All rights reserved. LLNL-CODE-678975. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 18 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 21 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 22 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 | 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DragonView v1.0 2 | =============== 3 | 4 | Dragonview is an interactive visual analytics tool to visualize the nodes and 5 | links of a supercomputer that uses the dragonfly topology for its 6 | interconnection network. It can be used to map different data such as number of 7 | packets or bytes or stalls on the network links and job IDs or other on-node 8 | metrics on the router or node. 9 | 10 | ### Build 11 | * Download and install [nodejs](https://nodejs.org "Title") 12 | * Install bower 13 | 14 | Note: *"-g"* means global installation and on OSX must be run as sudo. You can install bower locally without the *"-g"* 15 | ``` 16 | npm install -g bower 17 | ``` 18 | * Install the libraries 19 | ``` 20 | bower install 21 | ``` 22 | ### Run 23 | ``` 24 | ./run 25 | ``` 26 | Open a browser and point it to localhost:8000 27 | 28 | ### Data 29 | Each run should have two files: 30 | 31 | ##### counters.csv 32 | Header: sg,sr,sg,dg,dr,dc,color,counter1,counter2,.. 33 | 34 | Each row describes a link: *src group, src row, src col, dest group, dest row, 35 | dest col, link color, \[counter, ...\]* 36 | 37 | ##### jobs.csv 38 | Header: g,r,c,n,core,jobid 39 | 40 | ##### runs.csv 41 | Header: name,counters,jobs 42 | 43 | One row per run including a name and paths to counters and jobs files 44 | 45 | -------------------------------------------------------------------------------- /app/assets/compare.css: -------------------------------------------------------------------------------- 1 | .controls { 2 | width: 140px; } 3 | .controls .values { 4 | max-height: 100px; 5 | overflow: auto; } 6 | .controls .value { 7 | margin-top: 0; 8 | padding-top: 0; } 9 | 10 | .selected { 11 | box-sizing: border-box; 12 | border: solid black 2px; 13 | z-index: 1; } 14 | 15 | #compare { 16 | position: fixed; 17 | top: 50px; 18 | bottom: 0; 19 | left: 160px; 20 | right: 0; } 21 | 22 | #cmap { 23 | height: 20px; 24 | width: 80%; } 25 | 26 | #cmap_mid { 27 | position: absolute; 28 | left: 30%; } 29 | 30 | #cmap_max { 31 | position: absolute; 32 | right: 10%; } 33 | 34 | #outer { 35 | position: fixed; 36 | top: 100px; 37 | bottom: 10px; 38 | left: 160px; 39 | right: 10px; } 40 | 41 | #matrix { 42 | position: fixed; 43 | top: 100px; 44 | bottom: 10px; 45 | left: 180px; 46 | right: 250px; } 47 | 48 | #columns { 49 | position: absolute; 50 | overflow: hidden; } 51 | #columns .col { 52 | position: absolute; 53 | background-color: palegreen; 54 | text-align: center; 55 | overflow: hidden; 56 | font-size: 10px; } 57 | #columns .rotate { 58 | transform: rotate(-90deg); 59 | transform-origin: left 0px; 60 | text-align: center; } 61 | 62 | #rows { 63 | position: absolute; 64 | overflow-y: hidden; } 65 | #rows .row { 66 | position: absolute; 67 | background-color: paleturquoise; 68 | font-size: 10px; } 69 | #rows .row:hover { 70 | box-sizing: border-box; 71 | border: solid darkgrey 2px; 72 | z-index: 1; } 73 | #rows .rotate { 74 | transform: rotate(-90deg); 75 | transform-origin: left 0px; 76 | text-align: center; } 77 | 78 | #values { 79 | position: absolute; 80 | box-sizing: border-box; } 81 | #values .value { 82 | position: absolute; } 83 | #values .value:hover { 84 | box-sizing: border-box; 85 | border: solid darkgrey 2px; 86 | z-index: 1; } 87 | 88 | #frame { 89 | overflow: scroll; 90 | position: fixed; 91 | bottom: 10px; 92 | right: 250px; } 93 | 94 | #results { 95 | font-size: 10px; 96 | position: relative; 97 | height: 500px; } 98 | #results .value { 99 | position: absolute; } 100 | #results .rotate { 101 | transform: rotate(-90deg); 102 | transform-origin: left 0px; 103 | text-align: center; } 104 | #results .col { 105 | position: absolute; 106 | background-color: palegreen; 107 | text-align: center; } 108 | #results .colText { 109 | position: absolute; } 110 | 111 | #selection-values { 112 | height: 40px; 113 | padding-left: 10px; } 114 | 115 | #selection { 116 | position: absolute; 117 | right: 0; 118 | max-width: 200px; } 119 | #selection ul { 120 | list-style-type: none; 121 | padding: 0px; 122 | margin: 0px; 123 | overflow: auto; } 124 | #selection ul li { 125 | border-radius: 5px; 126 | padding-left: 5px; 127 | padding-top: 2px; } 128 | #selection ul li:hover { 129 | background-color: lightgrey; } 130 | #selection .li-body { 131 | margin-left: 10px; } 132 | 133 | .field-title { 134 | font-weight: bold; 135 | font-size: 10pt; } 136 | 137 | /*# sourceMappingURL=compare.css.map */ 138 | -------------------------------------------------------------------------------- /app/assets/compare.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": ["compare.scss"], 5 | "names": [], 6 | "file": "compare.css" 7 | } 8 | -------------------------------------------------------------------------------- /app/assets/compare.scss: -------------------------------------------------------------------------------- 1 | 2 | .controls { 3 | width: 140px; 4 | 5 | .values { 6 | max-height: 100px; 7 | overflow: auto; 8 | } 9 | 10 | .value { 11 | margin-top: 0; 12 | padding-top: 0; 13 | } 14 | } 15 | 16 | .selected { 17 | box-sizing: border-box; 18 | border: solid black 2px; 19 | z-index: 1; 20 | } 21 | 22 | #compare { 23 | position: fixed; 24 | top: 50px; 25 | bottom: 0; 26 | left: 160px; 27 | right: 0; 28 | //border: solid lightblue 1px; 29 | } 30 | 31 | #cmap { 32 | height: 20px; 33 | width:80%; 34 | } 35 | 36 | #cmap_mid { 37 | position: absolute; 38 | left: 30%; 39 | } 40 | #cmap_max { 41 | position: absolute; 42 | right: 10%; 43 | } 44 | 45 | #outer { 46 | position: fixed; 47 | top: 100px; 48 | bottom: 10px; 49 | left: 160px; 50 | right:10px; 51 | //background-color: lightgrey; 52 | } 53 | 54 | #matrix { 55 | position: fixed; 56 | top: 100px; 57 | bottom: 10px; 58 | left: 180px; 59 | right: 250px; 60 | } 61 | 62 | #columns { 63 | position: absolute; 64 | overflow: hidden; 65 | 66 | .col { 67 | position: absolute; 68 | background-color: palegreen; 69 | text-align: center; 70 | overflow: hidden; 71 | font-size: 10px; 72 | } 73 | 74 | .rotate { 75 | transform: rotate(-90deg); 76 | transform-origin: left 0px; 77 | text-align: center; 78 | } 79 | } 80 | 81 | 82 | #rows { 83 | position: absolute; 84 | overflow-y: hidden; 85 | 86 | .row { 87 | position: absolute; 88 | background-color: paleturquoise; 89 | font-size: 10px; 90 | 91 | &:hover { 92 | box-sizing: border-box; 93 | border: solid darkgrey 2px; 94 | z-index: 1; 95 | } 96 | } 97 | 98 | .rotate { 99 | transform: rotate(-90deg); 100 | transform-origin: left 0px; 101 | text-align: center; 102 | } 103 | } 104 | 105 | #values { 106 | position: absolute; 107 | box-sizing: border-box; 108 | .value { 109 | position: absolute; 110 | &:hover { 111 | box-sizing: border-box; 112 | border: solid darkgrey 2px; 113 | z-index: 1; 114 | } 115 | } 116 | } 117 | 118 | #frame { 119 | overflow: scroll; 120 | position: fixed; 121 | bottom: 10px; 122 | right: 250px; 123 | } 124 | 125 | #results { 126 | font-size: 10px; 127 | position: relative; 128 | height: 500px; 129 | .value { 130 | position: absolute; 131 | //border: lightgrey solid 1px; 132 | } 133 | 134 | 135 | 136 | .rotate { 137 | transform: rotate(-90deg); 138 | transform-origin: left 0px; 139 | text-align: center; 140 | } 141 | 142 | .col { 143 | position: absolute; 144 | background-color: palegreen; 145 | text-align: center; 146 | } 147 | 148 | .colText { 149 | position: absolute; 150 | //background-color: lightblue; 151 | } 152 | } 153 | 154 | #selection-values { 155 | height: 40px; 156 | padding-left: 10px; 157 | } 158 | 159 | #selection { 160 | position: absolute; 161 | //width: 180px; 162 | right: 0; 163 | max-width: 200px; 164 | 165 | ul { 166 | list-style-type: none; 167 | padding: 0px; 168 | margin: 0px; 169 | overflow: auto; 170 | } 171 | 172 | ul li { 173 | border-radius: 5px; 174 | padding-left: 5px; 175 | padding-top: 2px; 176 | 177 | &:hover { 178 | background-color: lightgrey; 179 | } 180 | 181 | } 182 | 183 | 184 | .li-body { 185 | margin-left: 10px; 186 | } 187 | } 188 | 189 | .field-title { 190 | font-weight: bold; 191 | font-size: 10pt; 192 | } 193 | -------------------------------------------------------------------------------- /app/assets/run.css: -------------------------------------------------------------------------------- 1 | .tabs { 2 | display: inline-block; 3 | /*----- Content of Tabs -----*/ } 4 | .tabs .tab-links { 5 | padding: 0; 6 | margin: 10px 0 0 0; } 7 | .tabs .tab-links:after { 8 | display: block; 9 | clear: both; 10 | content: ''; } 11 | .tabs .tab-links li { 12 | margin: 0px 5px; 13 | float: left; 14 | list-style: none; } 15 | .tabs .tab-links a { 16 | padding: 4px 8px; 17 | display: inline-block; 18 | border-radius: 3px 3px 0px 0px; 19 | color: #4c4c4c; 20 | transition: all linear 0.15s; } 21 | .tabs .tab-links a:hover { 22 | background: #f0f0f0; 23 | text-decoration: none; } 24 | .tabs li.active a, .tabs li.active a:hover { 25 | background: #e0e0e0; 26 | color: #4c4c4c; } 27 | .tabs .tab-content { 28 | padding: 0px; 29 | border-radius: 3px; } 30 | .tabs .tab { 31 | display: none; } 32 | .tabs .tab.active { 33 | display: block; } 34 | 35 | body { 36 | position: relative; 37 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 38 | font-size: 10pt; } 39 | 40 | .nav, .pagination, .carousel, .panel-title a { 41 | cursor: pointer; } 42 | 43 | div { 44 | margin: 0px; } 45 | 46 | .page { 47 | position: fixed; 48 | top: 0px; 49 | bottom: 0px; 50 | left: 0px; 51 | right: 0px; } 52 | 53 | .title { 54 | font-size: 16pt; 55 | font-weight: bold; } 56 | 57 | .color-menu { 58 | border: 1px solid black; 59 | background-color: #ccc; } 60 | 61 | .color-entry { 62 | margin: 2px; 63 | border: 1px solid #ccc; } 64 | .color-entry:hover { 65 | border: 1px solid black; } 66 | 67 | .swatch { 68 | display: block; 69 | width: 20px; 70 | height: 15px; } 71 | 72 | #data-table { 73 | font-size: 10pt; } 74 | 75 | .controls { 76 | top: 10px; 77 | left: 5px; 78 | width: 260px; } 79 | .controls ul { 80 | list-style-type: none; 81 | padding: 0px; 82 | margin: 0px; } 83 | .controls ul li { 84 | border-radius: 5px; 85 | padding-left: 15px; 86 | padding-top: 5px; 87 | margin-top: 10px; 88 | background-color: #f0f0f0; } 89 | .controls .li-title { 90 | margin-left: -10px; 91 | font-weight: bold; 92 | font-size: 10pt; } 93 | .controls .li-body { 94 | margin-left: 10px; } 95 | .controls .range-value { 96 | width: 50px; 97 | position: absolute; 98 | text-align: right; } 99 | .controls #cmap:hover { 100 | cursor: ns-resize; } 101 | .controls .job-color { 102 | display: inline-block; 103 | width: 20px; 104 | height: 10px; 105 | cursor: pointer; } 106 | .controls .jobs { 107 | font-size: 8pt; } 108 | 109 | .job-color { 110 | border: solid lightgrey 1px; } 111 | .job-color:hover { 112 | border: solid gray 1px; } 113 | .job-color.selected { 114 | border: solid black 1px; } 115 | 116 | .sub-label { 117 | width: 40px; } 118 | 119 | .info { 120 | margin-left: 0; 121 | margin-top: 0; } 122 | 123 | .counter { 124 | width: 250px; 125 | background-color: #fdf5ce; } 126 | 127 | #view { 128 | position: fixed; 129 | top: 0; 130 | bottom: 0; 131 | left: 280px; 132 | right: 0; } 133 | 134 | .views { 135 | position: fixed; 136 | top: 0; 137 | bottom: 0; 138 | left: 280px; 139 | right: 0; } 140 | 141 | .view { 142 | overflow: scroll; } 143 | 144 | .histogram .bar { 145 | shape-rendering: crispEdges; 146 | pointer-events: none; } 147 | .histogram .bar text { 148 | fill: #fff; } 149 | .histogram .axis text { 150 | font-size: 12px; } 151 | .histogram .axis path, .histogram .axis line { 152 | fill: none; 153 | stroke: #333; 154 | shape-rendering: crispEdges; } 155 | .histogram .brush .extent { 156 | fill: #ddd; 157 | fill-opacity: 1; 158 | stroke: #888; 159 | stroke-width: 1px; 160 | shape-rendering: crispEdges; } 161 | .histogram .externalHandler { 162 | fill: #ddd; 163 | fill-opacity: 1; 164 | stroke: #888; 165 | stroke-width: 1px; 166 | shape-rendering: crispEdges; } 167 | 168 | .slider { 169 | stroke: #333; } 170 | .slider .axis text { 171 | font-size: 12px; } 172 | .slider .axis line, .slider path { 173 | fill: none; 174 | stroke: #333; 175 | /*stroke-width: 2px;*/ 176 | shape-rendering: crispEdges; } 177 | .slider .brush .extent { 178 | fill: #ddd; 179 | stroke: #888; 180 | stroke-width: 1px; 181 | /*fill-opacity: .25;*/ 182 | shape-rendering: crispEdges; } 183 | .slider .resize { 184 | fill: #888; } 185 | 186 | .radial-view { 187 | display: inline-block; } 188 | 189 | .radial { 190 | display: inline-block; 191 | vertical-align: top; 192 | position: absolute; } 193 | .radial .group { 194 | fill: #fff; 195 | /*#f8f8f8;*/ 196 | stroke: #ccc; } 197 | .radial .group text { 198 | stroke: none; 199 | fill: black; } 200 | .radial .group text:hover { 201 | cursor: pointer; 202 | fill: red; 203 | font-size: large; } 204 | .radial .group.selected text { 205 | font-size: large; } 206 | .radial .group.selected path { 207 | stroke: #000; 208 | stroke-width: 2px; } 209 | .radial .connector { 210 | fill: #a0a0a0; 211 | stroke: none; } 212 | .radial .connection { 213 | stroke-opacity: 1; 214 | stroke-width: 0.5; 215 | fill: none; } 216 | .radial .connection.fade { 217 | stroke-opacity: 0.3; 218 | stroke: lightgray; } 219 | .radial .connection.highlight { 220 | stroke-width: 4; } 221 | 222 | .first { 223 | stroke-dasharray: 50%; } 224 | 225 | .router .nodes { 226 | fill: #eee; 227 | stroke-width: 1px; 228 | stroke: none; } 229 | .router circle { 230 | stroke-width: 2px; 231 | r: 2px; } 232 | .router circle:hover { 233 | stroke-width: 4px; } 234 | .router circle:active { 235 | r: 4px; } 236 | .router circle.fade { 237 | opacity: 0.3; } 238 | .router.fade { 239 | opacity: 0.3; } 240 | 241 | #bg-div { 242 | display: inline-block; } 243 | #bg-div #bg-button { 244 | position: absolute; 245 | right: 10px; } 246 | #bg-div.closed canvas { 247 | display: none; } 248 | 249 | .matrix line { 250 | fill: none; 251 | stroke: lightgray; 252 | stroke-width: 1px; 253 | shape-rendering: crispEdges; 254 | opacity: 0.4; } 255 | 256 | .node { 257 | stroke: white; 258 | stroke-width: 1.5px; } 259 | 260 | .edge { 261 | stroke-width: 1.5px; 262 | stroke-opacity: 0.6; } 263 | 264 | .graph-ctrl { 265 | padding-left: 40px; } 266 | 267 | .overlay { 268 | fill: none; 269 | pointer-events: all; } 270 | 271 | /* group view */ 272 | .group-view .green { 273 | stroke-width: 1px; 274 | stroke: green; 275 | shape-rendering: crispEdges; } 276 | 277 | .closeup { 278 | padding-bottom: 10px; } 279 | .closeup .closeup-group { 280 | fill: lightgray; } 281 | .closeup .closeup-group rect.fade { 282 | fill-opacity: 0.3; } 283 | .closeup .canvas { 284 | position: fixed; 285 | padding-left: 30px; 286 | vertical-align: top; 287 | fill: lightblue; } 288 | 289 | /*# sourceMappingURL=run.css.map */ 290 | -------------------------------------------------------------------------------- /app/assets/run.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": ["tabs.scss","run.scss"], 5 | "names": [], 6 | "file": "run.css" 7 | } 8 | -------------------------------------------------------------------------------- /app/assets/run.scss: -------------------------------------------------------------------------------- 1 | @import "tabs"; 2 | 3 | body { 4 | position: relative; 5 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 6 | font-size: 10pt; 7 | } 8 | 9 | .nav, .pagination, .carousel, .panel-title a { cursor: pointer; } 10 | 11 | div { 12 | margin: 0px; 13 | } 14 | 15 | .page { 16 | position: fixed; 17 | top: 0px; 18 | bottom: 0px; 19 | left: 0px; 20 | right: 0px; 21 | } 22 | 23 | .title { 24 | font-size: 16pt; 25 | font-weight: bold; 26 | } 27 | 28 | .color-menu { 29 | border: 1px solid black; 30 | background-color: #ccc; 31 | } 32 | 33 | .color-entry { 34 | margin: 2px; 35 | border: 1px solid #ccc; 36 | &:hover { 37 | border: 1px solid black; 38 | } 39 | } 40 | 41 | .swatch { 42 | //display: inline-block; 43 | display: block; 44 | width: 20px; 45 | height: 15px; 46 | } 47 | 48 | #data-table { 49 | font-size: 10pt; 50 | } 51 | 52 | .controls { 53 | // position: fixed; 54 | top: 10px; 55 | left: 5px; 56 | width: 260px; 57 | 58 | ul { 59 | list-style-type: none; 60 | padding: 0px; 61 | margin: 0px; 62 | } 63 | 64 | ul li { 65 | border-radius: 5px; 66 | padding-left: 15px; 67 | padding-top: 5px; 68 | margin-top: 10px; 69 | background-color: #f0f0f0; 70 | 71 | } 72 | 73 | .li-title { 74 | // font-style: italic; 75 | margin-left: -10px; 76 | font-weight: bold; 77 | font-size: 10pt; 78 | } 79 | 80 | .li-body { 81 | margin-left: 10px; 82 | } 83 | 84 | .range-value { 85 | width:50px; 86 | position: absolute; 87 | text-align: right; 88 | } 89 | 90 | 91 | #cmap { 92 | &:hover { 93 | cursor: ns-resize; 94 | } 95 | } 96 | 97 | .job-color { 98 | display: inline-block; 99 | width: 20px; 100 | height: 10px; 101 | cursor: pointer; 102 | } 103 | 104 | .jobs{ 105 | font-size: 8pt; 106 | } 107 | 108 | 109 | } 110 | 111 | .job-color { 112 | border: solid lightgrey 1px ; 113 | 114 | &:hover { 115 | border: solid gray 1px; 116 | } 117 | 118 | &.selected { 119 | border: solid black 1px; 120 | } 121 | } 122 | 123 | .sub-label { 124 | width: 40px; 125 | } 126 | 127 | .info { 128 | margin-left: 0; 129 | margin-top: 0; 130 | } 131 | 132 | 133 | .counter { 134 | width: 250px; 135 | background-color: #fdf5ce; 136 | } 137 | 138 | #view { 139 | position: fixed; 140 | top: 10px; 141 | bottom: 0; 142 | left: 280px; 143 | right: 0; 144 | } 145 | 146 | .views { 147 | position: fixed; 148 | top: 0; 149 | bottom: 0; 150 | left: 280px; 151 | right: 0; 152 | } 153 | 154 | .view { 155 | overflow: scroll 156 | } 157 | 158 | .histogram { 159 | 160 | .bar { 161 | shape-rendering: crispEdges; 162 | pointer-events: none; 163 | } 164 | 165 | .bar text { 166 | fill: #fff; 167 | } 168 | 169 | .axis text { 170 | font-size: 12px; 171 | } 172 | 173 | .axis path, .axis line { 174 | fill: none; 175 | stroke: #333; 176 | shape-rendering: crispEdges; 177 | } 178 | 179 | .brush .extent { 180 | fill: #ddd; 181 | fill-opacity: 1; 182 | stroke: #888; 183 | stroke-width: 1px; 184 | shape-rendering: crispEdges; 185 | } 186 | 187 | .externalHandler { 188 | fill: #ddd; 189 | fill-opacity: 1; 190 | stroke: #888; 191 | stroke-width: 1px; 192 | shape-rendering: crispEdges; 193 | } 194 | } 195 | 196 | .slider { 197 | stroke: #333; 198 | 199 | .axis text { 200 | font-size: 12px; 201 | } 202 | .axis line, path { 203 | fill: none; 204 | stroke: #333; 205 | /*stroke-width: 2px;*/ 206 | shape-rendering: crispEdges; 207 | } 208 | 209 | .brush .extent { 210 | fill: #ddd; 211 | stroke: #888; 212 | stroke-width: 1px; 213 | /*fill-opacity: .25;*/ 214 | shape-rendering: crispEdges; 215 | } 216 | 217 | .resize { 218 | fill: #888; 219 | } 220 | } 221 | 222 | .radial-view { 223 | display: inline-block; 224 | } 225 | 226 | 227 | .radial { 228 | display: inline-block; 229 | vertical-align: top; 230 | position: absolute; 231 | 232 | .group { 233 | fill: #fff; /*#f8f8f8;*/ 234 | stroke: #ccc; 235 | 236 | text { 237 | stroke: none; 238 | fill: black; 239 | } 240 | 241 | text:hover { 242 | cursor:pointer; 243 | fill: red; 244 | font-size: large; 245 | } 246 | 247 | //&.:hover { 248 | // cursor:pointer; 249 | // 250 | // text { 251 | // fill: red; 252 | // font-size: large; 253 | // } 254 | // 255 | // path { 256 | // stroke: #808080; 257 | // stroke-width: 1px; 258 | // } 259 | //} 260 | 261 | &.selected { 262 | text { 263 | font-size: large; 264 | } 265 | 266 | path { 267 | //fill: #d8d8d8; 268 | stroke: #000; 269 | stroke-width: 2px; 270 | } 271 | } 272 | 273 | } 274 | 275 | 276 | 277 | .connector { 278 | fill: #a0a0a0; 279 | stroke: none; 280 | } 281 | 282 | .connection { 283 | // stroke: steelblue; 284 | stroke-opacity: 1; 285 | stroke-width: 0.5; 286 | fill: none; 287 | // pointer-events: none; 288 | 289 | &.fade { 290 | stroke-opacity: 0.3; 291 | stroke: lightgray; 292 | } 293 | &.highlight { 294 | stroke-width: 4; 295 | //stroke-dasharray: 50%; 296 | } 297 | } 298 | 299 | } 300 | 301 | .first { 302 | stroke-dasharray: 50%; 303 | } 304 | 305 | .router { 306 | .nodes { 307 | fill: #eee; 308 | stroke-width: 1px; 309 | stroke: none; 310 | } 311 | 312 | circle { 313 | stroke-width: 2px; 314 | r: 2px; 315 | 316 | &:hover { 317 | stroke-width: 4px; 318 | } 319 | 320 | &:active { 321 | r: 4px; 322 | } 323 | 324 | &.fade { 325 | opacity: 0.3; 326 | } 327 | } 328 | 329 | &.fade { 330 | opacity: 0.3; 331 | } 332 | 333 | } 334 | 335 | #bg-div { 336 | display: inline-block; 337 | 338 | #bg-button { 339 | position: absolute; 340 | right: 10px; 341 | } 342 | 343 | &.closed { 344 | canvas { 345 | display: none; 346 | } 347 | 348 | } 349 | } 350 | 351 | 352 | 353 | .canvas { 354 | } 355 | 356 | .matrix { 357 | line { 358 | fill: none; 359 | stroke: lightgray; 360 | stroke-width: 1px; 361 | shape-rendering: crispEdges; 362 | opacity: 0.4; 363 | } 364 | } 365 | 366 | .node { 367 | // fill: steelblue; 368 | stroke: white; 369 | stroke-width: 1.5px; 370 | } 371 | 372 | .edge { 373 | // stroke: #ddd; 374 | stroke-width: 1.5px; 375 | stroke-opacity: 0.6; 376 | } 377 | 378 | .graph-ctrl { 379 | padding-left: 40px; 380 | } 381 | 382 | .overlay { 383 | fill: none; 384 | pointer-events: all; 385 | } 386 | 387 | /* group view */ 388 | .group-view { 389 | .green { 390 | stroke-width: 1px; 391 | stroke: green; 392 | shape-rendering: crispEdges; 393 | } 394 | } 395 | 396 | .closeup { 397 | //background-color: #eeff6e; 398 | padding-bottom: 10px; 399 | 400 | .closeup-group { 401 | fill: lightgray; 402 | 403 | rect.fade { 404 | fill-opacity: 0.3; 405 | } 406 | } 407 | 408 | .canvas { 409 | position: fixed; 410 | padding-left: 30px; 411 | vertical-align: top; 412 | fill: lightblue; 413 | } 414 | } -------------------------------------------------------------------------------- /app/assets/tabs.scss: -------------------------------------------------------------------------------- 1 | 2 | .tabs { 3 | // width: 100%; 4 | display: inline-block; 5 | 6 | .tab-links { 7 | padding: 0; 8 | margin: 10px 0 0 0; 9 | } 10 | .tab-links:after { 11 | display: block; 12 | clear: both; 13 | content: ''; 14 | } 15 | 16 | .tab-links li { 17 | margin: 0px 5px; 18 | float: left; 19 | list-style: none; 20 | } 21 | 22 | .tab-links a { 23 | padding: 4px 8px; 24 | display: inline-block; 25 | border-radius: 3px 3px 0px 0px; 26 | // background: #7FB5DA; 27 | // font-size: 14px; 28 | // font-weight: 600; 29 | color: #4c4c4c; 30 | transition: all linear 0.15s; 31 | } 32 | 33 | .tab-links a:hover { 34 | background: #f0f0f0; 35 | text-decoration: none; 36 | } 37 | 38 | li.active a, li.active a:hover { 39 | background: #e0e0e0; 40 | color: #4c4c4c; 41 | } 42 | 43 | /*----- Content of Tabs -----*/ 44 | .tab-content { 45 | padding: 0px; 46 | border-radius: 3px; 47 | // box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.15); 48 | // background: #fff; 49 | } 50 | 51 | .tab { 52 | display: none; 53 | } 54 | 55 | .tab.active { 56 | display: block; 57 | } 58 | 59 | }; -------------------------------------------------------------------------------- /app/compare.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/data/edison/runs-edison.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm {256-184},edison/2014-09-22-09-39-51/standard/dnd_net_counters.csv,edison/2014-09-22-09-39-51/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-206},edison/2014-09-08-02-05-59/standard/dnd_net_counters.csv,edison/2014-09-08-02-05-59/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-208},edison/2014-09-22-06-46-25/standard/dnd_net_counters.csv,edison/2014-09-22-06-46-25/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-215},edison/2014-09-12-17-47-31/standard/dnd_net_counters.csv,edison/2014-09-12-17-47-31/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-219},edison/2014-09-20-05-29-50/standard/dnd_net_counters.csv,edison/2014-09-20-05-29-50/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-233},edison/2014-09-09-10-18-03/standard/dnd_net_counters.csv,edison/2014-09-09-10-18-03/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-246},edison/2014-09-08-17-59-25/standard/dnd_net_counters.csv,edison/2014-09-08-17-59-25/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-268},edison/2014-09-07-14-46-43/standard/dnd_net_counters.csv,edison/2014-09-07-14-46-43/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-288},edison/2014-09-11-09-28-32/standard/dnd_net_counters.csv,edison/2014-09-11-09-28-32/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-292},edison/2014-09-05-13-45-14/standard/dnd_net_counters.csv,edison/2014-09-05-13-45-14/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-297},edison/2014-09-19-05-48-35/standard/dnd_net_counters.csv,edison/2014-09-19-05-48-35/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-305},edison/2014-09-01-10-45-18/standard/dnd_net_counters.csv,edison/2014-09-01-10-45-18/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-322},edison/2014-09-03-15-46-29/standard/dnd_net_counters.csv,edison/2014-09-03-15-46-29/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-332},edison/2014-09-23-09-41-34/standard/dnd_net_counters.csv,edison/2014-09-23-09-41-34/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-334},edison/2014-09-01-22-41-42/standard/dnd_net_counters.csv,edison/2014-09-01-22-41-42/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-334},edison/2014-09-16-15-58-16/standard/dnd_net_counters.csv,edison/2014-09-16-15-58-16/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-378},edison/2014-09-18-17-12-34/standard/dnd_net_counters.csv,edison/2014-09-18-17-12-34/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-400},edison/2014-09-02-18-17-45/standard/dnd_net_counters.csv,edison/2014-09-02-18-17-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-419},edison/2014-09-18-16-45-22/standard/dnd_net_counters.csv,edison/2014-09-18-16-45-22/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-544},edison/2014-09-21-12-30-53/standard/dnd_net_counters.csv,edison/2014-09-21-12-30-53/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-654},edison/2014-09-14-14-08-58/standard/dnd_net_counters.csv,edison/2014-09-14-14-08-58/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-661},edison/2014-09-14-15-51-56/standard/dnd_net_counters.csv,edison/2014-09-14-15-51-56/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {384-177},edison/2014-09-20-05-58-07/standard/dnd_net_counters.csv,edison/2014-09-20-05-58-07/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-182},edison/2014-09-20-05-19-01/standard/dnd_net_counters.csv,edison/2014-09-20-05-19-01/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-187},edison/2014-09-23-07-38-12/standard/dnd_net_counters.csv,edison/2014-09-23-07-38-12/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-192},edison/2014-09-20-05-39-04/standard/dnd_net_counters.csv,edison/2014-09-20-05-39-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-203},edison/2014-09-12-19-04-33/standard/dnd_net_count./2015-09-18-17-25-18/xtdb2proc.outrs.csv,edison/2014-09-12-19-04-33/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-208},edison/2014-09-12-19-39-57/standard/dnd_net_counters.csv,edison/2014-09-12-19-39-57/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-214},edison/2014-09-21-13-04-13/standard/dnd_net_counters.csv,edison/2014-09-21-13-04-13/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-218},edison/2014-09-10-19-07-11/standard/dnd_net_counters.csv,edison/2014-09-10-19-07-11/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-227},edison/2014-09-22-07-14-07/standard/dnd_net_counters.csv,edison/2014-09-22-07-14-07/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-231},edison/2014-09-01-23-05-04/standard/dnd_net_counters.csv,edison/2014-09-01-23-05-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-236},edison/2014-09-08-16-03-58/standard/dnd_net_counters.csv,edison/2014-09-08-16-03-58/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-253},edison/2014-09-07-14-48-27/standard/dnd_net_counters.csv,edison/2014-09-07-14-48-27/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-278},edison/2014-09-17-19-00-59/standard/dnd_net_counters.csv,edison/2014-09-17-19-00-59/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-278},edison/2014-09-19-05-23-04/standard/dnd_net_counters.csv,edison/2014-09-19-05-23-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-279},edison/2014-09-08-18-56-36/standard/dnd_net_counters.csv,edison/2014-09-08-18-56-36/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-283},edison/2014-09-24-03-43-41/standard/dnd_net_counters.csv,edison/2014-09-24-03-43-41/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-304},edison/2014-09-02-20-56-08/standard/dnd_net_counters.csv,edison/2014-09-02-20-56-08/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-310},edison/2014-09-01-10-50-59/standard/dnd_net_counters.csv,edison/2014-09-01-10-50-59/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-340},edison/2014-09-03-16-58-50/standard/dnd_net_counters.csv,edison/2014-09-03-16-58-50/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-595},edison/2014-09-14-16-36-45/standard/dnd_net_counters.csv,edison/2014-09-14-16-36-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-610},edison/2014-09-05-16-16-52/standard/dnd_net_counters.csv,edison/2014-09-05-16-16-52/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-633},edison/2014-09-14-16-04-02/standard/dnd_net_counters.csv,edison/2014-09-14-16-04-02/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-730},edison/2014-09-09-20-31-06/standard/dnd_net_counters.csv,edison/2014-09-09-20-31-06/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {512-198},edison/2014-09-10-19-10-40/standard/dnd_net_counters.csv,edison/2014-09-10-19-10-40/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-211},edison/2014-09-12-19-53-40/standard/dnd_net_counters.csv,edison/2014-09-12-19-53-40/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-222},edison/2014-09-21-13-26-42/standard/dnd_net_counters.csv,edison/2014-09-21-13-26-42/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-223},edison/2014-09-12-19-24-56/standard/dnd_net_counters.csv,edison/2014-09-12-19-24-56/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-230},edison/2014-09-21-06-28-47/standard/dnd_net_counters.csv,edison/2014-09-21-06-28-47/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-249},edison/2014-09-24-04-43-45/standard/dnd_net_counters.csv,edison/2014-09-24-04-43-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-260},edison/2014-09-05-19-27-45/standard/dnd_net_counters.csv,edison/2014-09-05-19-27-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-261},edison/2014-09-22-08-35-54/standard/dnd_net_counters.csv,edison/2014-09-22-08-35-54/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-264},edison/2014-09-05-19-11-04/standard/dnd_net_counters.csv,edison/2014-09-05-19-11-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-273},edison/2014-09-07-15-06-58/standard/dnd_net_counters.csv,edison/2014-09-07-15-06-58/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-281},edison/2014-09-08-21-55-30/standard/dnd_net_counters.csv,edison/2014-09-08-21-55-30/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-284},edison/2014-09-23-10-16-28/standard/dnd_net_counters.csv,edison/2014-09-23-10-16-28/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-292},edison/2014-09-01-23-27-40/standard/dnd_net_counters.csv,edison/2014-09-01-23-27-40/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-313},edison/2014-09-19-05-50-45/standard/dnd_net_counters.csv,edison/2014-09-19-05-50-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-324},edison/2014-09-08-23-31-23/standard/dnd_net_counters.csv,edison/2014-09-08-23-31-23/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-346},edison/2014-09-09-20-59-35/standard/dnd_net_counters.csv,edison/2014-09-09-20-59-35/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-350},edison/2014-09-01-12-50-30/standard/dnd_net_counters.csv,edison/2014-09-01-12-50-30/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-413},edison/2014-09-18-16-50-03/standard/dnd_net_counters.csv,edison/2014-09-18-16-50-03/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-441},edison/2014-09-02-21-17-32/standard/dnd_net_counters.csv,edison/2014-09-02-21-17-32/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-610},edison/2014-09-14-16-56-28/standard/dnd_net_counters.csv,edison/2014-09-14-16-56-28/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-618},edison/2014-09-21-12-30-46/standard/dnd_net_counters.csv,edison/2014-09-21-12-30-46/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-645},edison/2014-09-21-11-36-49/standard/dnd_net_counters.csv,edison/2014-09-21-11-36-49/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-690},edison/2014-09-14-16-30-21/standard/dnd_net_counters.csv,edison/2014-09-14-16-30-21/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv -------------------------------------------------------------------------------- /app/data/pacvis/fix.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | find links/linkdata/4b-2grn -name "*.csv" | sed \ 3 | -e 's/\(.*\/\)\([^\/]*\)/pushd \1; ln -s \2 \2Z; popd/' \ 4 | -e 's/links-\([^\.]*\)[^ ]*\(\-.\)\.csvZ/links-\1\2.csv/' \ 5 | -e 's/links-\([^\.]*\)[^ ]*\.csvZ/links-\1.csv/' \ 6 | -e 's/ \([^\.]*\)[^ ]*\(\-.\).csvZ/ \1\2.csv/' \ 7 | -e 's/ \([^\.]*\)[^ ]*.csvZ/ \1.csv/' > l 8 | 9 | source l; 10 | rm l 11 | -------------------------------------------------------------------------------- /app/data/sim/alldata.csv: -------------------------------------------------------------------------------- 1 | /Users/yarden/data/piper/alldata.csv -------------------------------------------------------------------------------- /app/data/sim/dump_net.py: -------------------------------------------------------------------------------- 1 | __author__ = 'yarden' 2 | 3 | import os 4 | import re 5 | import csv 6 | from sys import argv 7 | from collections import namedtuple 8 | import yaml 9 | 10 | from utils.eyaml import eyaml_load 11 | 12 | NodeCoord = namedtuple('NodeCoord', 'group row col node') 13 | 14 | MPI_PATTERN = '.*\.mpiP' 15 | PROC_PATTERN = 'xtdb2proc' 16 | QSTAT_PATTERN = 'qstat.*before' 17 | NETTILE_PATTERN = 'networktiles.yaml' 18 | PROCTILE_PATTERN = 'proctiles.yaml' 19 | 20 | COUNTERS_OUT = 'dnd_net_counters.csv' 21 | JOBS_OUT = 'dnd_jobs.csv' 22 | 23 | jobid = None 24 | mpirank = [] 25 | nodes = {} 26 | topology = {} 27 | dir_name = None 28 | 29 | edison_pattern = re.compile('l(\d)(\d).(\d+):(\d+):(\d+)') 30 | 31 | 32 | def dump(path): 33 | global jobid, files, mpirank, nodes, topology, dir_name 34 | 35 | jobid = None 36 | mpirank = [] 37 | nodes = {} 38 | topology = {} 39 | 40 | dir_name = path 41 | print path 42 | files = os.listdir(dir_name) 43 | # sig = os.path.basename(dir_name) 44 | # if string.digits.find(sig[0]) == -1: 45 | # sig = os.path.basename(os.path.dirname(dir_name)) 46 | 47 | load_topology() 48 | jobid = parse_job() 49 | parse_mpi() 50 | parse_proc() 51 | parse_net() 52 | parse_qstat() 53 | write_jobs() 54 | 55 | 56 | def parse(field): 57 | m = edison_pattern.search(field) 58 | if m is None: 59 | return None 60 | return int(m.group(3)), int(m.group(4)), int(m.group(5)), int(m.group(1))*8+int(m.group(2)) 61 | 62 | 63 | def load_topology(): 64 | with open('assets/interconnect.txt') as r: 65 | for line in r: 66 | fields = line.strip().split() 67 | color = fields[1][0] if fields[1] != 'black' else 'k' 68 | if color != 'p' and fields[3] != 'unused': 69 | sg, sr, sc, sp = parse(fields[0]) 70 | dg, dr, dc, dp = parse(fields[3]) 71 | topology[(sg, sr, sc, sp)] = (dg, dr, dc, color) 72 | 73 | 74 | def find_file(pattern): 75 | for filename in files: 76 | if re.match(pattern, filename): 77 | return local(filename) 78 | raise IOError('file not found: '+pattern) 79 | 80 | 81 | def local(name): 82 | return os.path.join(dir_name, name) 83 | 84 | 85 | def find_line(f, text): 86 | while True: 87 | line = f.readline() 88 | if line == '': 89 | raise IOError('reached EOF while searching for '+text) 90 | if line.startswith(text): 91 | return line 92 | 93 | 94 | def physical_to_logical(row, col, cage, slot, cpu): 95 | return NodeCoord(row*4+col/2, cage+(col % 2)*3, slot, cpu) 96 | 97 | 98 | def mpirank_to_router(rank): 99 | (g, r, c, n) = nodes[mpirank[rank]][1] 100 | return g, r, c 101 | 102 | 103 | # def parse_job(): 104 | # filename = find_file(NETTILE_PATTERN) 105 | # ignore, meta, net = eyaml_load(filename) 106 | # job = meta['jobid'] 107 | # job = job[:job.index('.')] 108 | # return job 109 | 110 | def parse_job(): 111 | filename = find_file(NETTILE_PATTERN) 112 | with open(filename, 'r') as f: 113 | loader = yaml.SafeLoader(f) 114 | key = loader.get_data() 115 | meta = loader.get_data() 116 | job = meta[0]['jobid'] 117 | job = job[:job.index('.')] 118 | return job 119 | 120 | def parse_mpi(): 121 | with open(find_file(MPI_PATTERN), 'r') as f: 122 | # parse mpi tasks 123 | line = find_line(f, '@ MPI Task Assignment') 124 | while line.startswith('@ MPI Task Assignment'): 125 | rank, nid = line[line.index(':') + 1:].strip().split(' ') 126 | mpirank.append(str(int(nid[3:]))) 127 | line = f.readline() 128 | 129 | 130 | def parse_qstat(): 131 | # jobs = [] 132 | with open(find_file(QSTAT_PATTERN), 'r') as f: 133 | for i in range(5): 134 | next(f) 135 | 136 | status = None 137 | jid = None 138 | for line in f: 139 | line = line.strip() 140 | if not line.startswith('+'): 141 | fields = line.split() 142 | 143 | status = fields[9] 144 | if status is 'R': 145 | jid = fields[0][:fields[0].index('.')] 146 | job = (jid, fields[3], int(fields[5])) 147 | # jobs.append(job) 148 | parse_node_list(fields[11], jid) 149 | elif status is 'R': 150 | # a continuation line 151 | parse_node_list(line, jid) 152 | 153 | # return sorted(jobs, key=lambda j: j.count, reverse=True) 154 | 155 | 156 | def parse_node_list(line, jid): 157 | fields = line.split('+') 158 | for pair in fields: 159 | if pair is not '': 160 | nid = pair.split('/')[0] 161 | node = nodes[nid] 162 | if node[3] == '': 163 | nodes[nid] = (node[0], node[1], node[2], jid) 164 | 165 | 166 | def parse_proc(): 167 | with open(find_file(PROC_PATTERN), 'r') as f: 168 | for i in range(7): 169 | next(f) 170 | 171 | for line in f: 172 | fields = line.strip().split(',') 173 | 174 | node = int(fields[0].split('=')[1]) 175 | slot = int(fields[1].split('=')[1]) 176 | cage = int(fields[2].split('=')[1]) 177 | col = int(fields[4].split('=')[1]) 178 | row = int(fields[5].split('=')[1]) 179 | 180 | # print (row,col,cage,slot, node), 'g:', row*4+col/2 181 | status = fields[11].split('=')[1].split('\'')[1] 182 | # node_type = fields[12].split('=')[1].split('\'')[1] 183 | node_id = fields[14].split('=')[1] 184 | 185 | nodes[node_id] = (node_id, physical_to_logical(row, col, cage, slot, node), status, '') 186 | 187 | 188 | counters_mapping = [ 189 | ['flits', None], 190 | ['stalls', None], 191 | ['stalls/flit', None], 192 | ['flits_vc_0', 'INQ_PRF_INCOMING_FLIT_VC0'], 193 | ['flits_vc_1', 'INQ_PRF_INCOMING_FLIT_VC1'], 194 | ['flits_vc_2', 'INQ_PRF_INCOMING_FLIT_VC2'], 195 | ['flits_vc_3', 'INQ_PRF_INCOMING_FLIT_VC3'], 196 | ['flits_vc_4', 'INQ_PRF_INCOMING_FLIT_VC4'], 197 | ['flits_vc_5', 'INQ_PRF_INCOMING_FLIT_VC5'], 198 | ['flits_vc_6', 'INQ_PRF_INCOMING_FLIT_VC6'], 199 | ['flits_vc_7', 'INQ_PRF_INCOMING_FLIT_VC7'], 200 | ['stalls_vc_0', 'INQ_PRF_INCOMING_PKT_VC0_FILTER_FLIT0_CNT'], 201 | ['stalls_vc_1', 'INQ_PRF_INCOMING_PKT_VC1_FILTER_FLIT1_CNT'], 202 | ['stalls_vc_2', 'INQ_PRF_INCOMING_PKT_VC2_FILTER_FLIT2_CNT'], 203 | ['stalls_vc_3', 'INQ_PRF_INCOMING_PKT_VC3_FILTER_FLIT3_CNT'], 204 | ['stalls_vc_4', 'INQ_PRF_INCOMING_PKT_VC4_FILTER_FLIT4_CNT'], 205 | ['stalls_vc_5', 'INQ_PRF_INCOMING_PKT_VC5_FILTER_FLIT5_CNT'], 206 | ['stalls_vc_6', 'INQ_PRF_INCOMING_PKT_VC6_FILTER_FLIT6_CNT'], 207 | ['stalls_vc_7', 'INQ_PRF_INCOMING_PKT_VC7_FILTER_FLIT7_CNT'], 208 | ['stalls/flit_0', None], 209 | ['stalls/flit_1', None], 210 | ['stalls/flit_2', None], 211 | ['stalls/flit_3', None], 212 | ['stalls/flit_4', None], 213 | ['stalls/flit_5', None], 214 | ['stalls/flit_6', None], 215 | ['stalls/flit_7', None] 216 | ] 217 | 218 | 219 | def convert_counters(counters, indices): 220 | values = [counters[i] if i is not None else 0 for i in indices] 221 | values[0] = sum(values[3:11]) 222 | values[1] = sum(values[11:19]) 223 | values[2] = float(values[1])/values[0] 224 | for i in range(8): 225 | values[19+i] = float(values[11+i])/values[3+i] if values[3+i] > 0 else 0 226 | return values 227 | 228 | 229 | def parse_net(): 230 | try: 231 | filename = find_file(NETTILE_PATTERN) 232 | 233 | ignore, meta, net = eyaml_load(filename) 234 | net = net.reshape(len(net)/40, 40) 235 | 236 | header = ['sg', 'sr', 'sc', 'dg', 'dr', 'dc', 'color'] 237 | # header.extend(list(net.dtype.names)[3:]) 238 | header.extend([x[0] for x in counters_mapping]) 239 | 240 | names = list(net.dtype.names)[3:] 241 | indices = [names.index(x[1]) if x[1] is not None else None for x in counters_mapping] 242 | 243 | with open(local(COUNTERS_OUT), 'w') as f: 244 | writer = csv.writer(f) 245 | writer.writerow(header) 246 | routers = set() 247 | i = 0 248 | for j in range(net.shape[0]): 249 | rank = net[j][0][0] 250 | rid = mpirank_to_router(rank) 251 | if rid not in routers: 252 | routers.add(rid) 253 | g, r, c = rid 254 | for p in range(40): 255 | key = (g, r, c, p) 256 | # ignore empty counters (all 0) for non-existing links 257 | if key in topology: 258 | dg, dr, dc, color = topology[key] 259 | row = [g, r, c, dg, dr, dc, color] 260 | row.extend(convert_counters(list(net[j][p])[3:], indices)) 261 | writer.writerow(row) 262 | except IOError: 263 | print dir_name, 'missing tile files' 264 | 265 | 266 | def write_jobs(): 267 | map = {} 268 | with open(local(JOBS_OUT), 'w') as f: 269 | w = csv.writer(f) 270 | w.writerow(['g', 'r', 'c', 'n', 'job']) 271 | for i in mpirank: 272 | nid, coord, status, jid = nodes[i] 273 | if coord not in map: 274 | map[coord] = True 275 | g, r, c, n = coord 276 | w.writerow([g, r, c, n, jid]) 277 | 278 | 279 | # process dir 280 | if len(argv) != 2: 281 | print 'Usage: ', argv[0], '' 282 | exit(255) 283 | 284 | src = argv[1] 285 | dirs = [os.path.join(src, d, 'standard') for d in os.listdir(src)] 286 | [dump(d) for d in dirs] 287 | 288 | -------------------------------------------------------------------------------- /app/data/sim/fix_comm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | for f in $(find edison/comm-graphs/); do 3 | echo $f 4 | echo 'from,to,bytes' > $f.csv 5 | sed 's/ /,/g' $f >> $f.csv 6 | done -------------------------------------------------------------------------------- /app/data/sim/fix_sim.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | dir=sim/simulations/single/placements 4 | for f in $(ls $dir); do 5 | cat header > $dir/$f.csv 6 | sed 's/ /,/g' $dir/$f >> $dir/$f.csv 7 | done -------------------------------------------------------------------------------- /app/data/sim/header: -------------------------------------------------------------------------------- 1 | g,r,c,n,core,jobid 2 | -------------------------------------------------------------------------------- /app/data/sim/list_edison.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | for f in $(ls -d edison/*/standard); do 3 | echo '{'`sed 's/^[^:]*: \([0-9]*\).*size: \([0-9]*\).*/\2-\1/' $f/catalog.yaml | head -1`'}',$f/dnd_net_counters.csv,$f/dnd_jobs.csv >> runs.csv; 4 | done 5 | -------------------------------------------------------------------------------- /app/data/sim/list_links.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | root=links 4 | 5 | echo name,counters,jobs > runs-"$root".csv 6 | 7 | path=$root/linkdata 8 | for d in $(ls $path/4jobs-1/sim*/*.csv); do 9 | echo $d 10 | # for f in $(ls -r $root/single/$d/*.csv); do 11 | # filename=`echo $f | sed 's/.*links-//' | sed 's/\.csv//'` 12 | # # name=`echo "$f" | sed 's/-\([0-9][0-9]k\)/- \1/'` 13 | # jobs=$root/placements/single/$filename 14 | # echo $d/$filename,$f,$jobs >> runs-"$root".csv 15 | # done 16 | done 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/data/sim/list_runs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo name,counters,jobs > runs.csv 3 | 4 | path=sim/simulations/single 5 | for d in $(ls -r $path); do 6 | if [ "$d" != 'placement' ]; then 7 | for f in $(ls -r $path/$d); do 8 | name=`echo "$f" | sed 's/-\([0-9][0-9]k\)/- \1/'` 9 | jobs=$path/placement/`echo $f | sed 's/-/./'`.csv 10 | counters=$(ls $path/$d/$f/*.csv) 11 | echo single/$name,$counters,$jobs >> runs.csv 12 | done 13 | fi 14 | done 15 | 16 | path=sim/simulations/multi 17 | for d in $(ls -r $path); do 18 | if [ "$d" != 'placement' ]; then 19 | for f in $(ls -r $path/$d); do 20 | name=`echo "$f" ` 21 | jobs=$path/placements/`echo $f | sed 's/-/./'`.csv 22 | counters=$(ls $path/$d/$f/*.csv) 23 | echo multi/$name,$counters,$jobs >> runs.csv 24 | done 25 | fi 26 | done 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/data/sim/runs-1blue.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs 2 | 4jobs/sim1, links/linkdata/1blue/4jobs-1/sim1/links-4jobs.32k4.csv, links/placements/4jobs-1/4jobs.32k4.csv 3 | 4jobs/sim1-spread, links/linkdata/1blue/4jobs-1/sim1/links-4jobs.32k4-0.csv, links/placements/4jobs-1/4jobs.32k4-0.csv 4 | 4jobs/sim1-2dstencil,links/linkdata/1blue/4jobs-1/sim1/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 5 | 4jobs/sim1-4dstencil,links/linkdata/1blue/4jobs-1/sim1/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 6 | 4jobs/sim1-many2many,links/linkdata/1blue/4jobs-1/sim1/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 7 | 8 | 4jobs/sim2,links/linkdata/1blue/4jobs-1/sim2/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 9 | 4jobs/sim2-2dstencil,links/linkdata/1blue/4jobs-1/sim2/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 10 | 4jobs/sim2-4dstencil,links/linkdata/1blue/4jobs-1/sim2/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 11 | 4jobs/sim2-umesh,links/linkdata/1blue/4jobs-1/sim2/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 12 | 4jobs/sim2-spread,links/linkdata/1blue/4jobs-1/sim2/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 13 | 14 | 4jobs/sim3,links/linkdata/1blue/4jobs-1/sim3/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 15 | 4jobs/sim3-umesh,links/linkdata/1blue/4jobs-1/sim3/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 16 | 4jobs/sim3-spread,links/linkdata/1blue/4jobs-1/sim3/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 17 | 4jobs/sim3-many2many,links/linkdata/1blue/4jobs-1/sim3/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 18 | 4jobs/sim3-2dstencil,links/linkdata/1blue/4jobs-1/sim3/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 19 | 20 | 4jobs/sim4,links/linkdata/1blue/4jobs-1/sim4/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 21 | 4jobs/sim4-4dstencil,links/linkdata/1blue/4jobs-1/sim4/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 22 | 4jobs/sim4-many2many,links/linkdata/1blue/4jobs-1/sim4/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 23 | 4jobs/sim4-spread,links/linkdata/1blue/4jobs-1/sim4/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 24 | 4jobs/sim4-umesh,links/linkdata/1blue/4jobs-1/sim4/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 25 | 26 | -------------------------------------------------------------------------------- /app/data/sim/runs-2blacks.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs 2 | 4jobs/sim1,links/linkdata/2blacks/4jobs-1/sim1/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 3 | 4jobs/sim1-spread,links/linkdata/2blacks/4jobs-1/sim1/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 4 | 4jobs/sim1-2dstencil,links/linkdata/2blacks/4jobs-1/sim1/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 5 | 4jobs/sim1-4dstencil,links/linkdata/2blacks/4jobs-1/sim1/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 6 | 4jobs/sim1-many2many,links/linkdata/2blacks/4jobs-1/sim1/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 7 | 8 | 4jobs/sim2,links/linkdata/2blacks/4jobs-1/sim2/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 9 | 4jobs/sim2-2dstencil,links/linkdata/2blacks/4jobs-1/sim2/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 10 | 4jobs/sim2-4dstencil,links/linkdata/2blacks/4jobs-1/sim2/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 11 | 4jobs/sim2-umesh,links/linkdata/2blacks/4jobs-1/sim2/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 12 | 4jobs/sim2-spread,links/linkdata/2blacks/4jobs-1/sim2/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 13 | 14 | 4jobs/sim3,links/linkdata/2blacks/4jobs-1/sim3/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 15 | 4jobs/sim3-umesh,links/linkdata/2blacks/4jobs-1/sim3/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 16 | 4jobs/sim3-spread,links/linkdata/2blacks/4jobs-1/sim3/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 17 | 4jobs/sim3-many2many,links/linkdata/2blacks/4jobs-1/sim3/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 18 | 4jobs/sim3-2dstencil,links/linkdata/2blacks/4jobs-1/sim3/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 19 | 20 | 4jobs/sim4,links/linkdata/2blacks/4jobs-1/sim4/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 21 | 4jobs/sim4-4dstencil,links/linkdata/2blacks/4jobs-1/sim4/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 22 | 4jobs/sim4-many2many,links/linkdata/2blacks/4jobs-1/sim4/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 23 | 4jobs/sim4-spread,links/linkdata/2blacks/4jobs-1/sim4/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 24 | 4jobs/sim4-umesh,links/linkdata/2blacks/4jobs-1/sim4/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 25 | 26 | -------------------------------------------------------------------------------- /app/data/sim/runs-4jobs-1.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs 2 | 4jobs-1/sim1,links/linkdata/default/4jobs-1/sim1/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 3 | 4jobs-1/job0-spread,links/linkdata/default/4jobs-1/sim1/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 4 | 4jobs-1/job1-2dstencil,links/linkdata/default/4jobs-1/sim1/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 5 | 4jobs-1/job2-4dstencil,links/linkdata/default/4jobs-1/sim1/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 6 | 4jobs-1/job3-many2many,links/linkdata/default/4jobs-1/sim1/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 7 | 8 | 4jobs-1/sim2,links/linkdata/default/4jobs-1/sim2/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 9 | 4jobs-1/job0-2dstencil,links/linkdata/default/4jobs-1/sim2/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 10 | 4jobs-1/job1-4dstencil,links/linkdata/default/4jobs-1/sim2/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 11 | 4jobs-1/job2-umesh,links/linkdata/default/4jobs-1/sim2/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 12 | 4jobs-1/job3-spread,links/linkdata/default/4jobs-1/sim2/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 13 | 14 | 4jobs-1/sim3,links/linkdata/default/4jobs-1/sim3/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 15 | 4jobs-1/job0-umesh,links/linkdata/default/4jobs-1/sim3/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 16 | 4jobs-1/job1-spread,links/linkdata/default/4jobs-1/sim3/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 17 | 4jobs-1/job2-many2many,links/linkdata/default/4jobs-1/sim3/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 18 | 4jobs-1/job3-2dstencil,links/linkdata/default/4jobs-1/sim3/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 19 | 20 | 4jobs-1/sim4,links/linkdata/default/4jobs-1/sim4/links-4jobs.32k4.csv,links/placements/4jobs-1/4jobs.32k4.csv 21 | 4jobs-1/job0-4dstencil,links/linkdata/default/4jobs-1/sim4/links-4jobs.32k4-0.csv,links/placements/4jobs-1/4jobs.32k4-0.csv 22 | 4jobs-1/job1-many2many,links/linkdata/default/4jobs-1/sim4/links-4jobs.32k4-1.csv,links/placements/4jobs-1/4jobs.32k4-1.csv 23 | 4jobs-1/job2-spread,links/linkdata/default/4jobs-1/sim4/links-4jobs.32k4-2.csv,links/placements/4jobs-1/4jobs.32k4-2.csv 24 | 4jobs-1/job3-umesh,links/linkdata/default/4jobs-1/sim4/links-4jobs.32k4-3.csv,links/placements/4jobs-1/4jobs.32k4-3.csv 25 | -------------------------------------------------------------------------------- /app/data/sim/runs-8jobs-1.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs 2 | 8jobs-1/sim1,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8.csv,links/placements/8jobs-1/8jobs.16k8.csv 3 | 8jobs-1/job0-spread,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-0.csv,links/placements/8jobs-1/8jobs.16k8-0.csv 4 | 8jobs-1/job1-2dstencil,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-1.csv,links/placements/8jobs-1/8jobs.16k8-1.csv 5 | 8jobs-1/job2-2dstencil,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-2.csv,links/placements/8jobs-1/8jobs.16k8-2.csv 6 | 8jobs-1/job3-4dstencil,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-3.csv,links/placements/8jobs-1/8jobs.16k8-3.csv 7 | 8jobs-1/job4-4dstencil,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-4.csv,links/placements/8jobs-1/8jobs.16k8-4.csv 8 | 8jobs-1/job5-many2many,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-5.csv,links/placements/8jobs-1/8jobs.16k8-5.csv 9 | 8jobs-1/job6-many2many,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-6.csv,links/placements/8jobs-1/8jobs.16k8-6.csv 10 | 8jobs-1/job7-umesh,links/linkdata/default/8jobs-1/sim1/links-8jobs.16k8-7.csv,links/placements/8jobs-1/8jobs.16k8-7.csv 11 | 12 | 8jobs-1/sim2,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8.csv,links/placements/8jobs-1/8jobs.16k8.csv 13 | 8jobs-1/job0-spread,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-0.csv,links/placements/8jobs-1/8jobs.16k8-0.csv 14 | 8jobs-1/job1-2dstencil,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-1.csv,links/placements/8jobs-1/8jobs.16k8-1.csv 15 | 8jobs-1/job2-2dstencil,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-2.csv,links/placements/8jobs-1/8jobs.16k8-2.csv 16 | 8jobs-1/job3-4dstencil,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-3.csv,links/placements/8jobs-1/8jobs.16k8-3.csv 17 | 8jobs-1/job4-4dstencil,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-4.csv,links/placements/8jobs-1/8jobs.16k8-4.csv 18 | 8jobs-1/job5-many2many,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-5.csv,links/placements/8jobs-1/8jobs.16k8-5.csv 19 | 8jobs-1/job6-umesh,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-6.csv,links/placements/8jobs-1/8jobs.16k8-6.csv 20 | 8jobs-1/job7-umesh,links/linkdata/default/8jobs-1/sim2/links-8jobs.16k8-7.csv,links/placements/8jobs-1/8jobs.16k8-7.csv 21 | 22 | 8jobs-1/sim3,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8.csv,links/placements/8jobs-1/8jobs.16k8.csv 23 | 8jobs-1/job0-spread,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-0.csv,links/placements/8jobs-1/8jobs.16k8-0.csv 24 | 8jobs-1/job1-2dstencil,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-1.csv,links/placements/8jobs-1/8jobs.16k8-1.csv 25 | 8jobs-1/job2-2dstencil,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-2.csv,links/placements/8jobs-1/8jobs.16k8-2.csv 26 | 8jobs-1/job3-4dstencil,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-3.csv,links/placements/8jobs-1/8jobs.16k8-3.csv 27 | 8jobs-1/job4-many2many,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-4.csv,links/placements/8jobs-1/8jobs.16k8-4.csv 28 | 8jobs-1/job5-many2many,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-5.csv,links/placements/8jobs-1/8jobs.16k8-5.csv 29 | 8jobs-1/job6-umesh,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-6.csv,links/placements/8jobs-1/8jobs.16k8-6.csv 30 | 8jobs-1/job7-umesh,links/linkdata/default/8jobs-1/sim3/links-8jobs.16k8-7.csv,links/placements/8jobs-1/8jobs.16k8-7.csv 31 | 32 | 8jobs-1/sim4,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8.csv,links/placements/8jobs-1/8jobs.16k8.csv 33 | 8jobs-1/job0-spread,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-0.csv,links/placements/8jobs-1/8jobs.16k8-0.csv 34 | 8jobs-1/job1-2dstencil,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-1.csv,links/placements/8jobs-1/8jobs.16k8-1.csv 35 | 8jobs-1/job2-4dstencil,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-2.csv,links/placements/8jobs-1/8jobs.16k8-2.csv 36 | 8jobs-1/job3-4dstencil,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-3.csv,links/placements/8jobs-1/8jobs.16k8-3.csv 37 | 8jobs-1/job4-many2many,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-4.csv,links/placements/8jobs-1/8jobs.16k8-4.csv 38 | 8jobs-1/job5-many2many,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-5.csv,links/placements/8jobs-1/8jobs.16k8-5.csv 39 | 8jobs-1/job6-umesh,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-6.csv,links/placements/8jobs-1/8jobs.16k8-6.csv 40 | 8jobs-1/job7-umesh,links/linkdata/default/8jobs-1/sim4/links-8jobs.16k8-7.csv,links/placements/8jobs-1/8jobs.16k8-7.csv 41 | 42 | -------------------------------------------------------------------------------- /app/data/sim/runs-DAT.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm t-21,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.21.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.21.csv t-22,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.22.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.22.csv t-23,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.23.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.23.csv t-24,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.24.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.24.csv t-25,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.25.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.25.csv t-26,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.26.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.26.csv t-27,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.27.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.27.csv t-28,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.28.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.28.csv t-29,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.29.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.29.csv t-31,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.31.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.31.csv t-32,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.32.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.32.csv t-33,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.33.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.33.csv t-34,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.34.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.34.csv t-35,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.35.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.35.csv t-36,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.36.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.36.csv t-37,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.37.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.37.csv t-38,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.38.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.38.csv t-39,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.39.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.39.csv t-40,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_net_counters.su3_rmd.40.csv,Feb-DAT/baseline.1/2016-02-10-12-28-22/dnd_jobs.su3_rmd.40.csv -------------------------------------------------------------------------------- /app/data/sim/runs-edison.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm {256-184},edison/2014-09-22-09-39-51/standard/dnd_net_counters.csv,edison/2014-09-22-09-39-51/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-206},edison/2014-09-08-02-05-59/standard/dnd_net_counters.csv,edison/2014-09-08-02-05-59/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-208},edison/2014-09-22-06-46-25/standard/dnd_net_counters.csv,edison/2014-09-22-06-46-25/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-215},edison/2014-09-12-17-47-31/standard/dnd_net_counters.csv,edison/2014-09-12-17-47-31/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-219},edison/2014-09-20-05-29-50/standard/dnd_net_counters.csv,edison/2014-09-20-05-29-50/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-233},edison/2014-09-09-10-18-03/standard/dnd_net_counters.csv,edison/2014-09-09-10-18-03/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-246},edison/2014-09-08-17-59-25/standard/dnd_net_counters.csv,edison/2014-09-08-17-59-25/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-268},edison/2014-09-07-14-46-43/standard/dnd_net_counters.csv,edison/2014-09-07-14-46-43/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-288},edison/2014-09-11-09-28-32/standard/dnd_net_counters.csv,edison/2014-09-11-09-28-32/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-292},edison/2014-09-05-13-45-14/standard/dnd_net_counters.csv,edison/2014-09-05-13-45-14/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-297},edison/2014-09-19-05-48-35/standard/dnd_net_counters.csv,edison/2014-09-19-05-48-35/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-305},edison/2014-09-01-10-45-18/standard/dnd_net_counters.csv,edison/2014-09-01-10-45-18/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-322},edison/2014-09-03-15-46-29/standard/dnd_net_counters.csv,edison/2014-09-03-15-46-29/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-332},edison/2014-09-23-09-41-34/standard/dnd_net_counters.csv,edison/2014-09-23-09-41-34/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-334},edison/2014-09-01-22-41-42/standard/dnd_net_counters.csv,edison/2014-09-01-22-41-42/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-334},edison/2014-09-16-15-58-16/standard/dnd_net_counters.csv,edison/2014-09-16-15-58-16/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-378},edison/2014-09-18-17-12-34/standard/dnd_net_counters.csv,edison/2014-09-18-17-12-34/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-400},edison/2014-09-02-18-17-45/standard/dnd_net_counters.csv,edison/2014-09-02-18-17-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-419},edison/2014-09-18-16-45-22/standard/dnd_net_counters.csv,edison/2014-09-18-16-45-22/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-544},edison/2014-09-21-12-30-53/standard/dnd_net_counters.csv,edison/2014-09-21-12-30-53/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-654},edison/2014-09-14-14-08-58/standard/dnd_net_counters.csv,edison/2014-09-14-14-08-58/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {256-661},edison/2014-09-14-15-51-56/standard/dnd_net_counters.csv,edison/2014-09-14-15-51-56/standard/dnd_jobs.csv,edison/comm-graphs/milc.256nodes.csv {384-177},edison/2014-09-20-05-58-07/standard/dnd_net_counters.csv,edison/2014-09-20-05-58-07/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-182},edison/2014-09-20-05-19-01/standard/dnd_net_counters.csv,edison/2014-09-20-05-19-01/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-187},edison/2014-09-23-07-38-12/standard/dnd_net_counters.csv,edison/2014-09-23-07-38-12/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-192},edison/2014-09-20-05-39-04/standard/dnd_net_counters.csv,edison/2014-09-20-05-39-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-203},edison/2014-09-12-19-04-33/standard/dnd_net_count./2015-09-18-17-25-18/xtdb2proc.outrs.csv,edison/2014-09-12-19-04-33/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-208},edison/2014-09-12-19-39-57/standard/dnd_net_counters.csv,edison/2014-09-12-19-39-57/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-214},edison/2014-09-21-13-04-13/standard/dnd_net_counters.csv,edison/2014-09-21-13-04-13/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-218},edison/2014-09-10-19-07-11/standard/dnd_net_counters.csv,edison/2014-09-10-19-07-11/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-227},edison/2014-09-22-07-14-07/standard/dnd_net_counters.csv,edison/2014-09-22-07-14-07/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-231},edison/2014-09-01-23-05-04/standard/dnd_net_counters.csv,edison/2014-09-01-23-05-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-236},edison/2014-09-08-16-03-58/standard/dnd_net_counters.csv,edison/2014-09-08-16-03-58/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-253},edison/2014-09-07-14-48-27/standard/dnd_net_counters.csv,edison/2014-09-07-14-48-27/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-278},edison/2014-09-17-19-00-59/standard/dnd_net_counters.csv,edison/2014-09-17-19-00-59/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-278},edison/2014-09-19-05-23-04/standard/dnd_net_counters.csv,edison/2014-09-19-05-23-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-279},edison/2014-09-08-18-56-36/standard/dnd_net_counters.csv,edison/2014-09-08-18-56-36/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-283},edison/2014-09-24-03-43-41/standard/dnd_net_counters.csv,edison/2014-09-24-03-43-41/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-304},edison/2014-09-02-20-56-08/standard/dnd_net_counters.csv,edison/2014-09-02-20-56-08/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-310},edison/2014-09-01-10-50-59/standard/dnd_net_counters.csv,edison/2014-09-01-10-50-59/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-340},edison/2014-09-03-16-58-50/standard/dnd_net_counters.csv,edison/2014-09-03-16-58-50/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-595},edison/2014-09-14-16-36-45/standard/dnd_net_counters.csv,edison/2014-09-14-16-36-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-610},edison/2014-09-05-16-16-52/standard/dnd_net_counters.csv,edison/2014-09-05-16-16-52/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-633},edison/2014-09-14-16-04-02/standard/dnd_net_counters.csv,edison/2014-09-14-16-04-02/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {384-730},edison/2014-09-09-20-31-06/standard/dnd_net_counters.csv,edison/2014-09-09-20-31-06/standard/dnd_jobs.csv,edison/comm-graphs/milc.384nodes.csv {512-198},edison/2014-09-10-19-10-40/standard/dnd_net_counters.csv,edison/2014-09-10-19-10-40/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-211},edison/2014-09-12-19-53-40/standard/dnd_net_counters.csv,edison/2014-09-12-19-53-40/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-222},edison/2014-09-21-13-26-42/standard/dnd_net_counters.csv,edison/2014-09-21-13-26-42/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-223},edison/2014-09-12-19-24-56/standard/dnd_net_counters.csv,edison/2014-09-12-19-24-56/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-230},edison/2014-09-21-06-28-47/standard/dnd_net_counters.csv,edison/2014-09-21-06-28-47/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-249},edison/2014-09-24-04-43-45/standard/dnd_net_counters.csv,edison/2014-09-24-04-43-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-260},edison/2014-09-05-19-27-45/standard/dnd_net_counters.csv,edison/2014-09-05-19-27-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-261},edison/2014-09-22-08-35-54/standard/dnd_net_counters.csv,edison/2014-09-22-08-35-54/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-264},edison/2014-09-05-19-11-04/standard/dnd_net_counters.csv,edison/2014-09-05-19-11-04/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-273},edison/2014-09-07-15-06-58/standard/dnd_net_counters.csv,edison/2014-09-07-15-06-58/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-281},edison/2014-09-08-21-55-30/standard/dnd_net_counters.csv,edison/2014-09-08-21-55-30/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-284},edison/2014-09-23-10-16-28/standard/dnd_net_counters.csv,edison/2014-09-23-10-16-28/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-292},edison/2014-09-01-23-27-40/standard/dnd_net_counters.csv,edison/2014-09-01-23-27-40/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-313},edison/2014-09-19-05-50-45/standard/dnd_net_counters.csv,edison/2014-09-19-05-50-45/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-324},edison/2014-09-08-23-31-23/standard/dnd_net_counters.csv,edison/2014-09-08-23-31-23/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-346},edison/2014-09-09-20-59-35/standard/dnd_net_counters.csv,edison/2014-09-09-20-59-35/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-350},edison/2014-09-01-12-50-30/standard/dnd_net_counters.csv,edison/2014-09-01-12-50-30/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-413},edison/2014-09-18-16-50-03/standard/dnd_net_counters.csv,edison/2014-09-18-16-50-03/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-441},edison/2014-09-02-21-17-32/standard/dnd_net_counters.csv,edison/2014-09-02-21-17-32/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-610},edison/2014-09-14-16-56-28/standard/dnd_net_counters.csv,edison/2014-09-14-16-56-28/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-618},edison/2014-09-21-12-30-46/standard/dnd_net_counters.csv,edison/2014-09-21-12-30-46/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-645},edison/2014-09-21-11-36-49/standard/dnd_net_counters.csv,edison/2014-09-21-11-36-49/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv {512-690},edison/2014-09-14-16-30-21/standard/dnd_net_counters.csv,edison/2014-09-14-16-30-21/standard/dnd_jobs.csv,edison/comm-graphs/milc.512nodes.csv -------------------------------------------------------------------------------- /app/data/sim/runs-links.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs 2 | 4jobs/sim1,links/linkdata/4jobs-1/sim1/links-4jobs.32kEach.csv,links/placements/4jobs-1/4jobs.32kEach.csv 3 | 4jobs/sim2,links/linkdata/4jobs-1/sim2/links-4jobs.32kEach.csv,links/placements/4jobs-1/4jobs.32kEach.csv 4 | 4jobs/sim3,links/linkdata/4jobs-1/sim3/links-4jobs.32kEach.csv,links/placements/4jobs-1/4jobs.32kEach.csv 5 | 4jobs/sim4,links/linkdata/4jobs-1/sim4/links-4jobs.32kEach.csv,links/placements/4jobs-1/4jobs.32kEach.csv 6 | 7 | -------------------------------------------------------------------------------- /app/data/sim/runs-multi.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm 2 | 2ds-compact-32k-32k-64k,sim/simulations/multi/3jobs/2ds-compact-32k-32k-64k/links-compact.32k-32k-64k.csv,sim/simulations/multi/placements/compact.32k-32k-64k.csv 3 | 2ds-random-32k-32k-64k,sim/simulations/multi/3jobs/2ds-random-32k-32k-64k/links-random.32k-32k-64k.csv,sim/simulations/multi/placements/random.32k-32k-64k.csv 4 | 2ds-nonuni-32k-32k-64k,sim/simulations/multi/3jobs/2ds-nonuni-32k-32k-64k/links-nonuni.32k-32k-64k.csv,sim/simulations/multi/placements/nonuni.32k-32k-64k.csv 5 | 6 | 2ds-m2m-random-64k-64k,sim/simulations/multi/2jobs/2ds-m2m-random-64k-64k/links-random.64k-64k.csv,sim/simulations/multi/placements/random.64k-64k.csv 7 | 2ds-m2m-nonuni-64k-64k,sim/simulations/multi/2jobs/2ds-m2m-nonuni-64k-64k/links-nonuni.64k-64k.csv,sim/simulations/multi/placements/nonuni.64k-64k.csv 8 | 2ds-m2m-compact-64k-64k,sim/simulations/multi/2jobs/2ds-m2m-compact-64k-64k/links-compact.64k-64k.csv,sim/simulations/multi/placements/compact.64k-64k.csv 9 | 10 | 2ds-ume-compact-64k-64k,sim/simulations/multi/2jobs/2ds-ume-compact-64k-64k/links-compact.64k-64k.csv,sim/simulations/multi/placements/compact.64k-64k.csv 11 | 2ds-ume-random-64k-64k,sim/simulations/multi/2jobs/2ds-ume-random-64k-64k/links-random.64k-64k.csv,sim/simulations/multi/placements/random.64k-64k.csv 12 | 2ds-ume-nonuni-64k-64k,sim/simulations/multi/2jobs/2ds-ume-nonuni-64k-64k/links-nonuni.64k-64k.csv,sim/simulations/multi/placements/nonuni.64k-64k.csv 13 | 14 | m2m-compact-32k-32k-64k,sim/simulations/multi/3jobs/m2m-compact-32k-32k-64k/links-compact.32k-32k-64k.csv,sim/simulations/multi/placements/compact.32k-32k-64k.csv 15 | m2m-random-32k-32k-64k,sim/simulations/multi/3jobs/m2m-random-32k-32k-64k/links-random.32k-32k-64k.csv,sim/simulations/multi/placements/random.32k-32k-64k.csv 16 | m2m-nonuni-32k-32k-64k,sim/simulations/multi/3jobs/m2m-nonuni-32k-32k-64k/links-nonuni.32k-32k-64k.csv,sim/simulations/multi/placements/nonuni.32k-32k-64k.csv 17 | 18 | m2m-ume-compact-64k-64k,sim/simulations/multi/2jobs/m2m-ume-compact-64k-64k/links-compact.64k-64k.csv,sim/simulations/multi/placements/compact.64k-64k.csv 19 | m2m-ume-random-64k-64k,sim/simulations/multi/2jobs/m2m-ume-random-64k-64k/links-random.64k-64k.csv,sim/simulations/multi/placements/random.64k-64k.csv 20 | m2m-ume-nonuni-64k-64k,sim/simulations/multi/2jobs/m2m-ume-nonuni-64k-64k/links-nonuni.64k-64k.csv,sim/simulations/multi/placements/nonuni.64k-64k.csv 21 | 22 | ume-compact-32k-32k-64k,sim/simulations/multi/3jobs/ume-compact-32k-32k-64k/links-compact.32k-32k-64k.csv,sim/simulations/multi/placements/compact.32k-32k-64k.csv 23 | ume-random-32k-32k-64k,sim/simulations/multi/3jobs/ume-random-32k-32k-64k/links-random.32k-32k-64k.csv,sim/simulations/multi/placements/random.32k-32k-64k.csv 24 | ume-nonuni-32k-32k-64k,sim/simulations/multi/3jobs/ume-nonuni-32k-32k-64k/links-nonuni.32k-32k-64k.csv,sim/simulations/multi/placements/nonuni.32k-32k-64k.csv -------------------------------------------------------------------------------- /app/data/sim/runs-single-bak.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm 2 | 2dstencil-compact-16k,sim/simulations/single/2dstencil/compact-16k/links-compact.16k.csv,sim/simulations/single/placements/compact.16k.csv,sim/comm-graphs/2dstencil/comm.16k.csv 3 | 2dstencil-compact-32k,sim/simulations/single/2dstencil/compact-32k/links-compact.32k.csv,sim/simulations/single/placements/compact.32k.csv,sim/comm-graphs/2dstencil/comm.32k.csv 4 | 2dstencil-compact-64k,sim/simulations/single/2dstencil/compact-64k/links-compact.64k.csv,sim/simulations/single/placements/compact.64k.csv,sim/comm-graphs/2dstencil/comm.64k.csv 5 | 2dstencil-compact-128k,sim/simulations/single/2dstencil/compact-128k/links-compact.128k.csv,sim/simulations/single/placements/compact.128k.csv,sim/comm-graphs/2dstencil/comm.128k.csv 6 | 7 | 2dstencil-random-16k,sim/simulations/single/2dstencil/random-16k/links-random.16k.csv,sim/simulations/single/placements/random.16k.csv,sim/comm-graphs/2dstencil/comm.16k.csv 8 | 2dstencil-random-32k,sim/simulations/single/2dstencil/random-32k/links-random.32k.csv,sim/simulations/single/placements/random.32k.csv,sim/comm-graphs/2dstencil/comm.32k.csv 9 | 2dstencil-random-64k,sim/simulations/single/2dstencil/random-64k/links-random.64k.csv,sim/simulations/single/placements/random.64k.csv,sim/comm-graphs/2dstencil/comm.64k.csv 10 | 2dstencil-random-128k,sim/simulations/single/2dstencil/random-128k/links-random.128k.csv,sim/simulations/single/placements/random.128k.csv,sim/comm-graphs/2dstencil/comm.128k.csv 11 | 12 | 2dstencil-nonuni-16k,sim/simulations/single/2dstencil/nonuni-16k/links-nonuni.16k.csv,sim/simulations/single/placements/nonuni.16k.csv,sim/comm-graphs/2dstencil/comm.16k.csv 13 | 2dstencil-nonuni-32k,sim/simulations/single/2dstencil/nonuni-32k/links-nonuni.32k.csv,sim/simulations/single/placements/nonuni.32k.csv,sim/comm-graphs/2dstencil/comm.32k.csv 14 | 2dstencil-nonuni-64k,sim/simulations/single/2dstencil/nonuni-64k/links-nonuni.64k.csv,sim/simulations/single/placements/nonuni.64k.csv,sim/comm-graphs/2dstencil/comm.64k.csv 15 | 2dstencil-nonuni-128k,sim/simulations/single/2dstencil/nonuni-128k/links-nonuni.128k.csv,sim/simulations/single/placements/nonuni.128k.csv,sim/comm-graphs/2dstencil/comm.128k.csv 16 | 17 | many2many-compact-16k,sim/simulations/single/many2many/compact-16k/links-compact.16k.csv,sim/simulations/single/placements/compact.16k.csv,sim/comm-graphs/many2many/comm.16k.csv 18 | many2many-compact-32k,sim/simulations/single/many2many/compact-32k/links-compact.32k.csv,sim/simulations/single/placements/compact.32k.csv,sim/comm-graphs/many2many/comm.32k.csv 19 | many2many-compact-64k,sim/simulations/single/many2many/compact-64k/links-compact.64k.csv,sim/simulations/single/placements/compact.64k.csv,sim/comm-graphs/many2many/comm.64k.csv 20 | many2many-compact-128k,sim/simulations/single/many2many/compact-128k/links-compact.128k.csv,sim/simulations/single/placements/compact.128k.csv,sim/comm-graphs/many2many/comm.128k.csv 21 | 22 | many2many-random-16k,sim/simulations/single/many2many/random-16k/links-random.16k.csv,sim/simulations/single/placements/random.16k.csv,sim/comm-graphs/many2many/comm.16k.csv 23 | many2many-random-32k,sim/simulations/single/many2many/random-32k/links-random.32k.csv,sim/simulations/single/placements/random.32k.csv,sim/comm-graphs/many2many/comm.32k.csv 24 | many2many-random-64k,sim/simulations/single/many2many/random-64k/links-random.64k.csv,sim/simulations/single/placements/random.64k.csv,sim/comm-graphs/many2many/comm.64k.csv 25 | many2many-random-128k,sim/simulations/single/many2many/random-128k/links-random.128k.csv,sim/simulations/single/placements/random.128k.csv,sim/comm-graphs/many2many/comm.128k.csv 26 | 27 | many2many-nonuni-16k,sim/simulations/single/many2many/nonuni-16k/links-nonuni.16k.csv,sim/simulations/single/placements/nonuni.16k.csv,sim/comm-graphs/many2many/comm.16k.csv 28 | many2many-nonuni-32k,sim/simulations/single/many2many/nonuni-32k/links-nonuni.32k.csv,sim/simulations/single/placements/nonuni.32k.csv,sim/comm-graphs/many2many/comm.32k.csv 29 | many2many-nonuni-64k,sim/simulations/single/many2many/nonuni-64k/links-nonuni.64k.csv,sim/simulations/single/placements/nonuni.64k.csv,sim/comm-graphs/many2many/comm.64k.csv 30 | many2many-nonuni-128k,sim/simulations/single/many2many/nonuni-128k/links-nonuni.128k.csv,sim/simulations/single/placements/nonuni.128k.csv,sim/comm-graphs/many2many/comm.128k.csv 31 | 32 | umesh-compact-16k,sim/simulations/single/umesh/compact-16k/links-compact.16k.csv,sim/simulations/single/placements/compact.16k.csv,sim/comm-graphs/umesh/comm.16k.csv 33 | umesh-compact-32k,sim/simulations/single/umesh/compact-32k/links-compact.32k.csv,sim/simulations/single/placements/compact.32k.csv,sim/comm-graphs/umesh/comm.32k.csv 34 | umesh-compact-64k,sim/simulations/single/umesh/compact-64k/links-compact.64k.csv,sim/simulations/single/placements/compact.64k.csv,sim/comm-graphs/umesh/comm.64k.csv 35 | umesh-compact-128k,sim/simulations/single/umesh/compact-128k/links-compact.128k.csv,sim/simulations/single/placements/compact.128k.csv,sim/comm-graphs/umesh/comm.128k.csv 36 | 37 | umesh-random-16k,sim/simulations/single/umesh/random-16k/links-random.16k.csv,sim/simulations/single/placements/random.16k.csv,sim/comm-graphs/umesh/comm.16k.csv 38 | umesh-random-32k,sim/simulations/single/umesh/random-32k/links-random.32k.csv,sim/simulations/single/placements/random.32k.csv,sim/comm-graphs/umesh/comm.32k.csv 39 | umesh-random-64k,sim/simulations/single/umesh/random-64k/links-random.64k.csv,sim/simulations/single/placements/random.64k.csv,sim/comm-graphs/umesh/comm.64k.csv 40 | umesh-random-128k,sim/simulations/single/umesh/random-128k/links-random.128k.csv,sim/simulations/single/placements/random.128k.csv,sim/comm-graphs/umesh/comm.128k.csv 41 | 42 | umesh-nonuni-16k,sim/simulations/single/umesh/nonuni-16k/links-nonuni.16k.csv,sim/simulations/single/placements/nonuni.16k.csv,sim/comm-graphs/umesh/comm.16k.csv 43 | umesh-nonuni-32k,sim/simulations/single/umesh/nonuni-32k/links-nonuni.32k.csv,sim/simulations/single/placements/nonuni.32k.csv,sim/comm-graphs/umesh/comm.32k.csv 44 | umesh-nonuni-64k,sim/simulations/single/umesh/nonuni-64k/links-nonuni.64k.csv,sim/simulations/single/placements/nonuni.64k.csv,sim/comm-graphs/umesh/comm.64k.csv 45 | umesh-nonuni-128k,sim/simulations/single/umesh/nonuni-128k/links-nonuni.128k.csv,sim/simulations/single/placements/nonuni.128k.csv,sim/comm-graphs/umesh/comm.128k.csv 46 | -------------------------------------------------------------------------------- /app/data/sim/runs-single.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm 2 | 2dstencil-nonUniR-8k,links/linkdata/single/2dstencil/links-nonUniR.8k.csv,links/placements/single/nonUniR.8k.csv 3 | 2dstencil-nonUniR-16k,links/linkdata/single/2dstencil/links-nonUniR.16k.csv,links/placements/single/nonUniR.16k.csv 4 | 2dstencil-nonUniR-32k,links/linkdata/single/2dstencil/links-nonUniR.32k.csv,links/placements/single/nonUniR.32k.csv 5 | 2dstencil-nonUniR-64k,links/linkdata/single/2dstencil/links-nonUniR.64k.csv,links/placements/single/nonUniR.64k.csv 6 | 2dstencil-nonUniR-128k,links/linkdata/single/2dstencil/links-nonUniR.128k.csv,links/placements/single/nonUniR.128k.csv 7 | 8 | 4dstencil-nonUniR-8k,links/linkdata/single/4dstencil/links-nonUniR.8k.csv,links/placements/single/nonUniR.8k.csv 9 | 4dstencil-nonUniR-16k,links/linkdata/single/4dstencil/links-nonUniR.16k.csv,links/placements/single/nonUniR.16k.csv 10 | 4dstencil-nonUniR-32k,links/linkdata/single/4dstencil/links-nonUniR.32k.csv,links/placements/single/nonUniR.32k.csv 11 | 4dstencil-nonUniR-64k,links/linkdata/single/4dstencil/links-nonUniR.64k.csv,links/placements/single/nonUniR.64k.csv 12 | 4dstencil-nonUniR-128k,links/linkdata/single/4dstencil/links-nonUniR.128k.csv,links/placements/single/nonUniR.128k.csv 13 | 14 | many2many-nonUniR-8k,links/linkdata/single/many2many/links-nonUniR.8k.csv,links/placements/single/nonUniR.8k.csv 15 | many2many-nonUniR-16k,links/linkdata/single/many2many/links-nonUniR.16k.csv,links/placements/single/nonUniR.16k.csv 16 | many2many-nonUniR-32k,links/linkdata/single/many2many/links-nonUniR.32k.csv,links/placements/single/nonUniR.32k.csv 17 | many2many-nonUniR-64k,links/linkdata/single/many2many/links-nonUniR.64k.csv,links/placements/single/nonUniR.64k.csv 18 | many2many-nonUniR-128k,links/linkdata/single/many2many/links-nonUniR.128k.csv,links/placements/single/nonUniR.128k.csv 19 | 20 | spread-nonUniR-8k,links/linkdata/single/spread/links-nonUniR.8k.csv,links/placements/single/nonUniR.8k.csv 21 | spread-nonUniR-16k,links/linkdata/single/spread/links-nonUniR.16k.csv,links/placements/single/nonUniR.16k.csv 22 | spread-nonUniR-32k,links/linkdata/single/spread/links-nonUniR.32k.csv,links/placements/single/nonUniR.32k.csv 23 | spread-nonUniR-64k,links/linkdata/single/spread/links-nonUniR.64k.csv,links/placements/single/nonUniR.64k.csv 24 | spread-nonUniR-128k,links/linkdata/single/spread/links-nonUniR.128k.csv,links/placements/single/nonUniR.128k.csv 25 | 26 | umesh-nonUniR-8k,links/linkdata/single/umesh/links-nonUniR.8k.csv,links/placements/single/nonUniR.8k.csv 27 | umesh-nonUniR-16k,links/linkdata/single/umesh/links-nonUniR.16k.csv,links/placements/single/nonUniR.16k.csv 28 | umesh-nonUniR-32k,links/linkdata/single/umesh/links-nonUniR.32k.csv,links/placements/single/nonUniR.32k.csv 29 | umesh-nonUniR-64k,links/linkdata/single/umesh/links-nonUniR.64k.csv,links/placements/single/nonUniR.64k.csv 30 | umesh-nonUniR-128k,links/linkdata/single/umesh/links-nonUniR.128k.csv,links/placements/single/nonUniR.128k.csv 31 | 32 | -------------------------------------------------------------------------------- /app/data/sim/runs-state.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs 2 | 2dstencil/randRtr.8k,state/single/2dstencil/links-randRtr.8k.csv,state/placements/single/randRtr.8k 3 | 2dstencil/randRtr.64k,state/single/2dstencil/links-randRtr.64k.csv,state/placements/single/randRtr.64k 4 | 2dstencil/randRtr.32k,state/single/2dstencil/links-randRtr.32k.csv,state/placements/single/randRtr.32k 5 | 2dstencil/randRtr.16k,state/single/2dstencil/links-randRtr.16k.csv,state/placements/single/randRtr.16k 6 | 2dstencil/randRtr.128k,state/single/2dstencil/links-randRtr.128k.csv,state/placements/single/randRtr.128k 7 | 2dstencil/compact.8k,state/single/2dstencil/links-compact.8k.csv,state/placements/single/compact.8k 8 | 2dstencil/compact.64k,state/single/2dstencil/links-compact.64k.csv,state/placements/single/compact.64k 9 | 2dstencil/compact.32k,state/single/2dstencil/links-compact.32k.csv,state/placements/single/compact.32k 10 | 2dstencil/compact.16k,state/single/2dstencil/links-compact.16k.csv,state/placements/single/compact.16k 11 | 2dstencil/compact.128k,state/single/2dstencil/links-compact.128k.csv,state/placements/single/compact.128k 12 | 4dstencil/randRtr.8k,state/single/4dstencil/links-randRtr.8k.csv,state/placements/single/randRtr.8k 13 | 4dstencil/randRtr.64k,state/single/4dstencil/links-randRtr.64k.csv,state/placements/single/randRtr.64k 14 | 4dstencil/randRtr.32k,state/single/4dstencil/links-randRtr.32k.csv,state/placements/single/randRtr.32k 15 | 4dstencil/randRtr.16k,state/single/4dstencil/links-randRtr.16k.csv,state/placements/single/randRtr.16k 16 | 4dstencil/randRtr.128k,state/single/4dstencil/links-randRtr.128k.csv,state/placements/single/randRtr.128k 17 | 4dstencil/compact.8k,state/single/4dstencil/links-compact.8k.csv,state/placements/single/compact.8k 18 | 4dstencil/compact.64k,state/single/4dstencil/links-compact.64k.csv,state/placements/single/compact.64k 19 | 4dstencil/compact.32k,state/single/4dstencil/links-compact.32k.csv,state/placements/single/compact.32k 20 | 4dstencil/compact.16k,state/single/4dstencil/links-compact.16k.csv,state/placements/single/compact.16k 21 | 4dstencil/compact.128k,state/single/4dstencil/links-compact.128k.csv,state/placements/single/compact.128k 22 | many2many/randRtr.8k,state/single/many2many/links-randRtr.8k.csv,state/placements/single/randRtr.8k 23 | many2many/randRtr.64k,state/single/many2many/links-randRtr.64k.csv,state/placements/single/randRtr.64k 24 | many2many/randRtr.32k,state/single/many2many/links-randRtr.32k.csv,state/placements/single/randRtr.32k 25 | many2many/randRtr.16k,state/single/many2many/links-randRtr.16k.csv,state/placements/single/randRtr.16k 26 | many2many/randRtr.128k,state/single/many2many/links-randRtr.128k.csv,state/placements/single/randRtr.128k 27 | many2many/compact.8k,state/single/many2many/links-compact.8k.csv,state/placements/single/compact.8k 28 | many2many/compact.64k,state/single/many2many/links-compact.64k.csv,state/placements/single/compact.64k 29 | many2many/compact.32k,state/single/many2many/links-compact.32k.csv,state/placements/single/compact.32k 30 | many2many/compact.16k,state/single/many2many/links-compact.16k.csv,state/placements/single/compact.16k 31 | many2many/compact.128k,state/single/many2many/links-compact.128k.csv,state/placements/single/compact.128k 32 | spread/randRtr.8k,state/single/spread/links-randRtr.8k.csv,state/placements/single/randRtr.8k 33 | spread/randRtr.64k,state/single/spread/links-randRtr.64k.csv,state/placements/single/randRtr.64k 34 | spread/randRtr.32k,state/single/spread/links-randRtr.32k.csv,state/placements/single/randRtr.32k 35 | spread/randRtr.16k,state/single/spread/links-randRtr.16k.csv,state/placements/single/randRtr.16k 36 | spread/randRtr.128k,state/single/spread/links-randRtr.128k.csv,state/placements/single/randRtr.128k 37 | spread/compact.8k,state/single/spread/links-compact.8k.csv,state/placements/single/compact.8k 38 | spread/compact.64k,state/single/spread/links-compact.64k.csv,state/placements/single/compact.64k 39 | spread/compact.32k,state/single/spread/links-compact.32k.csv,state/placements/single/compact.32k 40 | spread/compact.16k,state/single/spread/links-compact.16k.csv,state/placements/single/compact.16k 41 | spread/compact.128k,state/single/spread/links-compact.128k.csv,state/placements/single/compact.128k 42 | umesh/randRtr.8k,state/single/umesh/links-randRtr.8k.csv,state/placements/single/randRtr.8k 43 | umesh/randRtr.64k,state/single/umesh/links-randRtr.64k.csv,state/placements/single/randRtr.64k 44 | umesh/randRtr.32k,state/single/umesh/links-randRtr.32k.csv,state/placements/single/randRtr.32k 45 | umesh/randRtr.16k,state/single/umesh/links-randRtr.16k.csv,state/placements/single/randRtr.16k 46 | umesh/randRtr.128k,state/single/umesh/links-randRtr.128k.csv,state/placements/single/randRtr.128k 47 | umesh/compact.8k,state/single/umesh/links-compact.8k.csv,state/placements/single/compact.8k 48 | umesh/compact.64k,state/single/umesh/links-compact.64k.csv,state/placements/single/compact.64k 49 | umesh/compact.32k,state/single/umesh/links-compact.32k.csv,state/placements/single/compact.32k 50 | umesh/compact.16k,state/single/umesh/links-compact.16k.csv,state/placements/single/compact.16k 51 | umesh/compact.128k,state/single/umesh/links-compact.128k.csv,state/placements/single/compact.128k 52 | -------------------------------------------------------------------------------- /app/data/sim/substitute.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | find links/ -name "*.csv" | sed \ 3 | -e 's/\(.*\/\)\([^\/]*\)/pushd \1; ln -s \2 \2Z; popd/' \ 4 | -e 's/links-\([^\.]*\)[^ ]*\(\-.\)\.csvZ/links-\1\2.csv/' \ 5 | -e 's/links-\([^\.]*\)[^ ]*\.csvZ/links-\1.csv/' \ 6 | -e 's/ \([^\.]*\)[^ ]*\(\-.\).csvZ/ \1\2.csv/' \ 7 | -e 's/ \([^\.]*\)[^ ]*.csvZ/ \1.csv/' > l 8 | 9 | source l; 10 | rm l 11 | -------------------------------------------------------------------------------- /app/data/staci_sep_29/Screen Shot 2016-04-06 at 1.49.37 PM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LLNL/DragonView/9c5384e03b2e4f64cb2bbbe5872ba5c9bcd3cec5/app/data/staci_sep_29/Screen Shot 2016-04-06 at 1.49.37 PM.png -------------------------------------------------------------------------------- /app/data/staci_sep_29/runs.csv: -------------------------------------------------------------------------------- 1 | name,counters,jobs,comm 2 | 21,dnd_net_counters.21.csv,dnd_jobs.21.csv,null 3 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | DragonView 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
DragonView
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/lib-code/jquery-element-onresize.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jquery-element-onresize 0.1.1 3 | * jquery-element-onresize is a simple jQuery plugin for detecting ALL changes in a size of ANY positioned element. 4 | * 5 | * Usage: $("#element").detectResizing({onResize: noArgFunction}); 6 | * 7 | * Copyright 2014, RB Software Robert Bar (http://rbsoftware.pl) 8 | * Licensed under the MIT license. 9 | * 10 | */ 11 | define(function(require) { 12 | 13 | var $ = require('jquery'); 14 | 15 | (function ($, window, document, undefined) { 16 | "use strict"; 17 | 18 | var pluginName = "detectResizing" 19 | , defaults = {onResize: undefined}; 20 | 21 | function Plugin(element, options) { 22 | this.element = element; 23 | this.$element = $(element); 24 | this.settings = $.extend(true, {}, defaults, options); 25 | this._defaults = defaults; 26 | this._init(); 27 | } 28 | 29 | $.extend(Plugin.prototype, { 30 | _init: function () { 31 | 32 | var frameContent = "jquery.detectResizing" 33 | , iframes = [$(''), $('')] 34 | , length = iframes.length 35 | , index = 0 36 | , $iframe; 37 | 38 | for (; index < length; index++) { 39 | $iframe = iframes[index]; 40 | this.$element.append($iframe); 41 | $iframe.data("plugin_" + pluginName, this); 42 | $iframe[0].contentWindow.emitcontent = frameContent; 43 | $iframe[0].src = "javascript:window.emitcontent"; 44 | } 45 | 46 | this._iframes = iframes; 47 | this._fireResizeFunction(); 48 | }, 49 | 50 | _fireResizeFunction: function () { 51 | var fn = this.settings.onResize; 52 | 53 | if ($.isFunction(fn)) { 54 | fn(); 55 | } 56 | }, 57 | 58 | destroy: function () { 59 | var length = this._iframes.length 60 | , index = 0 61 | , $iframe; 62 | 63 | if (this.$element.data("plugin_" + pluginName)) { 64 | this.$element.removeData("plugin_" + pluginName); 65 | for (; index < length; index++) { 66 | $iframe = this._iframes[index]; 67 | $iframe.removeData("plugin_" + pluginName); 68 | $iframe.remove(); 69 | } 70 | } 71 | } 72 | }); 73 | 74 | $.fn[pluginName] = function (options) { 75 | this.each(function () { 76 | if (!$.data(this, "plugin_" + pluginName)) { 77 | $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 78 | } 79 | }); 80 | return this; 81 | }; 82 | 83 | })($, window, document) 84 | 85 | }); -------------------------------------------------------------------------------- /app/run.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Radial DragonView 4 | 5 | 6 | 7 | 8 | 9 | 10 |
DragonView
11 | 12 |
13 | 14 | 99 |
100 | 101 | 102 | 103 | 104 | 105 |
106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /app/src/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 1/30/15. 3 | */ 4 | 5 | define(function(require) { 6 | 'use strict'; 7 | 8 | 9 | var radio = require('radio'); 10 | var compare = require('./compare'); 11 | var Run = require('./run'); 12 | 13 | var tabs = new Map(); 14 | 15 | compare.on('selected', onSelect); 16 | window.addEventListener('resize', function() { 17 | var s = getSize('#outer'); 18 | compare.resize([s[0]-200, s[1]]); 19 | }); 20 | 21 | 22 | window.dispatchEvent(new Event('resize')); 23 | 24 | function onSelect(selection) { 25 | var tab = tabs.get(selection.key); 26 | if (!tab) { 27 | tab = {window: null, run: Run() }; 28 | tabs.set(selection.key, tab); 29 | } 30 | if (!tab.window || tab.window.closed) { 31 | tab.window = window.open('run.html', selection.key); 32 | d3.select(tab.window).on('load', function() { tab.run.init(selection, tab.window); }); 33 | } else { 34 | tab.window.focus(); 35 | } 36 | } 37 | 38 | 39 | 40 | function getSize(el) { 41 | var d3el = d3.select(el); 42 | return [parseInt(d3el.style('width')), parseInt(d3el.style('height'))]; 43 | } 44 | }); 45 | 46 | //function loadTemplate(tid, eid) { 47 | // var t = importDoc.querySelector(tid); 48 | // var clone = document.importNode(t.content, true); 49 | // var d = document.getElementsByTagName(eid); 50 | // d[0].appendChild(clone); 51 | //} 52 | //loadTemplate('#compare-template', name); -------------------------------------------------------------------------------- /app/src/cmap.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 11/24/16. 3 | */ 4 | 5 | 6 | define(function(require) { 7 | 8 | var d3 = require('d3'); 9 | 10 | return function() { 11 | var COLORS = ["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"]; 12 | var value_scale = d3.scale.linear().domain([0, 0.5, 1]).range([0, 0.5, 1]).clamp(true); 13 | var color_scale = d3.scale.quantize().domain([0, 1]).range(COLORS); 14 | 15 | function cmap(v) { 16 | return color_scale(value_scale(v)); 17 | } 18 | 19 | cmap.value_range = function (_) { 20 | if (!arguments.length) return value_scale.domain(); 21 | value_scale.domain(_); 22 | return cmap; 23 | }; 24 | 25 | cmap.colors = function (_) { 26 | if (!arguments.length) return color_scale.range(); 27 | color_scale.range(_); 28 | return cmap; 29 | }; 30 | 31 | return cmap; 32 | } 33 | }); -------------------------------------------------------------------------------- /app/src/components/cmap_swath.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 11/24/16. 3 | */ 4 | define(function(require) { 5 | 6 | var d3 = require('d3'); 7 | 8 | return function() { 9 | var selection = null; 10 | var colors = null; 11 | var horizontal = true; 12 | var dispatch = d3.dispatch("changed"); 13 | 14 | var size = 100; 15 | var mid = 0.5; 16 | var mid_pos = Math.floor(mid * size); 17 | 18 | function mouse_update(mouse_pos) { 19 | var pos = horizontal ? mouse_pos[0] : size - mouse_pos[1]; 20 | if (pos == mid_pos) return; 21 | mid_pos = pos; 22 | mid = mid_pos/size; 23 | render(); 24 | dispatch.changed(mid); 25 | } 26 | 27 | function update(f) { 28 | if (mid == f) return; 29 | mid = f; 30 | mid_pos = mid * size; 31 | render(); 32 | } 33 | 34 | function render() { 35 | if (selection) 36 | selection 37 | .style('background-image', "linear-gradient(" + (horizontal ? "to right, " : "to top, ") + create() + ")"); 38 | } 39 | 40 | function create() { 41 | return colors.map(function(v,i) { return i==4 ? v + " " + Math.floor(mid*100) + "%" : v;}).toString(); 42 | } 43 | 44 | function swath(_) { 45 | selection = _; 46 | selection 47 | .on('mousedown', function () { 48 | d3.event.preventDefault(); 49 | selection 50 | .on('mousemove', function () { 51 | mouse_update(d3.mouse(this)); 52 | }) 53 | .on('mouseup', function () { 54 | selection 55 | .on('mousemove', null) 56 | .on('mouseup', null); 57 | }); 58 | mouse_update(d3.mouse(this)); 59 | }); 60 | render(); 61 | return this; 62 | } 63 | 64 | swath.colors = function(_) { 65 | if (!arguments.length) return colors; 66 | colors = _.concat(); 67 | return swath; 68 | }; 69 | 70 | swath.size = function(_) { 71 | if (!arguments.length) return size; 72 | size = _; 73 | return swath; 74 | }; 75 | 76 | swath.horizontal = function(_) { 77 | if (!arguments.length) return horizontal; 78 | horizontal = _; 79 | return swath; 80 | }; 81 | 82 | swath.mid = function(_) { 83 | if (!arguments.length) return mid; 84 | mid = _; 85 | return swath; 86 | }; 87 | 88 | swath.update = function(_) { 89 | update(_); 90 | return swath; 91 | }; 92 | 93 | swath.on = function(type, cb) { 94 | dispatch.on(type, cb); 95 | return swath; 96 | }; 97 | 98 | return swath; 99 | } 100 | }); -------------------------------------------------------------------------------- /app/src/config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 4/2/15. 3 | */ 4 | 5 | 6 | 7 | define(function(require) { 8 | 9 | var d3 = require('d3'); 10 | 11 | 12 | var value_band = d3.scale.linear().rangeRound([8, 0]); 13 | var VALUES_COLORMAP =["#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027"]; 14 | var JOBS_COLORMAP = colorbrewer.Set2[8]; 15 | var value_color = d3.scale.ordinal().domain([0, 8]).range(VALUES_COLORMAP); 16 | var scale = d3.scale.quantize().domain([0,1]).range(VALUES_COLORMAP); 17 | var value_scale = d3.scale.linear().domain([0, 0.5, 1]).range([0, 0.5, 1]).clamp(true); 18 | var data_range = [0, 1]; 19 | 20 | return { 21 | MULTI_JOBS_COLOR: '#00ffff', 22 | UNKNOWN_JOB_COLOR: '#e0e0e0', 23 | VALUES_COLORMAP: VALUES_COLORMAP, 24 | JOBS_COLORMAP: JOBS_COLORMAP, 25 | 26 | ROUTER_RADIUS: 2.5, 27 | ROUTER_RADIUS_INACTIVE: 1.5, 28 | ROUTER_RADIUS_HIGHLIGHT: 4, 29 | 30 | value_scale: value_scale, 31 | 32 | jobColor: function(id) { 33 | id = Math.min(id, JOBS_COLORMAP.length-1); 34 | return JOBS_COLORMAP[id]; 35 | }, 36 | 37 | data_range: function(range) { 38 | if (!arguments.length) return data_range; 39 | data_range = range; 40 | // if (!arguments.length) return scale.domain(); 41 | // return scale.domain(range); 42 | }, 43 | 44 | color: function (v) { 45 | return scale(value_scale(v)); 46 | }, 47 | 48 | color2: d3.scale.linear() 49 | .range(['#ff0000', '#00ff00']) 50 | .interpolate(d3.interpolateHcl) 51 | } 52 | }); 53 | -------------------------------------------------------------------------------- /app/src/data.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 2/6/15. 3 | */ 4 | define(function(require) { 5 | 6 | var model = require('model'); 7 | var d3 = require('d3'); 8 | var queue = require('d3_queue'); 9 | var Radio = require('radio'); 10 | var config = require('config'); 11 | 12 | 13 | var runsInfo; 14 | var runs = d3.map(); 15 | 16 | 17 | function Run(name) { 18 | this.groups = []; 19 | this.routers = d3.map(); 20 | //this.nodes = new Map(); 21 | this.counters = []; 22 | this.blues = []; 23 | this.greens = []; 24 | this.blacks = []; 25 | this.links = new Map(); 26 | this.jobs = d3.map(); 27 | this.jobsColor = []; 28 | this.core_to_node = d3.map(); 29 | 30 | 31 | 32 | // for(g = 0; g < model.N_GROUPS; g++) { 33 | // 34 | // } 35 | } 36 | 37 | Run.prototype.createGroup = function(g) { 38 | var r, c, node, rid = 0, cid = 0; 39 | var group = {id: g, routers: [], mode: 'full'}; 40 | 41 | this.groups[g] = group; 42 | for(r = 0; r < model.N_ROWS; r++) { 43 | var row = []; 44 | group.routers.push(row); 45 | for(c = 0; c < model.N_COLS; c++) { 46 | var router = { 47 | id: model.router_id(g, r, c), 48 | g: g, r:r, c:c, 49 | jobs:[], 50 | nodes_jobs: [undefined, undefined, undefined, undefined], 51 | nodes_color: [undefined, undefined, undefined, undefined], 52 | color: config.UNKNOWN_JOB_COLOR, 53 | green: 0, 54 | black: 0 55 | }; 56 | row.push(router); 57 | this.routers.set(router.id, router); 58 | } 59 | } 60 | }; 61 | 62 | Run.prototype.updateJobColor = function(job, color) { 63 | this.jobsColor[job.idx] = color; 64 | this.routers.values().forEach(function (router) { 65 | if (router.jobs.length == 1 && router.jobs[0] == job) 66 | router.color = color; 67 | }); 68 | }; 69 | 70 | function loadRun(channel, name) { 71 | var info = runsInfo.get(name); 72 | queue() 73 | .defer(d3.csv, info.jobs) 74 | .defer(d3.text, info.counters) 75 | .await(function (error, placement, counters) { 76 | if (error) { 77 | console.log("Error loading data", error); 78 | } 79 | else { 80 | var run = new Run(name); 81 | run.commFile = info.comm; 82 | loadPlacement(placement, run); 83 | loadCounters(counters, run); 84 | Backbone.Radio.channel(channel).trigger('data.run', run); 85 | } 86 | }); 87 | } 88 | 89 | function loadPlacement(data, run) { 90 | var job, router, idx=0, n, i; 91 | 92 | data.forEach(function (item) { 93 | if (item.core == undefined || item.core == 0) { 94 | item.g = +item.g; 95 | item.r = +item.r; 96 | item.c = +item.c; 97 | item.n = +item.n; 98 | item.id = model.node_id(item); 99 | item.jobid = +item.jobid; 100 | if (item.jobid == undefined) 101 | console.log('undefined jobid for core:',item); 102 | 103 | // TEMP: ignore data outside of config params 104 | if (item.g >= model.N_GROUPS || item.r >= model.N_ROWS || item.c >= model.N_COLS || item.n >= model.N_NODES) return; 105 | 106 | job = run.jobs.get(item.jobid); 107 | if (!job) { 108 | job = {id: item.jobid, idx: idx, n:0}; 109 | run.jobs.set(item.jobid, job); 110 | idx++; 111 | } 112 | job.n++; 113 | 114 | var router_id = model.router_id(item); 115 | router = run.routers.get(router_id); 116 | if (!router) { 117 | run.createGroup(item.g); 118 | router = run.routers.get(router_id); 119 | } 120 | if (router.jobs.indexOf(job) == -1) { 121 | router.jobs.push(job); 122 | //router.color = router.jobs.length == 1 ? job.color : config.MULTI_JOBS_COLOR; 123 | } 124 | if (!router.nodes_jobs[item.n]) router.nodes_jobs[item.n] = new Set([job]); 125 | else router.nodes_jobs[item.n].add(job); 126 | } 127 | }); 128 | 129 | var jobs = run.jobs.values(); 130 | jobs.sort(function (a,b) { return b.n - a.n;}); 131 | for (i=0, n=jobs.length; i 1 ? config.MULTI_JOBS_COLOR : router.nodes_jobs[i].values().next().value.color; 146 | } 147 | }); 148 | } 149 | 150 | function loadCounters(data, run) { 151 | var i, n, idx, base; 152 | var values, sg, sr, sc, dg, dr, dc, color, j, nc, id, link; 153 | 154 | var rows = d3.csv.parseRows(data); 155 | run.countersNames = rows[0].slice(7); 156 | run.counters = []; 157 | n = rows.length; 158 | for (i = 1; i < n; i++) { 159 | values = rows[i]; 160 | sg = +values.shift(); 161 | sr = +values.shift(); 162 | sc = +values.shift(); 163 | dg = +values.shift(); 164 | dr = +values.shift(); 165 | dc = +values.shift(); 166 | 167 | // TEMP: ignore data outside of config parameters 168 | if (sg >= model.N_GROUPS || sr >= model.N_ROWS || sc >= model.N_COLS || dg >= model.N_GROUPS || dr >= model.N_ROWS || dc >= model.N_COLS) continue; 169 | 170 | color = values.shift(); 171 | nc = values.length; 172 | for (j = 0; j < nc; j++) { 173 | values[j] = +values[j]; 174 | } 175 | id = model.link_id(sg, sr, sc, dg, dr, dc); 176 | link = run.links.get(id); 177 | if (!link) { 178 | link = { 179 | id: id, 180 | color: color, 181 | srcId: {g: sg, r: sr, c: sc}, 182 | destId: {g: dg, r: dr, c: dc}, 183 | src: run.routers.get(model.router_id(sg, sr, sc)), 184 | dest: run.routers.get(model.router_id(dg, dr, dc)), 185 | counters: values, 186 | total: values.concat(), 187 | n: 1 188 | }; 189 | run.links.set(link.id, link); 190 | if (color == 'b') run.blues.push(link); 191 | else if (color == 'g') run.greens.push(link); 192 | else run.blacks.push(link); 193 | } else { 194 | for (j=0; j to.id) { 71 | var temp = from; 72 | from = to; to = temp; 73 | } 74 | var id = from.id+':'+to.id; 75 | var edge = edge_map.get(id); 76 | if (!edge) { 77 | edge = {id:id, source:from, target:to}; 78 | edge_map.set(id, edge); 79 | } 80 | var f = Math.floor(from.id/4); 81 | var t = Math.floor(to.id/4); 82 | var ft = f+':'+t; 83 | var link = link_map.get(ft); 84 | if (!link) { 85 | link = {id:ft, edges:d3.map()}; 86 | link_map.set(ft, link); 87 | } 88 | link.edges.set(edge.id, edge); 89 | } 90 | 91 | function load(filename) { 92 | force.stop(); 93 | if (filename == comm_file) return; 94 | comm_file = filename; 95 | 96 | node_map = d3.map(); 97 | edge_map = d3.map(); 98 | link_map = d3.map(); 99 | nodes = []; 100 | edges = []; 101 | 102 | svgNodes.selectAll('.node').remove(); 103 | svgEdges.selectAll('.link').remove(); 104 | 105 | if (!filename) { 106 | console.log('*** missing name of comm file'); 107 | return; 108 | } 109 | var from, to; 110 | d3.csv(filename, function(comm) { 111 | if (comm) { 112 | comm.forEach(function (item) { 113 | from = getNode(item.from); 114 | to = getNode(item.to); 115 | getEdge(from, to); 116 | } 117 | ); 118 | } 119 | nodes = node_map.values(); 120 | edges = edge_map.values(); 121 | 122 | var n = nodes.length, i = -1; 123 | var angle; 124 | var node; 125 | while (++i < n) { 126 | node = nodes[i]; 127 | angle = i * 2 * Math.PI / n; 128 | node.x = 500 + 500 * Math.cos(angle); 129 | node.y = 500 + 500 * Math.sin(angle); 130 | } 131 | console.log('load comm: ', nodes.length, edges.length); 132 | render(); 133 | }); 134 | } 135 | 136 | function render() { 137 | force 138 | .nodes(nodes) 139 | .links(edges) 140 | .on('tick', null) 141 | .on('end', end) 142 | .start(); 143 | 144 | for (var i=0; i<50; i++) force.tick(); 145 | force.on('tick', update); 146 | 147 | d3edges = svgEdges.selectAll('.edge') 148 | .data(edges, function(d) { return d.id; }); 149 | 150 | d3edges.enter() 151 | .append('line') 152 | .attr('class', 'edge') 153 | .attr('stroke', '#ddd'); 154 | 155 | d3edges.exit() 156 | .remove(); 157 | 158 | d3nodes = svgNodes.selectAll('.node') 159 | .data(nodes, function(d) { return d.id;}); 160 | 161 | d3nodes.enter() 162 | .append('circle') 163 | .attr('class', 'node') 164 | .attr('cx', function(d) { return d.x;}) 165 | .attr('cy', function(d) { return d.y;}) 166 | .attr('r', 3) 167 | .attr('fill', 'lightgray') 168 | .call(drag); 169 | 170 | d3nodes.exit().remove(); 171 | 172 | 173 | } 174 | 175 | function clamp(x) { return x < 500 ? x : 500;} 176 | 177 | function update() { 178 | d3nodes 179 | .attr('cx', function(d) { return d.x; }) 180 | .attr('cy', function(d) { return d.y; }); 181 | 182 | d3edges 183 | .attr('x1', function(d) { return d.source.x; }) 184 | .attr('y1', function(d) { return d.source.y; }) 185 | .attr('x2', function(d) { return d.target.x; }) 186 | .attr('y2', function(d) { return d.target.y; }); 187 | } 188 | 189 | function end() { 190 | console.log('force done'); 191 | } 192 | 193 | function filter() { 194 | var value, i, j; 195 | var map = d3.map(), node; 196 | var links = []; 197 | var selected = select_color == 'blue' ? data.blues 198 | : select_color == 'green' ? data.greens 199 | : select_color == 'black' ? data.blacks 200 | : data.links; 201 | node_map.forEach(function(key, node) { node.value = 0; node.color = '#000'}); 202 | selected.forEach(function(link) { 203 | //value = link.counters[counterId]; 204 | if (range[0] <= link.value && link.value <= range[1]) { 205 | var sid = model.node_id(link.srcId.g, link.srcId.r, link.srcId.c, 0); 206 | for(i = 0; i < 4; i++) { 207 | node = node_map.get(sid + i); 208 | if (node) { 209 | if (link.value > node.value) { 210 | node.value = link.value; 211 | node.color = link.vis_color; 212 | } 213 | map.set(sid + i, node); 214 | } 215 | } 216 | var did = model.node_id(link.destId.g, link.destId.r, link.destId.c, 0); 217 | for(i = 0; i < 4; i++) { 218 | node = node_map.get(did + i); 219 | if (node) { 220 | if (link.value > node.value) { 221 | node.value = link.value; 222 | node.color = link.vis_color; 223 | } 224 | map.set(did + i, node); 225 | } 226 | } 227 | 228 | //sid = Math.floor(sid/4); 229 | //did = Math.floor(did/4); 230 | //var id = sid < did ? sid+':'+did : did+':'+sid; 231 | //var l = link_map.get(id); 232 | //if (l) { 233 | // l.edges.forEach(function(entry, value) { 234 | // links.push(value); 235 | // }); 236 | //} 237 | } 238 | }); 239 | 240 | //var color = colors[select_color]; 241 | 242 | //var d3links = svg.select('.edges').selectAll('.edge') 243 | // .data(links, function(d) { return d.id; }); 244 | // 245 | //d3links 246 | // .attr('stroke', color); 247 | // 248 | //d3links.exit() 249 | // .attr('stroke', '#ddd'); 250 | 251 | var nodes = svgNodes.selectAll('.node') 252 | .data(map.values(), function(d) { return d.id;}); 253 | 254 | nodes 255 | .attr('fill', function(d) { return d.color;}) 256 | .attr('r', 4); 257 | 258 | nodes.exit() 259 | .attr('fill', 'lightgray') 260 | .attr('r', 2); 261 | } 262 | 263 | var view = {}; 264 | 265 | view.el = function(el) { 266 | svgContainer = d3.select(el) 267 | .classed("view", true) 268 | .append("svg") 269 | .attr('width', WIDTH) 270 | .attr('height', HEIGHT); 271 | 272 | svg = svgContainer.append("g").call(zoom); 273 | 274 | svg.append("rect") 275 | .attr("class", "overlay") 276 | .attr("width", WIDTH) 277 | .attr("height", WIDTH); 278 | 279 | container = svg.append('g'); 280 | svgEdges = container.append('g').attr('class', 'edges'); 281 | svgNodes = container.append('g').attr('class', 'nodes'); 282 | 283 | return this; 284 | }; 285 | 286 | view.resize = function(w,h) { 287 | force.size([w, h]); 288 | 289 | svg.select('.overlay') 290 | .attr('width', w) 291 | .attr('height', h); 292 | 293 | return this; 294 | }; 295 | 296 | view.data = function(_) { 297 | if (!arguments.length) return data; 298 | data = _; 299 | load(data.commFile); 300 | return this; 301 | }; 302 | 303 | view.counter = function(_) { 304 | if (!arguments.length) return counterId; 305 | counterId = _; 306 | return this; 307 | }; 308 | 309 | view.range = function(_) { 310 | if (!arguments.length) return range; 311 | range = _; 312 | return this; 313 | }; 314 | 315 | view.counter = function(_) { 316 | if (!arguments.length) return counterId; 317 | counterId = _; 318 | return this; 319 | }; 320 | 321 | view.filter = function() { 322 | if (data && range) 323 | filter(); 324 | return this; 325 | }; 326 | 327 | view.select = function(color) { 328 | select_color = color; 329 | if (data && range) 330 | filter(); 331 | return this; 332 | }; 333 | 334 | return view; 335 | 336 | } 337 | }); -------------------------------------------------------------------------------- /app/src/graph/graph_view.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 3/5/15. 3 | */ 4 | define(function(require) { 5 | var Component = require('graph/graph'); 6 | var _ = require('underscore'); 7 | var $ = require('jquery'); 8 | var Resize = require('resize'); 9 | var Radio = require('radio'); 10 | 11 | return function(id_) { 12 | var id = id_; 13 | var component, el; 14 | var active = false, _data, _range, _counter; 15 | 16 | Radio.channel(id).on('data.run', function (data) { 17 | if (active) component.data(data).filter(); 18 | else _data = data; 19 | }); 20 | 21 | Radio.channel(id).on('data.range', function (range) { 22 | if (active) component.range(range).filter(); 23 | else _range = range; 24 | }); 25 | 26 | Radio.channel(id).on('data.change', function (index) { 27 | if (active) component.counter(index).filter(); 28 | else _counter = index; 29 | }); 30 | 31 | function onResize() { 32 | component.resize(el.width(), el.height()); 33 | } 34 | 35 | var view = function(elem) { 36 | //el = $(elem); 37 | var div = d3.select(elem).append('div'); 38 | var ctrl = div.append('div').attr('class', 'graph-ctrl').selectAll('input') 39 | .data(['blue', 'green', 'black', 'all']) 40 | .enter() 41 | .append('g'); 42 | 43 | ctrl.append('input') 44 | .attr('type', 'radio') 45 | .attr('name', 'select-link') 46 | .attr('value', function(d) { return d;}) 47 | //.text(function(d) {return d;}) 48 | .property('checked', function(d, i) { return i==0; }) 49 | .on('change', function(d) { component.select(d);}); 50 | 51 | ctrl.append('label') 52 | .text(function(d) { return d;}); 53 | 54 | var g = div.append('div')[0][0]; 55 | el = $(g); 56 | component = Component().el(g).counter(0).resize(600, 600); 57 | el.detectResizing({onResize: onResize}); 58 | return view; 59 | }; 60 | 61 | view.active = function (_) { 62 | if (!arguments.length) return active; 63 | 64 | if (active != _) { 65 | active = _; 66 | if (_data) component.data(_data); 67 | if (_counter != undefined) component.counter(_counter); 68 | if (_range) component.range(_range); 69 | 70 | if (_counter != undefined || _range) 71 | component.filter(); 72 | 73 | _data = _range = _counter = undefined; 74 | } 75 | return this; 76 | }; 77 | 78 | return view; 79 | } 80 | 81 | }); -------------------------------------------------------------------------------- /app/src/init.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 12/15/14. 3 | */ 4 | require.config({ 5 | 6 | baseUrl: 'src', 7 | //urlArgs: "v=" + (new Date()).getTime(), 8 | 9 | paths: { 10 | text: '../lib/requirejs-text/text', 11 | jquery: '../lib/jquery/dist/jquery.min', 12 | jqueryui: '../lib/jquery-ui/jquery-ui.min', 13 | underscore: '../lib/lodash/lodash.min', 14 | //underscore: '../lib/underscore/underscore', 15 | backbone: '../lib/backbone/backbone', 16 | radio: '../lib/backbone.radio/build/backbone.radio', 17 | d3: '../lib/d3/d3', 18 | d3_queue: '../lib/queue-async/queue', 19 | resize: '../lib-code/jquery-element-onresize' 20 | } 21 | }); 22 | 23 | // bootstrap the application 24 | require(['app'], function() {}); -------------------------------------------------------------------------------- /app/src/jobs_view.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 3/25/15. 3 | */ 4 | define(function(require) { 5 | var Radio = require('radio'), 6 | d3 = require('d3'), 7 | config = require('config'); 8 | 9 | return function(id_, doc) { 10 | var localDocument = doc; 11 | var root = d3.select(localDocument); 12 | var id = id_; 13 | 14 | Radio.channel(id).on('data.run', newRun); 15 | Radio.channel(id).on('routers.active', active_routers); 16 | 17 | var colors = config.JOBS_COLORMAP; // colorbrewer.Set2[8]; 18 | var context; 19 | var currentRun; 20 | 21 | root.select('body').append('div') 22 | .attr('class', 'color-menu') 23 | .style('display', 'none') 24 | .selectAll('div').data(colors) 25 | .enter() 26 | .append('div') 27 | .attr('class', 'color-entry') 28 | .style('width', '20px') 29 | .style('height', '10px') 30 | .style('background-color', function(d) { return d }) 31 | .on('mouseup', function(d, i) { 32 | context.color = d; 33 | currentRun.updateJobColor(context, d); 34 | update(); 35 | root.select('.color-menu').style('display', 'none') 36 | }); 37 | 38 | root.select('body').on('click.color-menu', function() { 39 | root.select('.color-menu').style('display', 'none'); 40 | }); 41 | 42 | function update() { 43 | newRun(currentRun); 44 | Radio.channel(id).trigger('data.update', currentRun); 45 | } 46 | 47 | function newRun(run) { 48 | currentRun = run; 49 | var jobs = run.jobs.values().sort(function(a,b) { return b.n - a.n;}); 50 | var l = jobs.length/2; 51 | 52 | root.select('#jobs').selectAll("div").remove(); 53 | 54 | root.select('#jobs').selectAll("div") 55 | .data(jobs, function(d) { return d.id;}) 56 | .enter() 57 | .append('div') 58 | .attr('class', 'job-entry') 59 | .style('position', 'absolute') 60 | .style('top', function(d,i) { return (i 0) min = value; 47 | if (value > max) max = value; 48 | if (value >= range[0] && value <= range[1]) { 49 | n++; 50 | 51 | src = srcCluster.add(link.srcId, value); 52 | dest = destCluster.add(link.destId, value); 53 | 54 | cellId = src.id + ':' + dest.id; 55 | cell = cells.get(cellId); 56 | if (!cell) { 57 | cell = {id: cellId, color: link.color, src: src, dest: dest, links: []}; 58 | cells.set(cellId, cell); 59 | } 60 | cell.links.push(link); 61 | } 62 | }); 63 | 64 | scale.domain([min, max]); 65 | //console.log('range: ', min, max); 66 | //console.log('links: ',n); 67 | 68 | computeValue(srcCluster.root()); 69 | computeValue(destCluster.root()); 70 | 71 | layout(srcCluster.root(), 10, 70, true); 72 | layout(destCluster.root(), 28, 52, false); 73 | 74 | var node, nodes = []; 75 | for (node of srcCluster.nodes().values()) { 76 | if (node.value > 0) 77 | nodes.push(node); 78 | } 79 | 80 | for (node of destCluster.nodes().values()) { 81 | if (node.value > 0) 82 | nodes.push(node); 83 | } 84 | 85 | //collect(srcCluster.root(), nodes); 86 | //collect(destCluster.root(), nodes); 87 | 88 | var d3nodes = d3dests.selectAll('rect') 89 | .data(nodes, function(d) {return d.id;}); 90 | 91 | d3nodes.enter() 92 | .append('rect'); 93 | 94 | d3nodes 95 | .attr('x', function(d) { return d.x;} ) 96 | .attr('y', function(d) { return d.y;} ) 97 | .attr('width', function(d) { return d.width;}) 98 | .attr('height', function(d) { return d.height;}) 99 | .attr('fill', function(d) { return d.color || 'lightgray';}) 100 | .attr('opacity', function(d) { return scale(d.value); }); 101 | 102 | d3nodes.exit() 103 | .remove(); 104 | 105 | // bg lines 106 | var lines = []; 107 | var x1 = destCluster.root().x-1, 108 | x2 = x1 + destCluster.root().width+2, 109 | y1 = srcCluster.root().y-1, 110 | y2 = y1 + srcCluster.root().height+2; 111 | 112 | srcCluster.root().children.forEach(function(d) { 113 | if (d.value > 0) 114 | lines.push({x1:x1, y1:d.y-1, x2:x2, y2: d.y-1 }); 115 | }); 116 | 117 | destCluster.root().children.forEach(function(d) { 118 | if (d.value > 0) 119 | lines.push({x1:d.x-1, y1:y1, x2:d.x-1, y2: y2 }); 120 | }); 121 | 122 | var l = d3lines.selectAll('line') 123 | .data(lines); 124 | 125 | l.enter() 126 | .append('line'); 127 | 128 | l.attr('x1', function(d) { return d.x1;}) 129 | .attr('x2', function(d) { return d.x2;}) 130 | .attr('y1', function(d) { return d.y1;}) 131 | .attr('y2', function(d) { return d.y2;}); 132 | 133 | l.exit().remove(); 134 | 135 | // links 136 | nodes = []; 137 | for (cell of cells.values()) { 138 | if (!cell.src.ignore && !cell.dest.ignore) { 139 | cell.value = d3.max(cell.links, function(d) { return d.counters[counterId];}); 140 | nodes.push(cell); 141 | } 142 | } 143 | d3nodes = d3cells.selectAll('rect') 144 | .data(nodes, function(d) { return d.id; }); 145 | 146 | d3nodes.enter() 147 | .append('rect') 148 | .attr('width', 4) 149 | .attr('height', 4) 150 | .attr('fill', function(d) { return colormap[d.color];}); 151 | 152 | d3nodes 153 | .attr('x', function(d) { return d.dest.x; }) 154 | .attr('y', function(d) { return d.src.y; }) 155 | .attr('opacity', function(d) { return scale(d.value); }); 156 | 157 | d3nodes.exit().remove(); 158 | } 159 | 160 | function collect(node, list) { 161 | list.push(node); 162 | if (node.open && node.value > 0 && node.children) { 163 | var n = node.children.length; 164 | for (var i=0; i 0 && node.children.length || 0; 172 | 173 | x += dx; 174 | if (n > 0) { 175 | for(i = 0; i < n; i++) { 176 | if (node.children[i].value > 0) { 177 | y = dy + layout(node.children[i], x, y, horizontal); 178 | } 179 | } 180 | y -= dy; 181 | } else { 182 | y += 4; 183 | } 184 | x -= dx; 185 | 186 | if (horizontal) assign(node, x0, y0, dx - 1, y - y0); 187 | else assign(node, y0, x0, y-y0, dx-1); 188 | 189 | return y; 190 | } 191 | 192 | function assign(node, x, y, w, h) { 193 | node.x = x; 194 | node.y = y; 195 | node.width = w; 196 | node.height = h; 197 | } 198 | 199 | function computeValue(node) { 200 | if (node.children) { 201 | node.value = 0; 202 | var n = node.children.length; 203 | for(var i = 0; i < n; i++) { 204 | node.value = Math.max(node.value, computeValue(node.children[i])); 205 | } 206 | } else { 207 | node.value = node.values && d3.max(node.values) || 0; 208 | } 209 | return node.value; 210 | } 211 | 212 | function update1() { 213 | var cellId, n, i, y, x; 214 | var value, src, dest, srcId, destId, cell; 215 | 216 | srcNodes = new Map(); 217 | destNodes = new Map(); 218 | cells = new Map(); 219 | 220 | var min = range[1], max = range[0]; 221 | n = 0; 222 | data.links.forEach(function(link) { 223 | if (!link.counters) return; 224 | value = link.counters[counterId]; 225 | if (value >= range[0] && value <= range[1]) { 226 | if (value < min) min = value; 227 | if (value > max) max = value; 228 | n++; 229 | srcId = model.router_id(link.src); 230 | src = srcNodes.get(srcId); 231 | if (!src) { 232 | src = {id: srcId, values: []}; 233 | srcNodes.set(srcId, src); 234 | } 235 | src.values.push(value); 236 | 237 | destId = model.router_id(link.dest); 238 | dest = destNodes.get(destId); 239 | if (!dest) { 240 | dest = {id: destId, values: []}; 241 | destNodes.set(destId, dest); 242 | } 243 | dest.values.push(value); 244 | 245 | cellId = srcId + ':' + destId; 246 | cell = cells.get(cellId); 247 | if (!cell) { 248 | cell = {id: cellId, color: link.color, src:src, dest:dest, links: []}; 249 | cells.set(cellId, cell); 250 | } 251 | cell.links.push(link); 252 | } 253 | }); 254 | 255 | scale.domain([min, max]); 256 | 257 | console.log('links: ',n); 258 | 259 | // sort based on max per src/dest 260 | var srcArray = []; 261 | for (src of srcNodes.values()) { 262 | src.value = d3.max(src.values); 263 | srcArray.push(src); 264 | } 265 | srcArray.sort(function(a, b) { return b.value - a.value;}); 266 | n = srcArray.length; 267 | y = 50; 268 | for (i = 0; i 100) 278 | srcArray = srcArray.slice(0,100); 279 | 280 | var destArray = []; 281 | for (dest of destNodes.values()) { 282 | dest.value = d3.max(dest.values); 283 | destArray.push(dest); 284 | } 285 | destArray.sort(function(a, b) { return b.value - a.value;}); 286 | n = destArray.length; 287 | x = 50; 288 | for (i = 0; i 100) 298 | destArray = destArray.slice(0, 100); 299 | 300 | var cellArray = []; 301 | for (cell of cells.values()) { 302 | if (!cell.src.ignore && !cell.dest.ignore) { 303 | cell.value = d3.max(cell.links, function(d) { return d.counters[counterId];}); 304 | cellArray.push(cell); 305 | } 306 | } 307 | console.log('cells: ', cellArray.length, ' / ', cells.size ); 308 | 309 | // draw 310 | var d3nodes = d3srcs.selectAll('rect') 311 | .data(srcArray, function(d) {return d.id;}); 312 | 313 | d3nodes.enter() 314 | .append('rect') 315 | .attr('width', 4) 316 | .attr('height', 4) 317 | .attr('fill', 'lightgray'); 318 | 319 | d3nodes 320 | .attr('x', function(d) { return d.x;} ) 321 | .attr('y', function(d) { return d.y;} ); 322 | 323 | d3nodes.exit() 324 | .remove(); 325 | 326 | d3nodes= d3dests.selectAll('rect') 327 | .data(destArray, function(d) {return d.id;}); 328 | 329 | d3nodes.enter() 330 | .append('rect') 331 | .attr('width', 4) 332 | .attr('height', 4) 333 | .attr('fill', 'lightgray'); 334 | 335 | d3nodes 336 | .attr('x', function(d) { return d.x;} ) 337 | .attr('y', function(d) { return d.y;} ); 338 | 339 | d3nodes.exit() 340 | .remove(); 341 | 342 | d3nodes = d3cells.selectAll('rect') 343 | .data(cellArray, function(d) { return d.id; }); 344 | 345 | d3nodes.enter() 346 | .append('rect') 347 | .attr('width', 4) 348 | .attr('height', 4) 349 | .attr('fill', function(d) { return colormap[d.color];}); 350 | 351 | d3nodes 352 | .attr('x', function(d) { return d.dest.x; }) 353 | .attr('y', function(d) { return d.src.y; }) 354 | .attr('opacity', function(d) { return scale(d.value); }); 355 | 356 | d3nodes.exit().remove(); 357 | } 358 | 359 | var adj = function() {}; 360 | 361 | adj.el = function(el) { 362 | svgContainer = d3.select(el) 363 | .classed("matrix", true) 364 | .append("svg") 365 | .attr('width', WIDTH) 366 | .attr('height', HEIGHT); 367 | 368 | svg = svgContainer.append("g"); 369 | 370 | d3srcs = svg.append('g').attr('class', 'src'); 371 | d3dests = svg.append('g').attr('class', 'dest'); 372 | d3cells = svg.append('g').attr('class', 'cells'); 373 | d3lines = svg.append('g').attr('class', 'lines'); 374 | 375 | return this; 376 | }; 377 | 378 | adj.resize = function(w, h) { 379 | svgContainer.attr("width", w).attr("height", h); 380 | //layout.size(w, h); 381 | if (data && range) 382 | update(); 383 | return this; 384 | }; 385 | 386 | adj.data = function(_) { 387 | if (!arguments.length) return data; 388 | data = _; 389 | return this; 390 | }; 391 | 392 | adj.counter = function(_) { 393 | if (!arguments.length) return counterId; 394 | counterId = _; 395 | return this; 396 | }; 397 | 398 | adj.range = function(_) { 399 | if (!arguments.length) return range; 400 | range = _; 401 | return this; 402 | }; 403 | 404 | adj.update = function() { 405 | update(); 406 | return this; 407 | }; 408 | 409 | return adj; 410 | } 411 | }); -------------------------------------------------------------------------------- /app/src/matrix/cluster.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 3/15/15. 3 | */ 4 | define(function(require) { 5 | 6 | return function(id) { 7 | var nodes = new Map(), root = {id: id, open: true}; 8 | var levels = [16, 6, 16]; 9 | var colors = d3.scale.category20(); 10 | 11 | function key(id) { 12 | return root.id+':'+id.g+':'+id.r+':'+id.c; 13 | } 14 | 15 | function init() { 16 | build(root, 0); 17 | for (var i=0; i 1000;}); 139 | _series = series; 140 | domain = domain || [d3.min(_series), d3.max(_series)]; 141 | x.domain(domain); 142 | 143 | if (domain[0] > 1000) 144 | xAxis.tickFormat(d3.format('.02e')); 145 | else 146 | xAxis.tickFormat(d3.format('g')); 147 | 148 | data = d3.layout.histogram() 149 | .range(x.domain()) 150 | .bins(x.ticks(20)) 151 | (_series); 152 | 153 | 154 | data.forEach(function(d) { console.log('hist:', d.x, d.y);}); 155 | dx = data.length > 0 ? data[0].dx : 5; 156 | var min = x.domain()[0]; 157 | dx = x(min+dx)-1; 158 | if (data.length > 1) { 159 | dx = x(data[1].x) - x(data[0].x); 160 | } 161 | //console.log('dx:',dx, ' x(dx):', x(dx)); 162 | y.domain([0, d3.max(data, function(d) { return d.y;})]); 163 | 164 | brush.event(svg.select('.brush')); 165 | svg.select('.brush').call(brush); 166 | draw(); 167 | return histogram; 168 | }; 169 | 170 | histogram.xdomain = function(from, to) { 171 | var save=duration; duration = 0; 172 | this.data(_series, [from, to]); 173 | svg.select('.brush').call(brush); 174 | duration = save; 175 | 176 | return histogram; 177 | }; 178 | 179 | histogram.on = function(type, listener) { 180 | dispatch.on(type, listener); 181 | return histogram; 182 | }; 183 | 184 | return histogram; 185 | }; 186 | 187 | }); -------------------------------------------------------------------------------- /app/src/svg/histogram_g.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 12/16/14. 3 | */ 4 | 5 | define(function(require) { 6 | var 7 | d3 = require('d3'); 8 | 9 | return function() { 10 | var 11 | margin = {top: 10, right:10, bottom: 10, left: 40}, 12 | 13 | width = 250-margin.left-margin.right, 14 | height = 150 - margin.top - margin.bottom, 15 | dx = 5, duration = 500, 16 | svg, histogram, _series, handle, 17 | counterId = undefined, 18 | percentile = undefined, 19 | percentileX = undefined, 20 | highlightPercentile = [false, false, false], 21 | dispatch = d3.dispatch('brushed'); 22 | 23 | var insideMode = true; 24 | var leftHandle, rightHandle; 25 | 26 | var stack = d3.layout.stack(); 27 | var x = d3.scale.linear() 28 | .domain([0, 1]) 29 | .range([0, width]) 30 | .clamp(true); 31 | 32 | var y = d3.scale.linear() 33 | .domain([0, 1]) 34 | .rangeRound([height, 0]); 35 | 36 | var color = d3.scale.linear() 37 | .domain([0,2]) 38 | .range( ['#4daf4a','#377eb8','#404040']); 39 | 40 | var xAxis = d3.svg.axis() 41 | .scale(x) 42 | .orient("bottom") 43 | .ticks(4) 44 | .tickFormat(d3.format('4g')); 45 | 46 | var yAxis = d3.svg.axis() 47 | .scale(y) 48 | .orient("left") 49 | .ticks(4) 50 | .tickFormat(d3.format('4g')); 51 | 52 | var brush = d3.svg.brush() 53 | .x(x) 54 | .on('brush', brushed); 55 | // .on('brushend', brushed); 56 | 57 | var dispatch_args = { f: 0, t: 0, i: false}; 58 | var timeoutId = null; 59 | 60 | function brushed() { 61 | var e = brush.extent(); 62 | // console.log('brush', e, d3.event); 63 | var ex = [Math.round(x(e[0])), Math.round(x(e[1]))]; 64 | 65 | if (!insideMode) { 66 | leftHandle.attr('width', ex[0]); 67 | rightHandle.attr('x', ex[1]); 68 | rightHandle.attr('width', width-ex[1]); 69 | } 70 | var i, j, prev = highlightPercentile.concat(); 71 | for (i=0; i<3; i++) { 72 | highlightPercentile[i] = false; 73 | for (j=0; j<2; j++) { 74 | if (ex[j] == percentileX[i]) highlightPercentile[i] = true; 75 | } 76 | } 77 | var change = false; 78 | for (i=0; i<3; i++) change |= prev[i] != highlightPercentile[i]; 79 | // if (change) draw(); 80 | // dispatch_args = { f: e[0], t: e[1], i: insideMode}; 81 | // if (!timeoutId) { 82 | // timeoutId = window.setTimeout(function () { 83 | // console.log('delayed dispatch'); 84 | // dispatch.brushed(dispatch_args.f, dispatch_args.t, dispatch_args.i); 85 | // timeoutId = null; 86 | // }, 0); 87 | // console.log('timeout:', timeoutId); 88 | // } 89 | dispatch.brushed([e[0], e[1], insideMode]); 90 | } 91 | 92 | var colorAccessor = function(link) { 93 | return link.color; 94 | }; 95 | 96 | function draw() { 97 | if (svg == undefined) return; 98 | 99 | if (!percentile) { 100 | var values = _series.map(valueAccessor).sort(d3.ascending); 101 | var l = values.length; 102 | percentile = [values[l/4], values[l/2], values[l*3/4]]; 103 | percentileX = [Math.round(x(percentile[0])), Math.round(x(percentile[1])),Math.round(x(percentile[2]))]; 104 | } 105 | 106 | svg.select('.x') 107 | .call(xAxis); 108 | 109 | svg.select('.y') 110 | .call(yAxis); 111 | 112 | var colors = {g:'green', k:'black', b:'steelblue'}; 113 | var bars = []; 114 | histogram.forEach(function(bin, idx) { 115 | var i=-1, n = bin.length, counts = {g:0, k:0, b:0}; 116 | while( ++i 0 && lx[0] < width, 149 | color: highlightPercentile[0] && 'blue' || 'lighgray', 150 | width: highlightPercentile[0] && 4 || 1}, 151 | {x1: lx[1], x2: lx[1], y1: 0, y2: -6, visible: lx[1] > 0 && lx[1] < width, 152 | color: highlightPercentile[1] && 'blue' || 'lightgray', 153 | width: highlightPercentile[1] && 4 || 1}, 154 | {x1: lx[2], x2: lx[2], y1: 0, y2: -6, visible: lx[2] > 0 && lx[2] < width, 155 | color: highlightPercentile[2] && 'blue' || 'lightgray', 156 | width: highlightPercentile[2] && 4 || 1}, 157 | {x1: lx[0], x2: lx[2], y1: -2.5, y2: -2.5, visible: true, color:'gray', width: 1} 158 | ]; 159 | 160 | var line = svg.select('.percentile').selectAll('line') 161 | .data(lines); 162 | 163 | line.enter() 164 | .append('line') 165 | .style('stroke', 'black') 166 | .style('stroke-width', '1') 167 | .style('shape-rendering', 'crispEdges'); 168 | 169 | line 170 | .attr('x1', function(d) { return d.x1; }) 171 | .attr('x2', function(d) { return d.x2; }) 172 | .attr('y1', function(d) { return d.y1; }) 173 | .attr('y2', function(d) { return d.y2; }) 174 | .style('stroke', function(d) { return d.color;}) 175 | .style('stroke-width', function(d) { return d.width; }) 176 | .attr('visibility', function(d) { return d.visible && 'visible' || 'hidden'; }); 177 | 178 | } 179 | 180 | function api(selection) { 181 | svg = selection.append('g') 182 | .attr('class', 'histogram') 183 | .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); 184 | 185 | svg.append('g') 186 | .append('rect') 187 | .attr('width', width) 188 | .attr('height', height) 189 | .style('fill', 'steelblue') 190 | .style('opacity', 0.0); 191 | 192 | var p = svg.append('g') 193 | .attr('class', 'percentile'); 194 | 195 | //p.append('rect') 196 | // .attr('x', x(0)) 197 | // .attr('y', -5) 198 | // .attr('height', 5) 199 | // .attr('width', 0) 200 | // .attr('fill', 'orange'); 201 | 202 | //p.append('line') 203 | // .attr('x1', 0) 204 | // .attr('x2', 0) 205 | // .attr('y1', 0) 206 | // .attr('y2', -5) 207 | // .style('stroke', 'black') 208 | // .style('stroke-width', 1); 209 | 210 | handle = svg.append('g') 211 | .attr('class', 'brush') 212 | .call(brush); 213 | 214 | leftHandle = svg.append('rect') 215 | .attr('class', 'externalHandler') 216 | .attr('width', 0) 217 | .attr('height', height); 218 | 219 | rightHandle = svg.append('rect') 220 | .attr('class', 'externalHandler') 221 | .attr('width', 0) 222 | .attr('height', height) 223 | .attr('x', width); 224 | 225 | handle.selectAll('rect') 226 | .attr('height', height); 227 | 228 | svg.append('g') 229 | .attr('class', 'x axis') 230 | .attr('transform', 'translate(0,' + height + ')') 231 | .call(xAxis); 232 | 233 | svg.append('g') 234 | .attr('class', 'y axis') 235 | .call(yAxis); 236 | 237 | brush.clear(); 238 | return this; 239 | } 240 | 241 | api.width = function(w) { 242 | if (!arguments.length) return width + margin.left + margin.right; 243 | width = w - margin.left - margin.right; 244 | x.range([0, width]); 245 | 246 | draw(); 247 | return this; 248 | }; 249 | 250 | api.height = function(h) { 251 | if (!arguments.length) return height + margin.top + margin.bottom; 252 | height = h - margin.top - margin.bottom; 253 | y.rangeRound([height, 0]); 254 | yAxis.ticks( Math.max(2, height/50)); 255 | if (handle) { 256 | handle.selectAll('rect') 257 | .attr('height', height); 258 | } 259 | 260 | draw(); 261 | return this; 262 | }; 263 | 264 | api.margin = function(m) { 265 | if (!arguments.length) return margin; 266 | svg.attr('translate', 'transform(' + (m.left - margin.left) + ',' + (m.top - margin.top) + ')'); 267 | margin = m; 268 | return api; 269 | }; 270 | 271 | api.counter = function(id) { 272 | counterId = id; 273 | percentile = undefined; 274 | return this; 275 | }; 276 | 277 | var valueAccessor = function(link) { 278 | return link.counters[counterId]; 279 | }; 280 | 281 | api.data = function(series, domain) { 282 | _series = series; 283 | percentile = undefined; 284 | return this; 285 | }; 286 | 287 | api.range = function(range) { 288 | var save=duration; duration = 0; 289 | 290 | var extent = brush.extent(); 291 | 292 | x.domain(range); 293 | 294 | histogram = d3.layout.histogram() 295 | .range(x.domain()) 296 | .value(valueAccessor) 297 | .bins(20) 298 | (_series); 299 | 300 | dx = histogram.length > 1 ? x(histogram[1].x) - x(histogram[0].x)-1 : 5; 301 | 302 | y.domain([0, d3.max(histogram, function(d) { return d.y;})]); 303 | draw(); 304 | 305 | if (!brush.empty()) { 306 | //extent = [Math.min(Math.max(extent[0], range[0]), range[1]), Math.max(Math.min(extent[1], range[1]), range[0])]; 307 | //brush.extent(extent); 308 | svg.select('.brush').call(brush); 309 | brush.event(svg.select('.brush')); 310 | } 311 | duration = save; 312 | return this; 313 | }; 314 | 315 | api.mode = function(on) { 316 | insideMode = on; 317 | if (insideMode) { 318 | leftHandle.attr('x', 0).attr('width', 0); 319 | rightHandle.attr('x', width).attr('width', 0); 320 | svg.select('.brush .extent').style('opacity', 1); 321 | } else { 322 | var e = brush.extent(); 323 | var r = x(e[1]); 324 | leftHandle.attr('width', x(e[0])); 325 | rightHandle.attr('x', r).attr('width', width-r); 326 | svg.select('.brush .extent').style('opacity', 0); 327 | } 328 | svg.select('.brush').call(brush); 329 | brushed(); 330 | }; 331 | 332 | api.on = function(type, listener) { 333 | dispatch.on(type, listener); 334 | return this; 335 | }; 336 | 337 | return api; 338 | }; 339 | 340 | }); -------------------------------------------------------------------------------- /app/src/svg/slider.js: -------------------------------------------------------------------------------- 1 | define(function(require) { 2 | var d3 = require('d3'); 3 | 4 | return function() { 5 | var width = 100, height = 25, 6 | handle, d3axis, 7 | manual = false; 8 | 9 | var dispatch = d3.dispatch('start', 'move', 'end'); 10 | var x = d3.scale.linear() 11 | .domain([0, 1]) 12 | .range([0, width]); 13 | //.clamp(true); 14 | 15 | var axis = d3.svg.axis() 16 | .scale(x) 17 | .orient('bottom') 18 | .ticks(4); 19 | // .tickFormat(function (d) { return d ; }) 20 | // .tickSize(8, 8) 21 | // .tickPadding(12) 22 | 23 | var brush = d3.svg.brush() 24 | .x(x) 25 | //.extent([0, 1]) 26 | .on("brush", brushmove) 27 | .clear(); 28 | ; 29 | 30 | function brushmove() { 31 | manual = true; 32 | var e = brush.extent(); 33 | dispatch.move(e); 34 | } 35 | 36 | 37 | function slider(selection) { 38 | selection.each(function () { 39 | var g = d3.select(this); 40 | 41 | var frame = g.append("g") 42 | .attr('class', 'slider') 43 | .attr('width', width) 44 | .attr('height', height); 45 | 46 | d3axis = frame.append('g') 47 | .attr('class', 'x axis') 48 | .attr('transform', 'translate(0.5,' + 10.5 + ')') 49 | .call(axis); 50 | 51 | handle = frame.append('g') 52 | .attr("class", "brush") 53 | .attr('transform', 'translate(0.5,' + 5 + ')') 54 | .call(brush); 55 | 56 | brush.clear(); 57 | 58 | // handle.selectAll('.resize').append('path') 59 | // .attr('d', grasp); 60 | 61 | handle.selectAll("rect") 62 | .attr("height", 10); 63 | 64 | //handle.selectAll('.resize').selectAll('rect') 65 | // .style('visibility', 'visible'); 66 | }); 67 | } 68 | 69 | slider.width = function (value) { 70 | if (!arguments.length) return width; 71 | width = value; 72 | //console.log('extent pre:', brush.extent()); 73 | x.range([0, width]); 74 | brush.x(x); 75 | if (handle != undefined) { 76 | handle.call(brush); 77 | //console.log('extent: post', brush.extent()); 78 | } 79 | 80 | return slider; 81 | }; 82 | 83 | slider.height = function (value) { 84 | if (!arguments.length) return height; 85 | height = value; 86 | return slider; 87 | }; 88 | 89 | slider.scale = function (s) { 90 | if (!arguments.length) return x; 91 | x = s; 92 | return slider; 93 | }; 94 | 95 | slider.axis = function (a) { 96 | if (!arguments.length) return axis; 97 | axis = a; 98 | return slider; 99 | }; 100 | 101 | slider.domain = function(value) { 102 | if (!arguments.length) return x.domain(); 103 | x.domain(value); 104 | if (value[0] > 1000) 105 | axis.tickFormat(d3.format('.1e')); 106 | else 107 | axis.tickFormat(d3.format('g')); 108 | 109 | //g.select('.x') 110 | d3axis.call(axis); 111 | //var extent = brush.extent(); 112 | //if (manual) { 113 | // if (extent[0] < value[0]) extent[0] = value[0]; 114 | // if (extent[1] > value[1]) extent[1] = value[1]; 115 | // brush.extent(extent); 116 | //} else { 117 | // brush.extent(x.domain()); 118 | //} 119 | brush.extent(x.domain()); 120 | 121 | if (handle) handle.call(brush); 122 | return slider; 123 | }; 124 | 125 | slider.extent = function(value) { 126 | if (!arguments.length) return brush.extent(); 127 | brush.extent(value); 128 | return slider; 129 | }; 130 | 131 | slider.on = function(type, listener) { 132 | dispatch.on(type, listener); 133 | return slider; 134 | }; 135 | 136 | return slider; 137 | }; 138 | }); -------------------------------------------------------------------------------- /app/src/views.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by yarden on 3/12/15. 3 | */ 4 | define(function(require) { 5 | var d3 = require('d3'); 6 | var RadialFactory = require('radial/radial_view'); 7 | var MatrixFactory = require('matrix/matrix_view'); 8 | var GraphFactory = require('graph/graph_view'); 9 | 10 | return function(id, doc) { 11 | var localDocument = doc; 12 | var root = d3.select(localDocument); 13 | // var id = id_; 14 | 15 | // var views = [ 16 | // {id:'radial', factory: RadialFactory, view:undefined}, 17 | // {id:'matrix', factory: MatrixFactory, view:undefined}, 18 | // {id:'graph', factory: GraphFactory, view:undefined } 19 | // ]; 20 | // 21 | // 22 | // root.select('.views').select(".tab-links").selectAll("li") 23 | // .data(views) 24 | // .enter() 25 | // .append('li') 26 | // .classed('active', function(d,i) { return i==0;}) 27 | // .append('a') 28 | // .attr('href', function(d) {return '#'+d.id;}) 29 | // .text(function(d) { return d.id;}) 30 | // .on('click', function(d) { 31 | // root.select('.views').select('.tab-links').selectAll('li') 32 | // .data(views) 33 | // .classed('active', function(tab) { return tab.id == d.id; }); 34 | // 35 | // root.select('.views').selectAll('.tab') 36 | // .data(views) 37 | // .classed('active', function(tab) { return tab.id == d.id; }) 38 | // .each(function(tab) { tab.view.active(tab.id == d.id); }); 39 | // d3.event.preventDefault(); 40 | // }); 41 | // 42 | // root.select('.views').select('.tab-content').selectAll("div") 43 | // .data(views) 44 | // .enter() 45 | // .append('div') 46 | // .attr('id', function(d) { return d.id;}) 47 | // .attr('class', function(d, i) { return 'tab'+(i==0? ' active' : ''); }) 48 | // .each(function(d, i) { 49 | // d.view = d.factory(id); 50 | // var a = d.view(this); 51 | // d.view.active(i==0);}); 52 | // }; 53 | 54 | RadialFactory(id)(root.select('#view').node()); 55 | } 56 | }); -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "radial", 3 | "version": "0.1.0", 4 | "authors": [ 5 | "Yarden Livnat " 6 | ], 7 | "description": "Dragonfly performance", 8 | "main": "app.js", 9 | "license": "MIT", 10 | "private": true, 11 | "ignore": [ 12 | "**/.*", 13 | "node_modules", 14 | "bower_components", 15 | "test", 16 | "tests" 17 | ], 18 | "dependencies": { 19 | "requirejs": "~2.1.15", 20 | "lodash": "~3.4.0", 21 | "requirejs-text": "~2.0.13", 22 | "require-css": "~0.1.8", 23 | "jquery": "~2.1.3", 24 | "fontawesome": "~4.3.0", 25 | "d3": "~3.5.3", 26 | "jquery-ui": "~1.11.2", 27 | "sprintf": "~1.0.2", 28 | "queue-async": "~1.0.7", 29 | "backbone.radio": "~0.9.0", 30 | "backbone": "~1.1.2", 31 | "jqueryui": "~1.11.3", 32 | "colorbrewer": "~1.0.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd app 3 | #python -m SimpleHTTPServer 8888 4 | python ../server.py $1 5 | 6 | -------------------------------------------------------------------------------- /server.py: -------------------------------------------------------------------------------- 1 | import os 2 | from sys import argv 3 | 4 | try: 5 | from SimpleHTTPServer import SimpleHTTPRequestHandler as Handler 6 | from SocketServer import TCPServer as Server 7 | except ImportError: 8 | from http.server import SimpleHTTPRequestHandler as Handler 9 | from http.server import HTTPServer as Server 10 | 11 | PORT = int(os.getenv('DRAGONVIEW_PORT', 8000)) 12 | 13 | DATA_DIR = 'sim' 14 | if len(argv) == 2: 15 | DATA_DIR = argv[1] 16 | #if DATA_DIR[-1:] != '/': 17 | # DATA_DIR += '/' 18 | 19 | DATA_DIR = '/data/'+DATA_DIR 20 | 21 | 22 | class MyHandler(Handler): 23 | def do_GET(self): 24 | print 'PATH: ', self.path[:5] 25 | if self.path[:5] == '/data': 26 | print 'path:', self.path 27 | self.path = DATA_DIR + self.path[5:] 28 | print 'new path:', self.path 29 | Handler.do_GET(self) 30 | 31 | httpd = Server(("", PORT), MyHandler) 32 | print 'Port %i \nDATA %s' % (PORT, DATA_DIR) 33 | httpd.serve_forever() --------------------------------------------------------------------------------