Building on the concept and implementation of PAVER 2.0, the main goal of VIVA is to allow end users to interact with their own uploaded benchmark data from mathematical optimization problems and their solvers. The data is presented in a tabular format, with the added ability to visualize specific results through various plots, making it easier to understand and interpret the data.
Demo-data is attained from miplib2010 examples. The .solu file data from the problem libraries MINLPLib, MIPLIB 2017 and MIPLIB 2010 can be accessed directly through a dropdown option in the navigation menu.
This project is developed using:
The application can be run without a live server since Webpack is responsible for bundling the files. It is also possible to install it as a Progressive Web Application by launching the project in a live server, navigating to the report page using a compatible browser, and installing it. Currently, this gives access to notifications when a table or graph has been successfully rendered with results. Support for offline functionality is also included in the PWA implementation. Additional PWA functionality will be added during development.
Performance Note: Performance slowdowns may occur when handling a large number of files or particularly large datasets, as this application operates entirely in the browser without relying on a backend server to parse and process the files.
Display Note: While mobile-sized screens are supported, the most optimal experience is achieved using a larger display. A light and a dark theme are available.
Development Note: This project is still a work in progress, and therefore, bugs and unexpected behavior may occur.
report.html found in the root directory..trc format..solu (best known primal and dual bounds for each instance) and .csv (instance properties) files can be uploaded for additional information.UserConfiguration.json (which can be created from this application).UserConfiguration.json).The following header structure and order should be used in conjunction with .trc files, if no header is provided in the result files:
InputFileName
ModelType
SolverName
NLP
MIP
JulianDate
Direction
NumberOfEquations
NumberOfVariables
NumberOfDiscreteVariables
NumberOfNonZeros
NumberOfNonlinearNonZeros
OptionFile
ModelStatus
TermStatus
ObjectiveValue
ObjectiveValueEstimate
SolverTime
NumberOfIterations
NumberOfDomainViolations
NumberOfNodes
UserComment
For further information, see https://gams.com/latest/docs/UG_SolverUsage.html#UG_SolverUsage_TraceFile.
The file should include dataSet and dataFileType, defaultTime and gapLimit are optional.
{
"dataSet": [
"alan,MINLP,knitro,CONOPT,CPLEX,43365.479,min,8,9,4,24,3,1,8,Error,2.925,2.925,0.142,0,0,18,#,2.925,2.925,2.925,2.925,0,0,0,0,0",
"ball_mk2_10,MINLP,knitro,CONOPT,CPLEX,43365.479,min,2,11,10,21,10,1,8,Error,0,2.22044604925031E-16,2.5,0,0,3070,#,0,2.22044604925031e-16,0,2.22044604925031e-16,0,0,0,0,0",
"ball_mk2_30,MINLP,knitro,CONOPT,CPLEX,43365.479,min,2,31,30,61,30,1,2,Error,0,-26.887733399442,900.034,0,0,42269,#,0,-26.887733399442,0,-26.887733399442,Infinity,Infinity,0,0,0",
"ball_mk3_10,MINLP,knitro,CONOPT,CPLEX,43365.489,min,2,11,10,21,10,1,13,Error,0,NA,NA,NA,NA,NA,#,0,-Infinity,0,-Infinity,Infinity,Infinity,0,NaN,NaN",
"ball_mk4_05,MINLP,knitro,CONOPT,CPLEX,43365.51,min,2,11,10,21,10,1,13,Error,0,NA,NA,NA,NA,NA,#,0,-Infinity,0,-Infinity,Infinity,Infinity,0,NaN,NaN",
],
"dataFileType": "trc",
"defaultTime": 900,
"gapLimit": 0.1
}
As for now, this structure has to be used for the dataSet. It will eventually be updated to a proper object.
Before getting started, make sure you have the following software installed on your machine:
Node.js: https://nodejs.org/
TypeScript: https://www.typescriptlang.org/
Webpack: https://webpack.js.org/
Install the required packages by running:
npm install
Navigate to the project directory in your terminal and run:
npm run build
This builds the application with webpack and then writes the cache list and cache name into service-worker.js. The created bundle.js and main.css are located in Dist/. npm run check:sw fails if the generated block of service-worker.js is out of date.
Dev server can be run with:
npm start
Run unit tests using Jest:
npm run test:functions
Run the unit tests with coverage:
npm run test:coverage
Run the browser tests with Playwright (run npm run build first, and npx playwright install chromium once):
npm run test:ui
Regenerate the HTML pages (report.html and Src/Pages/*.html) from Src/Templates, and check that they are up to date:
npm run build:pages
npm run check:pages
Lint the project files using ESLint:
npm run lint
To automatically fix linting issues:
npm run lint:fix
Generate documentation using TypeDoc:
npm run build:docs
Create a slimmed down release build using gulp:
npm run release
Create a slimmed down web release build using gulp:
npm run release:web