linny-r 1.4.3 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +102 -48
  2. package/package.json +1 -1
  3. package/server.js +31 -6
  4. package/static/images/check-off-not-same-changed.png +0 -0
  5. package/static/images/check-off-not-same-not-changed.png +0 -0
  6. package/static/images/check-off-same-changed.png +0 -0
  7. package/static/images/check-off-same-not-changed.png +0 -0
  8. package/static/images/check-on-not-same-changed.png +0 -0
  9. package/static/images/check-on-not-same-not-changed.png +0 -0
  10. package/static/images/check-on-same-changed.png +0 -0
  11. package/static/images/check-on-same-not-changed.png +0 -0
  12. package/static/images/eq-not-same-changed.png +0 -0
  13. package/static/images/eq-not-same-not-changed.png +0 -0
  14. package/static/images/eq-same-changed.png +0 -0
  15. package/static/images/eq-same-not-changed.png +0 -0
  16. package/static/images/ne-not-same-changed.png +0 -0
  17. package/static/images/ne-not-same-not-changed.png +0 -0
  18. package/static/images/ne-same-changed.png +0 -0
  19. package/static/images/ne-same-not-changed.png +0 -0
  20. package/static/images/sort-asc-lead.png +0 -0
  21. package/static/images/sort-asc.png +0 -0
  22. package/static/images/sort-desc-lead.png +0 -0
  23. package/static/images/sort-desc.png +0 -0
  24. package/static/images/sort-not.png +0 -0
  25. package/static/index.html +51 -35
  26. package/static/linny-r.css +167 -53
  27. package/static/scripts/linny-r-gui-actor-manager.js +340 -0
  28. package/static/scripts/linny-r-gui-chart-manager.js +944 -0
  29. package/static/scripts/linny-r-gui-constraint-editor.js +681 -0
  30. package/static/scripts/linny-r-gui-controller.js +4005 -0
  31. package/static/scripts/linny-r-gui-dataset-manager.js +1176 -0
  32. package/static/scripts/linny-r-gui-documentation-manager.js +739 -0
  33. package/static/scripts/linny-r-gui-equation-manager.js +307 -0
  34. package/static/scripts/linny-r-gui-experiment-manager.js +1944 -0
  35. package/static/scripts/linny-r-gui-expression-editor.js +449 -0
  36. package/static/scripts/linny-r-gui-file-manager.js +392 -0
  37. package/static/scripts/linny-r-gui-finder.js +727 -0
  38. package/static/scripts/linny-r-gui-model-autosaver.js +230 -0
  39. package/static/scripts/linny-r-gui-monitor.js +448 -0
  40. package/static/scripts/linny-r-gui-paper.js +2789 -0
  41. package/static/scripts/linny-r-gui-receiver.js +323 -0
  42. package/static/scripts/linny-r-gui-repository-browser.js +819 -0
  43. package/static/scripts/linny-r-gui-scale-unit-manager.js +244 -0
  44. package/static/scripts/linny-r-gui-sensitivity-analysis.js +778 -0
  45. package/static/scripts/linny-r-gui-undo-redo.js +560 -0
  46. package/static/scripts/linny-r-model.js +24 -11
  47. package/static/scripts/linny-r-utils.js +10 -0
  48. package/static/scripts/linny-r-vm.js +21 -12
  49. package/static/scripts/linny-r-gui.js +0 -16908
package/README.md CHANGED
@@ -1,9 +1,13 @@
1
1
  <img src="https://sysmod.tbm.tudelft.nl/linny-r/images/logo.png" height="55px" alt="Linny-R">
2
2
 
3
- <p>Linny-R is an executable graphical specification language for mixed integer
4
- <a href="https://en.wikipedia.org/wiki/Linear_programming" target="_blank">linear programming</a> (MILP) problems, especially
5
- <a href="https://en.wikipedia.org/wiki/Unit_commitment_problem_in_electrical_power_production" target="_blank">unit commitment problems</a> (UCP) and
6
- <a href="https://en.wikipedia.org/wiki/Generation_expansion_planning" target="_blank">generation expansion planning</a> (GEP).</p>
3
+ Linny-R is an executable graphical specification language for mixed integer
4
+ <a href="https://en.wikipedia.org/wiki/Linear_programming" target="_blank">linear programming</a>
5
+ (MILP) problems, especially
6
+ <a href="https://en.wikipedia.org/wiki/Unit_commitment_problem_in_electrical_power_production"
7
+ target="_blank">unit commitment problems</a>
8
+ (UCP) and
9
+ <a href="https://en.wikipedia.org/wiki/Generation_expansion_planning"
10
+ target="_blank">generation expansion planning</a> (GEP).
7
11
 
8
12
  The graphical language and WYSIWYG model editor are developed by **Pieter Bots** at
9
13
  <a href="https://tudelft.nl" target="_blank">Delft University of Technology</a>.
@@ -16,8 +20,9 @@ and a graphical user interface (GUI) that runs in any modern browser.
16
20
  These <a href="https://sysmod.tbm.tudelft.nl/linny-r/docs/?68" target="_blank">instruction videos</a>
17
21
  published on YouTube give an idea of what Linny-R can do.
18
22
 
19
- User documentation for Linny-R is still scant, but it is growing. You can contribute yourself (in "wiki fashion")
20
- via the official user documentation site <a href="https://linny-r.info" target="_blank">https://linny-r.info</a>.
23
+ User documentation for Linny-R is still scant, but it is growing. You can contribute yourself
24
+ (in "wiki fashion") via the official user documentation site
25
+ <a href="https://linny-r.info" target="_blank">https://linny-r.info</a>.
21
26
  Technical documentation will be developed on GitHub: https://github.com/pwgbots/linny-r/wiki
22
27
 
23
28
  ## Installing Node.js
@@ -45,7 +50,11 @@ so in all commands you should replace this with the actual directory path.
45
50
  On a Windows machine the suggested path is `C:\Users\(your user name)\Documents\Linny-R`,
46
51
  and on a macOS machine `/Users/(your user name)/Linny-R`.
47
52
 
48
- To install Linny-R in this directory, first create it:
53
+ To install Linny-R in this directory, first change to the parent directory like so:
54
+
55
+ ``cd /Users/(your user name)``
56
+
57
+ Then create the `Linny-R` directory:
49
58
 
50
59
  ``mkdir Linny-R``
51
60
 
@@ -57,7 +66,8 @@ and then type at the command line prompt:
57
66
 
58
67
  ``npm install --prefix . linny-r``
59
68
 
60
- **NOTE:** The spacing around the dot is important. Type the command in lower case.
69
+ > **Important**
70
+ > The spacing around the dot is essential. Type the command in lower case.
61
71
 
62
72
  After installation has completed, `Linny-R` should have this directory tree structure:
63
73
 
@@ -88,11 +98,12 @@ on a Windows machine the batch script `linny-r.bat`. By default, this script fil
88
98
  two commands: first change to the Linny-R directory and then tell Node.js to launch the
89
99
  start the Linny-R server.
90
100
 
91
- **NOTE:** When configuring Linny-R for a network environment where individual users
92
- each have their personal work space (e.g., a virtual drive U:), you must edit this script file,
93
- adding the argument `workspace=path/to/workspace` to the `node` command.
94
- This will instruct Linny-R to create the `user` directory in this workspace directory
95
- instead of the Linny-R directory.
101
+ > **Note**
102
+ > When configuring Linny-R for a network environment where individual users
103
+ > each have their personal work space (e.g., a virtual drive U:), you must edit this script file,
104
+ > adding the argument `workspace=path/to/workspace` to the `node` command.
105
+ > This will instruct Linny-R to create the `user` directory in this workspace directory
106
+ > instead of the Linny-R directory.
96
107
 
97
108
  The `linny-r` directory should contain this file `README.md`,
98
109
  the files `server.js` and `console.js` that will be run by Node.js,
@@ -107,6 +118,33 @@ It should also contain the style sheet `linny-r.css` required by the GUI.
107
118
  The sub-directories of `static` contain files that are served to the browser by the script
108
119
  `server.js` when it is running in Node.js.
109
120
 
121
+ #### Installing and using an earlier version of Linny-R
122
+
123
+ By default, **npm** will install the latest release of the Linny-R software.
124
+ As this software is developed as part of academic research, new features are added
125
+ without rigorous testing. Although much effort is dedicated to maintaining upward
126
+ and downward compatibility, you may find that the latest version does not work as
127
+ well for you as some earlier version. To re-install an earlier release, for example
128
+ version 1.4.0, open the CLI, change to your `Linny-R` directory, and then type:
129
+
130
+ ``npm install linny-r@1.4.0``
131
+
132
+ > **Note**
133
+ > This will overwrite the contents of the `node_modules` directory, but
134
+ > it will not affect the files in your user space.
135
+
136
+ If you prefer to have different versions of Linny-R on your computer, you can
137
+ create a separate directory for a specific version, then change to this
138
+ directory and type:
139
+
140
+ ``npm install --prefix . linny-r@1.4.0``
141
+
142
+ > **Note**
143
+ > To run a specific version in your browser, you must start the server from
144
+ > the directory where you installed this version.
145
+ > Should you wish to run two different versions concurrently, you must use
146
+ > the `port=[number]` option when you start the server for the second version.
147
+
110
148
  ## Configuring the MILP solver
111
149
 
112
150
  Linny-R presently supports four MILP solvers: Gurobi, CPLEX, SCIP and LP_solve.
@@ -114,6 +152,12 @@ Gurobi and CPLEX are _considerably_ more powerful than the open source solvers S
114
152
  but they require a license.
115
153
  Academic licenses can be obtained by students and staff of eligible institutions.
116
154
 
155
+ > **Important**
156
+ > When installing a solver, it is advisable to accept the default file
157
+ > locations that are proposed by the installer.
158
+ > After installation, do **not** move files to some other directory,
159
+ > as this is bound to cause problems.
160
+
117
161
  #### Installing Gurobi
118
162
 
119
163
  The software you need to install is **Gurobi Optimizer**.
@@ -125,9 +169,6 @@ Gurobi on your computer can be obtained via this URL:
125
169
  When running a model, Linny-R will try to execute the command line application `gurobi_cl`.
126
170
  It will look for this application in the directory specified in the environment variable PATH on your computer.
127
171
 
128
- When installing Gurobi, please accept the default file locations that are proposed by the installer.
129
- Then do **not** move Gurobi files to some other directory, as this is bound to cause problems.
130
-
131
172
  #### Installing CPLEX
132
173
 
133
174
  The software you need to install is **CPLEX**.
@@ -141,9 +182,6 @@ It will look for this application in the directory specified in the environment
141
182
  or more specifically in the environment variable CPLEX_STUDIO_BINARIES<em>nnnn</em>
142
183
  (where _nnnn_ denotes the CPLEX version number) on your computer.
143
184
 
144
- When installing CPLEX, please accept the default file locations that are proposed by the installer.
145
- Then do **not** move CPLEX files to some other directory, as this is bound to cause problems.
146
-
147
185
  #### Installing SCIP
148
186
 
149
187
  The SCIP software is open source. Instructions for installation can be found via this URL:
@@ -152,9 +190,6 @@ The SCIP software is open source. Instructions for installation can be found via
152
190
  When running a model, Linny-R will try to execute the command line application `scip`.
153
191
  It will look for this application in the directory specified in the environment variable PATH on your computer.
154
192
 
155
- When installing SCIP, please accept the default file locations that are proposed by the installer.
156
- Then do **not** move SCIP files to some other directory, as this is bound to cause problems.
157
-
158
193
  #### Installing LP_solve
159
194
 
160
195
  The LP_solve software is open source and can be downloaded via this URL:
@@ -216,15 +251,23 @@ while in the CLI you should see a long series of server log messages like:
216
251
  ... etc.
217
252
  </pre>
218
253
 
254
+ > **Important**
255
+ > Do **not** close the CLI. If you do, the Linny-R GUI may still be
256
+ > visible in your browser, but you will be warned that it cannot connect
257
+ > to the server (at 127.0.0.1:5050). This means that you have to restart
258
+ > Linny-R from a new CLI.
259
+
219
260
  After loading into the browser, Linny-R will try to connect to the solver.
220
- If successful, a notification (blue background) will appear on the status bar at the bottom of the window,
221
- stating the name of the solver.
261
+ If successful, a notification (blue background) will appear on the status bar
262
+ at the bottom of the window, stating the name of the solver.
222
263
 
223
264
  You can then test the GUI by creating a simple model.
224
265
  Make one that has at least one process that outputs a product,
225
- and this product must have a price or a set lower bound, otherwise the model will have no objective function.
266
+ and this product must have a price or a set lower bound, otherwise the model
267
+ will have no objective function.
226
268
  Then click on the _Solve_ button at the bottom of the left-hand tool bar.
227
- The Linny-R icon in the upper left corner should start rotating, while the status bar at the bottom should display:
269
+ The Linny-R icon in the upper left corner should start rotating, while the
270
+ status bar at the bottom should display:
228
271
 
229
272
  <pre>
230
273
  Solving block 1 of 1
@@ -238,10 +281,11 @@ Meanwhile, in the CLI, you should see a server log message like:
238
281
  Solve block 1 a
239
282
  </pre>
240
283
 
241
- To end a modeling session, you can shut down the server by clickicng on the local host icon
242
- in the upper right corner of the Linny-R GUI in your browser, confirm that you want to leave,
243
- and then close your browser (tab). If you do not shut down the server from the browser,
244
- you can also stop the server by repeatedly pressing ``Ctrl+C`` in the CLI box.
284
+ To end a modeling session, you can shut down the server by clicking on the
285
+ local host icon in the upper right corner of the Linny-R GUI in your browser,
286
+ confirming that you want to leave, and then closing your browser (tab).
287
+ If you do not shut down the server from the browser, you can also stop the
288
+ server by repeatedly pressing ``Ctrl+C`` in the CLI.
245
289
 
246
290
  ## Command line options
247
291
 
@@ -262,8 +306,8 @@ To facilitate start-up, you can create a shortcut icon for Linny-R on your deskt
262
306
  On a Windows machine, open the _File Explorer_, select your Linny-R folder,
263
307
  right-click on the batch file `linny-r.bat`, and select the _Create shortcut_ option.
264
308
  Then right-click on the shortcut file to edit its properties, and click the _Change Icon_ button.
265
- The dialog that then appears will allow you to go to the sub-folder `node_modules\linny-r\static\images`,
266
- where you should select the file `linny-r.ico`.
309
+ The dialog that then appears will allow you to go to the sub-folder
310
+ `node_modules\linny-r\static\images`, where you should select the file `linny-r.ico`.
267
311
  Finally, rename the shortcut to `Linny-R` and move or copy it to your desktop.
268
312
 
269
313
  On a macOS machine, open Terminal and change to your Linny-R directory, and then type:
@@ -293,35 +337,43 @@ The sub-directories of this directory `user` are used by Linny-R to store files.
293
337
  * `solver` will contain the files that are exchanged with the Mixed Integer Linear Programming (MILP) solver
294
338
  (the names of the files that will appear in this directory may vary, depending on the MILP-solver you use)
295
339
 
296
- By default, the `user` directory is created in your `Linny-R` directory.
297
- You can overrule this by specifying the path to another directory when you start the server.
298
- Note that doing this will create a new, empty workspace (the directories listed above)
299
- in the specified path. It will **not** affect or duplicate information from existing workspaces.
340
+ > **Note**
341
+ > By default, the `user` directory is created in your `Linny-R` directory.
342
+ > You can overrule this by starting the server with the `workspace=[path]` option.
343
+ > This will create a new, empty workspace (the directories listed above) in the specified path.
344
+ > It will **not** affect or duplicate information from existing workspaces.
300
345
 
301
346
  ## Installing Inkscape
302
347
 
303
348
  Linny-R creates its diagrams and charts as SVG images.
304
349
  When you download a diagram, it will be saved as a .svg file.
305
- These files can be viewed and edited using Inkscape, an open source vector graphics editor.
350
+ These files can be viewed and edited using Inkscape, an open source
351
+ vector graphics editor.
306
352
 
307
- As it may be tedious to first save a diagram as SVG and then render it manually as a bitmap image,
308
- Linny-R features a *Render diagram as bitmap* button on the top toolbar, and on the bottom toolbar of the _Chart manager_.
353
+ As it may be tedious to first save a diagram as SVG and then render it
354
+ manually as a bitmap image, Linny-R features a *Render diagram as bitmap* button
355
+ on the top toolbar, and on the bottom toolbar of the _Chart manager_.
309
356
  When you click it, Linny-R will send the image as SVG to the server.
310
357
  The server script will save the SVG in the `user/diagrams` sub-directory,
311
- and then try to execute an Inkscape command that will convert this SVG to a PNG image file in the same directory.
358
+ and then try to execute an Inkscape command that will convert this SVG to
359
+ a PNG image file in the same directory.
312
360
  The file name will be `diagram-(date and time).png`.
313
- Meanwhile, the browser will have opened a new tab that will be "waiting" for this PNG image to become available.
361
+ Meanwhile, the browser will have opened a new tab that will be "waiting"
362
+ for this PNG image to become available.
314
363
  If rendering was successful, the image will appear in this browser tab;
315
364
  if rendering failed, the original SVG image will be shown.
316
365
 
317
366
  To install Inkscape, please look here:
318
367
  <a href="https://inkscape.org/release" target="_blank">https://inkscape.org/release</a>
319
368
 
320
- Linny-R will automatically detect whether Inkscape is installed by searching for it in the environment variable PATH on your computer.
321
- On a macOS computer, Linny-R will look for Inkscape in /Applications/Inkscape.app/Contents/MacOS.
369
+ Linny-R will automatically detect whether Inkscape is installed by searching
370
+ for it in the environment variable PATH on your computer. On a macOS computer,
371
+ Linny-R will look for Inkscape in `/Applications/Inkscape.app/Contents/MacOS`.
322
372
 
323
- **NOTE:** The current installation wizard for Inkscape (version 1.2.2) may **not** add the application to the PATH variable.
324
- Please check whether you need to do this yourself.
373
+ > **Note**
374
+ > The installation wizard for Inkscape (version 1.3) may **not**
375
+ > add the application to the PATH variable. Please check whether you need to
376
+ > do this yourself.
325
377
 
326
378
  ## Using Linny-R console
327
379
 
@@ -333,7 +385,8 @@ If you open a CLI box, change to your `Linny-R` directory, and then type:
333
385
 
334
386
  you will see the command line options that allow you to run models in various ways.
335
387
 
336
- **NOTE: The console-only version is still in development, and does not provide all functions yet.**
388
+ > **Note**
389
+ > The console-only version is still in development, and does not provide all functions yet.
337
390
 
338
391
  ## Troubleshooting problems
339
392
 
@@ -341,8 +394,9 @@ If during any of the steps above you encounter problems, please try to diagnose
341
394
  You can find a lot of useful information on the Linny-R user documentation website:
342
395
  <a href="https://linny-r.info" target="_blank">https://linny-r.info</a>.
343
396
 
344
- To diagnose a problem, always look in the CLI box where Node.js is running,
345
- as informative server-side error messages will appear there.
397
+ > **Important**
398
+ > To diagnose a problem, always look in the CLI box where Node.js is running,
399
+ > as informative server-side error messages will appear there.
346
400
 
347
401
  Then also look at the console window of your browser.
348
402
  Most browsers offer a _Web Developer Tools_ option via their application menu.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linny-r",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "description": "Executable graphical language with WYSIWYG editor for MILP models",
5
5
  "main": "server.js",
6
6
  "scripts": {
package/server.js CHANGED
@@ -1380,8 +1380,9 @@ function convertSVGtoPNG(req, res, sp) {
1380
1380
  // Enclose paths in double quotes if they contain spaces
1381
1381
  if(cmd.indexOf(' ') >= 0) cmd = `"${cmd}"`;
1382
1382
  if(svg.indexOf(' ') >= 0) svg = `"${svg}"`;
1383
- child_process.exec(cmd + ' --export-type=png --export-dpi=' +
1384
- SETTINGS.dpi + ' ' + svg,
1383
+ cmd += ` --export-type=png --export-dpi=${SETTINGS.dpi} ${svg}`;
1384
+ console.log(cmd);
1385
+ child_process.exec(cmd,
1385
1386
  (error, stdout, stderr) => {
1386
1387
  let ext = '.svg';
1387
1388
  console.log(stdout);
@@ -1389,8 +1390,24 @@ function convertSVGtoPNG(req, res, sp) {
1389
1390
  console.log('WARNING: Failed to run Inkscape --', error);
1390
1391
  console.log(stderr);
1391
1392
  } else {
1392
- ext = '.png';
1393
- // Delete the SVG
1393
+ // Look for the PNG file.
1394
+ const mode = fs.constants.R_OK | fs.constants.W_O;
1395
+ try {
1396
+ fs.accessSync(fp + '.png', mode);
1397
+ ext = '.png';
1398
+ } catch(err) {
1399
+ // NOTE: Inkscape 1.3 adds ".png" to the original file name,
1400
+ // so this may end on ".svg.png"
1401
+ try {
1402
+ fs.accessSync(fp + '.svg.png', mode);
1403
+ // If found, rename the PNG file.
1404
+ fs.renameSync(fp + '.svg.png', fp + '.png');
1405
+ ext = '.png';
1406
+ } catch(err) {
1407
+ console.log('WARNING: Inkscape did not output a PNG file');
1408
+ }
1409
+ }
1410
+ // Delete the SVG file.
1394
1411
  try {
1395
1412
  fs.unlinkSync(fp + '.svg');
1396
1413
  } catch(error) {
@@ -1669,9 +1686,17 @@ function commandLineSettings() {
1669
1686
  }
1670
1687
  // Verify that Inkscape is installed
1671
1688
  if(settings.inkscape) {
1672
- // NOTE: on Windows, the command line version is a .com file
1673
- const ip = path.join(settings.inkscape,
1689
+ // NOTE: On Windows, the command line version is a .com file
1690
+ let ip = path.join(settings.inkscape,
1674
1691
  'inkscape' + (PLATFORM.startsWith('win') ? '.com' : ''));
1692
+ try {
1693
+ fs.accessSync(ip, fs.constants.X_OK);
1694
+ } catch(err) {
1695
+ // NOTE: As of Inkscape version 1.3, the command line executable
1696
+ // is called inkscapecom(.com)
1697
+ ip = path.join(settings.inkscape,
1698
+ 'inkscapecom' + (PLATFORM.startsWith('win') ? '.com' : ''));
1699
+ }
1675
1700
  try {
1676
1701
  fs.accessSync(ip, fs.constants.X_OK);
1677
1702
  console.log('Path to Inkscape:', settings.inkscape);
Binary file
Binary file
Binary file
Binary file
Binary file
package/static/index.html CHANGED
@@ -121,7 +121,16 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
121
121
  document.getElementById('doc-head').appendChild(link);
122
122
  // Reload the scripts in their proper sequence, i.e., such that all
123
123
  // classes are initialized before their instances are created
124
- loadScripts(['-config', '-model', '-ctrl', '-gui', '-vm', '-utils'], t);
124
+ loadScripts(['-config', '-model', '-ctrl',
125
+ '-gui-paper', '-gui-controller', '-gui-monitor',
126
+ '-gui-file-manager', '-gui-expression-editor',
127
+ '-gui-model-autosaver', '-gui-scale-unit-manager',
128
+ '-gui-actor-manager', '-gui-constraint-editor',
129
+ '-gui-repository-browser', '-gui-dataset-manager',
130
+ '-gui-equation-manager', '-gui-chart-manager',
131
+ '-gui-sensitivity-analysis', '-gui-experiment-manager',
132
+ '-gui-documentation-manager', '-gui-finder', '-gui-receiver',
133
+ '-gui-undo-redo', '-vm', '-utils'], t);
125
134
  }
126
135
  }
127
136
 
@@ -877,9 +886,9 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
877
886
  will discard changes you made to the current model. Continue?
878
887
  </div>
879
888
  <div id="confirm-load-from-repo-buttons">
880
- <img class="ok-btn big-btn" src="images/ok.png">
889
+ <img class="ok-btn" src="images/ok.png">
881
890
  Yes
882
- <img class="cancel-btn big-btn" src="images/cancel.png">
891
+ <img class="cancel-btn" src="images/cancel.png">
883
892
  No
884
893
  </div>
885
894
  </div>
@@ -898,9 +907,9 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
898
907
  <span id="confirm-delete-from-repo-name"></span>?
899
908
  </div>
900
909
  <div id="confirm-delete-from-repo-buttons">
901
- <img class="ok-btn big-btn" src="images/ok.png">
910
+ <img class="ok-btn" src="images/ok.png">
902
911
  Yes
903
- <img class="cancel-btn big-btn" src="images/cancel.png">
912
+ <img class="cancel-btn" src="images/cancel.png">
904
913
  No
905
914
  </div>
906
915
  </div>
@@ -1016,7 +1025,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1016
1025
  <tr>
1017
1026
  <td>Actor:</td>
1018
1027
  <td>
1019
- <input id="add-process-actor-name" style="width:223px" type="text"
1028
+ <input id="add-process-actor" style="width:223px" type="text"
1020
1029
  autocomplete="off">
1021
1030
  </td>
1022
1031
  </tr>
@@ -1065,6 +1074,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1065
1074
  <div id="cluster-dlg" class="inp-dlg">
1066
1075
  <div class="dlg-title">
1067
1076
  <span id="cluster-action">Add</span> cluster
1077
+ <span id="cluster-group"></span>
1068
1078
  <img class="cancel-btn" src="images/cancel.png">
1069
1079
  <img class="ok-btn" src="images/ok.png">
1070
1080
  </div>
@@ -1076,7 +1086,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1076
1086
  </tr>
1077
1087
  <tr>
1078
1088
  <td>Actor:</td>
1079
- <td><input id="cluster-actor-name" style="width:270px"
1089
+ <td><input id="cluster-actor" style="width:270px"
1080
1090
  type="text" autocomplete="off"></td>
1081
1091
  </tr>
1082
1092
  </table>
@@ -1136,11 +1146,14 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1136
1146
  <div id="link-modal" class="modal">
1137
1147
  <div id="link-dlg" class="inp-dlg">
1138
1148
  <div class="dlg-title">
1139
- <!-- link arrow symbol depends on type of link: product => solid, data => dashed -->
1140
- Link X <span id="link-arrow-1">&#x279D;</span> Y:
1141
- <div id="link-from-name" title="FROM"></div>
1142
- <span id="link-arrow-2">&#x279D;</span>
1143
- <div id="link-to-name" title="TO"></div>
1149
+ <!-- link arrow symbol depends on type of link: product => solid,
1150
+ data => dashed; no spacing between <span> elements, as these
1151
+ elements have left and right padding. -->
1152
+ <div id="link-x-y">Link X<span id="link-arrow-1">&#x279D;</span>Y:</div>
1153
+ <div id="link-from-name" title="FROM">
1154
+ </div><span id="link-arrow-2">&#x279D;</span><div id="link-to-name" title="TO">
1155
+ </div>
1156
+ <span id="link-group"></span>
1144
1157
  <img class="cancel-btn" src="images/cancel.png">
1145
1158
  <img class="ok-btn" src="images/ok.png">
1146
1159
  </div>
@@ -1231,13 +1244,14 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1231
1244
  <div id="constraint-modal" class="modal">
1232
1245
  <div id="constraint-dlg" class="inp-dlg">
1233
1246
  <div class="dlg-title">Constraint X &DDotrahd; Y
1247
+ <span id="constraint-group"></span>
1234
1248
  <div style="display: inline-block; margin-left: 219px; margin-bottom: -7px">
1235
1249
  <img class="cancel-btn" src="images/cancel.png">
1236
1250
  <img class="ok-btn" src="images/ok.png"
1237
1251
  style="margin-left: 4px; margin-bottom: 3px">
1238
1252
  </div>
1239
1253
  </div>
1240
- <div id="ce-button-bar">
1254
+ <div id="constraint-button-bar">
1241
1255
  <img id="add-point-btn" class="mbtn enab" src="images/add.png"
1242
1256
  title="Add new point to selected bound line">
1243
1257
  <img id="del-point-btn" class="mbtn disab"
@@ -1256,27 +1270,27 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1256
1270
  <input id="bl-selectors" type="text" placeholder="(any)"
1257
1271
  title="When specified, bound line will constrain only in matching experiment runs">
1258
1272
  </div>
1259
- <div id="ce-y-label">% range of <span id="ce-to-name"></span></div>
1273
+ <div id="constraint-y-label">% range of <span id="constraint-to-name"></span></div>
1260
1274
  <!-- NOTE: this is the div that will contain the chart's SVG image -->
1261
- <div id="ce-container"></div>
1262
- <div id="ce-x-label">% range of <span id="ce-from-name"></span></div>
1263
- <div id="ce-pos-x">X = 0</div>
1264
- <div id="ce-pos-y">Y = 0</div>
1265
- <div id="ce-point" title="Selected point"></div>
1266
- <div id="ce-equation" title="Equation for line segment"></div>
1267
- <div id="ce-bottom-div">
1268
- <div id="ce-no-slack-div"
1275
+ <div id="constraint-container"></div>
1276
+ <div id="constraint-x-label">% range of <span id="constraint-from-name"></span></div>
1277
+ <div id="constraint-pos-x">X = 0</div>
1278
+ <div id="constraint-pos-y">Y = 0</div>
1279
+ <div id="constraint-point" title="Selected point"></div>
1280
+ <div id="constraint-equation" title="Equation for line segment"></div>
1281
+ <div id="constraint-bottom-div">
1282
+ <div id="constraint-no-slack-div"
1269
1283
  title="Check to enforce bounds (Caution: this may make model infeasible)">
1270
- <div id="ce-no-slack" class="box clear"></div>
1271
- <div id="ce-no-slack-lbl">No slack</div>
1284
+ <div id="constraint-no-slack" class="box clear"></div>
1285
+ <div id="constraint-no-slack-lbl">No slack</div>
1272
1286
  </div>
1273
- <div id="ce-soc">
1287
+ <div id="constraint-soc">
1274
1288
  <label>Attributed share of cost:</label>
1275
- <select id="ce-soc-direct">
1289
+ <select id="constraint-soc-direct">
1276
1290
  <option value="1">X&rarr;Y</option>
1277
1291
  <option value="-1">Y&rarr;X</option>
1278
1292
  </selector>
1279
- <input id="ce-share-of-cost" type="text" autocomplete="off"><label>%</label>
1293
+ <input id="constraint-share-of-cost" type="text" autocomplete="off"><label>%</label>
1280
1294
  </div>
1281
1295
  </div>
1282
1296
  </div>
@@ -1287,6 +1301,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1287
1301
  <div id="process-dlg" class="inp-dlg">
1288
1302
  <div class="dlg-title">
1289
1303
  Process properties
1304
+ <span id="process-group"></span>
1290
1305
  <img class="cancel-btn" src="images/cancel.png">
1291
1306
  <img class="ok-btn" src="images/ok.png">
1292
1307
  </div>
@@ -1303,7 +1318,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1303
1318
  <img id="process-UB-x" class="sbtn enab" src="images/edit.png"
1304
1319
  title="Edit expression for upper process bound">
1305
1320
  <!-- "equal bounds" button is displayed middle-left of the two input fields -->
1306
- <div id="process-UB-equal" class="nebtn" title="Set equal bounds"></div>
1321
+ <div id="process-UB-equal" class="bbtn ne" title="Set equal bounds"></div>
1307
1322
  <div id="process-IL-lbl">Initial level:</div>
1308
1323
  <input id="process-IL" type="text" autocomplete="off">
1309
1324
  <img id="process-IL-x" class="sbtn enab" src="images/edit.png"
@@ -1320,9 +1335,9 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1320
1335
  </div>
1321
1336
  <div id="process-pace-div">
1322
1337
  Level change frequency: 1/
1323
- <input id="process-pace" type="text" autocomplete="off">
1338
+ <input id="process-LCF" type="text" autocomplete="off">
1324
1339
  time step(s)
1325
- <img id="process-pace-x" class="sbtn enab" src="images/edit.png"
1340
+ <img id="process-LCF-x" class="sbtn enab" src="images/edit.png"
1326
1341
  title="Edit expression for level change frequency">
1327
1342
  </div>
1328
1343
  <div id="process-collapsed-div">
@@ -1337,6 +1352,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1337
1352
  <div id="product-dlg" class="inp-dlg">
1338
1353
  <div class="dlg-title">
1339
1354
  Product properties
1355
+ <span id="product-group"></span>
1340
1356
  <img class="cancel-btn" src="images/cancel.png">
1341
1357
  <img class="ok-btn" src="images/ok.png">
1342
1358
  </div>
@@ -1371,7 +1387,7 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1371
1387
  <img id="product-UB-x" class="sbtn enab" src="images/edit.png"
1372
1388
  title="Edit expression for upper product bound">
1373
1389
  <!-- "equal bounds" button is displayed middle-left of the two input fields -->
1374
- <div id="product-UB-equal" class="nebtn" title="Set equal bounds"></div>
1390
+ <div id="product-UB-equal" class="bbtn ne" title="Set equal bounds"></div>
1375
1391
  <div id="product-IL-lbl">Initial level:</div>
1376
1392
  <input id="product-IL" type="text" autocomplete="off">
1377
1393
  <img id="product-IL-x" class="sbtn enab" src="images/edit.png"
@@ -1456,9 +1472,9 @@ NOTE: Unit symbols are case-sensitive, so BTU &ne; Btu">
1456
1472
  to this cluster?
1457
1473
  </div>
1458
1474
  <div id="move-buttons">
1459
- <img class="ok-btn big-btn" src="images/ok.png">
1475
+ <img class="ok-btn" src="images/ok.png">
1460
1476
  Yes
1461
- <img class="cancel-btn big-btn" src="images/cancel.png">
1477
+ <img class="cancel-btn" src="images/cancel.png">
1462
1478
  No
1463
1479
  </div>
1464
1480
  </div>
@@ -2807,9 +2823,9 @@ where X can be one or several of these letters: ABCDELPQ">
2807
2823
  </div>
2808
2824
  <div id="check-update-msg"></div>
2809
2825
  <div id="check-update-buttons">
2810
- <img class="ok-btn big-btn" src="images/ok.png">
2826
+ <img class="ok-btn" src="images/ok.png">
2811
2827
  Shut down server to install new version
2812
- <img class="cancel-btn big-btn" src="images/cancel.png">
2828
+ <img class="cancel-btn" src="images/cancel.png">
2813
2829
  Continue using current version
2814
2830
  </div>
2815
2831
  </div>