From a87186e497f8a95d2bd192c7660283f7e010877a Mon Sep 17 00:00:00 2001 From: Jeremy Bogle Date: Wed, 21 Aug 2019 08:09:20 +0800 Subject: [PATCH] Update readme --- README.md | 42 ++++++++++++++++++++++++++++++++++-------- www/img/logo.png | Bin 0 -> 11933 bytes 2 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 www/img/logo.png diff --git a/README.md b/README.md index d94adf6..fda0b2e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -## [Traffic Engineering Applying Value at Risk](https://teavar.csail.mit.edu) +teavar logo





+## [Traffic Engineering Applying Value at Risk](http://teavar.csail.mit.edu) TEAVAR is a traffic engineering scheme that balances utilization and availability to provide bandwidth guarantees at a desired SLA. This codebase also includes a simulation framework that was used to test TEAVAR, as well as implementations of other traffice engineering algorithms in Julia. ## Getting started @@ -13,7 +14,11 @@ TEAVAR is a traffic engineering scheme that balances utilization and availabilit julia ``` -3. Switch to JuMP version ------: +3. Install [JuMP](https://github.com/JuliaOpt/JuMP.jl) version v0.18.5 using the Julia REPL: + ``` + julia> ] + (v1.0) pkg>add JuMP@0.18.5 + ``` 4. Include certain files using: ``` @@ -22,9 +27,30 @@ TEAVAR is a traffic engineering scheme that balances utilization and availabilit Note: Most TE algorithms in this codebase are implemented as Linear Programs and require the [Gurobi](http://www.gurobi.com/) solver. -### Outline -**Data** +**Using Pre-built binaries:** + +Instead of installing Julia and using the Julia REPL to run different files, we have compiled the codebase into binaries available on [Mac](http://teavar.csail.mit.edu/builds/mac) and [Linux](http://teavar.csail.mit.edu/builds/mac). To install these go to our homepage or follow the links above. + +1. Install the binary for your operating system + +2. Unzip the file +``` +tar -xvf linuxbuild.tar.gz +``` + +``` +unzip maxbuild.zip +``` + +3. Run the file teavar. Add -help or -h for more information on accepted parameters +``` +./teavar -help +``` + +## Outline: + +**Data:** All data used for TEAVAR evaluations is in the data folder. Each folder contains a topology. A topology must include 3 files. 1. nodes.txt @@ -34,17 +60,17 @@ All data used for TEAVAR evaluations is in the data folder. Each folder contains 3. demand.txt A set of demands in matrix form or list form. (See data/Custom/demand.txt for list form) -**Results** +**Results:** Results from experiments are saved in data/raw. Each experiment has its own folder in data/raw that contains a counter and saves each experiment run results in a folder with the counter number. Results used in the paper have been moved from data/raw to gnuplot/data. -**Plots** +**Plots:** Data for plots used in TEAVAR can be found in the gnuplot/data folder. All plotting code is also in gnuplot folder (gnuplot/*.gp) and each plotting file outputs plots to gnuplot/plots. Gnuplot can be installed on OSX using homebrew (```brew install gnuplot```) or linux using apt (```apt get gnuplot```). More information on gnuplot can be [found on the gnuplot website](http://www.gnuplot.info/). -**TE Schemes** +**TE Schemes:** All TE schemes (mostly case as linear programs) can be found by name in the Algorithms folder. ## Credits -See the [list contributors](https://teavar.csail.mit.edu). +See the [list contributors](http://teavar.csail.mit.edu). diff --git a/www/img/logo.png b/www/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d03f0f2eeee34e42eeb57310f08545b53b202a02 GIT binary patch literal 11933 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