From e1e3deb255a163ef66f37cb959fe271584c069d1 Mon Sep 17 00:00:00 2001 From: Jeremy Bogle Date: Wed, 14 Aug 2019 02:02:56 -0400 Subject: [PATCH] Change default topology --- www/demo/asset-manifest.json | 6 +++--- www/demo/index.html | 2 +- ...precache-manifest.0d112b315af59d1213bcd43c7899db3c.js} | 8 ++++---- www/demo/service-worker.js | 2 +- .../js/{main.f2ae1659.chunk.js => main.dfab464e.chunk.js} | 4 ++-- ...n.f2ae1659.chunk.js.map => main.dfab464e.chunk.js.map} | 2 +- www/frontend/src/App.js | 2 +- www/frontend/src/TEInputs.jsx | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) rename www/demo/{precache-manifest.af446782be38352cd03bae8c3b31996e.js => precache-manifest.0d112b315af59d1213bcd43c7899db3c.js} (64%) rename www/demo/static/js/{main.f2ae1659.chunk.js => main.dfab464e.chunk.js} (86%) rename www/demo/static/js/{main.f2ae1659.chunk.js.map => main.dfab464e.chunk.js.map} (86%) diff --git a/www/demo/asset-manifest.json b/www/demo/asset-manifest.json index 1b7678b..3559316 100644 --- a/www/demo/asset-manifest.json +++ b/www/demo/asset-manifest.json @@ -1,13 +1,13 @@ { "main.css": "./static/css/main.3e3b9dba.chunk.css", - "main.js": "./static/js/main.f2ae1659.chunk.js", - "main.js.map": "./static/js/main.f2ae1659.chunk.js.map", + "main.js": "./static/js/main.dfab464e.chunk.js", + "main.js.map": "./static/js/main.dfab464e.chunk.js.map", "runtime~main.js": "./static/js/runtime~main.d653cc00.js", "runtime~main.js.map": "./static/js/runtime~main.d653cc00.js.map", "static/js/2.c774d9f9.chunk.js": "./static/js/2.c774d9f9.chunk.js", "static/js/2.c774d9f9.chunk.js.map": "./static/js/2.c774d9f9.chunk.js.map", "index.html": "./index.html", - "precache-manifest.af446782be38352cd03bae8c3b31996e.js": "./precache-manifest.af446782be38352cd03bae8c3b31996e.js", + "precache-manifest.0d112b315af59d1213bcd43c7899db3c.js": "./precache-manifest.0d112b315af59d1213bcd43c7899db3c.js", "service-worker.js": "./service-worker.js", "static/css/main.3e3b9dba.chunk.css.map": "./static/css/main.3e3b9dba.chunk.css.map" } \ No newline at end of file diff --git a/www/demo/index.html b/www/demo/index.html index fe9444c..8e9edae 100644 --- a/www/demo/index.html +++ b/www/demo/index.html @@ -1 +1 @@ -React App
\ No newline at end of file +React App
\ No newline at end of file diff --git a/www/demo/precache-manifest.af446782be38352cd03bae8c3b31996e.js b/www/demo/precache-manifest.0d112b315af59d1213bcd43c7899db3c.js similarity index 64% rename from www/demo/precache-manifest.af446782be38352cd03bae8c3b31996e.js rename to www/demo/precache-manifest.0d112b315af59d1213bcd43c7899db3c.js index e49774b..05138b3 100644 --- a/www/demo/precache-manifest.af446782be38352cd03bae8c3b31996e.js +++ b/www/demo/precache-manifest.0d112b315af59d1213bcd43c7899db3c.js @@ -1,11 +1,11 @@ self.__precacheManifest = [ { - "revision": "a2a268ec9721f8c3c2ad", + "revision": "1b6f35c510b32635dff8", "url": "./static/css/main.3e3b9dba.chunk.css" }, { - "revision": "a2a268ec9721f8c3c2ad", - "url": "./static/js/main.f2ae1659.chunk.js" + "revision": "1b6f35c510b32635dff8", + "url": "./static/js/main.dfab464e.chunk.js" }, { "revision": "8c97409f0ee389fe75da", @@ -16,7 +16,7 @@ self.__precacheManifest = [ "url": "./static/js/2.c774d9f9.chunk.js" }, { - "revision": "c629ec62c8e3af993e13c7d245a2b36e", + "revision": "5b030a08ff4332888a280e5951d20f40", "url": "./index.html" } ]; \ No newline at end of file diff --git a/www/demo/service-worker.js b/www/demo/service-worker.js index 8df2fdd..d2f293b 100644 --- a/www/demo/service-worker.js +++ b/www/demo/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js"); importScripts( - "./precache-manifest.af446782be38352cd03bae8c3b31996e.js" + "./precache-manifest.0d112b315af59d1213bcd43c7899db3c.js" ); workbox.clientsClaim(); diff --git a/www/demo/static/js/main.f2ae1659.chunk.js b/www/demo/static/js/main.dfab464e.chunk.js similarity index 86% rename from www/demo/static/js/main.f2ae1659.chunk.js rename to www/demo/static/js/main.dfab464e.chunk.js index b81aaf0..8661ba1 100644 --- a/www/demo/static/js/main.f2ae1659.chunk.js +++ b/www/demo/static/js/main.dfab464e.chunk.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{22:function(t,e,n){t.exports=n(34)},33:function(t,e,n){},34:function(t,e,n){"use strict";n.r(e);var a=n(0),i=n.n(a),r=n(13),s=n.n(r),o=n(11),l=n(3),c=n(6),d=n(7),u=n(9),p=n(8),h=n(10),b=n(2),f=n(4),m=n(5);function g(){var t=Object(f.a)(["\n position: fixed;\n height: 67px;\n width: 100vw;\n top: 0;\n border-bottom: 1px solid #222;\n box-shadow: 0 1px 0 #262626;\n background-color: #191919;\n background-image: -webkit-gradient(linear,left top,left bottom,from(#282828),to(#191919));\n background-image: -webkit-linear-gradient(top,#282828,#191919);\n background-image: linear-gradient(top,#282828,#191919);\n background-repeat: no-repeat;\n z-index: 10;\n\n #left {\n position: absolute;\n height: 100%;\n left: 10px;\n }\n\n #center {\n position: absolute;\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n color: white;\n\n #title {\n font-size: 25px;\n padding-top: 15px;\n }\n }\n\n #right {\n position: absolute;\n height: 100%;\n padding-top: 20px;\n padding-right: 20px;\n right: 10px;\n color: white;\n\n .link {\n cursor: pointer;\n &:hover {\n border-bottom: 1px solid white;\n }\n }\n }\n"]);return g=function(){return t},t}var k=m.a.div(g()),v=function(t){function e(){return Object(c.a)(this,e),Object(u.a)(this,Object(p.a)(e).apply(this,arguments))}return Object(h.a)(e,t),Object(d.a)(e,[{key:"render",value:function(){var t=this,e=this.props.modes.map(function(e,n){return t.props.mode===e?"":i.a.createElement("div",{key:n,className:"link",onClick:function(n){return t.props.setMode(e)}},e)});return i.a.createElement("div",null,i.a.createElement(k,null,i.a.createElement("div",{id:"left"}),i.a.createElement("div",{id:"center"},i.a.createElement("div",{id:"title"},"TEAVAR Demo")),i.a.createElement("div",{id:"right"},e)))}}]),e}(a.Component);function x(){var t=Object(f.a)(["\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 370px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n input, form {\n font-size: 20px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 90px;\n height: calc(100% - 29px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 18px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 350px;\n }\n button {\n margin: 10px;\n font-size: 20px;\n }\n"]);return x=function(){return t},t}var y=m.a.div(x()),E=function(t){function e(){return Object(c.a)(this,e),Object(u.a)(this,Object(p.a)(e).apply(this,arguments))}return Object(h.a)(e,t),Object(d.a)(e,[{key:"render",value:function(){var t=this;return i.a.createElement("div",null,i.a.createElement(y,null,i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Topology"),i.a.createElement("form",null,i.a.createElement("select",{name:"dropdown",onChange:function(e){return t.props.handleTEInput(e.target.value,"topology")}},i.a.createElement("option",{value:"Custom",default:!0},"Small Net"),i.a.createElement("option",{value:"B4"},"B4"),i.a.createElement("option",{value:"IBM"},"IBM"),i.a.createElement("option",{value:"Abilene"},"Abilene")))),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Demand"),i.a.createElement("form",null,i.a.createElement("select",{name:"dropdown",onChange:function(e){return t.props.handleTEInput(e.target.value,"demand")}},i.a.createElement("option",{value:"1",default:!0},"1"),i.a.createElement("option",{value:"2"},"2"),i.a.createElement("option",{value:"3"},"3"),i.a.createElement("option",{value:"4"},"4"),i.a.createElement("option",{value:"5"},"5"),i.a.createElement("option",{value:"6"},"6")))),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Paths"),i.a.createElement("form",null,i.a.createElement("select",{name:"dropdown",onChange:function(e){return t.props.handleTEInput(e.target.value,"path")}},i.a.createElement("option",{value:"ED",default:!0},"ED"),i.a.createElement("option",{value:"SMORE"},"Oblivious"),i.a.createElement("option",{value:"ksp_2"},"KSP_2"),i.a.createElement("option",{value:"ksp_4"},"KSP_4"),i.a.createElement("option",{value:"ksp_6"},"KSP_6")))),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Beta (%)"),i.a.createElement("input",{type:"text",placeholder:"0.9",onChange:function(e){return t.props.handleTEInput(e.target.value,"beta")}})),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Cutoff (%)"),i.a.createElement("input",{type:"text",placeholder:"0.0001",onChange:function(e){return t.props.handleTEInput(e.target.value,"cutoff")}})),i.a.createElement("button",{onClick:function(e){return t.props.handleTESubmit()}},"Submit")))}}]),e}(a.Component);function w(){var t=Object(f.a)(["\n margin 40px auto;\n text-align: center;\n\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n\n\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n input {\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .matches {\n position: relative;\n top: 10px;\n }\n button {\n margin: 10px;\n }\n"]);return w=function(){return t},t}var O=m.a.div(w()),j=function(t){function e(){return Object(c.a)(this,e),Object(u.a)(this,Object(p.a)(e).apply(this,arguments))}return Object(h.a)(e,t),Object(d.a)(e,[{key:"render",value:function(){var t,e=this,n=this.props.tickers.map(function(t,n){return i.a.createElement("input",{key:n,type:"text",placeholder:"Ticker ".concat(n),value:t,onChange:function(t){return e.props.handleTickerValue(t.target.value,n)}})});return this.props.tickerMatches&&(t=this.props.tickerMatches.map(function(t){return i.a.createElement("div",null,t["1. symbol"])})),i.a.createElement("div",null,i.a.createElement(O,null,i.a.createElement("div",{className:"tickers_label"},"Portfolio Tickers"),n,i.a.createElement("div",null,t),i.a.createElement("button",{onClick:function(t){return e.props.handleAddTicker()}},"Add"),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Budget ($)"),i.a.createElement("input",{type:"text",placeholder:"1000",onChange:function(t){return e.props.handleStockInput(t.target.value,"budget")}})),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Return ($)"),i.a.createElement("input",{type:"text",placeholder:"50",onChange:function(t){return e.props.handleStockInput(t.target.value,"roi")}})),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Loss ($)"),i.a.createElement("input",{type:"text",placeholder:"40",onChange:function(t){return e.props.handleStockInput(t.target.value,"target")}})),i.a.createElement("button",{onClick:function(t){return e.props.handleTickerSubmit()}},"Submit")))}}]),e}(a.Component);function A(){var t=Object(f.a)(["\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n"]);return A=function(){return t},t}function S(){var t=Object(f.a)(["\n color: white;\n"]);return S=function(){return t},t}m.a.div(S());var T=m.a.table(A());a.Component;function _(){var t=Object(f.a)(["\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n .input-elt {\n font-size: 15px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n .input-elt {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .button {\n color: white;\n display: block;\n width: 75px;\n background-color: #999;\n vertical-align: top;\n margin: 10px auto;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n border-radius: 5px;\n }\n"]);return _=function(){return t},t}function N(){var t=Object(f.a)(["\n margin-top: 30vh;\n"]);return N=function(){return t},t}var C=m.a.div(N()),M=m.a.div(_()),z=function(t){function e(t){var n;return Object(c.a)(this,e),(n=Object(u.a)(this,Object(p.a)(e).call(this,t))).state={password:""},n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"handlePassword",value:function(t){this.setState({password:t})}},{key:"render",value:function(){var t=this;return i.a.createElement(C,null,i.a.createElement(M,{id:"login-window"},i.a.createElement("form",{className:"input"},i.a.createElement("input",{className:"input-elt",type:"password",placeholder:"",onChange:function(e){return t.handlePassword(e.target.value)}}),i.a.createElement("input",{className:"button",type:"submit",onClick:function(e){return t.props.login(t.state.password)},value:"Login"}))))}}]),e}(a.Component),I=n(1);function F(){var t=Object(f.a)(["\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 10px auto;\n margin-top: 70px;\n\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return F=function(){return t},t}function L(){var t=Object(f.a)(["\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 0px auto;\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return L=function(){return t},t}function B(){var t=Object(f.a)(["\n display: block;\n margin: -60px auto 0px auto;\n height: 700px;\n width: 900px;\n"]);return B=function(){return t},t}function P(){var t=Object(f.a)(["\n position: relative;\n svg {\n font-family: Sans-Serif, Arial;\n }\n .line {\n stroke-width: 4;\n fill: none;\n }\n\n .axis path {\n stroke: black;\n }\n\n .text {\n font-size: 12px;\n }\n\n .title-text {\n font-size: 12px;\n }\n\n #all-statements {\n display: block;\n width: 100%;\n border-bottom: 1px solid black;\n }\n\n #statement-table {\n background-color: #EEE;\n margin-top: 10px;\n }\n\n #statements {\n width: 40%;\n margin: 0px auto;\n margin-bottom: 70px;\n background-color: #EEE;\n padding: 20px;\n border-radius: 5px;\n font-size: 18px;\n text-align:center;\n\n div {\n margin: 20px 0px;\n }\n .colorGreen {\n color: rgb(0,150,0);\n }\n .colorRed {\n color: rgb(150, 0,0);\n }\n }\n"]);return P=function(){return t},t}var D=m.a.div(P()),R=m.a.svg(B()),G=m.a.table(L()),U=m.a.table(F()),V=function(t){function e(t){var n;return Object(c.a)(this,e),n=Object(u.a)(this,Object(p.a)(e).call(this,t)),console.log(t),n.state={beta:t.data.optimal_b,roi:t.roi/t.budget,cvar:t.data.optimal_cvar,var:t.data.optimal_var,a:t.data.optimal_a,budget:t.budget,selected:{allocation:t.data.optimal_a,var:t.data.optimal_var,cvar:t.data.optimal_cvar,gain:t.roi/t.budget,name:"test_"+t.data.optimal_b,id:-1}},n.drawGraph=n.drawGraph.bind(Object(b.a)(Object(b.a)(n))),n.selectLine=n.selectLine.bind(Object(b.a)(Object(b.a)(n))),n.highlightCircles=n.highlightCircles.bind(Object(b.a)(Object(b.a)(n))),n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"componentDidMount",value:function(){this.drawGraph(this.props.data)}},{key:"componentWillReceiveProps",value:function(t){console.log(t),this.setState({beta:t.data.optimal_b,roi:t.roi/t.budget,cvar:t.data.optimal_cvar,var:t.data.optimal_var,budget:t.budget,a:t.data.optimal_a,selected:{allocation:t.data.optimal_a,var:t.data.optimal_var,cvar:t.data.optimal_cvar,gain:t.roi/t.budget,name:"test_"+t.data.optimal_b}}),this.drawGraph(t.data)}},{key:"selectLine",value:function(t){var e=this;console.log(t),this.setState({selected:t},function(){e.highlightCircles()})}},{key:"highlightCircles",value:function(){var t=this;if(I.s("circle").style("opacity",.5),I.s("circle").attr("r",6),this.state.selected){var e=I.s("circle").filter(function(e,n){return e.id===t.state.selected.id});e.style("opacity",1),e.attr("r",8)}}},{key:"drawGraph",value:function(t){console.log(t);var e=t.beta,n=t.gains,a=0,i=e.map(function(e,i){var r=n.map(function(n,r){return{gain:n,cvar:t.cvar[i][r],var:t.var[i][r],allocation:t.allocation[i][r],name:"test_"+e,line_id:i,point_id:r,id:a++}});return{name:"Beta="+e,values:r,beta:e,id:i}}),r=i.length;i.push({name:"Beta="+t.optimal_b,beta:t.optimal_b,id:a++,values:[{gain:this.props.roi/this.props.budget,cvar:t.optimal_cvar,var:t.optimal_var,allocation:t.optimal_a,name:"test_"+t.optimal_b,line_id:r+1,point_id:-1,id:-1}]}),console.log(i);var s=I.o().domain(I.e(i[0].values,function(t){return t.gain})).range([0,700]),o=t.cvar;o.push([t.optimal_cvar]);var l=I.o().domain([I.n(o.map(function(t){return I.n(t,function(t){return t})}),function(t){return t}),I.m(o.map(function(t){return I.m(t,function(t){return t})}),function(t){return t})]).range([500,0]),c=I.p(I.q),d=I.r(this.svg).append("g").attr("height","700px").attr("width","900px").attr("transform","translate(".concat(100,", ").concat(100,")"));d.append("text").attr("class","title-text").attr("text-anchor","middle").attr("x",350).attr("y",5);var u=I.l().x(function(t){return s(t.gain)}).y(function(t){return l(t.cvar)}),p=d.append("g").attr("class","lines"),h=this.highlightCircles;p.selectAll(".line-group").data(i).enter().append("g").attr("class","line-group").append("path").attr("class","line").attr("d",function(t){return u(t.values)}).style("stroke",function(t,e){return c(e)}).style("opacity","0.25").on("mouseover",function(t,e){I.s(".line").style("opacity","0.1"),I.s("circle").filter(function(e,n){return e.line_id===t.id}).attr("opacity",1),I.r(this).style("opacity","0.6").style("stroke-width","4px").style("cursor","pointer")}).on("mouseout",function(t){h(),I.r(this).style("opacity","0.25").style("stroke-width","4px").style("cursor","pointer")}),p.selectAll("circle-group").data(i).enter().append("g").attr("id",function(t,e){return"circle-group-".concat(e)}).attr("class","circle-group").style("fill",function(t,e){return c(e)}).selectAll("circle").data(function(t){return t.values}).enter().append("g").attr("class","circle").attr("id",function(t,e){return"circle-".concat(e)}).on("click",this.selectLine).append("circle").attr("cx",function(t){return s(t.gain)}).attr("cy",function(t){return l(t.cvar)}).attr("r",6).style("opacity","0.85").on("mouseover",function(t,e){I.s("circle").filter(function(e,n){return e.id===t.id}).attr("r",8)}).on("mouseout",function(t){I.s("circle").filter(function(e,n){return e.id===t.id}).attr("r",6),h()}),I.s(".circle-group").append("text").attr("class","text").text(function(t){return t.name}).attr("x",function(t){return s(t.values[0].gain)+20}).attr("y",function(t){return l(t.values[0].cvar)});var b=I.j(".3p"),f=I.a(s).ticks(5).tickFormat(b),m=I.b(l).ticks(5).tickFormat(b);d.append("g").attr("class","x axis").attr("transform","translate(0, ".concat(500,")")).call(f).append("text").attr("x",350).attr("y","45").attr("text-anchor","middle").attr("fill","#000").attr("font-size","18px").text("Return on Investment (%)"),d.append("g").attr("class","y axis").attr("dy","1em").call(m).append("text").attr("y",-50).attr("x",-250).attr("text-anchor","middle").attr("transform","rotate(-90)").attr("fill","#000").attr("font-size","18px").text("Conditional Value at Risk (%)"),this.highlightCircles()}},{key:"render",value:function(){var t,e,n=this,a=[],r=[];return this.state.a.forEach(function(t,e){a.push(i.a.createElement("th",{x:"0"},n.props.tickers[e])),r.push(i.a.createElement("td",{x:"0"},"$",Math.round(100*t*n.state.budget)/100))}),this.state.selected&&(e=i.a.createElement("tr",null,i.a.createElement("td",{x:"0"},Math.round(1e5*this.state.selected.var)/1e3,"%"),i.a.createElement("td",{x:"50"},Math.round(1e5*this.state.selected.cvar)/1e3,"%"),i.a.createElement("td",{x:"50"},Math.round(1e5*this.state.selected.gain)/1e3,"%")),t=this.state.selected.allocation.map(function(t,e){return i.a.createElement("tr",{key:e},i.a.createElement("td",{x:"0"},n.props.tickers[e]),i.a.createElement("td",{x:"50"},Math.round(1e5*t)/1e3,"%"))})),console.log(this.state),i.a.createElement(D,null,i.a.createElement("div",{id:"all-statements"},i.a.createElement(U,{id:"statement-table"},i.a.createElement("tbody",null,i.a.createElement("tr",null,a),i.a.createElement("tr",null,r))),i.a.createElement("div",{id:"statements"},i.a.createElement("div",null,"Your gain is",i.a.createElement("span",{className:"colorGreen"}," ",Math.round(100*this.state.roi*this.state.budget)/100,"$ "),"return on invesment"),i.a.createElement("div",null,"Your loss is no less than",i.a.createElement("span",{className:"colorRed"}," ",Math.round(100*this.state.var*this.state.budget)/100,"$ "),"with probability",i.a.createElement("span",{className:"colorGreen"}," ",Math.round(1e5*this.state.beta)/1e3,"% ")),i.a.createElement("div",null,"In the worst",i.a.createElement("span",{className:"colorGreen"}," ",Math.round(1e5*(1-this.state.beta))/1e3,"% "),"of days, your average loss is",i.a.createElement("span",{className:"colorRed"}," ",Math.round(100*this.state.cvar*this.state.budget)/100,"$")))),i.a.createElement(U,null,i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null,"VAR"),i.a.createElement("th",null,"CVAR"),i.a.createElement("th",null,"ROI")),e)),i.a.createElement(G,null,i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null,"Ticker"),i.a.createElement("th",null,"weight")),t)),i.a.createElement(R,{ref:function(t){return n.svg=t}}))}}]),e}(a.Component),X=n(17),Y=n(12);function K(){var t=Object(f.a)(["\n font-size: 14px;\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n"]);return K=function(){return t},t}function $(){var t=Object(f.a)(["\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: right;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return $=function(){return t},t}function J(){var t=Object(f.a)(["\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: left;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .table-scroll {\n height: 200px;\n overflow: scroll;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return J=function(){return t},t}function W(){var t=Object(f.a)(["\n width: 100%;\n height: 100%;\n\n .links line {\n stroke: #888;\n stroke-width: 6;\n }\n\n .nodes circle {\n pointer-events: all;\n stroke: none;\n stroke-width: 15px;\n cursor: pointer;\n }\n\n #limitButton {\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n position: absolute;\n bottom: 7px;\n left: 7px;\n }\n\n #utilizationButton {\n position: absolute;\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n bottom: 7px;\n right: 7px;\n }\n\n select {\n position: absolute;\n top: 7px;\n left: 7px;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n overflow: hidden;\n padding: 5px 35px 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: auto;\n }\n"]);return W=function(){return t},t}function H(){var t=Object(f.a)(["\n height: 100%;\n .tableTitle {\n margin-top: 20px;\n text-align: center;\n }\n"]);return H=function(){return t},t}var q=m.a.div(H()),Q=m.a.svg(W()),Z=m.a.table(J()),tt=m.a.table($()),et=m.a.table(K()),nt=["#1abc9c","#3498db","#9b59b6","#34495e","#e67e22","#f1c40f"],at=function(t){function e(t){var n;return Object(c.a)(this,e),(n=Object(u.a)(this,Object(p.a)(e).call(this,t))).state={simulation:"",numSelected:0,firstSelected:null,secondSelected:null,nodeSize:9,edgeLength:100,flows:[],allocation:[],showPaths:!1,showUtilization:0,edgesByTunnel:[],nodesByTunnel:[],tunnelIndex:0,scenario:0,downLinks:[],dashLinks:[],colorNodes:[],secondaryNodes:[],secondaryTunnels:[],scenarios:[],capacity:[],failure_probabilities:[],linkUtilization:[],flowid:null,backFlowid:null,tips:[],graph:null,num_nodes:0,limitTraffic:!0},n.click=n.click.bind(Object(b.a)(Object(b.a)(n))),n.arrowPress=n.arrowPress.bind(Object(b.a)(Object(b.a)(n))),n.dragstarted=n.dragstarted.bind(Object(b.a)(Object(b.a)(n))),n.dragged=n.dragged.bind(Object(b.a)(Object(b.a)(n))),n.dragended=n.dragended.bind(Object(b.a)(Object(b.a)(n))),n.changeTunnel=n.changeTunnel.bind(Object(b.a)(Object(b.a)(n))),n.showUtilization=n.showUtilization.bind(Object(b.a)(Object(b.a)(n))),n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"componentDidMount",value:function(){this.drawGraph(this.props.topology)}},{key:"componentWillReceiveProps",value:function(t){var e=this;this.clearGraph(),this.drawGraph(t.topology),this.setState({num_nodes:t.num_nodes,f:t.flows,T:t.T,Tf:t.Tf,links:t.links,allocation:t.allocation,demand:t.demand,probabilities:t.probabilities,scenarios:t.scenarios,scenario:0,showUtilization:0,capacity:t.capacity,failure_probabilities:t.failure_probabilities,flowid:null,downLinks:[],X:t.X,var:t.var,cvar:t.cvar,limitTraffic:!0,linkUtilization:[]},function(){e.simulateTraffic()})}},{key:"componentDidUpdate",value:function(t){}},{key:"simulateTraffic",value:function(){var t=this;console.log(this.state);var e={};this.state.f.forEach(function(n,a){e[a]={id:a,src:n[0].toString(),dst:n[1].toString(),demand:t.state.demand[a],permissable:t.state.limitTraffic?1-t.state.var:1}});var n=[],a=new Array(this.state.capacity.length).fill(0);if(this.state.scenarios){var i=this.state.demand.reduce(function(t,e){return t+e});this.state.scenarios.forEach(function(r,s){var o=t.state.graph?new Array(t.state.graph.links.length).fill(0):[],l=0;Object.values(e).forEach(function(e,n){var i=0,r=t.getTunnels(e.id,e.src,e.dst,s);r.forEach(function(n,r){var c=n.weight,d=c*e.demand*e.permissable,u=!1,p=Math.max.apply(Math,Object(Y.a)(t.state.capacity));n.links.forEach(function(e){p=Math.min(p,t.state.capacity[e.index]-o[e.index]),o[e.index]+d>t.state.capacity[e.index]&&(u=!0)}),u?p>0&&(d=p,n.links.forEach(function(n){o[n.index]+=d,s===t.state.scenario&&(a[n.index]+=c*e.demand*e.permissable)}),s===t.state.scenario&&(n.sent=d,i+=d),l+=d):(n.links.forEach(function(e){o[e.index]+=d,s===t.state.scenario&&(a[e.index]+=d)}),s===t.state.scenario&&(n.sent=d,i+=d),l+=d)}),s===t.state.scenario&&(e.satisfied=i,e.tunnels=r)}),n.push(l/i)})}this.setState({flows:e,scenarioSatisfaction:n,linkUtilization:a},function(){t.updateGraph(),t.changeTunnel(0)})}},{key:"dragstarted",value:function(t){I.d.active||this.state.simulation.alphaTarget(.3).restart(),t.fx=t.x,t.fy=t.y}},{key:"dragged",value:function(t){t.fx=I.d.x,t.fy=I.d.y}},{key:"dragended",value:function(t){I.d.active||this.state.simulation.alphaTarget(0),t.fx=null,t.fy=null}},{key:"handleUtilization",value:function(t){this.setState({showUtilization:t},this.updateGraph)}},{key:"handleScenario",value:function(t){var e=this,n=[];this.simulateTraffic(),this.state.scenarios[t].forEach(function(t,a){t||n.push({src:String(e.state.links[a][0]),dst:String(e.state.links[a][1])})}),this.setState({downLinks:n,scenario:t},function(){e.simulateTraffic()})}},{key:"handleLimit",value:function(t){var e=this;this.setState({limitTraffic:t},function(){e.simulateTraffic()})}},{key:"colorLinks",value:function(t,e){var n=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.src===e.source.id&&t.dst===e.target.id&&(n=!0)}),n}),a=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.dst===e.source.id&&t.src===e.target.id&&(n=!0)}),n});n.style("stroke-opacity",.6),n.style("stroke",e),a.style("stroke-opacity",0),a.style("stroke",e)}},{key:"colorNodes",value:function(t,e){var n=I.s("circle").filter(function(e){return t.includes(e.id)});n.style("fill",e)}},{key:"dashLinks",value:function(t,e,n){var a=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.src===e.source.id&&t.dst===e.target.id&&(n=!0)}),n});I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.dst===e.source.id&&t.src===e.target.id&&(n=!0)}),n});a.style("stroke-opacity",1),a.style("stroke-dasharray",e),a.attr("marker-end","url(#arrowhead)")}},{key:"animateLinks",value:function(t){clearInterval(this.dashInterval);var e=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.src===e.source.id&&t.dst===e.target.id&&(n=!0)}),n}),n=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.dst===e.source.id&&t.src===e.target.id&&(n=!0)}),n});e.style("stroke-opacity",1);var a=1;this.dashInterval=setInterval(function(){e.style("stroke-dashoffset",a),a-=1},50),n.style("stroke-opacity",0),e.attr("marker-end","url(#arrowhead)")}},{key:"getTunnelNodes",value:function(t){var e=[];return t.links.forEach(function(t){e.includes(t.src)||e.push(t.src),e.includes(t.dst)||e.push(t.dst)}),e}},{key:"getFlow",value:function(t,e){var n=null;return Object.values(this.state.flows).forEach(function(a){a.src===t&&a.dst===e&&(n=a)}),n}},{key:"getTunnels",value:function(t,e,n,a){var i=this,r=[],s=this.state.Tf[t],o=0,l=0;return s.forEach(function(e,n){o+=1===i.state.X[a][e-1]?i.state.allocation[t][n]:0,l+=1===i.state.X[a][e-1]?1:0}),s.forEach(function(e,n){var s=0;i.state.probabilities.forEach(function(t,n){s+=t*i.state.X[n][e-1]});var c=0;c=1===i.state.X[a][e-1]?0!==o?i.state.allocation[t][n]/o:1/l:0;var d=i.state.T[e-1],u=[];d.forEach(function(t){u.push({src:i.state.links[t-1][0].toString(),dst:i.state.links[t-1][1].toString(),index:t-1})}),c>0&&r.push({links:u,allocation:i.state.allocation[t][n],weight:c,availability:Math.round(1e6*s)/1e6,id:e-1})}),r}},{key:"getBackLink",value:function(t){var e=-1;return this.state.links.forEach(function(n,a){n[0]===t[1]&&n[1]===t[0]&&(e=a)}),-1!=e?{src:String(this.state.links[e][0]),dst:String(this.state.links[e][1])}:{}}},{key:"addTip",value:function(t,e,n){var a=I.s("circle").filter(function(e,n){return e.id===t}).select(function(){return this.parentNode}).append("g").attr("class","tip").attr("transform","translate(6,6)"),i=a.append("rect").style("fill","white").style("stroke","steelblue").style("opacity",.8);a.append("text").text(e).attr("dy","1.2em").attr("x",8),a.append("text").text(n).attr("dy","2.4em").attr("x",8);var r=a.node().getBBox();i.attr("width",r.width+15).attr("height",r.height+10)}},{key:"updateGraph",value:function(){var t=this;I.s(".tip").remove(),I.s("line").each(function(t){I.r(this).style("stroke-opacity",.1)}),I.s("line").each(function(t){I.r(this).style("stroke-dasharray","")}),I.s("line").each(function(t){I.r(this).style("stroke","#888")}),I.s("line").attr("marker-end",""),I.s("circle").each(function(t){I.r(this).style("fill","lightgrey")}),this.state.secondaryTunnels.forEach(function(e,n){t.dashLinks(e,"5,5",!1),t.colorLinks(e,nt[n])}),this.animateLinks(this.state.dashLinks),this.colorNodes(this.state.secondaryNodes,"#bbb"),this.colorNodes(this.state.colorNodes,"#aaa"),I.s("circle").filter(function(e,n){return e.id===t.state.firstSelected||e.id===t.state.secondSelected}).style("fill","steelblue"),this.state.tips.forEach(function(e){t.addTip(e.id,e.line1,e.line2)}),null===this.state.firstSelected&&this.resetColors(),this.colorLinks(this.state.downLinks,"red"),this.showUtilization(this.state.showUtilization)}},{key:"resetColors",value:function(){I.s("line").each(function(t){I.r(this).style("stroke-opacity",1)}),I.s("line").each(function(t){I.r(this).style("stroke-dasharray","")}),I.s("line").each(function(t){I.r(this).style("stroke","#888")}),I.s("line").attr("marker-end",""),I.s("circle").each(function(t){I.r(this).style("fill","black")})}},{key:"clearGraph",value:function(){var t=this;I.s("svg > .tip").remove(),I.s("svg > .links").remove(),I.s("svg > .nodes").remove(),this.setState({showPaths:!1,firstSelected:null,secondSelected:null,numSelected:0,tips:[]},function(){console.log(t.state)})}},{key:"arrowPress",value:function(t){if(39===t.keyCode&&this.state.flows[this.state.flowid]){var e=this.state.tunnelIndex+1>=this.state.flows[this.state.flowid].tunnels.length?0:this.state.tunnelIndex+1;this.changeTunnel(e)}else if(37===t.keyCode&&this.state.flows[this.state.flowid]){var n=this.state.tunnelIndex-1<0?this.state.flows[this.state.flowid].tunnels.length-1:this.state.tunnelIndex-1;this.changeTunnel(n)}else 38===t.keyCode&&this.state.scenarios.length>0?(t.preventDefault(),this.handleScenario(this.state.scenario-1<0?this.state.scenarios.length-1:this.state.scenario-1)):40===t.keyCode&&this.state.scenarios.length>0&&(t.preventDefault(),this.handleScenario(this.state.scenario+11?a.style("fill","red"):a.style("fill","black")},i=0;i<=n.length-1;i++)a(i);I.s(".aEnd").style("opacity",t)}},{key:"changeTunnel",value:function(t){var e=this,n=this.state.flowid,a=this.state.flows[n],i=null!==n?a.tunnels[t].sent:0,r=null!==n?a.tunnels:[],s=null!==n?r[t].links:[],o=null!==n?this.getTunnelNodes(r[t]):[],l=[],c=[];null!==n&&a.tunnels.forEach(function(t){l=[].concat(Object(Y.a)(l),Object(Y.a)(e.getTunnelNodes(t))),c=[].concat(Object(Y.a)(c),[t.links])});var d=this.state.backFlowid,u=(this.state.flows[d],[]);if(2==this.state.numSelected)null!=this.state.firstSelected&&u.push({id:this.state.firstSelected,line1:"Node: ".concat(this.state.firstSelected),line2:"Sent: ".concat(i)}),null!=this.state.secondSelected&&u.push({id:this.state.secondSelected,line1:"Node: ".concat(this.state.secondSelected),line2:"Received: ".concat(i)});else if(1==this.state.numSelected){var p=this.getNodeDemand(this.state.firstSelected),h=Object(X.a)(p,2),b=h[0],f=h[1];b=this.state.limitTraffic?(1-this.state.var)*b:b,f=this.state.limitTraffic?(1-this.state.var)*f:f,u.push({id:this.state.firstSelected,line1:"Sent: ".concat(f),line2:"Received ".concat(b)})}this.setState({tunnelIndex:t,dashLinks:s,colorNodes:o,secondaryTunnels:c,secondaryNodes:l,tips:u},this.updateGraph)}},{key:"getNodeDemand",value:function(t){var e=this,n=0,a=0;return Object.values(this.state.flows).forEach(function(i){t===i.src&&(n+=e.state.demand[i.id]),t===i.dst&&(a+=e.state.demand[i.id])}),[a,n]}},{key:"click",value:function(t){var e=this;if(0===this.state.numSelected||2===this.state.numSelected){var n,a=this.getNodeDemand(t.id),i=Object(X.a)(a,2),r=i[0],s=i[1],l=this.state.limitTraffic?1-this.state.var:1;this.setState((n={numSelected:1,firstSelected:t.id,secondSelected:null,showPaths:!1,dashLinks:[],colorNodes:[],secondaryTunnels:[]},Object(o.a)(n,"secondaryTunnels",[]),Object(o.a)(n,"flowid",null),Object(o.a)(n,"tips",[{id:t.id,line1:"Sent: ".concat(s*l),line2:"Received ".concat(r*l)}]),n),this.updateGraph)}else if(1===this.state.numSelected)if(this.state.firstSelected===t.id)this.setState({numSelected:0,firstSelected:null,secondSelected:null,tips:[],showPaths:!1,colorNodes:[],dashLinks:[]},this.updateGraph);else{var c=this.getFlow(this.state.firstSelected,t.id),d=this.getFlow(t.id,this.state.firstSelected);this.setState({numSelected:2,secondSelected:t.id,showPaths:!0,flowid:c?c.id:null,backFlowid:d?d.id:null},function(){e.changeTunnel(0)})}}},{key:"drawGraph",value:function(t){var e=this;document.addEventListener("keydown",this.arrowPress,!1);var n=I.i().force("link",I.g().id(function(t){return t.id}).distance(function(t){return 100})).force("charge",I.h().strength(-500)).force("center",I.f(this.svg.getBoundingClientRect().width/2,this.svg.getBoundingClientRect().height/2));this.setState({simulation:n},function(){var n=I.r(e.svg);n.append("defs").append("marker").attr("id","arrowhead").attr("viewBox","-0 -5 10 10").attr("refX",13).attr("refY",0).attr("orient","auto").attr("markerWidth",3).attr("markerHeight",13).attr("xoverflow","visible").append("svg:path").attr("d","M 0,-5 L 10 ,0 L 0,5").attr("fill","#999").style("stroke","none"),I.k("./data/".concat(t,".json")).then(function(t,a){if(a)throw a;e.setState(Object(l.a)({},e.state,{graph:t})),t.links.forEach(function(t,n){t.capacity=e.state.capacity[n]});var i=n.append("g").attr("class","links").selectAll("line").data(t.links).enter().append("g").attr("class","link").append("line").attr("class","link-line"),r=(n.selectAll(".link").append("text").attr("class","aEnd").data(t.links).attr("x",function(t){return t.source.x}).attr("y",function(t){return t.source.y}).attr("text-anchor","middle").style("font-size","10px").style("opacity",0).text("yo"),I.r("body").append("div").attr("class","tooltip").style("opacity",0)),s=n.append("g").attr("class","nodes").selectAll("circle").data(t.nodes).enter().append("g").attr("class","wrapper").attr("width",10).attr("height",10).on("click",e.click).call(I.c().on("start",e.dragstarted).on("drag",e.dragged).on("end",e.dragended));s.append("circle").attr("r",14);s.append("text").text(function(t){return t.id}).style("text-anchor","middle").style("fill","#999").style("cursor","pointer").style("font-size",18).attr("transform",function(t){return"translate(0,6)"}),s.append("title").text(function(t){return t.id});var o=e;function c(t,e){var n=Math.atan2(e.y-t.y,e.x-t.x);return 30*Math.cos(n)+t.x}function d(t,e){var n=Math.atan2(e.y-t.y,e.x-t.x);return 30*Math.sin(n)+t.y}n.selectAll("line").on("mouseover",function(t){r.transition().duration(200).style("opacity",.9),r.html("p = "+Math.round(1e7*o.state.failure_probabilities[t.index])/1e5+"%").style("width","90px").style("left",I.d.pageX+"px").style("top",I.d.pageY-28+"px")}).on("mouseout",function(t){r.transition().duration(200).style("opacity",0)}),e.state.simulation.nodes(t.nodes).on("tick",function(){i.attr("x1",function(t){return t.source.x}).attr("y1",function(t){return t.source.y}).attr("x2",function(t){return t.target.x}).attr("y2",function(t){return t.target.y}),n.selectAll("text.aEnd").attr("x",function(t){return c(t.source,t.target)}).attr("y",function(t){return d(t.source,t.target)}),n.selectAll("text.zEnd").attr("x",function(t){return c(t.target,t.source)}).attr("y",function(t){return d(t.target,t.source)}),s.attr("transform",function(t){return"translate("+t.x+","+t.y+")"})}),e.state.simulation.force("link").links(t.links)})})}},{key:"render",value:function(){var t,e=this;null!=this.state.flowid&&(t=this.state.flows[this.state.flowid].tunnels.map(function(t,n){return t.weight>0?i.a.createElement("tr",{className:n===e.state.tunnelIndex?"selected":"",onClick:function(){return e.changeTunnel(n)},key:n},i.a.createElement("td",{x:"0"},"Tunnel ",n),i.a.createElement("td",{x:"50"},t.weight),i.a.createElement("td",{x:"80"},t.availability)):i.a.createElement("tr",null)}));for(var n,a,r=this.state.limitTraffic?i.a.createElement("div",{id:"limitButton",onClick:function(){return e.handleLimit(!1)}},"Unlimit"):i.a.createElement("div",{id:"limitButton",onClick:function(){return e.handleLimit(!0)}},"Limit"),s=0===this.state.showUtilization?i.a.createElement("div",{id:"utilizationButton",onClick:function(){return e.handleUtilization(.6)}},"Utilization"):i.a.createElement("div",{id:"utilizationButton",onClick:function(){return e.handleUtilization(0)}},"Off"),o=0,l=[],c=[],d=[],u=[],p=[],h=[],b=[],f=function(t){u.push(i.a.createElement("th",{className:"border-bottom",key:o++},t));for(var n=[],a=[],r=[],s=function(s){var o="-",l=0;Object.values(e.state.flows).forEach(function(e,n){e.src===t.toString()&&e.dst===s.toString()&&(l=e.satisfied,o=e.demand)}),n.push(i.a.createElement("td",null,"-"===o?o:Math.round(1e4*o)/1e4)),a.push(i.a.createElement("td",null,0===l?"-":Math.round(1e5*l)/1e5)),r.push(i.a.createElement("td",null,"-"===o?"-":"".concat(Math.round(1e4*l/o)/100,"%"))),l,"-"===o?0:o},l=1;l<=parseInt(e.state.num_nodes);l++)s(l);p.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",{className:"border-right"},t),n)),h.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",{className:"border-right"},t),a)),b.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",{className:"border-right"},t),r))},m=1;m<=parseInt(this.state.num_nodes);m++)f(m);return l.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",null),u)),l.push(p),c.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",null),u)),c.push(h),d.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",null),u)),d.push(b),this.state.scenarios&&this.state.scenarioSatisfaction&&(n=this.state.scenarios.map(function(t,n){return i.a.createElement("tr",{className:n===e.state.scenario?"selected":"",onClick:function(){return e.handleScenario(n)},key:n},i.a.createElement("td",{x:"0"},"Scenario ",n),i.a.createElement("td",{x:"50"},Math.round(1e6*e.state.probabilities[n])/1e4,"%"),i.a.createElement("td",{x:"80"},Math.round(1e6*e.state.scenarioSatisfaction[n])/1e4,"%"))})),this.state.cvar&&(a=i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",{className:"border-bottom",style:{paddingLeft:"10px"}},"VAR"),i.a.createElement("th",{className:"border-bottom"},"CVAR")),i.a.createElement("tr",null,i.a.createElement("td",{style:{paddingLeft:"20px"}},this.state.var),i.a.createElement("td",null,"".concat(Math.round(1e6*this.state.cvar)/1e4,"%"))))),i.a.createElement(q,null,i.a.createElement(Q,{ref:function(t){return e.svg=t}},i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none"},r),i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none"},s),i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none",style:{padding:"14px"}},this.state.scenarios&&this.state.scenarioSatisfaction&&i.a.createElement(Z,null,i.a.createElement("div",{className:"table-scroll"},i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null),i.a.createElement("th",null,"availability"),i.a.createElement("th",null,"demand satisfied")),n)))),this.state.showPaths&&i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none",style:{padding:"14px"}},i.a.createElement(tt,null,i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null),i.a.createElement("th",null,"weight"),i.a.createElement("th",null,"availability")),t)))),i.a.createElement("div",{className:"tableTitle"},"Demand"),i.a.createElement(et,null,i.a.createElement("tbody",null,l)),i.a.createElement("div",{className:"tableTitle"},"Successful Demand"),i.a.createElement(et,null,i.a.createElement("tbody",null,c)),i.a.createElement("div",{className:"tableTitle"},"Satisfied Demand"),i.a.createElement(et,null,i.a.createElement("tbody",null,d)),i.a.createElement("div",{className:"tableTitle"},"Loss"),i.a.createElement(et,null,a))}}]),e}(a.Component);n(33);function it(){var t=Object(f.a)(["\n background-color: #CCC\n padding: 20px;\n text-align: center;\n transition: .1s all;\n\n &:hover {\n background-color: #999;\n cursor: pointer;\n }\n"]);return it=function(){return t},t}function rt(){var t=Object(f.a)(["\n width: 100vw;\n height: 70vh;\n\n #inputs {\n text-align: center;\n padding-top: 40px;\n width: 100%;\n }\n #graph {\n background-color: #EEE;\n margin-top: 20px;\n border: 1px solid gray;\n height: 80vh;\n width: 90%;\n margin-left: auto;\n margin-right: auto;\n }\n"]);return rt=function(){return t},t}var st=m.a.div(rt()),ot=m.a.div(it()),lt=function(t){function e(t){var n;return Object(c.a)(this,e),(n=Object(u.a)(this,Object(p.a)(e).call(this,t))).state={login:!1,te:{inputs:{topology:"Custom",demand:"1",path:"ED",beta:".9",cutoff:".0001",k:"4",downscale_demand:"1000",zeroindex:"false",demand_matrix:"true",num_nodes:0},results:{var:0,cvar:0,allocation:[],flows:[],capacity:[],T:[],Tf:[],links:[]},show_results:!1},stocks:{inputs:{tickers:[""],beta:.9,roi:50,target:40,days:800,budget:1e3,KEYS:["F6JGTHROSNY4A8MV","EGZPCEQOXI85VKRT","ASDPVYC2XRAJJ81K","M4XW13HI1CWYH0KN"],key:0},results:{},show_results:!1},error:"",mode:"TE"},n.setMode=n.setMode.bind(Object(b.a)(Object(b.a)(n))),n.login=n.login.bind(Object(b.a)(Object(b.a)(n))),n.removeError=n.removeError.bind(Object(b.a)(Object(b.a)(n))),n.handleTESubmit=n.handleTESubmit.bind(Object(b.a)(Object(b.a)(n))),n.handleTEInput=n.handleTEInput.bind(Object(b.a)(Object(b.a)(n))),n.handleStockInput=n.handleStockInput.bind(Object(b.a)(Object(b.a)(n))),n.handleTickerValue=n.handleTickerValue.bind(Object(b.a)(Object(b.a)(n))),n.handleAddTicker=n.handleAddTicker.bind(Object(b.a)(Object(b.a)(n))),n.handleTickerSubmit=n.handleTickerSubmit.bind(Object(b.a)(Object(b.a)(n))),n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"setMode",value:function(t){this.setState(Object(l.a)({},this.state,{mode:t}))}},{key:"removeError",value:function(){this.setState(Object(l.a)({},this.state,{error:""}))}},{key:"login",value:function(t){"CVaR2019!"===t&&this.setState(Object(l.a)({},this.state,{login:!0}))}},{key:"handleStockInput",value:function(t,e){this.setState(Object(l.a)({},this.state,{stocks:Object(l.a)({},this.state.stocks,{inputs:Object(l.a)({},this.state.stocks.inputs,Object(o.a)({},e,t)),show_results:!1})}))}},{key:"handleTickerValue",value:function(t,e){var n=this.state.stocks.inputs.tickers;n[e]=t,this.setState(Object(l.a)({},this.state,{stocks:{inputs:Object(l.a)({},this.state.stocks.inputs,{tickers:n}),show_results:!1}}))}},{key:"handleAddTicker",value:function(){var t=this.state.stocks.inputs.tickers;t.push(""),this.setState(Object(l.a)({},this.state,{stocks:Object(l.a)({},this.state.stocks,{inputs:Object(l.a)({},this.state.stocks.inputs,{tickers:t}),show_results:!1})}))}},{key:"handleTickerSubmit",value:function(){var t=this,e=[],n=[];console.log(this.state.stocks.inputs.key),Promise.all(this.state.stocks.inputs.tickers.map(function(a){return new Promise(function(i,r){fetch("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=".concat(a,"&outputsize=full&apikey=").concat(t.state.stocks.inputs.KEYS[t.state.stocks.inputs.key]),{method:"GET",mode:"cors"}).then(function(t){return t.json()}).then(function(r){for(var s=[],o=r["Time Series (Daily)"],l=Object.keys(o),c=o[l[t.state.stocks.inputs.days+1]]["4. close"],d=t.state.stocks.inputs.days;d>=0;d--){var u=o[l[d]]["4. close"];s.push((u-c)/c),c=u}e.push(s),n.push(a),i()}).catch(function(t){r(t)})})})).then(function(){console.log({nstocks:t.state.stocks.inputs.tickers.length,returns:e,beta:t.state.stocks.inputs.beta,ticker_ordered:n});fetch("http://128.30.92.156:8080/api/cvarf",{method:"POST",mode:"cors",body:JSON.stringify({nstocks:t.state.stocks.inputs.tickers.length,returns:e,beta:parseFloat(t.state.stocks.inputs.beta),roi:parseFloat(t.state.stocks.inputs.roi/t.state.stocks.inputs.budget),target:parseFloat(t.state.stocks.inputs.target/t.state.stocks.inputs.budget)}),headers:{"Content-Type":"application/json"}}).then(function(t){return t.json()}).then(function(e){t.setState(Object(l.a)({},t.state,{stocks:Object(l.a)({},t.state.stocks,{results:e,show_results:!0,tickers:n})}))}).catch(function(t){return console.error("Error:",t)})}).catch(function(e){console.log(e);var n=t.state.stocks.inputs.key,a=t.state.stocks.inputs.key+1>=t.state.stocks.inputs.KEYS.length?0:t.state.stocks.inputs.key+1;t.setState(Object(l.a)({},t.state,{stocks:Object(l.a)({},t.state.stocks,{inputs:Object(l.a)({},t.state.stocks.inputs,{key:a})}),error:{error:e,message:"API error with key ".concat(n,"...")}}))})}},{key:"handleTEInput",value:function(t,e){console.log(this.state.te.inputs),this.setState(Object(l.a)({},this.state,{te:Object(l.a)({},this.state.te,{inputs:Object(l.a)({},this.state.te.inputs,Object(o.a)({},e,t)),show_results:!1})}))}},{key:"handleTESubmit",value:function(){var t=this,e={topology:this.state.te.inputs.topology,demand:this.state.te.inputs.demand,path:this.state.te.inputs.path,beta:this.state.te.inputs.beta,cutoff:this.state.te.inputs.cutoff};switch(this.state.te.inputs.path.includes("ksp")?e.k="".concat(this.state.te.inputs.path.split("_")[1]):e.k="4",e.topology){case"Custom":case"B4":e.downscale_demand="1";break;case"IBM":e.downscale_demand="1000";break;case"Abilene":e.downscale_demand="1";break;default:e.downscale_demand="1000"}fetch("http://128.30.92.156:8080/api/teavar",{method:"POST",mode:"cors",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}}).then(function(t){return t.json()}).then(function(n){console.log(n),t.setState(Object(l.a)({},t.state,{te:Object(l.a)({},t.state.te,{inputs:Object(l.a)({},t.state.te.inputs,{num_nodes:e.num_nodes,zeroindex:e.zeroindex}),results:n,show_results:!0})}))}).catch(function(t){return console.error("Error:",t)})}},{key:"render",value:function(){var t,e;return"TE"===this.state.mode?(e=i.a.createElement(v,{modes:["TE","Stocks"],mode:this.state.mode,setMode:this.setMode}),t=i.a.createElement("div",null,i.a.createElement(st,null,i.a.createElement("div",{id:"inputs"},i.a.createElement(E,{handleTESubmit:this.handleTESubmit,handleTEInput:this.handleTEInput})),i.a.createElement("div",{id:"graph"},i.a.createElement(at,{topology:this.state.te.inputs.topology,num_nodes:this.state.te.results.num_nodes,capacity:this.state.te.results.capacity,failure_probabilities:this.state.te.results.failure_probabilities,T:this.state.te.results.T,Tf:this.state.te.results.Tf,links:this.state.te.results.links,flows:this.state.te.results.flows,allocation:this.state.te.results.allocation,demand:this.state.te.results.demand,probabilities:this.state.te.results.probabilities,scenarios:this.state.te.results.scenarios,X:this.state.te.results.X,var:this.state.te.results.var,cvar:this.state.te.results.cvar}))))):this.state.login?(e=i.a.createElement(v,{modes:["TE","Stocks"],mode:this.state.mode,setMode:this.setMode}),t=i.a.createElement("div",null,i.a.createElement(j,{handleTickerValue:this.handleTickerValue,handleStockInput:this.handleStockInput,handleAddTicker:this.handleAddTicker,handleTickerSubmit:this.handleTickerSubmit,tickers:this.state.stocks.inputs.tickers,tickerMatches:this.state.stocks.tickerMatches}),this.state.stocks.show_results&&i.a.createElement(V,{data:this.state.stocks.results,roi:parseFloat(this.state.stocks.inputs.roi),target:parseFloat(this.state.stocks.inputs.target),tickers:this.state.stocks.tickers,budget:parseFloat(this.state.stocks.inputs.budget)}))):(t=i.a.createElement(z,{login:this.login}),e=i.a.createElement(v,{modes:["TE","Stocks"],mode:this.state.mode,setMode:this.setMode})),i.a.createElement("div",null,e,""!==this.state.error&&i.a.createElement(ot,{onClick:this.removeError},this.state.error.message),t)}}]),e}(a.Component);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));s.a.render(i.a.createElement(lt,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(t){t.unregister()})}},[[22,1,2]]]); -//# sourceMappingURL=main.f2ae1659.chunk.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{22:function(t,e,n){t.exports=n(34)},33:function(t,e,n){},34:function(t,e,n){"use strict";n.r(e);var a=n(0),i=n.n(a),r=n(13),s=n.n(r),o=n(11),l=n(3),c=n(6),d=n(7),u=n(9),p=n(8),h=n(10),b=n(2),f=n(4),m=n(5);function g(){var t=Object(f.a)(["\n position: fixed;\n height: 67px;\n width: 100vw;\n top: 0;\n border-bottom: 1px solid #222;\n box-shadow: 0 1px 0 #262626;\n background-color: #191919;\n background-image: -webkit-gradient(linear,left top,left bottom,from(#282828),to(#191919));\n background-image: -webkit-linear-gradient(top,#282828,#191919);\n background-image: linear-gradient(top,#282828,#191919);\n background-repeat: no-repeat;\n z-index: 10;\n\n #left {\n position: absolute;\n height: 100%;\n left: 10px;\n }\n\n #center {\n position: absolute;\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n color: white;\n\n #title {\n font-size: 25px;\n padding-top: 15px;\n }\n }\n\n #right {\n position: absolute;\n height: 100%;\n padding-top: 20px;\n padding-right: 20px;\n right: 10px;\n color: white;\n\n .link {\n cursor: pointer;\n &:hover {\n border-bottom: 1px solid white;\n }\n }\n }\n"]);return g=function(){return t},t}var k=m.a.div(g()),v=function(t){function e(){return Object(c.a)(this,e),Object(u.a)(this,Object(p.a)(e).apply(this,arguments))}return Object(h.a)(e,t),Object(d.a)(e,[{key:"render",value:function(){var t=this,e=this.props.modes.map(function(e,n){return t.props.mode===e?"":i.a.createElement("div",{key:n,className:"link",onClick:function(n){return t.props.setMode(e)}},e)});return i.a.createElement("div",null,i.a.createElement(k,null,i.a.createElement("div",{id:"left"}),i.a.createElement("div",{id:"center"},i.a.createElement("div",{id:"title"},"TEAVAR Demo")),i.a.createElement("div",{id:"right"},e)))}}]),e}(a.Component);function x(){var t=Object(f.a)(["\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 370px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n input, form {\n font-size: 20px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 90px;\n height: calc(100% - 29px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 18px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 350px;\n }\n button {\n margin: 10px;\n font-size: 20px;\n }\n"]);return x=function(){return t},t}var y=m.a.div(x()),E=function(t){function e(){return Object(c.a)(this,e),Object(u.a)(this,Object(p.a)(e).apply(this,arguments))}return Object(h.a)(e,t),Object(d.a)(e,[{key:"render",value:function(){var t=this;return i.a.createElement("div",null,i.a.createElement(y,null,i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Topology"),i.a.createElement("form",null,i.a.createElement("select",{name:"dropdown",onChange:function(e){return t.props.handleTEInput(e.target.value,"topology")}},i.a.createElement("option",{value:"B4",default:!0},"B4"),i.a.createElement("option",{value:"Custom"},"Small Net"),i.a.createElement("option",{value:"IBM"},"IBM"),i.a.createElement("option",{value:"Abilene"},"Abilene")))),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Demand"),i.a.createElement("form",null,i.a.createElement("select",{name:"dropdown",onChange:function(e){return t.props.handleTEInput(e.target.value,"demand")}},i.a.createElement("option",{value:"1",default:!0},"1"),i.a.createElement("option",{value:"2"},"2"),i.a.createElement("option",{value:"3"},"3"),i.a.createElement("option",{value:"4"},"4"),i.a.createElement("option",{value:"5"},"5"),i.a.createElement("option",{value:"6"},"6")))),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Paths"),i.a.createElement("form",null,i.a.createElement("select",{name:"dropdown",onChange:function(e){return t.props.handleTEInput(e.target.value,"path")}},i.a.createElement("option",{value:"ED",default:!0},"ED"),i.a.createElement("option",{value:"SMORE"},"Oblivious"),i.a.createElement("option",{value:"ksp_2"},"KSP_2"),i.a.createElement("option",{value:"ksp_4"},"KSP_4"),i.a.createElement("option",{value:"ksp_6"},"KSP_6")))),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Beta (%)"),i.a.createElement("input",{type:"text",placeholder:"0.9",onChange:function(e){return t.props.handleTEInput(e.target.value,"beta")}})),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Cutoff (%)"),i.a.createElement("input",{type:"text",placeholder:"0.0001",onChange:function(e){return t.props.handleTEInput(e.target.value,"cutoff")}})),i.a.createElement("button",{onClick:function(e){return t.props.handleTESubmit()}},"Submit")))}}]),e}(a.Component);function w(){var t=Object(f.a)(["\n margin 40px auto;\n text-align: center;\n\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n\n\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n input {\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .matches {\n position: relative;\n top: 10px;\n }\n button {\n margin: 10px;\n }\n"]);return w=function(){return t},t}var O=m.a.div(w()),j=function(t){function e(){return Object(c.a)(this,e),Object(u.a)(this,Object(p.a)(e).apply(this,arguments))}return Object(h.a)(e,t),Object(d.a)(e,[{key:"render",value:function(){var t,e=this,n=this.props.tickers.map(function(t,n){return i.a.createElement("input",{key:n,type:"text",placeholder:"Ticker ".concat(n),value:t,onChange:function(t){return e.props.handleTickerValue(t.target.value,n)}})});return this.props.tickerMatches&&(t=this.props.tickerMatches.map(function(t){return i.a.createElement("div",null,t["1. symbol"])})),i.a.createElement("div",null,i.a.createElement(O,null,i.a.createElement("div",{className:"tickers_label"},"Portfolio Tickers"),n,i.a.createElement("div",null,t),i.a.createElement("button",{onClick:function(t){return e.props.handleAddTicker()}},"Add"),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Budget ($)"),i.a.createElement("input",{type:"text",placeholder:"1000",onChange:function(t){return e.props.handleStockInput(t.target.value,"budget")}})),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Return ($)"),i.a.createElement("input",{type:"text",placeholder:"50",onChange:function(t){return e.props.handleStockInput(t.target.value,"roi")}})),i.a.createElement("div",{className:"input"},i.a.createElement("div",{className:"input_label"},"Loss ($)"),i.a.createElement("input",{type:"text",placeholder:"40",onChange:function(t){return e.props.handleStockInput(t.target.value,"target")}})),i.a.createElement("button",{onClick:function(t){return e.props.handleTickerSubmit()}},"Submit")))}}]),e}(a.Component);function A(){var t=Object(f.a)(["\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n"]);return A=function(){return t},t}function S(){var t=Object(f.a)(["\n color: white;\n"]);return S=function(){return t},t}m.a.div(S());var T=m.a.table(A());a.Component;function _(){var t=Object(f.a)(["\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n .input-elt {\n font-size: 15px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n .input-elt {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .button {\n color: white;\n display: block;\n width: 75px;\n background-color: #999;\n vertical-align: top;\n margin: 10px auto;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n border-radius: 5px;\n }\n"]);return _=function(){return t},t}function N(){var t=Object(f.a)(["\n margin-top: 30vh;\n"]);return N=function(){return t},t}var C=m.a.div(N()),M=m.a.div(_()),z=function(t){function e(t){var n;return Object(c.a)(this,e),(n=Object(u.a)(this,Object(p.a)(e).call(this,t))).state={password:""},n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"handlePassword",value:function(t){this.setState({password:t})}},{key:"render",value:function(){var t=this;return i.a.createElement(C,null,i.a.createElement(M,{id:"login-window"},i.a.createElement("form",{className:"input"},i.a.createElement("input",{className:"input-elt",type:"password",placeholder:"",onChange:function(e){return t.handlePassword(e.target.value)}}),i.a.createElement("input",{className:"button",type:"submit",onClick:function(e){return t.props.login(t.state.password)},value:"Login"}))))}}]),e}(a.Component),I=n(1);function F(){var t=Object(f.a)(["\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 10px auto;\n margin-top: 70px;\n\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return F=function(){return t},t}function L(){var t=Object(f.a)(["\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 0px auto;\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return L=function(){return t},t}function B(){var t=Object(f.a)(["\n display: block;\n margin: -60px auto 0px auto;\n height: 700px;\n width: 900px;\n"]);return B=function(){return t},t}function P(){var t=Object(f.a)(["\n position: relative;\n svg {\n font-family: Sans-Serif, Arial;\n }\n .line {\n stroke-width: 4;\n fill: none;\n }\n\n .axis path {\n stroke: black;\n }\n\n .text {\n font-size: 12px;\n }\n\n .title-text {\n font-size: 12px;\n }\n\n #all-statements {\n display: block;\n width: 100%;\n border-bottom: 1px solid black;\n }\n\n #statement-table {\n background-color: #EEE;\n margin-top: 10px;\n }\n\n #statements {\n width: 40%;\n margin: 0px auto;\n margin-bottom: 70px;\n background-color: #EEE;\n padding: 20px;\n border-radius: 5px;\n font-size: 18px;\n text-align:center;\n\n div {\n margin: 20px 0px;\n }\n .colorGreen {\n color: rgb(0,150,0);\n }\n .colorRed {\n color: rgb(150, 0,0);\n }\n }\n"]);return P=function(){return t},t}var D=m.a.div(P()),R=m.a.svg(B()),G=m.a.table(L()),U=m.a.table(F()),V=function(t){function e(t){var n;return Object(c.a)(this,e),n=Object(u.a)(this,Object(p.a)(e).call(this,t)),console.log(t),n.state={beta:t.data.optimal_b,roi:t.roi/t.budget,cvar:t.data.optimal_cvar,var:t.data.optimal_var,a:t.data.optimal_a,budget:t.budget,selected:{allocation:t.data.optimal_a,var:t.data.optimal_var,cvar:t.data.optimal_cvar,gain:t.roi/t.budget,name:"test_"+t.data.optimal_b,id:-1}},n.drawGraph=n.drawGraph.bind(Object(b.a)(Object(b.a)(n))),n.selectLine=n.selectLine.bind(Object(b.a)(Object(b.a)(n))),n.highlightCircles=n.highlightCircles.bind(Object(b.a)(Object(b.a)(n))),n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"componentDidMount",value:function(){this.drawGraph(this.props.data)}},{key:"componentWillReceiveProps",value:function(t){console.log(t),this.setState({beta:t.data.optimal_b,roi:t.roi/t.budget,cvar:t.data.optimal_cvar,var:t.data.optimal_var,budget:t.budget,a:t.data.optimal_a,selected:{allocation:t.data.optimal_a,var:t.data.optimal_var,cvar:t.data.optimal_cvar,gain:t.roi/t.budget,name:"test_"+t.data.optimal_b}}),this.drawGraph(t.data)}},{key:"selectLine",value:function(t){var e=this;console.log(t),this.setState({selected:t},function(){e.highlightCircles()})}},{key:"highlightCircles",value:function(){var t=this;if(I.s("circle").style("opacity",.5),I.s("circle").attr("r",6),this.state.selected){var e=I.s("circle").filter(function(e,n){return e.id===t.state.selected.id});e.style("opacity",1),e.attr("r",8)}}},{key:"drawGraph",value:function(t){console.log(t);var e=t.beta,n=t.gains,a=0,i=e.map(function(e,i){var r=n.map(function(n,r){return{gain:n,cvar:t.cvar[i][r],var:t.var[i][r],allocation:t.allocation[i][r],name:"test_"+e,line_id:i,point_id:r,id:a++}});return{name:"Beta="+e,values:r,beta:e,id:i}}),r=i.length;i.push({name:"Beta="+t.optimal_b,beta:t.optimal_b,id:a++,values:[{gain:this.props.roi/this.props.budget,cvar:t.optimal_cvar,var:t.optimal_var,allocation:t.optimal_a,name:"test_"+t.optimal_b,line_id:r+1,point_id:-1,id:-1}]}),console.log(i);var s=I.o().domain(I.e(i[0].values,function(t){return t.gain})).range([0,700]),o=t.cvar;o.push([t.optimal_cvar]);var l=I.o().domain([I.n(o.map(function(t){return I.n(t,function(t){return t})}),function(t){return t}),I.m(o.map(function(t){return I.m(t,function(t){return t})}),function(t){return t})]).range([500,0]),c=I.p(I.q),d=I.r(this.svg).append("g").attr("height","700px").attr("width","900px").attr("transform","translate(".concat(100,", ").concat(100,")"));d.append("text").attr("class","title-text").attr("text-anchor","middle").attr("x",350).attr("y",5);var u=I.l().x(function(t){return s(t.gain)}).y(function(t){return l(t.cvar)}),p=d.append("g").attr("class","lines"),h=this.highlightCircles;p.selectAll(".line-group").data(i).enter().append("g").attr("class","line-group").append("path").attr("class","line").attr("d",function(t){return u(t.values)}).style("stroke",function(t,e){return c(e)}).style("opacity","0.25").on("mouseover",function(t,e){I.s(".line").style("opacity","0.1"),I.s("circle").filter(function(e,n){return e.line_id===t.id}).attr("opacity",1),I.r(this).style("opacity","0.6").style("stroke-width","4px").style("cursor","pointer")}).on("mouseout",function(t){h(),I.r(this).style("opacity","0.25").style("stroke-width","4px").style("cursor","pointer")}),p.selectAll("circle-group").data(i).enter().append("g").attr("id",function(t,e){return"circle-group-".concat(e)}).attr("class","circle-group").style("fill",function(t,e){return c(e)}).selectAll("circle").data(function(t){return t.values}).enter().append("g").attr("class","circle").attr("id",function(t,e){return"circle-".concat(e)}).on("click",this.selectLine).append("circle").attr("cx",function(t){return s(t.gain)}).attr("cy",function(t){return l(t.cvar)}).attr("r",6).style("opacity","0.85").on("mouseover",function(t,e){I.s("circle").filter(function(e,n){return e.id===t.id}).attr("r",8)}).on("mouseout",function(t){I.s("circle").filter(function(e,n){return e.id===t.id}).attr("r",6),h()}),I.s(".circle-group").append("text").attr("class","text").text(function(t){return t.name}).attr("x",function(t){return s(t.values[0].gain)+20}).attr("y",function(t){return l(t.values[0].cvar)});var b=I.j(".3p"),f=I.a(s).ticks(5).tickFormat(b),m=I.b(l).ticks(5).tickFormat(b);d.append("g").attr("class","x axis").attr("transform","translate(0, ".concat(500,")")).call(f).append("text").attr("x",350).attr("y","45").attr("text-anchor","middle").attr("fill","#000").attr("font-size","18px").text("Return on Investment (%)"),d.append("g").attr("class","y axis").attr("dy","1em").call(m).append("text").attr("y",-50).attr("x",-250).attr("text-anchor","middle").attr("transform","rotate(-90)").attr("fill","#000").attr("font-size","18px").text("Conditional Value at Risk (%)"),this.highlightCircles()}},{key:"render",value:function(){var t,e,n=this,a=[],r=[];return this.state.a.forEach(function(t,e){a.push(i.a.createElement("th",{x:"0"},n.props.tickers[e])),r.push(i.a.createElement("td",{x:"0"},"$",Math.round(100*t*n.state.budget)/100))}),this.state.selected&&(e=i.a.createElement("tr",null,i.a.createElement("td",{x:"0"},Math.round(1e5*this.state.selected.var)/1e3,"%"),i.a.createElement("td",{x:"50"},Math.round(1e5*this.state.selected.cvar)/1e3,"%"),i.a.createElement("td",{x:"50"},Math.round(1e5*this.state.selected.gain)/1e3,"%")),t=this.state.selected.allocation.map(function(t,e){return i.a.createElement("tr",{key:e},i.a.createElement("td",{x:"0"},n.props.tickers[e]),i.a.createElement("td",{x:"50"},Math.round(1e5*t)/1e3,"%"))})),console.log(this.state),i.a.createElement(D,null,i.a.createElement("div",{id:"all-statements"},i.a.createElement(U,{id:"statement-table"},i.a.createElement("tbody",null,i.a.createElement("tr",null,a),i.a.createElement("tr",null,r))),i.a.createElement("div",{id:"statements"},i.a.createElement("div",null,"Your gain is",i.a.createElement("span",{className:"colorGreen"}," ",Math.round(100*this.state.roi*this.state.budget)/100,"$ "),"return on invesment"),i.a.createElement("div",null,"Your loss is no less than",i.a.createElement("span",{className:"colorRed"}," ",Math.round(100*this.state.var*this.state.budget)/100,"$ "),"with probability",i.a.createElement("span",{className:"colorGreen"}," ",Math.round(1e5*this.state.beta)/1e3,"% ")),i.a.createElement("div",null,"In the worst",i.a.createElement("span",{className:"colorGreen"}," ",Math.round(1e5*(1-this.state.beta))/1e3,"% "),"of days, your average loss is",i.a.createElement("span",{className:"colorRed"}," ",Math.round(100*this.state.cvar*this.state.budget)/100,"$")))),i.a.createElement(U,null,i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null,"VAR"),i.a.createElement("th",null,"CVAR"),i.a.createElement("th",null,"ROI")),e)),i.a.createElement(G,null,i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null,"Ticker"),i.a.createElement("th",null,"weight")),t)),i.a.createElement(R,{ref:function(t){return n.svg=t}}))}}]),e}(a.Component),X=n(17),Y=n(12);function K(){var t=Object(f.a)(["\n font-size: 14px;\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n"]);return K=function(){return t},t}function $(){var t=Object(f.a)(["\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: right;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return $=function(){return t},t}function J(){var t=Object(f.a)(["\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: left;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .table-scroll {\n height: 200px;\n overflow: scroll;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n"]);return J=function(){return t},t}function W(){var t=Object(f.a)(["\n width: 100%;\n height: 100%;\n\n .links line {\n stroke: #888;\n stroke-width: 6;\n }\n\n .nodes circle {\n pointer-events: all;\n stroke: none;\n stroke-width: 15px;\n cursor: pointer;\n }\n\n #limitButton {\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n position: absolute;\n bottom: 7px;\n left: 7px;\n }\n\n #utilizationButton {\n position: absolute;\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n bottom: 7px;\n right: 7px;\n }\n\n select {\n position: absolute;\n top: 7px;\n left: 7px;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n overflow: hidden;\n padding: 5px 35px 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: auto;\n }\n"]);return W=function(){return t},t}function H(){var t=Object(f.a)(["\n height: 100%;\n .tableTitle {\n margin-top: 20px;\n text-align: center;\n }\n"]);return H=function(){return t},t}var q=m.a.div(H()),Q=m.a.svg(W()),Z=m.a.table(J()),tt=m.a.table($()),et=m.a.table(K()),nt=["#1abc9c","#3498db","#9b59b6","#34495e","#e67e22","#f1c40f"],at=function(t){function e(t){var n;return Object(c.a)(this,e),(n=Object(u.a)(this,Object(p.a)(e).call(this,t))).state={simulation:"",numSelected:0,firstSelected:null,secondSelected:null,nodeSize:9,edgeLength:100,flows:[],allocation:[],showPaths:!1,showUtilization:0,edgesByTunnel:[],nodesByTunnel:[],tunnelIndex:0,scenario:0,downLinks:[],dashLinks:[],colorNodes:[],secondaryNodes:[],secondaryTunnels:[],scenarios:[],capacity:[],failure_probabilities:[],linkUtilization:[],flowid:null,backFlowid:null,tips:[],graph:null,num_nodes:0,limitTraffic:!0},n.click=n.click.bind(Object(b.a)(Object(b.a)(n))),n.arrowPress=n.arrowPress.bind(Object(b.a)(Object(b.a)(n))),n.dragstarted=n.dragstarted.bind(Object(b.a)(Object(b.a)(n))),n.dragged=n.dragged.bind(Object(b.a)(Object(b.a)(n))),n.dragended=n.dragended.bind(Object(b.a)(Object(b.a)(n))),n.changeTunnel=n.changeTunnel.bind(Object(b.a)(Object(b.a)(n))),n.showUtilization=n.showUtilization.bind(Object(b.a)(Object(b.a)(n))),n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"componentDidMount",value:function(){this.drawGraph(this.props.topology)}},{key:"componentWillReceiveProps",value:function(t){var e=this;this.clearGraph(),this.drawGraph(t.topology),this.setState({num_nodes:t.num_nodes,f:t.flows,T:t.T,Tf:t.Tf,links:t.links,allocation:t.allocation,demand:t.demand,probabilities:t.probabilities,scenarios:t.scenarios,scenario:0,showUtilization:0,capacity:t.capacity,failure_probabilities:t.failure_probabilities,flowid:null,downLinks:[],X:t.X,var:t.var,cvar:t.cvar,limitTraffic:!0,linkUtilization:[]},function(){e.simulateTraffic()})}},{key:"componentDidUpdate",value:function(t){}},{key:"simulateTraffic",value:function(){var t=this;console.log(this.state);var e={};this.state.f.forEach(function(n,a){e[a]={id:a,src:n[0].toString(),dst:n[1].toString(),demand:t.state.demand[a],permissable:t.state.limitTraffic?1-t.state.var:1}});var n=[],a=new Array(this.state.capacity.length).fill(0);if(this.state.scenarios){var i=this.state.demand.reduce(function(t,e){return t+e});this.state.scenarios.forEach(function(r,s){var o=t.state.graph?new Array(t.state.graph.links.length).fill(0):[],l=0;Object.values(e).forEach(function(e,n){var i=0,r=t.getTunnels(e.id,e.src,e.dst,s);r.forEach(function(n,r){var c=n.weight,d=c*e.demand*e.permissable,u=!1,p=Math.max.apply(Math,Object(Y.a)(t.state.capacity));n.links.forEach(function(e){p=Math.min(p,t.state.capacity[e.index]-o[e.index]),o[e.index]+d>t.state.capacity[e.index]&&(u=!0)}),u?p>0&&(d=p,n.links.forEach(function(n){o[n.index]+=d,s===t.state.scenario&&(a[n.index]+=c*e.demand*e.permissable)}),s===t.state.scenario&&(n.sent=d,i+=d),l+=d):(n.links.forEach(function(e){o[e.index]+=d,s===t.state.scenario&&(a[e.index]+=d)}),s===t.state.scenario&&(n.sent=d,i+=d),l+=d)}),s===t.state.scenario&&(e.satisfied=i,e.tunnels=r)}),n.push(l/i)})}this.setState({flows:e,scenarioSatisfaction:n,linkUtilization:a},function(){t.updateGraph(),t.changeTunnel(0)})}},{key:"dragstarted",value:function(t){I.d.active||this.state.simulation.alphaTarget(.3).restart(),t.fx=t.x,t.fy=t.y}},{key:"dragged",value:function(t){t.fx=I.d.x,t.fy=I.d.y}},{key:"dragended",value:function(t){I.d.active||this.state.simulation.alphaTarget(0),t.fx=null,t.fy=null}},{key:"handleUtilization",value:function(t){this.setState({showUtilization:t},this.updateGraph)}},{key:"handleScenario",value:function(t){var e=this,n=[];this.simulateTraffic(),this.state.scenarios[t].forEach(function(t,a){t||n.push({src:String(e.state.links[a][0]),dst:String(e.state.links[a][1])})}),this.setState({downLinks:n,scenario:t},function(){e.simulateTraffic()})}},{key:"handleLimit",value:function(t){var e=this;this.setState({limitTraffic:t},function(){e.simulateTraffic()})}},{key:"colorLinks",value:function(t,e){var n=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.src===e.source.id&&t.dst===e.target.id&&(n=!0)}),n}),a=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.dst===e.source.id&&t.src===e.target.id&&(n=!0)}),n});n.style("stroke-opacity",.6),n.style("stroke",e),a.style("stroke-opacity",0),a.style("stroke",e)}},{key:"colorNodes",value:function(t,e){var n=I.s("circle").filter(function(e){return t.includes(e.id)});n.style("fill",e)}},{key:"dashLinks",value:function(t,e,n){var a=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.src===e.source.id&&t.dst===e.target.id&&(n=!0)}),n});I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.dst===e.source.id&&t.src===e.target.id&&(n=!0)}),n});a.style("stroke-opacity",1),a.style("stroke-dasharray",e),a.attr("marker-end","url(#arrowhead)")}},{key:"animateLinks",value:function(t){clearInterval(this.dashInterval);var e=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.src===e.source.id&&t.dst===e.target.id&&(n=!0)}),n}),n=I.s("line").filter(function(e){var n=!1;return t.forEach(function(t){t.dst===e.source.id&&t.src===e.target.id&&(n=!0)}),n});e.style("stroke-opacity",1);var a=1;this.dashInterval=setInterval(function(){e.style("stroke-dashoffset",a),a-=1},50),n.style("stroke-opacity",0),e.attr("marker-end","url(#arrowhead)")}},{key:"getTunnelNodes",value:function(t){var e=[];return t.links.forEach(function(t){e.includes(t.src)||e.push(t.src),e.includes(t.dst)||e.push(t.dst)}),e}},{key:"getFlow",value:function(t,e){var n=null;return Object.values(this.state.flows).forEach(function(a){a.src===t&&a.dst===e&&(n=a)}),n}},{key:"getTunnels",value:function(t,e,n,a){var i=this,r=[],s=this.state.Tf[t],o=0,l=0;return s.forEach(function(e,n){o+=1===i.state.X[a][e-1]?i.state.allocation[t][n]:0,l+=1===i.state.X[a][e-1]?1:0}),s.forEach(function(e,n){var s=0;i.state.probabilities.forEach(function(t,n){s+=t*i.state.X[n][e-1]});var c=0;c=1===i.state.X[a][e-1]?0!==o?i.state.allocation[t][n]/o:1/l:0;var d=i.state.T[e-1],u=[];d.forEach(function(t){u.push({src:i.state.links[t-1][0].toString(),dst:i.state.links[t-1][1].toString(),index:t-1})}),c>0&&r.push({links:u,allocation:i.state.allocation[t][n],weight:c,availability:Math.round(1e6*s)/1e6,id:e-1})}),r}},{key:"getBackLink",value:function(t){var e=-1;return this.state.links.forEach(function(n,a){n[0]===t[1]&&n[1]===t[0]&&(e=a)}),-1!=e?{src:String(this.state.links[e][0]),dst:String(this.state.links[e][1])}:{}}},{key:"addTip",value:function(t,e,n){var a=I.s("circle").filter(function(e,n){return e.id===t}).select(function(){return this.parentNode}).append("g").attr("class","tip").attr("transform","translate(6,6)"),i=a.append("rect").style("fill","white").style("stroke","steelblue").style("opacity",.8);a.append("text").text(e).attr("dy","1.2em").attr("x",8),a.append("text").text(n).attr("dy","2.4em").attr("x",8);var r=a.node().getBBox();i.attr("width",r.width+15).attr("height",r.height+10)}},{key:"updateGraph",value:function(){var t=this;I.s(".tip").remove(),I.s("line").each(function(t){I.r(this).style("stroke-opacity",.1)}),I.s("line").each(function(t){I.r(this).style("stroke-dasharray","")}),I.s("line").each(function(t){I.r(this).style("stroke","#888")}),I.s("line").attr("marker-end",""),I.s("circle").each(function(t){I.r(this).style("fill","lightgrey")}),this.state.secondaryTunnels.forEach(function(e,n){t.dashLinks(e,"5,5",!1),t.colorLinks(e,nt[n])}),this.animateLinks(this.state.dashLinks),this.colorNodes(this.state.secondaryNodes,"#bbb"),this.colorNodes(this.state.colorNodes,"#aaa"),I.s("circle").filter(function(e,n){return e.id===t.state.firstSelected||e.id===t.state.secondSelected}).style("fill","steelblue"),this.state.tips.forEach(function(e){t.addTip(e.id,e.line1,e.line2)}),null===this.state.firstSelected&&this.resetColors(),this.colorLinks(this.state.downLinks,"red"),this.showUtilization(this.state.showUtilization)}},{key:"resetColors",value:function(){I.s("line").each(function(t){I.r(this).style("stroke-opacity",1)}),I.s("line").each(function(t){I.r(this).style("stroke-dasharray","")}),I.s("line").each(function(t){I.r(this).style("stroke","#888")}),I.s("line").attr("marker-end",""),I.s("circle").each(function(t){I.r(this).style("fill","black")})}},{key:"clearGraph",value:function(){var t=this;I.s("svg > .tip").remove(),I.s("svg > .links").remove(),I.s("svg > .nodes").remove(),this.setState({showPaths:!1,firstSelected:null,secondSelected:null,numSelected:0,tips:[]},function(){console.log(t.state)})}},{key:"arrowPress",value:function(t){if(39===t.keyCode&&this.state.flows[this.state.flowid]){var e=this.state.tunnelIndex+1>=this.state.flows[this.state.flowid].tunnels.length?0:this.state.tunnelIndex+1;this.changeTunnel(e)}else if(37===t.keyCode&&this.state.flows[this.state.flowid]){var n=this.state.tunnelIndex-1<0?this.state.flows[this.state.flowid].tunnels.length-1:this.state.tunnelIndex-1;this.changeTunnel(n)}else 38===t.keyCode&&this.state.scenarios.length>0?(t.preventDefault(),this.handleScenario(this.state.scenario-1<0?this.state.scenarios.length-1:this.state.scenario-1)):40===t.keyCode&&this.state.scenarios.length>0&&(t.preventDefault(),this.handleScenario(this.state.scenario+11?a.style("fill","red"):a.style("fill","black")},i=0;i<=n.length-1;i++)a(i);I.s(".aEnd").style("opacity",t)}},{key:"changeTunnel",value:function(t){var e=this,n=this.state.flowid,a=this.state.flows[n],i=null!==n?a.tunnels[t].sent:0,r=null!==n?a.tunnels:[],s=null!==n?r[t].links:[],o=null!==n?this.getTunnelNodes(r[t]):[],l=[],c=[];null!==n&&a.tunnels.forEach(function(t){l=[].concat(Object(Y.a)(l),Object(Y.a)(e.getTunnelNodes(t))),c=[].concat(Object(Y.a)(c),[t.links])});var d=this.state.backFlowid,u=(this.state.flows[d],[]);if(2==this.state.numSelected)null!=this.state.firstSelected&&u.push({id:this.state.firstSelected,line1:"Node: ".concat(this.state.firstSelected),line2:"Sent: ".concat(i)}),null!=this.state.secondSelected&&u.push({id:this.state.secondSelected,line1:"Node: ".concat(this.state.secondSelected),line2:"Received: ".concat(i)});else if(1==this.state.numSelected){var p=this.getNodeDemand(this.state.firstSelected),h=Object(X.a)(p,2),b=h[0],f=h[1];b=this.state.limitTraffic?(1-this.state.var)*b:b,f=this.state.limitTraffic?(1-this.state.var)*f:f,u.push({id:this.state.firstSelected,line1:"Sent: ".concat(f),line2:"Received ".concat(b)})}this.setState({tunnelIndex:t,dashLinks:s,colorNodes:o,secondaryTunnels:c,secondaryNodes:l,tips:u},this.updateGraph)}},{key:"getNodeDemand",value:function(t){var e=this,n=0,a=0;return Object.values(this.state.flows).forEach(function(i){t===i.src&&(n+=e.state.demand[i.id]),t===i.dst&&(a+=e.state.demand[i.id])}),[a,n]}},{key:"click",value:function(t){var e=this;if(0===this.state.numSelected||2===this.state.numSelected){var n,a=this.getNodeDemand(t.id),i=Object(X.a)(a,2),r=i[0],s=i[1],l=this.state.limitTraffic?1-this.state.var:1;this.setState((n={numSelected:1,firstSelected:t.id,secondSelected:null,showPaths:!1,dashLinks:[],colorNodes:[],secondaryTunnels:[]},Object(o.a)(n,"secondaryTunnels",[]),Object(o.a)(n,"flowid",null),Object(o.a)(n,"tips",[{id:t.id,line1:"Sent: ".concat(s*l),line2:"Received ".concat(r*l)}]),n),this.updateGraph)}else if(1===this.state.numSelected)if(this.state.firstSelected===t.id)this.setState({numSelected:0,firstSelected:null,secondSelected:null,tips:[],showPaths:!1,colorNodes:[],dashLinks:[]},this.updateGraph);else{var c=this.getFlow(this.state.firstSelected,t.id),d=this.getFlow(t.id,this.state.firstSelected);this.setState({numSelected:2,secondSelected:t.id,showPaths:!0,flowid:c?c.id:null,backFlowid:d?d.id:null},function(){e.changeTunnel(0)})}}},{key:"drawGraph",value:function(t){var e=this;document.addEventListener("keydown",this.arrowPress,!1);var n=I.i().force("link",I.g().id(function(t){return t.id}).distance(function(t){return 100})).force("charge",I.h().strength(-500)).force("center",I.f(this.svg.getBoundingClientRect().width/2,this.svg.getBoundingClientRect().height/2));this.setState({simulation:n},function(){var n=I.r(e.svg);n.append("defs").append("marker").attr("id","arrowhead").attr("viewBox","-0 -5 10 10").attr("refX",13).attr("refY",0).attr("orient","auto").attr("markerWidth",3).attr("markerHeight",13).attr("xoverflow","visible").append("svg:path").attr("d","M 0,-5 L 10 ,0 L 0,5").attr("fill","#999").style("stroke","none"),I.k("./data/".concat(t,".json")).then(function(t,a){if(a)throw a;e.setState(Object(l.a)({},e.state,{graph:t})),t.links.forEach(function(t,n){t.capacity=e.state.capacity[n]});var i=n.append("g").attr("class","links").selectAll("line").data(t.links).enter().append("g").attr("class","link").append("line").attr("class","link-line"),r=(n.selectAll(".link").append("text").attr("class","aEnd").data(t.links).attr("x",function(t){return t.source.x}).attr("y",function(t){return t.source.y}).attr("text-anchor","middle").style("font-size","10px").style("opacity",0).text("yo"),I.r("body").append("div").attr("class","tooltip").style("opacity",0)),s=n.append("g").attr("class","nodes").selectAll("circle").data(t.nodes).enter().append("g").attr("class","wrapper").attr("width",10).attr("height",10).on("click",e.click).call(I.c().on("start",e.dragstarted).on("drag",e.dragged).on("end",e.dragended));s.append("circle").attr("r",14);s.append("text").text(function(t){return t.id}).style("text-anchor","middle").style("fill","#999").style("cursor","pointer").style("font-size",18).attr("transform",function(t){return"translate(0,6)"}),s.append("title").text(function(t){return t.id});var o=e;function c(t,e){var n=Math.atan2(e.y-t.y,e.x-t.x);return 30*Math.cos(n)+t.x}function d(t,e){var n=Math.atan2(e.y-t.y,e.x-t.x);return 30*Math.sin(n)+t.y}n.selectAll("line").on("mouseover",function(t){r.transition().duration(200).style("opacity",.9),r.html("p = "+Math.round(1e7*o.state.failure_probabilities[t.index])/1e5+"%").style("width","90px").style("left",I.d.pageX+"px").style("top",I.d.pageY-28+"px")}).on("mouseout",function(t){r.transition().duration(200).style("opacity",0)}),e.state.simulation.nodes(t.nodes).on("tick",function(){i.attr("x1",function(t){return t.source.x}).attr("y1",function(t){return t.source.y}).attr("x2",function(t){return t.target.x}).attr("y2",function(t){return t.target.y}),n.selectAll("text.aEnd").attr("x",function(t){return c(t.source,t.target)}).attr("y",function(t){return d(t.source,t.target)}),n.selectAll("text.zEnd").attr("x",function(t){return c(t.target,t.source)}).attr("y",function(t){return d(t.target,t.source)}),s.attr("transform",function(t){return"translate("+t.x+","+t.y+")"})}),e.state.simulation.force("link").links(t.links)})})}},{key:"render",value:function(){var t,e=this;null!=this.state.flowid&&(t=this.state.flows[this.state.flowid].tunnels.map(function(t,n){return t.weight>0?i.a.createElement("tr",{className:n===e.state.tunnelIndex?"selected":"",onClick:function(){return e.changeTunnel(n)},key:n},i.a.createElement("td",{x:"0"},"Tunnel ",n),i.a.createElement("td",{x:"50"},t.weight),i.a.createElement("td",{x:"80"},t.availability)):i.a.createElement("tr",null)}));for(var n,a,r=this.state.limitTraffic?i.a.createElement("div",{id:"limitButton",onClick:function(){return e.handleLimit(!1)}},"Unlimit"):i.a.createElement("div",{id:"limitButton",onClick:function(){return e.handleLimit(!0)}},"Limit"),s=0===this.state.showUtilization?i.a.createElement("div",{id:"utilizationButton",onClick:function(){return e.handleUtilization(.6)}},"Utilization"):i.a.createElement("div",{id:"utilizationButton",onClick:function(){return e.handleUtilization(0)}},"Off"),o=0,l=[],c=[],d=[],u=[],p=[],h=[],b=[],f=function(t){u.push(i.a.createElement("th",{className:"border-bottom",key:o++},t));for(var n=[],a=[],r=[],s=function(s){var o="-",l=0;Object.values(e.state.flows).forEach(function(e,n){e.src===t.toString()&&e.dst===s.toString()&&(l=e.satisfied,o=e.demand)}),n.push(i.a.createElement("td",null,"-"===o?o:Math.round(1e4*o)/1e4)),a.push(i.a.createElement("td",null,0===l?"-":Math.round(1e5*l)/1e5)),r.push(i.a.createElement("td",null,"-"===o?"-":"".concat(Math.round(1e4*l/o)/100,"%"))),l,"-"===o?0:o},l=1;l<=parseInt(e.state.num_nodes);l++)s(l);p.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",{className:"border-right"},t),n)),h.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",{className:"border-right"},t),a)),b.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",{className:"border-right"},t),r))},m=1;m<=parseInt(this.state.num_nodes);m++)f(m);return l.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",null),u)),l.push(p),c.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",null),u)),c.push(h),d.push(i.a.createElement("tr",{key:o++},i.a.createElement("th",null),u)),d.push(b),this.state.scenarios&&this.state.scenarioSatisfaction&&(n=this.state.scenarios.map(function(t,n){return i.a.createElement("tr",{className:n===e.state.scenario?"selected":"",onClick:function(){return e.handleScenario(n)},key:n},i.a.createElement("td",{x:"0"},"Scenario ",n),i.a.createElement("td",{x:"50"},Math.round(1e6*e.state.probabilities[n])/1e4,"%"),i.a.createElement("td",{x:"80"},Math.round(1e6*e.state.scenarioSatisfaction[n])/1e4,"%"))})),this.state.cvar&&(a=i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",{className:"border-bottom",style:{paddingLeft:"10px"}},"VAR"),i.a.createElement("th",{className:"border-bottom"},"CVAR")),i.a.createElement("tr",null,i.a.createElement("td",{style:{paddingLeft:"20px"}},this.state.var),i.a.createElement("td",null,"".concat(Math.round(1e6*this.state.cvar)/1e4,"%"))))),i.a.createElement(q,null,i.a.createElement(Q,{ref:function(t){return e.svg=t}},i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none"},r),i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none"},s),i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none",style:{padding:"14px"}},this.state.scenarios&&this.state.scenarioSatisfaction&&i.a.createElement(Z,null,i.a.createElement("div",{className:"table-scroll"},i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null),i.a.createElement("th",null,"availability"),i.a.createElement("th",null,"demand satisfied")),n)))),this.state.showPaths&&i.a.createElement("foreignObject",{x:"0",y:"0",width:"100%",height:"100%",pointerEvents:"none",style:{padding:"14px"}},i.a.createElement(tt,null,i.a.createElement("tbody",null,i.a.createElement("tr",null,i.a.createElement("th",null),i.a.createElement("th",null,"weight"),i.a.createElement("th",null,"availability")),t)))),i.a.createElement("div",{className:"tableTitle"},"Demand"),i.a.createElement(et,null,i.a.createElement("tbody",null,l)),i.a.createElement("div",{className:"tableTitle"},"Successful Demand"),i.a.createElement(et,null,i.a.createElement("tbody",null,c)),i.a.createElement("div",{className:"tableTitle"},"Satisfied Demand"),i.a.createElement(et,null,i.a.createElement("tbody",null,d)),i.a.createElement("div",{className:"tableTitle"},"Loss"),i.a.createElement(et,null,a))}}]),e}(a.Component);n(33);function it(){var t=Object(f.a)(["\n background-color: #CCC\n padding: 20px;\n text-align: center;\n transition: .1s all;\n\n &:hover {\n background-color: #999;\n cursor: pointer;\n }\n"]);return it=function(){return t},t}function rt(){var t=Object(f.a)(["\n width: 100vw;\n height: 70vh;\n\n #inputs {\n text-align: center;\n padding-top: 40px;\n width: 100%;\n }\n #graph {\n background-color: #EEE;\n margin-top: 20px;\n border: 1px solid gray;\n height: 80vh;\n width: 90%;\n margin-left: auto;\n margin-right: auto;\n }\n"]);return rt=function(){return t},t}var st=m.a.div(rt()),ot=m.a.div(it()),lt=function(t){function e(t){var n;return Object(c.a)(this,e),(n=Object(u.a)(this,Object(p.a)(e).call(this,t))).state={login:!1,te:{inputs:{topology:"B4",demand:"1",path:"ED",beta:".9",cutoff:".0001",k:"4",downscale_demand:"1000",zeroindex:"false",demand_matrix:"true",num_nodes:0},results:{var:0,cvar:0,allocation:[],flows:[],capacity:[],T:[],Tf:[],links:[]},show_results:!1},stocks:{inputs:{tickers:[""],beta:.9,roi:50,target:40,days:800,budget:1e3,KEYS:["F6JGTHROSNY4A8MV","EGZPCEQOXI85VKRT","ASDPVYC2XRAJJ81K","M4XW13HI1CWYH0KN"],key:0},results:{},show_results:!1},error:"",mode:"TE"},n.setMode=n.setMode.bind(Object(b.a)(Object(b.a)(n))),n.login=n.login.bind(Object(b.a)(Object(b.a)(n))),n.removeError=n.removeError.bind(Object(b.a)(Object(b.a)(n))),n.handleTESubmit=n.handleTESubmit.bind(Object(b.a)(Object(b.a)(n))),n.handleTEInput=n.handleTEInput.bind(Object(b.a)(Object(b.a)(n))),n.handleStockInput=n.handleStockInput.bind(Object(b.a)(Object(b.a)(n))),n.handleTickerValue=n.handleTickerValue.bind(Object(b.a)(Object(b.a)(n))),n.handleAddTicker=n.handleAddTicker.bind(Object(b.a)(Object(b.a)(n))),n.handleTickerSubmit=n.handleTickerSubmit.bind(Object(b.a)(Object(b.a)(n))),n}return Object(h.a)(e,t),Object(d.a)(e,[{key:"setMode",value:function(t){this.setState(Object(l.a)({},this.state,{mode:t}))}},{key:"removeError",value:function(){this.setState(Object(l.a)({},this.state,{error:""}))}},{key:"login",value:function(t){"CVaR2019!"===t&&this.setState(Object(l.a)({},this.state,{login:!0}))}},{key:"handleStockInput",value:function(t,e){this.setState(Object(l.a)({},this.state,{stocks:Object(l.a)({},this.state.stocks,{inputs:Object(l.a)({},this.state.stocks.inputs,Object(o.a)({},e,t)),show_results:!1})}))}},{key:"handleTickerValue",value:function(t,e){var n=this.state.stocks.inputs.tickers;n[e]=t,this.setState(Object(l.a)({},this.state,{stocks:{inputs:Object(l.a)({},this.state.stocks.inputs,{tickers:n}),show_results:!1}}))}},{key:"handleAddTicker",value:function(){var t=this.state.stocks.inputs.tickers;t.push(""),this.setState(Object(l.a)({},this.state,{stocks:Object(l.a)({},this.state.stocks,{inputs:Object(l.a)({},this.state.stocks.inputs,{tickers:t}),show_results:!1})}))}},{key:"handleTickerSubmit",value:function(){var t=this,e=[],n=[];console.log(this.state.stocks.inputs.key),Promise.all(this.state.stocks.inputs.tickers.map(function(a){return new Promise(function(i,r){fetch("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=".concat(a,"&outputsize=full&apikey=").concat(t.state.stocks.inputs.KEYS[t.state.stocks.inputs.key]),{method:"GET",mode:"cors"}).then(function(t){return t.json()}).then(function(r){for(var s=[],o=r["Time Series (Daily)"],l=Object.keys(o),c=o[l[t.state.stocks.inputs.days+1]]["4. close"],d=t.state.stocks.inputs.days;d>=0;d--){var u=o[l[d]]["4. close"];s.push((u-c)/c),c=u}e.push(s),n.push(a),i()}).catch(function(t){r(t)})})})).then(function(){console.log({nstocks:t.state.stocks.inputs.tickers.length,returns:e,beta:t.state.stocks.inputs.beta,ticker_ordered:n});fetch("http://128.30.92.156:8080/api/cvarf",{method:"POST",mode:"cors",body:JSON.stringify({nstocks:t.state.stocks.inputs.tickers.length,returns:e,beta:parseFloat(t.state.stocks.inputs.beta),roi:parseFloat(t.state.stocks.inputs.roi/t.state.stocks.inputs.budget),target:parseFloat(t.state.stocks.inputs.target/t.state.stocks.inputs.budget)}),headers:{"Content-Type":"application/json"}}).then(function(t){return t.json()}).then(function(e){t.setState(Object(l.a)({},t.state,{stocks:Object(l.a)({},t.state.stocks,{results:e,show_results:!0,tickers:n})}))}).catch(function(t){return console.error("Error:",t)})}).catch(function(e){console.log(e);var n=t.state.stocks.inputs.key,a=t.state.stocks.inputs.key+1>=t.state.stocks.inputs.KEYS.length?0:t.state.stocks.inputs.key+1;t.setState(Object(l.a)({},t.state,{stocks:Object(l.a)({},t.state.stocks,{inputs:Object(l.a)({},t.state.stocks.inputs,{key:a})}),error:{error:e,message:"API error with key ".concat(n,"...")}}))})}},{key:"handleTEInput",value:function(t,e){console.log(this.state.te.inputs),this.setState(Object(l.a)({},this.state,{te:Object(l.a)({},this.state.te,{inputs:Object(l.a)({},this.state.te.inputs,Object(o.a)({},e,t)),show_results:!1})}))}},{key:"handleTESubmit",value:function(){var t=this,e={topology:this.state.te.inputs.topology,demand:this.state.te.inputs.demand,path:this.state.te.inputs.path,beta:this.state.te.inputs.beta,cutoff:this.state.te.inputs.cutoff};switch(this.state.te.inputs.path.includes("ksp")?e.k="".concat(this.state.te.inputs.path.split("_")[1]):e.k="4",e.topology){case"Custom":case"B4":e.downscale_demand="1";break;case"IBM":e.downscale_demand="1000";break;case"Abilene":e.downscale_demand="1";break;default:e.downscale_demand="1000"}fetch("http://128.30.92.156:8080/api/teavar",{method:"POST",mode:"cors",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}}).then(function(t){return t.json()}).then(function(n){console.log(n),t.setState(Object(l.a)({},t.state,{te:Object(l.a)({},t.state.te,{inputs:Object(l.a)({},t.state.te.inputs,{num_nodes:e.num_nodes,zeroindex:e.zeroindex}),results:n,show_results:!0})}))}).catch(function(t){return console.error("Error:",t)})}},{key:"render",value:function(){var t,e;return"TE"===this.state.mode?(e=i.a.createElement(v,{modes:["TE","Stocks"],mode:this.state.mode,setMode:this.setMode}),t=i.a.createElement("div",null,i.a.createElement(st,null,i.a.createElement("div",{id:"inputs"},i.a.createElement(E,{handleTESubmit:this.handleTESubmit,handleTEInput:this.handleTEInput})),i.a.createElement("div",{id:"graph"},i.a.createElement(at,{topology:this.state.te.inputs.topology,num_nodes:this.state.te.results.num_nodes,capacity:this.state.te.results.capacity,failure_probabilities:this.state.te.results.failure_probabilities,T:this.state.te.results.T,Tf:this.state.te.results.Tf,links:this.state.te.results.links,flows:this.state.te.results.flows,allocation:this.state.te.results.allocation,demand:this.state.te.results.demand,probabilities:this.state.te.results.probabilities,scenarios:this.state.te.results.scenarios,X:this.state.te.results.X,var:this.state.te.results.var,cvar:this.state.te.results.cvar}))))):this.state.login?(e=i.a.createElement(v,{modes:["TE","Stocks"],mode:this.state.mode,setMode:this.setMode}),t=i.a.createElement("div",null,i.a.createElement(j,{handleTickerValue:this.handleTickerValue,handleStockInput:this.handleStockInput,handleAddTicker:this.handleAddTicker,handleTickerSubmit:this.handleTickerSubmit,tickers:this.state.stocks.inputs.tickers,tickerMatches:this.state.stocks.tickerMatches}),this.state.stocks.show_results&&i.a.createElement(V,{data:this.state.stocks.results,roi:parseFloat(this.state.stocks.inputs.roi),target:parseFloat(this.state.stocks.inputs.target),tickers:this.state.stocks.tickers,budget:parseFloat(this.state.stocks.inputs.budget)}))):(t=i.a.createElement(z,{login:this.login}),e=i.a.createElement(v,{modes:["TE","Stocks"],mode:this.state.mode,setMode:this.setMode})),i.a.createElement("div",null,e,""!==this.state.error&&i.a.createElement(ot,{onClick:this.removeError},this.state.error.message),t)}}]),e}(a.Component);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));s.a.render(i.a.createElement(lt,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(t){t.unregister()})}},[[22,1,2]]]); +//# sourceMappingURL=main.dfab464e.chunk.js.map \ No newline at end of file diff --git a/www/demo/static/js/main.f2ae1659.chunk.js.map b/www/demo/static/js/main.dfab464e.chunk.js.map similarity index 86% rename from www/demo/static/js/main.f2ae1659.chunk.js.map rename to www/demo/static/js/main.dfab464e.chunk.js.map index 146bd6e..8ed6ea6 100644 --- a/www/demo/static/js/main.f2ae1659.chunk.js.map +++ b/www/demo/static/js/main.dfab464e.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["Header.jsx","TEInputs.jsx","StockInputs.jsx","TEOutputs.jsx","Login.jsx","StockOutputs.jsx","ForceGraph.jsx","App.js","serviceWorker.js","index.js"],"names":["StyledHeader","styled","div","_templateObject","Header","_this","this","modes","props","map","mode","num","react_default","a","createElement","key","className","onClick","e","setMode","id","Component","StyledInputs","TEInputs_templateObject","TEInputs","name","onChange","handleTEInput","target","value","default","type","placeholder","handleTESubmit","StockInputs_templateObject","StockInputs","matches","tickerInputs","tickers","ticker","concat","handleTickerValue","tickerMatches","StockInputs_StyledInputs","handleAddTicker","handleStockInput","handleTickerSubmit","TEOutputs_templateObject","Table","table","_templateObject2","StyledLogin","Login_templateObject","Login_templateObject2","Login","Object","classCallCheck","possibleConstructorReturn","getPrototypeOf","call","state","password","v","setState","_this2","Login_StyledInputs","handlePassword","login","StyledOutputs","StockOutputs_templateObject","SVG","svg","StockOutputs_templateObject2","AllocationTable","_templateObject3","InfoTable","_templateObject4","StockOutputs","console","log","beta","data","optimal_b","roi","budget","cvar","optimal_cvar","var","optimal_var","optimal_a","selected","allocation","gain","drawGraph","bind","assertThisInitialized","selectLine","highlightCircles","d","_this3","d3","style","attr","circle","filter","c","i","beta_vals","g_vals","gains","b","values","g","j","line_id","point_id","length","push","xScale","domain","range","width","scalesY","yScale","height","color","append","line","x","y","lines","selectAll","enter","on","text","formatter","xAxis","ticks","tickFormat","yAxis","allocation_info","point_info","_this4","statement_header","statement_weights","forEach","w","Math","round","ref","StyledResults","ForceGraph_templateObject","ForceGraph_templateObject2","ScenarioTable","ForceGraph_templateObject3","PathTable","ForceGraph_templateObject4","OuterTable","_templateObject5","colors","ForceGraph","simulation","numSelected","firstSelected","secondSelected","nodeSize","edgeLength","flows","showPaths","showUtilization","edgesByTunnel","nodesByTunnel","tunnelIndex","scenario","downLinks","dashLinks","colorNodes","secondaryNodes","secondaryTunnels","scenarios","capacity","failure_probabilities","linkUtilization","flowid","backFlowid","tips","graph","num_nodes","limitTraffic","click","arrowPress","dragstarted","dragged","dragended","changeTunnel","topology","clearGraph","f","T","Tf","links","demand","probabilities","X","simulateTraffic","nodes","src","toString","dst","permissable","scenarioSatisfaction","Array","fill","totalDemand","reduce","s","scenarioSentTraffic","satisfiedDemandForScenario","flow","satisfiedDemandForFlow","flowTunnels","getTunnels","tunnel","t","weight","sent","congested","minSpace","max","apply","toConsumableArray","link","min","index","satisfied","tunnels","updateGraph","active","alphaTarget","restart","fx","fy","opacity","String","bool","_this5","forwardLinks","source","backLinks","includes","dash","animate","clearInterval","dashInterval","offset","setInterval","node1","node2","ret","_this6","allTunnels","total_weight","numAvailable","availability","prob","edges_used","edge","backindex","l","line1","line2","tip","select","parentNode","rect","bbox","node","getBBox","_this7","remove","each","colorLinks","animateLinks","addTip","resetColors","_this8","keyCode","preventDefault","handleScenario","_this9","linkTraffic","_loop","linklabel","html","_this10","getTunnelNodes","_this$getNodeDemand","getNodeDemand","_this$getNodeDemand2","slicedToArray","demandedTo","demandedFrom","_this11","_this12","_this$setState","_this$getNodeDemand3","_this$getNodeDemand4","defineProperty","getFlow","backFlow","_this13","document","addEventListener","force","distance","strength","getBoundingClientRect","then","error","objectSpread","that","xpos","angle","atan2","cos","ypos","sin","transition","duration","pageX","pageY","path_info","_this14","limitButton","handleLimit","utilizationButton","handleUtilization","sentDemand","thead","demandRows","sentRows","satisfiedRows","_loop2","demandRow","sentRow","satisfiedRow","_loop3","satisfiedDemand","parseInt","paddingLeft","ForceGraph_SVG","pointerEvents","padding","TESection","App_templateObject","StyledError","App_templateObject2","App","te","inputs","path","cutoff","k","downscale_demand","zeroindex","demand_matrix","results","show_results","stocks","days","KEYS","removeError","newtickers","returns","ticker_ordered","Promise","all","resolve","reject","fetch","method","res","json","daily_returns","daily_data","keys","last","curr","catch","nstocks","body","JSON","stringify","parseFloat","headers","Content-Type","response","oldkey","newkey","message","split","home","header","src_Header","src_TEInputs","src_ForceGraph","src_StockInputs","src_StockOutputs","src_Login","Boolean","window","location","hostname","match","ReactDOM","render","src_App","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.f2ae1659.chunk.js","sourcesContent":["import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst StyledHeader = styled.div`\n position: fixed;\n height: 67px;\n width: 100vw;\n top: 0;\n border-bottom: 1px solid #222;\n box-shadow: 0 1px 0 #262626;\n background-color: #191919;\n background-image: -webkit-gradient(linear,left top,left bottom,from(#282828),to(#191919));\n background-image: -webkit-linear-gradient(top,#282828,#191919);\n background-image: linear-gradient(top,#282828,#191919);\n background-repeat: no-repeat;\n z-index: 10;\n\n #left {\n position: absolute;\n height: 100%;\n left: 10px;\n }\n\n #center {\n position: absolute;\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n color: white;\n\n #title {\n font-size: 25px;\n padding-top: 15px;\n }\n }\n\n #right {\n position: absolute;\n height: 100%;\n padding-top: 20px;\n padding-right: 20px;\n right: 10px;\n color: white;\n\n .link {\n cursor: pointer;\n &:hover {\n border-bottom: 1px solid white;\n }\n }\n }\n`;\n\n\nclass Header extends Component {\n render() {\n let modes = this.props.modes.map((mode, num) => {\n return this.props.mode === mode ? \"\" :\n
this.props.setMode(mode)}>{mode}
\n })\n return (\n
\n \n
\n
\n
\n
\n TEAVAR Demo\n
\n
\n
\n {modes}\n
\n
\n
\n );\n }\n}\n\nexport default Header;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst StyledInputs = styled.div`\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 370px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n input, form {\n font-size: 20px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 90px;\n height: calc(100% - 29px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 18px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 350px;\n }\n button {\n margin: 10px;\n font-size: 20px;\n }\n`;\n\nclass TEInputs extends Component {\n render() {\n return (\n
\n \n
\n
Topology
\n
\n \n
\n
\n
\n
Demand
\n
\n \n
\n
\n
\n
Paths
\n
\n \n
\n
\n
\n
Beta (%)
\n this.props.handleTEInput(e.target.value, \"beta\")}\n />\n
\n
\n
Cutoff (%)
\n this.props.handleTEInput(e.target.value, \"cutoff\")}\n />\n
\n \n
\n
\n );\n }\n}\n\nexport default TEInputs;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\n\nconst StyledInputs = styled.div`\n margin 40px auto;\n text-align: center;\n\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n\n\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n input {\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .matches {\n position: relative;\n top: 10px;\n }\n button {\n margin: 10px;\n }\n`;\n\nclass StockInputs extends Component {\n\n render() {\n const tickerInputs =\n this.props.tickers.map((ticker, num) => {\n return (\n this.props.handleTickerValue(e.target.value, num)}\n />\n\n );\n });\n\n let matches\n if (this.props.tickerMatches) {\n matches = this.props.tickerMatches.map(ticker => (
{ticker[\"1. symbol\"]}
))\n }\n\n return (\n
\n \n
Portfolio Tickers
\n\n {tickerInputs}\n
\n {matches}\n
\n \n
\n
Budget ($)
\n this.props.handleStockInput(e.target.value, \"budget\")}\n />\n
\n
\n
Return ($)
\n this.props.handleStockInput(e.target.value, \"roi\")}\n />\n
\n
\n
Loss ($)
\n this.props.handleStockInput(e.target.value, \"target\")}\n />\n
\n {/* this.props.handleStockInput(e.target.value, \"days\")}\n />*/}\n \n
\n
\n );\n }\n}\n\n\nexport default StockInputs;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst Allocation = styled.div`\n color: white;\n`;\n\nconst Table = styled.table`\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n`;\n\n\nclass TEOutputs extends Component {\n\n constructor(props) {\n super(props);\n // let flows = new Array(6);\n // let demand = new Array(6);\n // let satisfied = new Array(6);\n // for (let i = 0; i < flows.length; i++) {\n // demand[i] = new Array(6);\n // flows[i] = new Array(6);\n // satisfied[i] = new Array(6);\n // for (let j = 0; j < 6; j++) {\n // flows[i][j] = \"-\";\n // demand[i][j] = \"-\";\n // satisfied[i][j] = \"-\";\n // }\n // }\n\n\n // this.state = {\n // flows: flows,\n // demand: demand,\n // satisfied: satisfied,\n // }\n let flows = new Array(Number(props.num_nodes));\n let demand = new Array(Number(props.num_nodes));\n let satisfied = new Array(Number(props.num_nodes));\n for (let i = 0; i < flows.length; i++) {\n flows[i] = new Array(Number(props.num_nodes));\n demand[i] = new Array(Number(props.num_nodes));\n satisfied[i] = new Array(Number(props.num_nodes));\n for (let j = 0; j < props.num_nodes; j++) {\n flows[i][j] = \"-\";\n demand[i][j] = \"-\";\n satisfied[i][j] = \"-\";\n }\n }\n let offset = props.zeroindex ? 1 : 0;\n for (let i = 0; i < props.data.flows.length; i++) {\n let a = props.data.allocation[i].reduce((partial_sum, s) => partial_sum + s);\n flows[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a * 100) / 100;\n demand[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(props.data.demand[i] * 100) / 100;\n satisfied[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a /props.data.demand[i] * 100) + \"%\";\n };\n this.state = {\n ...this.state,\n flows: flows,\n demand: demand,\n satisfied: satisfied,\n }\n }\n\n componentWillReceiveProps(props) {\n console.log(props)\n let flows = new Array(Number(props.num_nodes));\n let demand = new Array(Number(props.num_nodes));\n let satisfied = new Array(Number(props.num_nodes));\n for (let i = 0; i < flows.length; i++) {\n flows[i] = new Array(Number(props.num_nodes));\n demand[i] = new Array(Number(props.num_nodes));\n satisfied[i] = new Array(Number(props.num_nodes));\n for (let j = 0; j < props.num_nodes; j++) {\n flows[i][j] = \"-\";\n demand[i][j] = \"-\";\n satisfied[i][j] = \"-\";\n }\n }\n let offset = props.zeroindex ? 1 : 0;\n for (let i = 0; i < props.data.flows.length; i++) {\n let a = props.data.allocation[i].reduce((partial_sum, s) => partial_sum + s);\n flows[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a * 100) / 100;\n demand[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(props.data.demand[i] * 100) / 100;\n satisfied[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a /props.data.demand[i] * 100) + \"%\";\n };\n this.setState({\n ...this.state,\n flows: flows,\n demand: demand,\n satisfied: satisfied,\n })\n }\n\n render() {\n let key = 0;\n let flows = []\n let thead = []\n if (this.state.flows[0]) {\n for (let i = 0; i < this.state.flows[0].length; i++) {\n thead.push({i})\n }\n }\n flows.push({thead})\n\n for (let i = 0; i < this.state.flows.length; i++) {\n let row = this.state.flows[i]\n let rowDOM = []\n for (let j = 0; j < row.length; j++) {\n rowDOM.push({row[j]});\n }\n flows.push({i}{rowDOM});\n }\n\n\n let demand = []\n thead = []\n if (this.state.demand[0]) {\n for (let i = 0; i < this.state.demand[0].length; i++) {\n thead.push({i})\n }\n }\n demand.push({thead})\n\n for (let i = 0; i < this.state.demand.length; i++) {\n let row = this.state.demand[i]\n let rowDOM = []\n for (let j = 0; j < row.length; j++) {\n rowDOM.push({row[j]});\n }\n demand.push({i}{rowDOM});\n }\n\n let satisfied = []\n thead = []\n if (this.state.satisfied[0]) {\n for (let i = 0; i < this.state.satisfied[0].length; i++) {\n thead.push({i})\n }\n }\n satisfied.push({thead})\n\n for (let i = 0; i < this.state.satisfied.length; i++) {\n let row = this.state.satisfied[i]\n let rowDOM = []\n for (let j = 0; j < row.length; j++) {\n rowDOM.push({row[j]});\n }\n satisfied.push({i}{rowDOM});\n }\n return (\n
\n \n \n {flows}\n \n
\n \n \n {demand}\n \n
\n \n \n {satisfied}\n \n
\n
\n );\n }\n}\n\nexport default TEOutputs;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst StyledLogin = styled.div`\n margin-top: 30vh;\n`;\n\nconst StyledInputs = styled.div`\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n .input-elt {\n font-size: 15px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n .input-elt {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .button {\n color: white;\n display: block;\n width: 75px;\n background-color: #999;\n vertical-align: top;\n margin: 10px auto;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n border-radius: 5px;\n }\n`;\n\nclass Login extends Component {\n constructor(props) {\n super(props);\n this.state = {\n password: \"\",\n }\n }\n\n handlePassword(v) {\n this.setState({\n password: v,\n })\n }\n render() {\n return (\n \n \n
\n {/*
Password
*/}\n this.handlePassword(e.target.value)}\n />\n this.props.login(this.state.password)}\n value=\"Login\"\n />\n \n\n
\n
\n );\n }\n}\n\nexport default Login;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\nimport * as d3 from \"d3\";\n\nconst StyledOutputs = styled.div`\n position: relative;\n svg {\n font-family: Sans-Serif, Arial;\n }\n .line {\n stroke-width: 4;\n fill: none;\n }\n\n .axis path {\n stroke: black;\n }\n\n .text {\n font-size: 12px;\n }\n\n .title-text {\n font-size: 12px;\n }\n\n #all-statements {\n display: block;\n width: 100%;\n border-bottom: 1px solid black;\n }\n\n #statement-table {\n background-color: #EEE;\n margin-top: 10px;\n }\n\n #statements {\n width: 40%;\n margin: 0px auto;\n margin-bottom: 70px;\n background-color: #EEE;\n padding: 20px;\n border-radius: 5px;\n font-size: 18px;\n text-align:center;\n\n div {\n margin: 20px 0px;\n }\n .colorGreen {\n color: rgb(0,150,0);\n }\n .colorRed {\n color: rgb(150, 0,0);\n }\n }\n`;\n\nconst SVG = styled.svg`\n display: block;\n margin: -60px auto 0px auto;\n height: 700px;\n width: 900px;\n`;\n\nconst AllocationTable = styled.table`\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 0px auto;\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nconst InfoTable = styled.table`\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 10px auto;\n margin-top: 70px;\n\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nclass StockOutputs extends Component {\n constructor(props){\n super(props)\n console.log(props)\n this.state = {\n beta: props.data.optimal_b,\n roi: props.roi/props.budget,\n cvar: props.data.optimal_cvar,\n var: props.data.optimal_var,\n a: props.data.optimal_a,\n budget: props.budget,\n selected: {\n allocation: props.data.optimal_a,\n var: props.data.optimal_var,\n cvar: props.data.optimal_cvar,\n gain: props.roi/props.budget,\n name: \"test_\" + props.data.optimal_b,\n id: -1,\n }\n }\n this.drawGraph = this.drawGraph.bind(this);\n this.selectLine = this.selectLine.bind(this);\n this.highlightCircles = this.highlightCircles.bind(this);\n }\n\n componentDidMount() {\n this.drawGraph(this.props.data)\n }\n\n componentWillReceiveProps(props) {\n console.log(props);\n this.setState({\n // allocation: props.data.optimal_a,\n // var: props.data.optimal_var,\n // cvar: props.data.optimal_cvar,\n beta: props.data.optimal_b,\n roi: props.roi/props.budget,\n cvar: props.data.optimal_cvar,\n var: props.data.optimal_var,\n budget: props.budget,\n a: props.data.optimal_a,\n selected: {\n allocation: props.data.optimal_a,\n var: props.data.optimal_var,\n cvar: props.data.optimal_cvar,\n gain: props.roi/props.budget,\n name: \"test_\" + props.data.optimal_b,\n }\n })\n this.drawGraph(props.data);\n }\n\n selectLine(d) {\n console.log(d)\n this.setState({\n selected: d,\n }, () => {\n this.highlightCircles();\n })\n }\n\n highlightCircles() {\n d3.selectAll(\"circle\").style(\"opacity\", .5)\n d3.selectAll(\"circle\").attr(\"r\", 6)\n if (this.state.selected) {\n let circle = d3.selectAll(\"circle\").filter((c, i) => (c.id === this.state.selected.id));\n circle.style(\"opacity\", 1);\n circle.attr(\"r\", 8)\n }\n\n }\n\n drawGraph(d) {\n console.log(d)\n var beta_vals = d.beta\n var g_vals = d.gains\n var id = 0;\n var data = beta_vals.map((b,i) => {\n var values = g_vals.map((g,j) => {\n return {\n gain: g,\n cvar: d.cvar[i][j],\n var: d.var[i][j],\n allocation: d.allocation[i][j],\n name: \"test_\" + b,\n line_id: i,\n point_id: j,\n id: id++,\n }\n });\n return {\n name: \"Beta=\" + b,\n values: values,\n beta: b,\n id: i,\n }\n });\n var line_id = data.length\n data.push({\n name: \"Beta=\" + d.optimal_b,\n beta: d.optimal_b,\n id: id++,\n values: [{\n gain: this.props.roi/this.props.budget,\n cvar: d.optimal_cvar,\n var: d.optimal_var,\n allocation: d.optimal_a,\n name: \"test_\" + d.optimal_b,\n line_id: line_id + 1,\n point_id: -1,\n id: -1,\n }],\n })\n\n console.log(data)\n var width = 800;\n var height = 600;\n var margin = 100;\n var duration = 100;\n\n var lineOpacity = \"0.25\";\n var lineOpacityHover = \"0.6\";\n var otherLinesOpacityHover = \"0.1\";\n var lineStroke = \"4px\";\n var lineStrokeHover = \"4px\";\n\n var circleOpacity = '0.85';\n var circleOpacityOnLineHover = \"0.25\"\n var circleRadius = 6;\n var circleRadiusHover = 8;\n\n /* Scale */\n var xScale = d3.scaleLinear ()\n .domain(d3.extent(data[0].values, d => d.gain))\n .range([0, width-margin]);\n\n var scalesY = d.cvar\n scalesY.push([d.optimal_cvar])\n var yScale = d3.scaleLinear()\n .domain([d3.min(scalesY.map(cvar => d3.min(cvar, d => d)), d => d), d3.max(scalesY.map(cvar => d3.max(cvar, d => d)), d => d)])\n .range([height-margin, 0]);\n\n var color = d3.scaleOrdinal(d3.schemeCategory10);\n\n /* Add SVG */\n var svg = d3.select(this.svg)\n .append('g')\n .attr(\"height\", (height + margin) + \"px\")\n .attr(\"width\", (width + margin) + \"px\")\n .attr(\"transform\", `translate(${margin}, ${margin})`);\n\n svg.append(\"text\")\n .attr(\"class\", \"title-text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", (width-margin)/2)\n .attr(\"y\", 5);\n\n /* Add line into SVG */\n var line = d3.line()\n .x(d => xScale(d.gain))\n .y(d => yScale(d.cvar));\n\n let lines = svg.append('g')\n .attr('class', 'lines');\n\n\n let highlightCircles = this.highlightCircles;\n lines.selectAll('.line-group')\n .data(data).enter()\n .append('g')\n .attr('class', 'line-group')\n .append('path')\n .attr('class', 'line')\n .attr('d', d => line(d.values))\n .style('stroke', (d, i) => color(i))\n .style('opacity', lineOpacity)\n .on(\"mouseover\", function(d, i) {\n d3.selectAll('.line')\n .style('opacity', otherLinesOpacityHover);\n d3.selectAll(\"circle\").filter((c, i) => (c.line_id === d.id))\n .attr('opacity', 1);\n d3.select(this)\n .style('opacity', lineOpacityHover)\n .style(\"stroke-width\", lineStrokeHover)\n .style(\"cursor\", \"pointer\");\n })\n .on(\"mouseout\", function(d) {\n highlightCircles();\n d3.select(this)\n .style('opacity', lineOpacity)\n .style(\"stroke-width\", lineStroke)\n .style(\"cursor\", \"pointer\");\n });\n\n\n /* Add circles in the line */\n lines.selectAll(\"circle-group\")\n .data(data).enter()\n .append(\"g\")\n .attr(\"id\", (d,i) => `circle-group-${i}`)\n .attr(\"class\", \"circle-group\")\n .style(\"fill\", (d, i) => color(i))\n .selectAll(\"circle\")\n .data(d => d.values).enter()\n .append(\"g\")\n .attr(\"class\", \"circle\")\n .attr(\"id\", (d,i) => `circle-${i}`)\n .on(\"click\", this.selectLine)\n // .on(\"mouseover\", function(d) {\n // d3.select(this)\n // .style(\"cursor\", \"pointer\")\n // .append(\"text\")\n // .attr(\"class\", \"text\")\n // .text(`${d.cvar}`)\n // .attr(\"x\", d => xScale(d.gain) + 5)\n // .attr(\"y\", d => yScale(d.cvar) - 10);\n // })\n // .on(\"mouseout\", function(d) {\n // d3.select(this)\n // .style(\"cursor\", \"none\")\n // .transition()\n // .duration(duration)\n // .selectAll(\".text\").remove();\n // })\n .append(\"circle\")\n .attr(\"cx\", d => xScale(d.gain))\n .attr(\"cy\", d => yScale(d.cvar))\n .attr(\"r\", circleRadius)\n .style('opacity', circleOpacity)\n .on(\"mouseover\", function(d, i) {\n d3.selectAll(\"circle\").filter((c, i) => (c.id === d.id))\n .attr(\"r\", circleRadiusHover);\n })\n .on(\"mouseout\", function(d) {\n d3.selectAll(\"circle\").filter((c, i) => (c.id === d.id))\n .attr(\"r\", circleRadius);\n highlightCircles();\n })\n\n d3.selectAll(\".circle-group\")\n .append(\"text\")\n .attr(\"class\", \"text\")\n .text(d => d.name)\n .attr(\"x\", d => xScale(d.values[0].gain) + 20)\n .attr(\"y\", d => yScale(d.values[0].cvar))\n\n /* Add Axis into SVG */\n var formatter = d3.format(\".3p\");\n var xAxis = d3.axisBottom(xScale).ticks(5).tickFormat(formatter);\n var yAxis = d3.axisLeft(yScale).ticks(5).tickFormat(formatter);\n\n svg.append(\"g\")\n .attr(\"class\", \"x axis\")\n .attr(\"transform\", `translate(0, ${height-margin})`)\n .call(xAxis)\n .append('text')\n .attr(\"x\", (width-margin)/2)\n .attr(\"y\", \"45\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"fill\", \"#000\")\n .attr(\"font-size\", \"18px\")\n .text(\"Return on Investment (%)\");\n\n svg.append(\"g\")\n .attr(\"class\", \"y axis\")\n .attr(\"dy\", \"1em\")\n .call(yAxis)\n .append('text')\n .attr(\"y\", -50)\n .attr(\"x\", -(height - margin)/2)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"transform\", \"rotate(-90)\")\n .attr(\"fill\", \"#000\")\n .attr(\"font-size\", \"18px\")\n .text(\"Conditional Value at Risk (%)\");\n\n this.highlightCircles();\n }\n render() {\n let allocation_info;\n let point_info;\n let statement_header = []\n let statement_weights = []\n this.state.a.forEach((w,i) => {\n statement_header.push({this.props.tickers[i]})\n statement_weights.push(${Math.round(w * 100 * this.state.budget)/100})\n })\n\n if (this.state.selected) {\n point_info = (\n {Math.round(this.state.selected.var * 100000)/1000}%\n {Math.round(this.state.selected.cvar * 100000)/1000}%\n {Math.round(this.state.selected.gain * 100000)/1000}%\n )\n allocation_info = this.state.selected.allocation.map((w, i) => {\n return \n {this.props.tickers[i]}\n {Math.round(w * 100000)/1000}%\n \n })\n }\n\n console.log(this.state)\n return (\n \n
\n \n \n \n {statement_header}\n \n \n {statement_weights}\n \n \n \n
\n
Your gain is\n {Math.round(this.state.roi * 100 * this.state.budget)/100}$ \n return on invesment\n
\n
Your loss is no less than\n {Math.round(this.state.var * 100 * this.state.budget)/100}$ \n with probability\n {Math.round(this.state.beta * 100000)/1000}% \n
\n
In the worst\n {Math.round((1-this.state.beta) * 100000)/1000}% \n of days, your average loss is\n {Math.round(this.state.cvar * 100 * this.state.budget)/100}$\n
\n
\n
\n \n \n \n VAR\n CVAR\n ROI\n \n { point_info }\n \n \n \n \n \n Ticker\n weight\n \n { allocation_info }\n \n \n this.svg = svg}\n >\n \n\n {/*
\n VAR:\n
\n {this.props.data.var}\n
\n
\n
\n CVAR:\n
\n {this.props.data.cvar}\n
\n
\n
\n Allocation:\n
\n {this.props.data.allocation}\n
\n
*/}\n
\n );\n }\n}\n\nexport default StockOutputs;\n","import React, {Component} from 'react';\nimport * as d3 from \"d3\";\nimport styled from 'styled-components';\n\nconst StyledResults = styled.div`\n height: 100%;\n .tableTitle {\n margin-top: 20px;\n text-align: center;\n }\n`;\n\nconst SVG = styled.svg`\n width: 100%;\n height: 100%;\n\n .links line {\n stroke: #888;\n stroke-width: 6;\n }\n\n .nodes circle {\n pointer-events: all;\n stroke: none;\n stroke-width: 15px;\n cursor: pointer;\n }\n\n #limitButton {\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n position: absolute;\n bottom: 7px;\n left: 7px;\n }\n\n #utilizationButton {\n position: absolute;\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n bottom: 7px;\n right: 7px;\n }\n\n select {\n position: absolute;\n top: 7px;\n left: 7px;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n overflow: hidden;\n padding: 5px 35px 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: auto;\n }\n`\n\nconst ScenarioTable = styled.table`\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: left;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .table-scroll {\n height: 200px;\n overflow: scroll;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nconst PathTable = styled.table`\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: right;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nconst OuterTable = styled.table`\n font-size: 14px;\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n`;\n\nlet colors = [\"#1abc9c\", \"#3498db\", \"#9b59b6\", \"#34495e\", \"#e67e22\", \"#f1c40f\"];\nlet dashes = [\"5,5\", \"10,10\", \"20, 20\", \"20,10,5,5,5,10\", \"10,10,5,10\"]\n\nclass ForceGraph extends Component {\n constructor(props){\n super(props)\n this.state = {\n simulation: \"\",\n numSelected: 0,\n firstSelected: null,\n secondSelected: null,\n nodeSize: 9,\n edgeLength: 100,\n flows: [],\n allocation: [],\n showPaths: false,\n showUtilization: 0,\n edgesByTunnel: [],\n nodesByTunnel: [],\n tunnelIndex: 0,\n scenario: 0,\n downLinks: [],\n dashLinks: [],\n colorNodes: [],\n secondaryNodes: [],\n secondaryTunnels: [],\n scenarios: [],\n capacity: [],\n failure_probabilities: [],\n linkUtilization: [],\n flowid: null,\n backFlowid: null,\n tips: [],\n graph: null,\n num_nodes: 0,\n limitTraffic: true,\n }\n this.click = this.click.bind(this);\n this.arrowPress = this.arrowPress.bind(this);\n this.dragstarted = this.dragstarted.bind(this);\n this.dragged = this.dragged.bind(this);\n this.dragended = this.dragended.bind(this);\n this.changeTunnel = this.changeTunnel.bind(this);\n this.showUtilization = this.showUtilization.bind(this);\n\n }\n\n componentDidMount() {\n this.drawGraph(this.props.topology)\n }\n\n componentWillReceiveProps(props) {\n this.clearGraph();\n this.drawGraph(props.topology);\n this.setState({\n num_nodes: props.num_nodes,\n f: props.flows,\n T: props.T,\n Tf: props.Tf,\n links: props.links,\n allocation: props.allocation,\n demand: props.demand,\n probabilities: props.probabilities,\n scenarios: props.scenarios,\n scenario: 0,\n showUtilization: 0,\n capacity: props.capacity,\n failure_probabilities: props.failure_probabilities,\n flowid: null,\n downLinks: [],\n X: props.X,\n var: props.var,\n cvar: props.cvar,\n limitTraffic: true,\n linkUtilization: [],\n }, () => {\n this.simulateTraffic();\n // let flows = {}\n // props.flows.forEach((nodes, flowid) => {\n // let tunnels = this.getTunnels(flowid, nodes[0], nodes[1]);\n // flows[flowid] = {\n // id: flowid,\n // src: nodes[0].toString(),\n // dst: nodes[1].toString(),\n // tunnels: tunnels,\n // demand: props.demand[flowid],\n // permissable: 1 - props.var,\n // };\n // })\n // let satisfiedDemand = [];\n // if (props.scenarios) {\n // let totalDemand = props.demand.reduce((i, j) => i + j);\n // props.scenarios.forEach((scenario, s) => {\n // let sentTraffic = this.state.graph ? new Array(this.state.graph.links.length).fill(0) : [];\n // let satisfied = 0;\n // Object.values(flows).forEach((flow, f) => {\n // let total_weight = 0;\n // let numAvailable = 0;\n // flow.tunnels.forEach((tunnel, t) => {\n // total_weight += props.X[s][tunnel.id] === 1 ? this.state.allocation[f][t] : 0;\n // numAvailable += props.X[s][tunnel.id] === 1 ? 1 : 0;\n // });\n // flow.tunnels.forEach((tunnel, t) => {\n // let weight = 0\n // if (props.X[s][tunnel.id] === 1) {\n // weight = total_weight !== 0 ?\n // (this.state.allocation[f][t] / total_weight) :\n // (1 / numAvailable);\n // } else {\n // weight = 0;\n // }\n // let congested = false;\n // tunnel.links.forEach(link => {\n // // let ls = this.state.graph.links.filter((l, index) => index === link.index);\n // if (sentTraffic[link.index] >= this.state.capacity[link.index]) {\n // congested = true;\n // }\n // })\n // if (!congested) {\n // tunnel.links.forEach(link => {\n // sentTraffic[link.index] += weight * flow.demand * flow.permissable\n // });\n // satisfied += weight * flow.demand * flow.permissable\n // }\n // })\n // })\n // satisfiedDemand.push(satisfied / totalDemand)\n // });\n // };\n // this.setState({\n // flows,\n // scenarioSatisfaction: satisfiedDemand,\n // }, this.updateGraph)\n });\n }\n\n componentDidUpdate(state) {\n // this.drawGraph()\n }\n\n simulateTraffic() {\n console.log(this.state);\n let flows = {}\n this.state.f.forEach((nodes, flowid) => {\n flows[flowid] = {\n id: flowid,\n src: nodes[0].toString(),\n dst: nodes[1].toString(),\n demand: this.state.demand[flowid],\n permissable: this.state.limitTraffic ? 1 - this.state.var : 1,\n };\n })\n let scenarioSatisfaction = [];\n let linkUtilization = new Array(this.state.capacity.length).fill(0);\n if (this.state.scenarios) {\n let totalDemand = this.state.demand.reduce((i, j) => i + j);\n this.state.scenarios.forEach((scenario, s) => {\n let scenarioSentTraffic = this.state.graph ? new Array(this.state.graph.links.length).fill(0) : [];\n let satisfiedDemandForScenario = 0;\n Object.values(flows).forEach((flow, f) => {\n let satisfiedDemandForFlow = 0;\n let flowTunnels = this.getTunnels(flow.id, flow.src, flow.dst, s);\n flowTunnels.forEach((tunnel, t) => {\n let weight = tunnel.weight;\n let sent = weight * flow.demand * flow.permissable;\n\n let congested = false;\n let minSpace = Math.max(...this.state.capacity);\n tunnel.links.forEach(link => {\n minSpace = Math.min(minSpace, this.state.capacity[link.index] - scenarioSentTraffic[link.index])\n if (scenarioSentTraffic[link.index] + sent > this.state.capacity[link.index]) {\n congested = true;\n }\n })\n\n if (!congested) {\n tunnel.links.forEach(link => {\n scenarioSentTraffic[link.index] += sent;\n if (s === this.state.scenario) {\n linkUtilization[link.index] += sent;\n }\n });\n if (s === this.state.scenario) {\n tunnel.sent = sent;\n satisfiedDemandForFlow += sent;\n }\n satisfiedDemandForScenario += sent;\n } else if (minSpace > 0){\n sent = minSpace;\n tunnel.links.forEach(link => {\n scenarioSentTraffic[link.index] += sent;\n if (s === this.state.scenario) {\n linkUtilization[link.index] += weight * flow.demand * flow.permissable;\n // TODO \n // linkUtilization[link.index] += sent;\n }\n });\n if (s === this.state.scenario) {\n tunnel.sent = sent;\n satisfiedDemandForFlow += sent;\n }\n satisfiedDemandForScenario += sent;\n }\n })\n if (s === this.state.scenario) {\n flow.satisfied = satisfiedDemandForFlow;\n flow.tunnels = flowTunnels;\n }\n })\n scenarioSatisfaction.push(satisfiedDemandForScenario / totalDemand)\n });\n };\n this.setState({\n flows,\n scenarioSatisfaction,\n linkUtilization,\n }, () => {\n this.updateGraph();\n this.changeTunnel(0);\n });\n }\n\n // simulateScenario(s) {\n // return flows, satifiedDemand, \n // }\n\n dragstarted(d) {\n if (!d3.event.active) this.state.simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n }\n\n dragged(d) {\n d.fx = d3.event.x;\n d.fy = d3.event.y;\n }\n\n dragended(d) {\n if (!d3.event.active) this.state.simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n }\n\n handleUtilization(opacity) {\n this.setState({\n showUtilization: opacity,\n }, this.updateGraph)\n }\n \n handleScenario(scenario) {\n let downLinks = [];\n this.simulateTraffic();\n this.state.scenarios[scenario].forEach((s, i) => {\n if (!s) {\n downLinks.push({src: String(this.state.links[i][0]), dst: String(this.state.links[i][1])});\n }\n });\n this.setState({\n downLinks: downLinks,\n scenario: scenario,\n }, () => {\n this.simulateTraffic();\n });\n }\n\n handleLimit(bool) {\n this.setState({\n limitTraffic: bool,\n }, () => {\n this.simulateTraffic();\n });\n }\n\n colorLinks(links, color){\n let forwardLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.src === d.source.id && link.dst === d.target.id) { filter = true }\n })\n return filter;\n })\n let backLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.dst === d.source.id && link.src === d.target.id) { filter = true }\n })\n return filter;\n })\n forwardLinks.style(\"stroke-opacity\", .6);\n forwardLinks.style(\"stroke\", color);\n backLinks.style(\"stroke-opacity\", 0);\n backLinks.style(\"stroke\", color);\n }\n\n colorNodes(nodes, color){\n let colorNodes = d3.selectAll('circle').filter(function(d) {return (nodes.includes(d.id))})\n colorNodes.style(\"fill\", color);\n }\n\n dashLinks(links, dash, animate){\n // clearInterval(this.dashInterval);\n let forwardLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.src === d.source.id && link.dst === d.target.id) { filter = true }\n })\n return filter;\n })\n let backLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.dst === d.source.id && link.src === d.target.id) { filter = true }\n })\n return filter;\n })\n forwardLinks.style(\"stroke-opacity\", 1);\n forwardLinks.style(\"stroke-dasharray\", dash);\n // var offset = 1;\n // if (animate) {\n // this.dashInterval = setInterval(function() {\n // forwardLinks.style('stroke-dashoffset', offset);\n // offset -= 1; \n // }, 50);\n // }\n // backLinks.style(\"stroke-opacity\", 0);\n // backLinks.style(\"stroke-dasharray\", dash);\n forwardLinks.attr('marker-end','url(#arrowhead)')\n }\n\n animateLinks(links){\n clearInterval(this.dashInterval);\n let forwardLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.src === d.source.id && link.dst === d.target.id) { filter = true }\n })\n return filter;\n })\n let backLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.dst === d.source.id && link.src === d.target.id) { filter = true }\n })\n return filter;\n })\n forwardLinks.style(\"stroke-opacity\", 1);\n var offset = 1;\n this.dashInterval = setInterval(function() {\n forwardLinks.style('stroke-dashoffset', offset);\n offset -= 1; \n }, 50);\n backLinks.style(\"stroke-opacity\", 0);\n forwardLinks.attr('marker-end','url(#arrowhead)')\n }\n\n getTunnelNodes(tunnel) {\n let nodes = []\n tunnel.links.forEach(link => {\n if (!nodes.includes(link.src)) { nodes.push(link.src) };\n if (!nodes.includes(link.dst)) { nodes.push(link.dst) };\n })\n return nodes;\n }\n\n\n getFlow(node1, node2) {\n let ret = null\n Object.values(this.state.flows).forEach(flow => {\n if (flow.src === node1 && flow.dst === node2) {\n ret = flow\n }\n });\n return ret\n }\n\n getTunnels(f, node1, node2, s) {\n let allTunnels = []\n let tunnels = this.state.Tf[f];\n let total_weight = 0;\n let numAvailable = 0;\n tunnels.forEach((tunnel, t) => {\n total_weight += this.state.X[s][tunnel - 1] === 1 ? this.state.allocation[f][t] : 0;\n numAvailable += this.state.X[s][tunnel - 1] === 1 ? 1 : 0;\n });\n\n tunnels.forEach((tunnel, t) => {\n let availability = 0;\n this.state.probabilities.forEach((prob, s) => {\n availability += prob * this.state.X[s][tunnel - 1];\n })\n let weight = 0\n if (this.state.X[s][tunnel - 1] === 1) {\n weight = total_weight !== 0 ?\n (this.state.allocation[f][t] / total_weight) :\n (1 / numAvailable);\n } else {\n weight = 0;\n }\n let edges_used = this.state.T[tunnel - 1]\n let links = [];\n edges_used.forEach(edge => {\n links.push({\n \"src\": this.state.links[edge-1][0].toString(),\n \"dst\": this.state.links[edge-1][1].toString(),\n \"index\": edge - 1,\n });\n });\n if (weight > 0) {\n allTunnels.push({\n links,\n \"allocation\": this.state.allocation[f][t],\n \"weight\": weight,\n \"availability\": Math.round(availability * 1000000) / 1000000,\n \"id\": (tunnel - 1),\n })\n }\n })\n return allTunnels\n }\n\n getBackLink(link) {\n let backindex = -1;\n this.state.links.forEach((l, i) => {\n if (l[0] === link[1] && l[1] === link[0]) { backindex = i }\n });\n return backindex != -1 ? {src: String(this.state.links[backindex][0]), dst: String(this.state.links[backindex][1])} : {};\n }\n\n addTip(id, line1, line2) {\n let circle = d3.selectAll(\"circle\").filter(function (c, i) { return (c.id === id);});\n let g = circle.select(function() { return this.parentNode; })\n let tip = g.append(\"g\")\n .attr(\"class\", \"tip\")\n .attr(\"transform\", \"translate(\" + 6 + \",\" + 6 + \")\");\n\n var rect = tip.append(\"rect\")\n .style(\"fill\", \"white\")\n .style(\"stroke\", \"steelblue\")\n .style(\"opacity\", .8)\n\n tip.append(\"text\")\n .text(line1)\n .attr(\"dy\", \"1.2em\")\n .attr(\"x\", 8);\n\n tip.append(\"text\")\n .text(line2)\n .attr(\"dy\", \"2.4em\")\n .attr(\"x\", 8);\n\n let bbox = tip.node().getBBox();\n rect.attr(\"width\", bbox.width + 15)\n .attr(\"height\", bbox.height + 10)\n }\n\n updateGraph() {\n d3.selectAll('.tip').remove();\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-opacity\", .1)});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-dasharray\", \"\")});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke\", \"#888\")});\n d3.selectAll('line').attr('marker-end','');\n d3.selectAll('circle').each(function(d) {d3.select(this).style(\"fill\", \"lightgrey\")});\n \n this.state.secondaryTunnels.forEach((tunnel, i) => {\n this.dashLinks(tunnel, \"5,5\", false);\n this.colorLinks(tunnel, colors[i]);\n })\n // this.dashLinks(this.state.dashLinks, \"5,5\", true);\n this.animateLinks(this.state.dashLinks);\n this.colorNodes(this.state.secondaryNodes, \"#bbb\");\n this.colorNodes(this.state.colorNodes, \"#aaa\");\n\n d3.selectAll(\"circle\").filter((c, i) => (c.id === this.state.firstSelected || c.id === this.state.secondSelected)).style(\"fill\", \"steelblue\");\n this.state.tips.forEach(tip => {\n this.addTip(tip.id, tip.line1, tip.line2);\n })\n\n if (this.state.firstSelected === null) {\n this.resetColors();\n }\n this.colorLinks(this.state.downLinks, \"red\");\n this.showUtilization(this.state.showUtilization);\n }\n\n resetColors() {\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-opacity\", 1)});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-dasharray\", \"\")});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke\", \"#888\")});\n d3.selectAll('line').attr('marker-end','');\n d3.selectAll('circle').each(function(d) {d3.select(this).style(\"fill\", \"black\")});\n }\n\n clearGraph() {\n d3.selectAll(\"svg > .tip\").remove();\n d3.selectAll(\"svg > .links\").remove();\n d3.selectAll(\"svg > .nodes\").remove();\n this.setState({\n showPaths: false,\n firstSelected: null,\n secondSelected: null,\n numSelected: 0,\n tips: [],\n }, () => {console.log(this.state)})\n }\n\n arrowPress(e) {\n // this.showUtilization();\n if (e.keyCode === 39 && this.state.flows[this.state.flowid]) {\n let tunnelIndex = (this.state.tunnelIndex + 1 >= this.state.flows[this.state.flowid].tunnels.length) ? 0 : this.state.tunnelIndex + 1;\n this.changeTunnel(tunnelIndex);\n } else if (e.keyCode === 37 && this.state.flows[this.state.flowid]) {\n let tunnelIndex = (this.state.tunnelIndex - 1 < 0) ? this.state.flows[this.state.flowid].tunnels.length - 1 : this.state.tunnelIndex - 1;\n this.changeTunnel(tunnelIndex);\n } else if (e.keyCode === 38 && this.state.scenarios.length > 0) {\n e.preventDefault();\n this.handleScenario(this.state.scenario - 1 < 0 ? this.state.scenarios.length - 1 : this.state.scenario - 1);\n } else if (e.keyCode === 40 && this.state.scenarios.length > 0) {\n e.preventDefault();\n this.handleScenario(this.state.scenario + 1 < this.state.scenarios.length ? this.state.scenario + 1 : 0);\n };\n\n }\n\n showUtilization(opacity) {\n let linkTraffic = this.state.linkUtilization;\n for (let i = 0; i <= linkTraffic.length - 1; i++) {\n let linklabel = d3.selectAll(\".aEnd\").filter(function (c, j) { return (j === i)});\n linklabel.html(`${Math.round((linkTraffic[i] / this.state.capacity[i]) * 100) / 1}%`);\n if (linkTraffic[i] / this.state.capacity[i] > 1) {\n linklabel.style(\"fill\", \"red\")\n } else {\n linklabel.style(\"fill\", \"black\")\n }\n }\n d3.selectAll(\".aEnd\").style(\"opacity\", opacity);\n }\n\n changeTunnel(tunnelIndex) {\n let flowid = this.state.flowid;\n let flow = this.state.flows[flowid];\n let sent = flowid !== null ? (flow.tunnels[tunnelIndex].sent) : 0;\n let tunnels = flowid !== null ? flow.tunnels : [];\n let dashLinks = flowid !== null ? tunnels[tunnelIndex].links : [];\n let colorNodes = flowid !== null ? this.getTunnelNodes(tunnels[tunnelIndex]) : [];\n let secondaryNodes = []\n let secondaryTunnels = []\n if (flowid !== null) {\n flow.tunnels.forEach(tunnel => {\n secondaryNodes = [...secondaryNodes, ...this.getTunnelNodes(tunnel)];\n secondaryTunnels = [...secondaryTunnels, tunnel.links];\n });\n };\n let backFlowid = this.state.backFlowid;\n let backFlow = this.state.flows[backFlowid]\n // let sentBack = backFlowid !== null ? (backFlow.tunnels[tunnelIndex].weight * backFlow.demand) : 0;\n let tips = []\n if (this.state.numSelected == 2) {\n if (this.state.firstSelected != null) {\n tips.push({\n id: this.state.firstSelected,\n line1: `Node: ${this.state.firstSelected}`,\n line2: `Sent: ${sent}`\n });\n }\n if (this.state.secondSelected != null) {\n tips.push({\n id: this.state.secondSelected,\n line1: `Node: ${this.state.secondSelected}`,\n line2: `Received: ${sent}`,\n });\n }\n } else if (this.state.numSelected == 1) {\n let [demandedTo, demandedFrom] = this.getNodeDemand(this.state.firstSelected);\n demandedTo = this.state.limitTraffic ? (1 - this.state.var) * demandedTo : demandedTo;\n demandedFrom = this.state.limitTraffic ? (1 - this.state.var) * demandedFrom : demandedFrom;\n tips.push({\n id: this.state.firstSelected,\n line1: `Sent: ${demandedFrom}`,\n line2: `Received ${demandedTo}`,\n })\n }\n \n this.setState({\n tunnelIndex,\n dashLinks,\n colorNodes,\n secondaryTunnels,\n secondaryNodes,\n tips,\n }, this.updateGraph);\n }\n\n getNodeDemand(id) {\n let demandedFrom = 0;\n let demandedTo = 0;\n Object.values(this.state.flows).forEach(flow => {\n if (id === flow.src) { demandedFrom += this.state.demand[flow.id] }\n if (id === flow.dst) { demandedTo += this.state.demand[flow.id] }\n });\n return [demandedTo, demandedFrom]\n }\n\n\n click(d) {\n if (this.state.numSelected === 0 || this.state.numSelected === 2) {\n // document.removeEventListener(\"keydown\", this.arrowPress, false);\n let [demandedTo, demandedFrom] = this.getNodeDemand(d.id);\n let permissable = this.state.limitTraffic ? 1 - this.state.var : 1;\n this.setState({\n numSelected: 1,\n firstSelected: d.id,\n secondSelected: null,\n showPaths: false,\n dashLinks: [],\n colorNodes: [],\n secondaryTunnels: [],\n secondaryTunnels: [],\n flowid: null,\n tips: [\n {\n id: d.id,\n line1: `Sent: ${demandedFrom * permissable}`,\n line2: `Received ${demandedTo * permissable}`,\n }\n ],\n }, this.updateGraph);\n } else if (this.state.numSelected === 1) {\n if (this.state.firstSelected === d.id) {\n this.setState({\n numSelected: 0,\n firstSelected: null,\n secondSelected: null,\n tips: [],\n showPaths: false,\n colorNodes: [],\n dashLinks: [],\n }, this.updateGraph);\n } else {\n let flow = this.getFlow(this.state.firstSelected, d.id);\n let backFlow = this.getFlow(d.id, this.state.firstSelected);\n this.setState({\n numSelected: 2,\n secondSelected: d.id,\n showPaths: true,\n flowid: flow ? flow.id : null,\n backFlowid: backFlow ? backFlow.id : null,\n }, () => { this.changeTunnel(0) })\n }\n }\n }\n\n drawGraph(topology) {\n document.addEventListener(\"keydown\", this.arrowPress, false);\n var simulation = d3.forceSimulation()\n .force(\"link\", d3\n .forceLink().id(function(d) { return d.id; })\n .distance(function (d) {\n return 100;\n })\n )\n .force(\"charge\", d3.forceManyBody().strength(-500))\n .force(\"center\", d3.forceCenter(this.svg.getBoundingClientRect().width / 2, this.svg.getBoundingClientRect().height / 2));\n\n\n this.setState({\n simulation: simulation,\n }, () => {\n const svg = d3.select(this.svg);\n svg.append('defs').append('marker')\n .attr('id', 'arrowhead')\n .attr('viewBox', '-0 -5 10 10')\n .attr('refX', 13)\n .attr('refY', 0)\n .attr('orient', 'auto')\n .attr('markerWidth', 3)\n .attr('markerHeight', 13)\n .attr('xoverflow', 'visible')\n .append('svg:path')\n .attr('d', 'M 0,-5 L 10 ,0 L 0,5')\n .attr('fill', '#999')\n .style('stroke','none');\n\n d3.json(`./data/${topology}.json`)\n .then((graph, error) => {\n if (error) throw error;\n this.setState({\n ...this.state,\n graph: graph,\n })\n\n graph.links.forEach((link, i) => {\n link.capacity = this.state.capacity[i]\n })\n var linkg = svg.append(\"g\")\n .attr(\"class\", \"links\")\n .selectAll(\"line\")\n .data(graph.links)\n .enter()\n .append(\"g\")\n .attr(\"class\", \"link\")\n\n\n var link = linkg\n .append(\"line\")\n .attr(\"class\", \"link-line\")\n\n var labelLine = svg.selectAll(\".link\")\n .append(\"text\")\n .attr('class', 'aEnd')\n .data(graph.links)\n .attr('x', function(d) { return d.source.x; })\n .attr('y', function(d) { return d.source.y; })\n .attr('text-anchor', 'middle')\n .style(\"font-size\", \"10px\")\n .style(\"opacity\", 0)\n .text(\"yo\");\n\n var div = d3.select(\"body\").append(\"div\")\n .attr(\"class\", \"tooltip\")\n .style(\"opacity\", 0);\n\n // var edgepaths = svg.selectAll(\".edgepath\")\n // .data(graph.links)\n // .enter()\n // .append('path')\n // .attrs({'d': function(d) {return 'M '+d.source.x+' '+d.source.y+' L '+ d.target.x +' '+d.target.y},\n // 'class':'edgepath',\n // 'fill-opacity':0,\n // 'stroke-opacity':0,\n // 'fill':'blue',\n // 'stroke':'red',\n // 'id':function(d,i) {return 'edgepath'+i}})\n // .style(\"pointer-events\", \"none\");\n\n // var edgelabels = svg.selectAll(\".edgelabel\")\n // .data(graph.links)\n // .enter()\n // .append('text')\n // .style(\"pointer-events\", \"none\")\n // .attrs({'class':'edgelabel',\n // 'id':function(d,i){return 'edgelabel'+i},\n // 'dx':80,\n // 'dy':0,\n // 'font-size':10,\n // 'fill':'#aaa'});\n\n // edgelabels.append('textPath')\n // .attr('xlink:href',function(d,i) {return '#edgepath'+i})\n // .style(\"pointer-events\", \"none\")\n // .text(function(d,i){return 'label '+i});\n\n var node = svg.append(\"g\")\n .attr(\"class\", \"nodes\")\n .selectAll(\"circle\")\n .data(graph.nodes)\n .enter()\n .append('g').attr(\"class\", \"wrapper\")\n .attr(\"width\", 10)\n .attr(\"height\", 10)\n .on(\"click\", this.click)\n .call(d3.drag()\n .on(\"start\", this.dragstarted)\n .on(\"drag\", this.dragged)\n .on(\"end\", this.dragended));\n\n var circle = node.append(\"circle\")\n .attr(\"r\", 14)\n\n node.append(\"text\")\n .text(function (d) { return d.id; })\n .style(\"text-anchor\", \"middle\")\n .style(\"fill\", \"#999\")\n .style(\"cursor\", \"pointer\")\n .style(\"font-size\", 18)\n .attr(\"transform\", function(d) {\n return \"translate(\" + 0 + \",\" + 6+ \")\"\n });\n\n node.append(\"title\")\n .text(function(d) { return d.id; });\n\n //add tooltip\n let that = this;\n svg.selectAll(\"line\")\n .on(\"mouseover\", function(d) {\n div.transition()\n .duration(200)\n .style(\"opacity\", .9);\n div.html(\"p = \" + Math.round(that.state.failure_probabilities[d.index]*10000000)/100000 + \"%\") //+ \"
\" + d.close\n .style(\"width\", \"90px\")\n .style(\"left\", (d3.event.pageX) + \"px\")\n .style(\"top\", (d3.event.pageY - 28) + \"px\");\n })\n .on(\"mouseout\", function(d) {\n div.transition()\n .duration(200)\n .style(\"opacity\", 0);\n });\n\n this.state.simulation\n .nodes(graph.nodes)\n .on(\"tick\", ticked)\n\n this.state.simulation.force(\"link\")\n .links(graph.links);\n\n function xpos(s, t) {\n var angle = Math.atan2(t.y - s.y, t.x - s.x);\n return 30 * Math.cos(angle) + s.x;\n };\n\n function ypos(s, t) {\n var angle = Math.atan2(t.y - s.y, t.x - s.x);\n return 30 * Math.sin(angle) + s.y;\n };\n\n\n function ticked() {\n link\n .attr(\"x1\", function(d) { return d.source.x; })\n .attr(\"y1\", function(d) { return d.source.y; })\n .attr(\"x2\", function(d) { return d.target.x; })\n .attr(\"y2\", function(d) { return d.target.y; });\n\n svg.selectAll('text.aEnd')\n .attr('x', function(d) { return xpos(d.source, d.target); })\n .attr('y', function(d) { return ypos(d.source, d.target); });\n\n svg.selectAll('text.zEnd')\n .attr('x', function(d) { return xpos(d.target, d.source); })\n .attr('y', function(d) { return ypos(d.target, d.source); });\n\n // labelLine.attr('transform',function(d,i){\n // if (d.target.x {\n // return \n // })\n // console.log(d3.select(\"line\"))\n // }\n let path_info;\n if (this.state.flowid != null) {\n path_info = this.state.flows[this.state.flowid].tunnels.map((tunnel, i) => {\n return tunnel.weight > 0 ? this.changeTunnel(i)}\n key={i}\n >\n Tunnel {i}\n {tunnel.weight}\n {tunnel.availability}\n : \n });\n }\n\n let limitButton = this.state.limitTraffic ?\n
this.handleLimit(false)}>Unlimit
:\n
this.handleLimit(true)}>Limit
\n\n let utilizationButton = this.state.showUtilization === 0 ?\n
this.handleUtilization(.6)}>Utilization
:\n
this.handleUtilization(0)}>Off
\n\n let key = 0;\n let demand = [];\n let sentDemand = [];\n let satisfied = [];\n let thead = [];\n let demandRows = [];\n let sentRows = [];\n let satisfiedRows = [];\n let totalSatisfied = 0;\n let totalDemand = 0;\n\n for (let i = 1; i <= parseInt(this.state.num_nodes); i++) {\n thead.push({i})\n let demandRow = [];\n let sentRow = [];\n let satisfiedRow = [];\n for (let j = 1; j <= parseInt(this.state.num_nodes); j++) {\n let d = \"-\"\n let sentDemand = 0\n let satisfiedDemand = 0\n Object.values(this.state.flows).forEach((flow, f) => {\n if (flow.src === i.toString() && flow.dst === j.toString()) {\n satisfiedDemand = flow.satisfied;\n d = flow.demand;\n }\n })\n demandRow.push({d === \"-\" ? d : Math.round(d * 10000)/10000})\n sentRow.push({satisfiedDemand === 0 ? \"-\" : Math.round(satisfiedDemand * 100000)/100000})\n satisfiedRow.push({d === \"-\" ? \"-\" : `${Math.round((satisfiedDemand * 10000)/ d) / 100}%`})\n totalSatisfied += satisfiedDemand;\n totalDemand += d === \"-\" ? 0 : d;\n }\n demandRows.push({i}{demandRow})\n sentRows.push({i}{sentRow})\n satisfiedRows.push({i}{satisfiedRow})\n\n }\n demand.push({thead})\n demand.push(demandRows)\n sentDemand.push({thead})\n sentDemand.push(sentRows)\n satisfied.push({thead})\n satisfied.push(satisfiedRows)\n\n // let scenarios;\n // if (this.state.scenarios && this.state.scenarioSatisfaction) {\n // scenarios = this.state.scenarios.map((scenario, i) => {\n // return ({`Scenario ${i} (${Math.round(this.state.probabilities[i] * 1000000) / 10000}%)\n // (${Math.round((this.state.scenarioSatisfaction[i]) * 1000000) / 10000})`}\n // )\n // })\n // }\n\n\n let scenarios;\n if (this.state.scenarios && this.state.scenarioSatisfaction) {\n scenarios = this.state.scenarios.map((scenario, i) => {\n return this.handleScenario(i)}\n key={i}\n >\n Scenario {i}\n {Math.round(this.state.probabilities[i] * 1000000) / 10000}%\n {Math.round((this.state.scenarioSatisfaction[i]) * 1000000) / 10000}%\n \n });\n }\n\n let cvar;\n if (this.state.cvar) {\n cvar = (\n \n VAR\n CVAR\n \n \n {this.state.var}\n {`${Math.round(this.state.cvar * 1000000) / 10000}%`}\n \n )\n }\n\n return (\n \n this.svg = svg}\n >\n {/**\n { links }\n **/}\n \n { limitButton }\n \n \n { utilizationButton }\n \n {/* \n \n */}\n \n \n {this.state.scenarios && this.state.scenarioSatisfaction &&\n \n
\n \n \n \n availability\n demand satisfied\n \n { scenarios }\n \n
\n
\n }\n
\n {this.state.showPaths &&\n \n \n \n \n \n weight\n availability\n \n { path_info }\n \n \n \n }\n \n
Demand
\n \n \n { demand }\n \n \n
Successful Demand
\n \n \n { sentDemand }\n \n \n
Satisfied Demand
\n \n \n { satisfied }\n \n \n
Loss
\n \n { cvar }\n \n
\n\n )\n }\n}\n\nexport default ForceGraph;\n","import React, { Component } from 'react';\nimport Header from './Header';\nimport TEInputs from './TEInputs';\nimport StockInputs from './StockInputs';\nimport TEOutputs from './TEOutputs';\nimport Login from './Login';\nimport StockOutputs from './StockOutputs';\nimport ForceGraph from './ForceGraph';\n\nimport styled from 'styled-components';\nimport './style.css';\n\nconst TESection = styled.div`\n width: 100vw;\n height: 70vh;\n\n #inputs {\n text-align: center;\n padding-top: 40px;\n width: 100%;\n }\n #graph {\n background-color: #EEE;\n margin-top: 20px;\n border: 1px solid gray;\n height: 80vh;\n width: 90%;\n margin-left: auto;\n margin-right: auto;\n }\n`;\n\nconst StyledError = styled.div`\n background-color: #CCC\n padding: 20px;\n text-align: center;\n transition: .1s all;\n\n &:hover {\n background-color: #999;\n cursor: pointer;\n }\n`;\n\nclass App extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n login: false,\n te: {\n inputs: {\n topology: \"Custom\",\n demand: \"1\",\n path: \"ED\",\n beta: \".9\",\n cutoff: \".0001\",\n k: \"4\",\n downscale_demand: \"1000\",\n zeroindex: \"false\",\n demand_matrix: \"true\",\n num_nodes: 0,\n },\n results: {\n var: 0,\n cvar: 0,\n allocation: [],\n flows: [],\n capacity: [],\n T: [],\n Tf: [],\n links: [],\n },\n show_results: false,\n },\n stocks: {\n inputs: {\n tickers: [\n \"\"\n ],\n beta: .9,\n roi: 50,\n target: 40,\n days: 800,\n budget: 1000,\n KEYS: [\"F6JGTHROSNY4A8MV\", \"EGZPCEQOXI85VKRT\", \"ASDPVYC2XRAJJ81K\", \"M4XW13HI1CWYH0KN\"],\n key: 0,\n },\n results: {\n\n },\n show_results: false,\n },\n error: \"\",\n mode: \"TE\",\n };\n this.setMode = this.setMode.bind(this);\n this.login = this.login.bind(this);\n this.removeError = this.removeError.bind(this);\n this.handleTESubmit = this.handleTESubmit.bind(this);\n this.handleTEInput = this.handleTEInput.bind(this);\n this.handleStockInput = this.handleStockInput.bind(this);\n this.handleTickerValue = this.handleTickerValue.bind(this);\n this.handleAddTicker = this.handleAddTicker.bind(this);\n this.handleTickerSubmit = this.handleTickerSubmit.bind(this);\n }\n\n setMode(mode) {\n this.setState({\n ...this.state,\n mode: mode,\n });\n }\n\n removeError() {\n this.setState({\n ...this.state,\n error: \"\",\n });\n }\n\n login(password) {\n if (password === \"CVaR2019!\") {\n this.setState({\n ...this.state,\n login: true,\n }); \n };\n }\n\n ////////////////////////////////////////////////////////////////////\n /////////////////////////// Stock Methods //////////////////////////\n ////////////////////////////////////////////////////////////////////\n handleStockInput(value, type) {\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n inputs: {\n ...this.state.stocks.inputs,\n [type]: value,\n },\n show_results: false,\n }\n })\n }\n\n handleTickerValue(value, num) {\n let newtickers = this.state.stocks.inputs.tickers;\n newtickers[num] = value;\n this.setState({\n ...this.state,\n stocks: {\n inputs: {\n ...this.state.stocks.inputs,\n tickers: newtickers,\n },\n show_results: false,\n },\n })\n // fetch(`https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=${value}&apikey=${this.state.stocks.inputs.KEY}`, {\n // method: \"GET\",\n // mode: \"cors\"\n // }).then(res => {\n // console.log(res);\n // return res.json();\n // })\n // .then(data => {\n // console.log(data.bestMatches);\n // this.setState({\n // stocks: {\n // ...this.state.stocks,\n // tickerMatches: data.bestMatches,\n // }\n // }, () => {\n // console.log(this.state)\n // })\n // })\n // .catch(err => console.log(err))\n\n\n }\n\n handleAddTicker() {\n let newtickers = this.state.stocks.inputs.tickers;\n newtickers.push(\"\");\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n inputs: {\n ...this.state.stocks.inputs,\n tickers: newtickers,\n },\n show_results: false,\n },\n })\n }\n\n handleTickerSubmit() {\n let returns = [];\n let ticker_ordered = [];\n console.log(this.state.stocks.inputs.key)\n Promise.all(\n this.state.stocks.inputs.tickers.map(ticker => {\n return new Promise((resolve, reject) => {\n fetch(`https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=${ticker}&outputsize=full&apikey=${this.state.stocks.inputs.KEYS[this.state.stocks.inputs.key]}`, {\n method: \"GET\",\n mode: \"cors\"\n }).then(res => res.json())\n .then(data => {\n let daily_returns = []\n let daily_data = data[\"Time Series (Daily)\"];\n let close = \"4. close\";\n let days = Object.keys(daily_data);\n let last = daily_data[days[this.state.stocks.inputs.days + 1]][close]\n for (let i = this.state.stocks.inputs.days; i >= 0; i--) {\n let curr = daily_data[days[i]][close];\n daily_returns.push((curr - last) / last);\n last = curr;\n }\n returns.push(daily_returns);\n ticker_ordered.push(ticker);\n resolve();\n })\n .catch(error => {\n reject(error);\n });\n })\n })\n )\n .then(() => {\n console.log({\n \"nstocks\": this.state.stocks.inputs.tickers.length,\n \"returns\": returns,\n \"beta\": this.state.stocks.inputs.beta,\n \"ticker_ordered\": ticker_ordered,\n })\n // var url = 'http://localhost:8080/api/cvarf';\n var url = 'http://128.30.92.156:8080/api/cvarf';\n fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n body: JSON.stringify({\n \"nstocks\": this.state.stocks.inputs.tickers.length,\n \"returns\": returns,\n \"beta\": parseFloat(this.state.stocks.inputs.beta),\n \"roi\": parseFloat(this.state.stocks.inputs.roi/this.state.stocks.inputs.budget),\n \"target\": parseFloat(this.state.stocks.inputs.target/this.state.stocks.inputs.budget),\n }),\n headers:{\n 'Content-Type': 'application/json'\n }\n }).then(res => res.json())\n .then(response => {\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n results: response,\n show_results: true,\n tickers: ticker_ordered,\n },\n })\n })\n .catch(error => console.error('Error:', error));\n })\n .catch(error => {\n console.log(error);\n let oldkey = this.state.stocks.inputs.key;\n let newkey = this.state.stocks.inputs.key+1 >= this.state.stocks.inputs.KEYS.length ? 0 : this.state.stocks.inputs.key+1\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n inputs: {\n ...this.state.stocks.inputs,\n key: newkey,\n },\n },\n error: {\n error: error,\n message: `API error with key ${oldkey}...`,\n }\n })\n });\n }\n\n ////////////////////////////////////////////////////////////////////\n /////////////////////////// TE Methods /////////////////////////////\n ////////////////////////////////////////////////////////////////////\n handleTEInput(value, type) {\n console.log(this.state.te.inputs)\n this.setState({\n ...this.state,\n te: {\n ...this.state.te,\n inputs: {\n ...this.state.te.inputs,\n [type]: value,\n },\n show_results: false,\n }\n })\n }\n\n handleTESubmit() {\n // var url = 'http://localhost:8080/api/teavar';\n var url = 'http://128.30.92.156:8080/api/teavar';\n\n let data = {\n topology: this.state.te.inputs.topology,\n demand: this.state.te.inputs.demand,\n path: this.state.te.inputs.path,\n beta: this.state.te.inputs.beta,\n cutoff: this.state.te.inputs.cutoff,\n }\n if (this.state.te.inputs.path.includes(\"ksp\")) {\n data.k = `${this.state.te.inputs.path.split(\"_\")[1]}`;\n } else {\n data.k = \"4\";\n }\n switch (data.topology) {\n case \"Custom\":\n data.downscale_demand = \"1\";\n break;\n case \"B4\":\n data.downscale_demand = \"1\";\n break;\n case \"IBM\":\n data.downscale_demand = \"1000\";\n break;\n case \"Abilene\":\n data.downscale_demand = \"1\";\n break;\n default:\n data.downscale_demand = \"1000\";\n break;\n }\n\n fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n body: JSON.stringify(data),\n headers:{\n 'Content-Type': 'application/json'\n }\n }).then(res => res.json())\n .then(response => {\n console.log(response)\n this.setState({\n ...this.state,\n te: {\n ...this.state.te,\n inputs: {\n ...this.state.te.inputs,\n num_nodes: data.num_nodes,\n zeroindex: data.zeroindex,\n },\n results: response,\n show_results: true,\n },\n })\n })\n .catch(error => console.error('Error:', error));\n }\n\n render() {\n var home;\n var header;\n if (this.state.mode === \"TE\") {\n header = ()\n home = (\n
\n \n
\n \n \n
\n
\n {/*\"graph\"*/}\n \n
\n
\n {/**this.state.te.show_results &&\n **/\n }\n
\n )\n } else if (!this.state.login) {\n home = \n header = ()\n } else {\n header = ()\n home = (
\n \n \n {this.state.stocks.show_results &&\n \n }\n
)\n }\n return (\n
\n { header }\n {this.state.error !== \"\" &&\n {this.state.error.message}\n }\n { home }\n
\n );\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["Header.jsx","TEInputs.jsx","StockInputs.jsx","TEOutputs.jsx","Login.jsx","StockOutputs.jsx","ForceGraph.jsx","App.js","serviceWorker.js","index.js"],"names":["StyledHeader","styled","div","_templateObject","Header","_this","this","modes","props","map","mode","num","react_default","a","createElement","key","className","onClick","e","setMode","id","Component","StyledInputs","TEInputs_templateObject","TEInputs","name","onChange","handleTEInput","target","value","default","type","placeholder","handleTESubmit","StockInputs_templateObject","StockInputs","matches","tickerInputs","tickers","ticker","concat","handleTickerValue","tickerMatches","StockInputs_StyledInputs","handleAddTicker","handleStockInput","handleTickerSubmit","TEOutputs_templateObject","Table","table","_templateObject2","StyledLogin","Login_templateObject","Login_templateObject2","Login","Object","classCallCheck","possibleConstructorReturn","getPrototypeOf","call","state","password","v","setState","_this2","Login_StyledInputs","handlePassword","login","StyledOutputs","StockOutputs_templateObject","SVG","svg","StockOutputs_templateObject2","AllocationTable","_templateObject3","InfoTable","_templateObject4","StockOutputs","console","log","beta","data","optimal_b","roi","budget","cvar","optimal_cvar","var","optimal_var","optimal_a","selected","allocation","gain","drawGraph","bind","assertThisInitialized","selectLine","highlightCircles","d","_this3","d3","style","attr","circle","filter","c","i","beta_vals","g_vals","gains","b","values","g","j","line_id","point_id","length","push","xScale","domain","range","width","scalesY","yScale","height","color","append","line","x","y","lines","selectAll","enter","on","text","formatter","xAxis","ticks","tickFormat","yAxis","allocation_info","point_info","_this4","statement_header","statement_weights","forEach","w","Math","round","ref","StyledResults","ForceGraph_templateObject","ForceGraph_templateObject2","ScenarioTable","ForceGraph_templateObject3","PathTable","ForceGraph_templateObject4","OuterTable","_templateObject5","colors","ForceGraph","simulation","numSelected","firstSelected","secondSelected","nodeSize","edgeLength","flows","showPaths","showUtilization","edgesByTunnel","nodesByTunnel","tunnelIndex","scenario","downLinks","dashLinks","colorNodes","secondaryNodes","secondaryTunnels","scenarios","capacity","failure_probabilities","linkUtilization","flowid","backFlowid","tips","graph","num_nodes","limitTraffic","click","arrowPress","dragstarted","dragged","dragended","changeTunnel","topology","clearGraph","f","T","Tf","links","demand","probabilities","X","simulateTraffic","nodes","src","toString","dst","permissable","scenarioSatisfaction","Array","fill","totalDemand","reduce","s","scenarioSentTraffic","satisfiedDemandForScenario","flow","satisfiedDemandForFlow","flowTunnels","getTunnels","tunnel","t","weight","sent","congested","minSpace","max","apply","toConsumableArray","link","min","index","satisfied","tunnels","updateGraph","active","alphaTarget","restart","fx","fy","opacity","String","bool","_this5","forwardLinks","source","backLinks","includes","dash","animate","clearInterval","dashInterval","offset","setInterval","node1","node2","ret","_this6","allTunnels","total_weight","numAvailable","availability","prob","edges_used","edge","backindex","l","line1","line2","tip","select","parentNode","rect","bbox","node","getBBox","_this7","remove","each","colorLinks","animateLinks","addTip","resetColors","_this8","keyCode","preventDefault","handleScenario","_this9","linkTraffic","_loop","linklabel","html","_this10","getTunnelNodes","_this$getNodeDemand","getNodeDemand","_this$getNodeDemand2","slicedToArray","demandedTo","demandedFrom","_this11","_this12","_this$setState","_this$getNodeDemand3","_this$getNodeDemand4","defineProperty","getFlow","backFlow","_this13","document","addEventListener","force","distance","strength","getBoundingClientRect","then","error","objectSpread","that","xpos","angle","atan2","cos","ypos","sin","transition","duration","pageX","pageY","path_info","_this14","limitButton","handleLimit","utilizationButton","handleUtilization","sentDemand","thead","demandRows","sentRows","satisfiedRows","_loop2","demandRow","sentRow","satisfiedRow","_loop3","satisfiedDemand","parseInt","paddingLeft","ForceGraph_SVG","pointerEvents","padding","TESection","App_templateObject","StyledError","App_templateObject2","App","te","inputs","path","cutoff","k","downscale_demand","zeroindex","demand_matrix","results","show_results","stocks","days","KEYS","removeError","newtickers","returns","ticker_ordered","Promise","all","resolve","reject","fetch","method","res","json","daily_returns","daily_data","keys","last","curr","catch","nstocks","body","JSON","stringify","parseFloat","headers","Content-Type","response","oldkey","newkey","message","split","home","header","src_Header","src_TEInputs","src_ForceGraph","src_StockInputs","src_StockOutputs","src_Login","Boolean","window","location","hostname","match","ReactDOM","render","src_App","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.dfab464e.chunk.js","sourcesContent":["import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst StyledHeader = styled.div`\n position: fixed;\n height: 67px;\n width: 100vw;\n top: 0;\n border-bottom: 1px solid #222;\n box-shadow: 0 1px 0 #262626;\n background-color: #191919;\n background-image: -webkit-gradient(linear,left top,left bottom,from(#282828),to(#191919));\n background-image: -webkit-linear-gradient(top,#282828,#191919);\n background-image: linear-gradient(top,#282828,#191919);\n background-repeat: no-repeat;\n z-index: 10;\n\n #left {\n position: absolute;\n height: 100%;\n left: 10px;\n }\n\n #center {\n position: absolute;\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n color: white;\n\n #title {\n font-size: 25px;\n padding-top: 15px;\n }\n }\n\n #right {\n position: absolute;\n height: 100%;\n padding-top: 20px;\n padding-right: 20px;\n right: 10px;\n color: white;\n\n .link {\n cursor: pointer;\n &:hover {\n border-bottom: 1px solid white;\n }\n }\n }\n`;\n\n\nclass Header extends Component {\n render() {\n let modes = this.props.modes.map((mode, num) => {\n return this.props.mode === mode ? \"\" :\n
this.props.setMode(mode)}>{mode}
\n })\n return (\n
\n \n
\n
\n
\n
\n TEAVAR Demo\n
\n
\n
\n {modes}\n
\n
\n
\n );\n }\n}\n\nexport default Header;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst StyledInputs = styled.div`\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 370px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n input, form {\n font-size: 20px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 90px;\n height: calc(100% - 29px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 18px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 350px;\n }\n button {\n margin: 10px;\n font-size: 20px;\n }\n`;\n\nclass TEInputs extends Component {\n render() {\n return (\n
\n \n
\n
Topology
\n
\n \n
\n
\n
\n
Demand
\n
\n \n
\n
\n
\n
Paths
\n
\n \n
\n
\n
\n
Beta (%)
\n this.props.handleTEInput(e.target.value, \"beta\")}\n />\n
\n
\n
Cutoff (%)
\n this.props.handleTEInput(e.target.value, \"cutoff\")}\n />\n
\n \n
\n
\n );\n }\n}\n\nexport default TEInputs;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\n\nconst StyledInputs = styled.div`\n margin 40px auto;\n text-align: center;\n\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n\n\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n input {\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n input {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .matches {\n position: relative;\n top: 10px;\n }\n button {\n margin: 10px;\n }\n`;\n\nclass StockInputs extends Component {\n\n render() {\n const tickerInputs =\n this.props.tickers.map((ticker, num) => {\n return (\n this.props.handleTickerValue(e.target.value, num)}\n />\n\n );\n });\n\n let matches\n if (this.props.tickerMatches) {\n matches = this.props.tickerMatches.map(ticker => (
{ticker[\"1. symbol\"]}
))\n }\n\n return (\n
\n \n
Portfolio Tickers
\n\n {tickerInputs}\n
\n {matches}\n
\n \n
\n
Budget ($)
\n this.props.handleStockInput(e.target.value, \"budget\")}\n />\n
\n
\n
Return ($)
\n this.props.handleStockInput(e.target.value, \"roi\")}\n />\n
\n
\n
Loss ($)
\n this.props.handleStockInput(e.target.value, \"target\")}\n />\n
\n {/* this.props.handleStockInput(e.target.value, \"days\")}\n />*/}\n \n
\n
\n );\n }\n}\n\n\nexport default StockInputs;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst Allocation = styled.div`\n color: white;\n`;\n\nconst Table = styled.table`\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n`;\n\n\nclass TEOutputs extends Component {\n\n constructor(props) {\n super(props);\n // let flows = new Array(6);\n // let demand = new Array(6);\n // let satisfied = new Array(6);\n // for (let i = 0; i < flows.length; i++) {\n // demand[i] = new Array(6);\n // flows[i] = new Array(6);\n // satisfied[i] = new Array(6);\n // for (let j = 0; j < 6; j++) {\n // flows[i][j] = \"-\";\n // demand[i][j] = \"-\";\n // satisfied[i][j] = \"-\";\n // }\n // }\n\n\n // this.state = {\n // flows: flows,\n // demand: demand,\n // satisfied: satisfied,\n // }\n let flows = new Array(Number(props.num_nodes));\n let demand = new Array(Number(props.num_nodes));\n let satisfied = new Array(Number(props.num_nodes));\n for (let i = 0; i < flows.length; i++) {\n flows[i] = new Array(Number(props.num_nodes));\n demand[i] = new Array(Number(props.num_nodes));\n satisfied[i] = new Array(Number(props.num_nodes));\n for (let j = 0; j < props.num_nodes; j++) {\n flows[i][j] = \"-\";\n demand[i][j] = \"-\";\n satisfied[i][j] = \"-\";\n }\n }\n let offset = props.zeroindex ? 1 : 0;\n for (let i = 0; i < props.data.flows.length; i++) {\n let a = props.data.allocation[i].reduce((partial_sum, s) => partial_sum + s);\n flows[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a * 100) / 100;\n demand[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(props.data.demand[i] * 100) / 100;\n satisfied[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a /props.data.demand[i] * 100) + \"%\";\n };\n this.state = {\n ...this.state,\n flows: flows,\n demand: demand,\n satisfied: satisfied,\n }\n }\n\n componentWillReceiveProps(props) {\n console.log(props)\n let flows = new Array(Number(props.num_nodes));\n let demand = new Array(Number(props.num_nodes));\n let satisfied = new Array(Number(props.num_nodes));\n for (let i = 0; i < flows.length; i++) {\n flows[i] = new Array(Number(props.num_nodes));\n demand[i] = new Array(Number(props.num_nodes));\n satisfied[i] = new Array(Number(props.num_nodes));\n for (let j = 0; j < props.num_nodes; j++) {\n flows[i][j] = \"-\";\n demand[i][j] = \"-\";\n satisfied[i][j] = \"-\";\n }\n }\n let offset = props.zeroindex ? 1 : 0;\n for (let i = 0; i < props.data.flows.length; i++) {\n let a = props.data.allocation[i].reduce((partial_sum, s) => partial_sum + s);\n flows[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a * 100) / 100;\n demand[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(props.data.demand[i] * 100) / 100;\n satisfied[props.data.flows[i][0]-offset][props.data.flows[i][1]-offset] = Math.round(a /props.data.demand[i] * 100) + \"%\";\n };\n this.setState({\n ...this.state,\n flows: flows,\n demand: demand,\n satisfied: satisfied,\n })\n }\n\n render() {\n let key = 0;\n let flows = []\n let thead = []\n if (this.state.flows[0]) {\n for (let i = 0; i < this.state.flows[0].length; i++) {\n thead.push({i})\n }\n }\n flows.push({thead})\n\n for (let i = 0; i < this.state.flows.length; i++) {\n let row = this.state.flows[i]\n let rowDOM = []\n for (let j = 0; j < row.length; j++) {\n rowDOM.push({row[j]});\n }\n flows.push({i}{rowDOM});\n }\n\n\n let demand = []\n thead = []\n if (this.state.demand[0]) {\n for (let i = 0; i < this.state.demand[0].length; i++) {\n thead.push({i})\n }\n }\n demand.push({thead})\n\n for (let i = 0; i < this.state.demand.length; i++) {\n let row = this.state.demand[i]\n let rowDOM = []\n for (let j = 0; j < row.length; j++) {\n rowDOM.push({row[j]});\n }\n demand.push({i}{rowDOM});\n }\n\n let satisfied = []\n thead = []\n if (this.state.satisfied[0]) {\n for (let i = 0; i < this.state.satisfied[0].length; i++) {\n thead.push({i})\n }\n }\n satisfied.push({thead})\n\n for (let i = 0; i < this.state.satisfied.length; i++) {\n let row = this.state.satisfied[i]\n let rowDOM = []\n for (let j = 0; j < row.length; j++) {\n rowDOM.push({row[j]});\n }\n satisfied.push({i}{rowDOM});\n }\n return (\n
\n \n \n {flows}\n \n
\n \n \n {demand}\n \n
\n \n \n {satisfied}\n \n
\n
\n );\n }\n}\n\nexport default TEOutputs;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\n\nconst StyledLogin = styled.div`\n margin-top: 30vh;\n`;\n\nconst StyledInputs = styled.div`\n form {\n margin: 10px;\n select {\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 300px;\n }\n }\n .input {\n text-align: center;\n width: 100%;\n display: block;\n height: 50px;\n\n select {\n border: none;\n }\n\n .input-elt {\n font-size: 15px;\n margin-left: 0;\n margin-right: 0;\n display: inline-block;\n border-left: none;\n border-right: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n }\n }\n\n .input_label {\n color: white;\n display: inline-block;\n width: 75px;\n height: calc(100% - 34px);\n background-color: #999;\n vertical-align: top;\n margin: 10px 0px;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n }\n\n .input-elt {\n position: relative;\n display: block;\n margin: 10px auto;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n border: 1px solid #AAA;\n color: #555;\n font-size: inherit;\n overflow: hidden;\n padding: 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 278px;\n }\n .button {\n color: white;\n display: block;\n width: 75px;\n background-color: #999;\n vertical-align: top;\n margin: 10px auto;\n padding: 6px 10px;\n border-left: 1px solid #AAA;\n border-top: 1px solid #AAA;\n border-bottom: 1px solid #AAA;\n font-size: 14px;\n border-radius: 5px;\n }\n`;\n\nclass Login extends Component {\n constructor(props) {\n super(props);\n this.state = {\n password: \"\",\n }\n }\n\n handlePassword(v) {\n this.setState({\n password: v,\n })\n }\n render() {\n return (\n \n \n
\n {/*
Password
*/}\n this.handlePassword(e.target.value)}\n />\n this.props.login(this.state.password)}\n value=\"Login\"\n />\n \n\n
\n
\n );\n }\n}\n\nexport default Login;\n","import React, { Component } from 'react';\nimport styled from 'styled-components';\nimport * as d3 from \"d3\";\n\nconst StyledOutputs = styled.div`\n position: relative;\n svg {\n font-family: Sans-Serif, Arial;\n }\n .line {\n stroke-width: 4;\n fill: none;\n }\n\n .axis path {\n stroke: black;\n }\n\n .text {\n font-size: 12px;\n }\n\n .title-text {\n font-size: 12px;\n }\n\n #all-statements {\n display: block;\n width: 100%;\n border-bottom: 1px solid black;\n }\n\n #statement-table {\n background-color: #EEE;\n margin-top: 10px;\n }\n\n #statements {\n width: 40%;\n margin: 0px auto;\n margin-bottom: 70px;\n background-color: #EEE;\n padding: 20px;\n border-radius: 5px;\n font-size: 18px;\n text-align:center;\n\n div {\n margin: 20px 0px;\n }\n .colorGreen {\n color: rgb(0,150,0);\n }\n .colorRed {\n color: rgb(150, 0,0);\n }\n }\n`;\n\nconst SVG = styled.svg`\n display: block;\n margin: -60px auto 0px auto;\n height: 700px;\n width: 900px;\n`;\n\nconst AllocationTable = styled.table`\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 0px auto;\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nconst InfoTable = styled.table`\n border: 1px solid gray;\n background-color: rgba(255, 255, 255, .2);\n margin: 10px auto;\n margin-top: 70px;\n\n th {\n padding: 3px 10px;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nclass StockOutputs extends Component {\n constructor(props){\n super(props)\n console.log(props)\n this.state = {\n beta: props.data.optimal_b,\n roi: props.roi/props.budget,\n cvar: props.data.optimal_cvar,\n var: props.data.optimal_var,\n a: props.data.optimal_a,\n budget: props.budget,\n selected: {\n allocation: props.data.optimal_a,\n var: props.data.optimal_var,\n cvar: props.data.optimal_cvar,\n gain: props.roi/props.budget,\n name: \"test_\" + props.data.optimal_b,\n id: -1,\n }\n }\n this.drawGraph = this.drawGraph.bind(this);\n this.selectLine = this.selectLine.bind(this);\n this.highlightCircles = this.highlightCircles.bind(this);\n }\n\n componentDidMount() {\n this.drawGraph(this.props.data)\n }\n\n componentWillReceiveProps(props) {\n console.log(props);\n this.setState({\n // allocation: props.data.optimal_a,\n // var: props.data.optimal_var,\n // cvar: props.data.optimal_cvar,\n beta: props.data.optimal_b,\n roi: props.roi/props.budget,\n cvar: props.data.optimal_cvar,\n var: props.data.optimal_var,\n budget: props.budget,\n a: props.data.optimal_a,\n selected: {\n allocation: props.data.optimal_a,\n var: props.data.optimal_var,\n cvar: props.data.optimal_cvar,\n gain: props.roi/props.budget,\n name: \"test_\" + props.data.optimal_b,\n }\n })\n this.drawGraph(props.data);\n }\n\n selectLine(d) {\n console.log(d)\n this.setState({\n selected: d,\n }, () => {\n this.highlightCircles();\n })\n }\n\n highlightCircles() {\n d3.selectAll(\"circle\").style(\"opacity\", .5)\n d3.selectAll(\"circle\").attr(\"r\", 6)\n if (this.state.selected) {\n let circle = d3.selectAll(\"circle\").filter((c, i) => (c.id === this.state.selected.id));\n circle.style(\"opacity\", 1);\n circle.attr(\"r\", 8)\n }\n\n }\n\n drawGraph(d) {\n console.log(d)\n var beta_vals = d.beta\n var g_vals = d.gains\n var id = 0;\n var data = beta_vals.map((b,i) => {\n var values = g_vals.map((g,j) => {\n return {\n gain: g,\n cvar: d.cvar[i][j],\n var: d.var[i][j],\n allocation: d.allocation[i][j],\n name: \"test_\" + b,\n line_id: i,\n point_id: j,\n id: id++,\n }\n });\n return {\n name: \"Beta=\" + b,\n values: values,\n beta: b,\n id: i,\n }\n });\n var line_id = data.length\n data.push({\n name: \"Beta=\" + d.optimal_b,\n beta: d.optimal_b,\n id: id++,\n values: [{\n gain: this.props.roi/this.props.budget,\n cvar: d.optimal_cvar,\n var: d.optimal_var,\n allocation: d.optimal_a,\n name: \"test_\" + d.optimal_b,\n line_id: line_id + 1,\n point_id: -1,\n id: -1,\n }],\n })\n\n console.log(data)\n var width = 800;\n var height = 600;\n var margin = 100;\n var duration = 100;\n\n var lineOpacity = \"0.25\";\n var lineOpacityHover = \"0.6\";\n var otherLinesOpacityHover = \"0.1\";\n var lineStroke = \"4px\";\n var lineStrokeHover = \"4px\";\n\n var circleOpacity = '0.85';\n var circleOpacityOnLineHover = \"0.25\"\n var circleRadius = 6;\n var circleRadiusHover = 8;\n\n /* Scale */\n var xScale = d3.scaleLinear ()\n .domain(d3.extent(data[0].values, d => d.gain))\n .range([0, width-margin]);\n\n var scalesY = d.cvar\n scalesY.push([d.optimal_cvar])\n var yScale = d3.scaleLinear()\n .domain([d3.min(scalesY.map(cvar => d3.min(cvar, d => d)), d => d), d3.max(scalesY.map(cvar => d3.max(cvar, d => d)), d => d)])\n .range([height-margin, 0]);\n\n var color = d3.scaleOrdinal(d3.schemeCategory10);\n\n /* Add SVG */\n var svg = d3.select(this.svg)\n .append('g')\n .attr(\"height\", (height + margin) + \"px\")\n .attr(\"width\", (width + margin) + \"px\")\n .attr(\"transform\", `translate(${margin}, ${margin})`);\n\n svg.append(\"text\")\n .attr(\"class\", \"title-text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", (width-margin)/2)\n .attr(\"y\", 5);\n\n /* Add line into SVG */\n var line = d3.line()\n .x(d => xScale(d.gain))\n .y(d => yScale(d.cvar));\n\n let lines = svg.append('g')\n .attr('class', 'lines');\n\n\n let highlightCircles = this.highlightCircles;\n lines.selectAll('.line-group')\n .data(data).enter()\n .append('g')\n .attr('class', 'line-group')\n .append('path')\n .attr('class', 'line')\n .attr('d', d => line(d.values))\n .style('stroke', (d, i) => color(i))\n .style('opacity', lineOpacity)\n .on(\"mouseover\", function(d, i) {\n d3.selectAll('.line')\n .style('opacity', otherLinesOpacityHover);\n d3.selectAll(\"circle\").filter((c, i) => (c.line_id === d.id))\n .attr('opacity', 1);\n d3.select(this)\n .style('opacity', lineOpacityHover)\n .style(\"stroke-width\", lineStrokeHover)\n .style(\"cursor\", \"pointer\");\n })\n .on(\"mouseout\", function(d) {\n highlightCircles();\n d3.select(this)\n .style('opacity', lineOpacity)\n .style(\"stroke-width\", lineStroke)\n .style(\"cursor\", \"pointer\");\n });\n\n\n /* Add circles in the line */\n lines.selectAll(\"circle-group\")\n .data(data).enter()\n .append(\"g\")\n .attr(\"id\", (d,i) => `circle-group-${i}`)\n .attr(\"class\", \"circle-group\")\n .style(\"fill\", (d, i) => color(i))\n .selectAll(\"circle\")\n .data(d => d.values).enter()\n .append(\"g\")\n .attr(\"class\", \"circle\")\n .attr(\"id\", (d,i) => `circle-${i}`)\n .on(\"click\", this.selectLine)\n // .on(\"mouseover\", function(d) {\n // d3.select(this)\n // .style(\"cursor\", \"pointer\")\n // .append(\"text\")\n // .attr(\"class\", \"text\")\n // .text(`${d.cvar}`)\n // .attr(\"x\", d => xScale(d.gain) + 5)\n // .attr(\"y\", d => yScale(d.cvar) - 10);\n // })\n // .on(\"mouseout\", function(d) {\n // d3.select(this)\n // .style(\"cursor\", \"none\")\n // .transition()\n // .duration(duration)\n // .selectAll(\".text\").remove();\n // })\n .append(\"circle\")\n .attr(\"cx\", d => xScale(d.gain))\n .attr(\"cy\", d => yScale(d.cvar))\n .attr(\"r\", circleRadius)\n .style('opacity', circleOpacity)\n .on(\"mouseover\", function(d, i) {\n d3.selectAll(\"circle\").filter((c, i) => (c.id === d.id))\n .attr(\"r\", circleRadiusHover);\n })\n .on(\"mouseout\", function(d) {\n d3.selectAll(\"circle\").filter((c, i) => (c.id === d.id))\n .attr(\"r\", circleRadius);\n highlightCircles();\n })\n\n d3.selectAll(\".circle-group\")\n .append(\"text\")\n .attr(\"class\", \"text\")\n .text(d => d.name)\n .attr(\"x\", d => xScale(d.values[0].gain) + 20)\n .attr(\"y\", d => yScale(d.values[0].cvar))\n\n /* Add Axis into SVG */\n var formatter = d3.format(\".3p\");\n var xAxis = d3.axisBottom(xScale).ticks(5).tickFormat(formatter);\n var yAxis = d3.axisLeft(yScale).ticks(5).tickFormat(formatter);\n\n svg.append(\"g\")\n .attr(\"class\", \"x axis\")\n .attr(\"transform\", `translate(0, ${height-margin})`)\n .call(xAxis)\n .append('text')\n .attr(\"x\", (width-margin)/2)\n .attr(\"y\", \"45\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"fill\", \"#000\")\n .attr(\"font-size\", \"18px\")\n .text(\"Return on Investment (%)\");\n\n svg.append(\"g\")\n .attr(\"class\", \"y axis\")\n .attr(\"dy\", \"1em\")\n .call(yAxis)\n .append('text')\n .attr(\"y\", -50)\n .attr(\"x\", -(height - margin)/2)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"transform\", \"rotate(-90)\")\n .attr(\"fill\", \"#000\")\n .attr(\"font-size\", \"18px\")\n .text(\"Conditional Value at Risk (%)\");\n\n this.highlightCircles();\n }\n render() {\n let allocation_info;\n let point_info;\n let statement_header = []\n let statement_weights = []\n this.state.a.forEach((w,i) => {\n statement_header.push({this.props.tickers[i]})\n statement_weights.push(${Math.round(w * 100 * this.state.budget)/100})\n })\n\n if (this.state.selected) {\n point_info = (\n {Math.round(this.state.selected.var * 100000)/1000}%\n {Math.round(this.state.selected.cvar * 100000)/1000}%\n {Math.round(this.state.selected.gain * 100000)/1000}%\n )\n allocation_info = this.state.selected.allocation.map((w, i) => {\n return \n {this.props.tickers[i]}\n {Math.round(w * 100000)/1000}%\n \n })\n }\n\n console.log(this.state)\n return (\n \n
\n \n \n \n {statement_header}\n \n \n {statement_weights}\n \n \n \n
\n
Your gain is\n {Math.round(this.state.roi * 100 * this.state.budget)/100}$ \n return on invesment\n
\n
Your loss is no less than\n {Math.round(this.state.var * 100 * this.state.budget)/100}$ \n with probability\n {Math.round(this.state.beta * 100000)/1000}% \n
\n
In the worst\n {Math.round((1-this.state.beta) * 100000)/1000}% \n of days, your average loss is\n {Math.round(this.state.cvar * 100 * this.state.budget)/100}$\n
\n
\n
\n \n \n \n VAR\n CVAR\n ROI\n \n { point_info }\n \n \n \n \n \n Ticker\n weight\n \n { allocation_info }\n \n \n this.svg = svg}\n >\n \n\n {/*
\n VAR:\n
\n {this.props.data.var}\n
\n
\n
\n CVAR:\n
\n {this.props.data.cvar}\n
\n
\n
\n Allocation:\n
\n {this.props.data.allocation}\n
\n
*/}\n
\n );\n }\n}\n\nexport default StockOutputs;\n","import React, {Component} from 'react';\nimport * as d3 from \"d3\";\nimport styled from 'styled-components';\n\nconst StyledResults = styled.div`\n height: 100%;\n .tableTitle {\n margin-top: 20px;\n text-align: center;\n }\n`;\n\nconst SVG = styled.svg`\n width: 100%;\n height: 100%;\n\n .links line {\n stroke: #888;\n stroke-width: 6;\n }\n\n .nodes circle {\n pointer-events: all;\n stroke: none;\n stroke-width: 15px;\n cursor: pointer;\n }\n\n #limitButton {\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n position: absolute;\n bottom: 7px;\n left: 7px;\n }\n\n #utilizationButton {\n position: absolute;\n padding: 5px 10px;\n border: 1px solid #AAA;\n width: 100px;\n text-align: center;\n cursor: pointer;\n background-color: #DEDEDE;\n pointer-events: auto;\n bottom: 7px;\n right: 7px;\n }\n\n select {\n position: absolute;\n top: 7px;\n left: 7px;\n -webkit-appearance: button;\n -webkit-border-radius: 2px;\n -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);\n -webkit-padding-end: 20px;\n -webkit-padding-start: 2px;\n -webkit-user-select: none;\n background-image: url(http://i62.tinypic.com/15xvbd5.png), -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);\n background-position: 97% center;\n background-repeat: no-repeat;\n border: 1px solid #AAA;\n color: #555;\n overflow: hidden;\n padding: 5px 35px 5px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: auto;\n }\n`\n\nconst ScenarioTable = styled.table`\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: left;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .table-scroll {\n height: 200px;\n overflow: scroll;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nconst PathTable = styled.table`\n border: 1px solid steelblue;\n background-color: rgba(255, 255, 255, .2);\n float: right;\n pointer-events: auto;\n\n th {\n padding: 3px 10px;\n }\n\n tr {\n cursor: pointer;\n }\n\n td {\n padding: 5px 10px;\n text-align: center;\n }\n\n .selected {\n background-color: rgba(200, 200, 200, .6);\n }\n`;\n\nconst OuterTable = styled.table`\n font-size: 14px;\n color: white;\n background-color: #444;\n border-radius: 10px;\n margin: 30px auto;\n\n tr {\n border: 1px solid gray;\n td {\n padding: 10px;\n }\n .border-bottom {\n border-bottom: 1px solid white;\n padding: 6px 0px;\n }\n .border-right {\n border-right: 1px solid white;\n padding: 0px 6px;\n }\n`;\n\nlet colors = [\"#1abc9c\", \"#3498db\", \"#9b59b6\", \"#34495e\", \"#e67e22\", \"#f1c40f\"];\nlet dashes = [\"5,5\", \"10,10\", \"20, 20\", \"20,10,5,5,5,10\", \"10,10,5,10\"]\n\nclass ForceGraph extends Component {\n constructor(props){\n super(props)\n this.state = {\n simulation: \"\",\n numSelected: 0,\n firstSelected: null,\n secondSelected: null,\n nodeSize: 9,\n edgeLength: 100,\n flows: [],\n allocation: [],\n showPaths: false,\n showUtilization: 0,\n edgesByTunnel: [],\n nodesByTunnel: [],\n tunnelIndex: 0,\n scenario: 0,\n downLinks: [],\n dashLinks: [],\n colorNodes: [],\n secondaryNodes: [],\n secondaryTunnels: [],\n scenarios: [],\n capacity: [],\n failure_probabilities: [],\n linkUtilization: [],\n flowid: null,\n backFlowid: null,\n tips: [],\n graph: null,\n num_nodes: 0,\n limitTraffic: true,\n }\n this.click = this.click.bind(this);\n this.arrowPress = this.arrowPress.bind(this);\n this.dragstarted = this.dragstarted.bind(this);\n this.dragged = this.dragged.bind(this);\n this.dragended = this.dragended.bind(this);\n this.changeTunnel = this.changeTunnel.bind(this);\n this.showUtilization = this.showUtilization.bind(this);\n\n }\n\n componentDidMount() {\n this.drawGraph(this.props.topology)\n }\n\n componentWillReceiveProps(props) {\n this.clearGraph();\n this.drawGraph(props.topology);\n this.setState({\n num_nodes: props.num_nodes,\n f: props.flows,\n T: props.T,\n Tf: props.Tf,\n links: props.links,\n allocation: props.allocation,\n demand: props.demand,\n probabilities: props.probabilities,\n scenarios: props.scenarios,\n scenario: 0,\n showUtilization: 0,\n capacity: props.capacity,\n failure_probabilities: props.failure_probabilities,\n flowid: null,\n downLinks: [],\n X: props.X,\n var: props.var,\n cvar: props.cvar,\n limitTraffic: true,\n linkUtilization: [],\n }, () => {\n this.simulateTraffic();\n // let flows = {}\n // props.flows.forEach((nodes, flowid) => {\n // let tunnels = this.getTunnels(flowid, nodes[0], nodes[1]);\n // flows[flowid] = {\n // id: flowid,\n // src: nodes[0].toString(),\n // dst: nodes[1].toString(),\n // tunnels: tunnels,\n // demand: props.demand[flowid],\n // permissable: 1 - props.var,\n // };\n // })\n // let satisfiedDemand = [];\n // if (props.scenarios) {\n // let totalDemand = props.demand.reduce((i, j) => i + j);\n // props.scenarios.forEach((scenario, s) => {\n // let sentTraffic = this.state.graph ? new Array(this.state.graph.links.length).fill(0) : [];\n // let satisfied = 0;\n // Object.values(flows).forEach((flow, f) => {\n // let total_weight = 0;\n // let numAvailable = 0;\n // flow.tunnels.forEach((tunnel, t) => {\n // total_weight += props.X[s][tunnel.id] === 1 ? this.state.allocation[f][t] : 0;\n // numAvailable += props.X[s][tunnel.id] === 1 ? 1 : 0;\n // });\n // flow.tunnels.forEach((tunnel, t) => {\n // let weight = 0\n // if (props.X[s][tunnel.id] === 1) {\n // weight = total_weight !== 0 ?\n // (this.state.allocation[f][t] / total_weight) :\n // (1 / numAvailable);\n // } else {\n // weight = 0;\n // }\n // let congested = false;\n // tunnel.links.forEach(link => {\n // // let ls = this.state.graph.links.filter((l, index) => index === link.index);\n // if (sentTraffic[link.index] >= this.state.capacity[link.index]) {\n // congested = true;\n // }\n // })\n // if (!congested) {\n // tunnel.links.forEach(link => {\n // sentTraffic[link.index] += weight * flow.demand * flow.permissable\n // });\n // satisfied += weight * flow.demand * flow.permissable\n // }\n // })\n // })\n // satisfiedDemand.push(satisfied / totalDemand)\n // });\n // };\n // this.setState({\n // flows,\n // scenarioSatisfaction: satisfiedDemand,\n // }, this.updateGraph)\n });\n }\n\n componentDidUpdate(state) {\n // this.drawGraph()\n }\n\n simulateTraffic() {\n console.log(this.state);\n let flows = {}\n this.state.f.forEach((nodes, flowid) => {\n flows[flowid] = {\n id: flowid,\n src: nodes[0].toString(),\n dst: nodes[1].toString(),\n demand: this.state.demand[flowid],\n permissable: this.state.limitTraffic ? 1 - this.state.var : 1,\n };\n })\n let scenarioSatisfaction = [];\n let linkUtilization = new Array(this.state.capacity.length).fill(0);\n if (this.state.scenarios) {\n let totalDemand = this.state.demand.reduce((i, j) => i + j);\n this.state.scenarios.forEach((scenario, s) => {\n let scenarioSentTraffic = this.state.graph ? new Array(this.state.graph.links.length).fill(0) : [];\n let satisfiedDemandForScenario = 0;\n Object.values(flows).forEach((flow, f) => {\n let satisfiedDemandForFlow = 0;\n let flowTunnels = this.getTunnels(flow.id, flow.src, flow.dst, s);\n flowTunnels.forEach((tunnel, t) => {\n let weight = tunnel.weight;\n let sent = weight * flow.demand * flow.permissable;\n\n let congested = false;\n let minSpace = Math.max(...this.state.capacity);\n tunnel.links.forEach(link => {\n minSpace = Math.min(minSpace, this.state.capacity[link.index] - scenarioSentTraffic[link.index])\n if (scenarioSentTraffic[link.index] + sent > this.state.capacity[link.index]) {\n congested = true;\n }\n })\n\n if (!congested) {\n tunnel.links.forEach(link => {\n scenarioSentTraffic[link.index] += sent;\n if (s === this.state.scenario) {\n linkUtilization[link.index] += sent;\n }\n });\n if (s === this.state.scenario) {\n tunnel.sent = sent;\n satisfiedDemandForFlow += sent;\n }\n satisfiedDemandForScenario += sent;\n } else if (minSpace > 0){\n sent = minSpace;\n tunnel.links.forEach(link => {\n scenarioSentTraffic[link.index] += sent;\n if (s === this.state.scenario) {\n linkUtilization[link.index] += weight * flow.demand * flow.permissable;\n // TODO \n // linkUtilization[link.index] += sent;\n }\n });\n if (s === this.state.scenario) {\n tunnel.sent = sent;\n satisfiedDemandForFlow += sent;\n }\n satisfiedDemandForScenario += sent;\n }\n })\n if (s === this.state.scenario) {\n flow.satisfied = satisfiedDemandForFlow;\n flow.tunnels = flowTunnels;\n }\n })\n scenarioSatisfaction.push(satisfiedDemandForScenario / totalDemand)\n });\n };\n this.setState({\n flows,\n scenarioSatisfaction,\n linkUtilization,\n }, () => {\n this.updateGraph();\n this.changeTunnel(0);\n });\n }\n\n // simulateScenario(s) {\n // return flows, satifiedDemand, \n // }\n\n dragstarted(d) {\n if (!d3.event.active) this.state.simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n }\n\n dragged(d) {\n d.fx = d3.event.x;\n d.fy = d3.event.y;\n }\n\n dragended(d) {\n if (!d3.event.active) this.state.simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n }\n\n handleUtilization(opacity) {\n this.setState({\n showUtilization: opacity,\n }, this.updateGraph)\n }\n \n handleScenario(scenario) {\n let downLinks = [];\n this.simulateTraffic();\n this.state.scenarios[scenario].forEach((s, i) => {\n if (!s) {\n downLinks.push({src: String(this.state.links[i][0]), dst: String(this.state.links[i][1])});\n }\n });\n this.setState({\n downLinks: downLinks,\n scenario: scenario,\n }, () => {\n this.simulateTraffic();\n });\n }\n\n handleLimit(bool) {\n this.setState({\n limitTraffic: bool,\n }, () => {\n this.simulateTraffic();\n });\n }\n\n colorLinks(links, color){\n let forwardLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.src === d.source.id && link.dst === d.target.id) { filter = true }\n })\n return filter;\n })\n let backLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.dst === d.source.id && link.src === d.target.id) { filter = true }\n })\n return filter;\n })\n forwardLinks.style(\"stroke-opacity\", .6);\n forwardLinks.style(\"stroke\", color);\n backLinks.style(\"stroke-opacity\", 0);\n backLinks.style(\"stroke\", color);\n }\n\n colorNodes(nodes, color){\n let colorNodes = d3.selectAll('circle').filter(function(d) {return (nodes.includes(d.id))})\n colorNodes.style(\"fill\", color);\n }\n\n dashLinks(links, dash, animate){\n // clearInterval(this.dashInterval);\n let forwardLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.src === d.source.id && link.dst === d.target.id) { filter = true }\n })\n return filter;\n })\n let backLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.dst === d.source.id && link.src === d.target.id) { filter = true }\n })\n return filter;\n })\n forwardLinks.style(\"stroke-opacity\", 1);\n forwardLinks.style(\"stroke-dasharray\", dash);\n // var offset = 1;\n // if (animate) {\n // this.dashInterval = setInterval(function() {\n // forwardLinks.style('stroke-dashoffset', offset);\n // offset -= 1; \n // }, 50);\n // }\n // backLinks.style(\"stroke-opacity\", 0);\n // backLinks.style(\"stroke-dasharray\", dash);\n forwardLinks.attr('marker-end','url(#arrowhead)')\n }\n\n animateLinks(links){\n clearInterval(this.dashInterval);\n let forwardLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.src === d.source.id && link.dst === d.target.id) { filter = true }\n })\n return filter;\n })\n let backLinks = d3.selectAll('line').filter((d) => {\n let filter = false;\n links.forEach(link => {\n if (link.dst === d.source.id && link.src === d.target.id) { filter = true }\n })\n return filter;\n })\n forwardLinks.style(\"stroke-opacity\", 1);\n var offset = 1;\n this.dashInterval = setInterval(function() {\n forwardLinks.style('stroke-dashoffset', offset);\n offset -= 1; \n }, 50);\n backLinks.style(\"stroke-opacity\", 0);\n forwardLinks.attr('marker-end','url(#arrowhead)')\n }\n\n getTunnelNodes(tunnel) {\n let nodes = []\n tunnel.links.forEach(link => {\n if (!nodes.includes(link.src)) { nodes.push(link.src) };\n if (!nodes.includes(link.dst)) { nodes.push(link.dst) };\n })\n return nodes;\n }\n\n\n getFlow(node1, node2) {\n let ret = null\n Object.values(this.state.flows).forEach(flow => {\n if (flow.src === node1 && flow.dst === node2) {\n ret = flow\n }\n });\n return ret\n }\n\n getTunnels(f, node1, node2, s) {\n let allTunnels = []\n let tunnels = this.state.Tf[f];\n let total_weight = 0;\n let numAvailable = 0;\n tunnels.forEach((tunnel, t) => {\n total_weight += this.state.X[s][tunnel - 1] === 1 ? this.state.allocation[f][t] : 0;\n numAvailable += this.state.X[s][tunnel - 1] === 1 ? 1 : 0;\n });\n\n tunnels.forEach((tunnel, t) => {\n let availability = 0;\n this.state.probabilities.forEach((prob, s) => {\n availability += prob * this.state.X[s][tunnel - 1];\n })\n let weight = 0\n if (this.state.X[s][tunnel - 1] === 1) {\n weight = total_weight !== 0 ?\n (this.state.allocation[f][t] / total_weight) :\n (1 / numAvailable);\n } else {\n weight = 0;\n }\n let edges_used = this.state.T[tunnel - 1]\n let links = [];\n edges_used.forEach(edge => {\n links.push({\n \"src\": this.state.links[edge-1][0].toString(),\n \"dst\": this.state.links[edge-1][1].toString(),\n \"index\": edge - 1,\n });\n });\n if (weight > 0) {\n allTunnels.push({\n links,\n \"allocation\": this.state.allocation[f][t],\n \"weight\": weight,\n \"availability\": Math.round(availability * 1000000) / 1000000,\n \"id\": (tunnel - 1),\n })\n }\n })\n return allTunnels\n }\n\n getBackLink(link) {\n let backindex = -1;\n this.state.links.forEach((l, i) => {\n if (l[0] === link[1] && l[1] === link[0]) { backindex = i }\n });\n return backindex != -1 ? {src: String(this.state.links[backindex][0]), dst: String(this.state.links[backindex][1])} : {};\n }\n\n addTip(id, line1, line2) {\n let circle = d3.selectAll(\"circle\").filter(function (c, i) { return (c.id === id);});\n let g = circle.select(function() { return this.parentNode; })\n let tip = g.append(\"g\")\n .attr(\"class\", \"tip\")\n .attr(\"transform\", \"translate(\" + 6 + \",\" + 6 + \")\");\n\n var rect = tip.append(\"rect\")\n .style(\"fill\", \"white\")\n .style(\"stroke\", \"steelblue\")\n .style(\"opacity\", .8)\n\n tip.append(\"text\")\n .text(line1)\n .attr(\"dy\", \"1.2em\")\n .attr(\"x\", 8);\n\n tip.append(\"text\")\n .text(line2)\n .attr(\"dy\", \"2.4em\")\n .attr(\"x\", 8);\n\n let bbox = tip.node().getBBox();\n rect.attr(\"width\", bbox.width + 15)\n .attr(\"height\", bbox.height + 10)\n }\n\n updateGraph() {\n d3.selectAll('.tip').remove();\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-opacity\", .1)});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-dasharray\", \"\")});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke\", \"#888\")});\n d3.selectAll('line').attr('marker-end','');\n d3.selectAll('circle').each(function(d) {d3.select(this).style(\"fill\", \"lightgrey\")});\n \n this.state.secondaryTunnels.forEach((tunnel, i) => {\n this.dashLinks(tunnel, \"5,5\", false);\n this.colorLinks(tunnel, colors[i]);\n })\n // this.dashLinks(this.state.dashLinks, \"5,5\", true);\n this.animateLinks(this.state.dashLinks);\n this.colorNodes(this.state.secondaryNodes, \"#bbb\");\n this.colorNodes(this.state.colorNodes, \"#aaa\");\n\n d3.selectAll(\"circle\").filter((c, i) => (c.id === this.state.firstSelected || c.id === this.state.secondSelected)).style(\"fill\", \"steelblue\");\n this.state.tips.forEach(tip => {\n this.addTip(tip.id, tip.line1, tip.line2);\n })\n\n if (this.state.firstSelected === null) {\n this.resetColors();\n }\n this.colorLinks(this.state.downLinks, \"red\");\n this.showUtilization(this.state.showUtilization);\n }\n\n resetColors() {\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-opacity\", 1)});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke-dasharray\", \"\")});\n d3.selectAll('line').each(function(d) {d3.select(this).style(\"stroke\", \"#888\")});\n d3.selectAll('line').attr('marker-end','');\n d3.selectAll('circle').each(function(d) {d3.select(this).style(\"fill\", \"black\")});\n }\n\n clearGraph() {\n d3.selectAll(\"svg > .tip\").remove();\n d3.selectAll(\"svg > .links\").remove();\n d3.selectAll(\"svg > .nodes\").remove();\n this.setState({\n showPaths: false,\n firstSelected: null,\n secondSelected: null,\n numSelected: 0,\n tips: [],\n }, () => {console.log(this.state)})\n }\n\n arrowPress(e) {\n // this.showUtilization();\n if (e.keyCode === 39 && this.state.flows[this.state.flowid]) {\n let tunnelIndex = (this.state.tunnelIndex + 1 >= this.state.flows[this.state.flowid].tunnels.length) ? 0 : this.state.tunnelIndex + 1;\n this.changeTunnel(tunnelIndex);\n } else if (e.keyCode === 37 && this.state.flows[this.state.flowid]) {\n let tunnelIndex = (this.state.tunnelIndex - 1 < 0) ? this.state.flows[this.state.flowid].tunnels.length - 1 : this.state.tunnelIndex - 1;\n this.changeTunnel(tunnelIndex);\n } else if (e.keyCode === 38 && this.state.scenarios.length > 0) {\n e.preventDefault();\n this.handleScenario(this.state.scenario - 1 < 0 ? this.state.scenarios.length - 1 : this.state.scenario - 1);\n } else if (e.keyCode === 40 && this.state.scenarios.length > 0) {\n e.preventDefault();\n this.handleScenario(this.state.scenario + 1 < this.state.scenarios.length ? this.state.scenario + 1 : 0);\n };\n\n }\n\n showUtilization(opacity) {\n let linkTraffic = this.state.linkUtilization;\n for (let i = 0; i <= linkTraffic.length - 1; i++) {\n let linklabel = d3.selectAll(\".aEnd\").filter(function (c, j) { return (j === i)});\n linklabel.html(`${Math.round((linkTraffic[i] / this.state.capacity[i]) * 100) / 1}%`);\n if (linkTraffic[i] / this.state.capacity[i] > 1) {\n linklabel.style(\"fill\", \"red\")\n } else {\n linklabel.style(\"fill\", \"black\")\n }\n }\n d3.selectAll(\".aEnd\").style(\"opacity\", opacity);\n }\n\n changeTunnel(tunnelIndex) {\n let flowid = this.state.flowid;\n let flow = this.state.flows[flowid];\n let sent = flowid !== null ? (flow.tunnels[tunnelIndex].sent) : 0;\n let tunnels = flowid !== null ? flow.tunnels : [];\n let dashLinks = flowid !== null ? tunnels[tunnelIndex].links : [];\n let colorNodes = flowid !== null ? this.getTunnelNodes(tunnels[tunnelIndex]) : [];\n let secondaryNodes = []\n let secondaryTunnels = []\n if (flowid !== null) {\n flow.tunnels.forEach(tunnel => {\n secondaryNodes = [...secondaryNodes, ...this.getTunnelNodes(tunnel)];\n secondaryTunnels = [...secondaryTunnels, tunnel.links];\n });\n };\n let backFlowid = this.state.backFlowid;\n let backFlow = this.state.flows[backFlowid]\n // let sentBack = backFlowid !== null ? (backFlow.tunnels[tunnelIndex].weight * backFlow.demand) : 0;\n let tips = []\n if (this.state.numSelected == 2) {\n if (this.state.firstSelected != null) {\n tips.push({\n id: this.state.firstSelected,\n line1: `Node: ${this.state.firstSelected}`,\n line2: `Sent: ${sent}`\n });\n }\n if (this.state.secondSelected != null) {\n tips.push({\n id: this.state.secondSelected,\n line1: `Node: ${this.state.secondSelected}`,\n line2: `Received: ${sent}`,\n });\n }\n } else if (this.state.numSelected == 1) {\n let [demandedTo, demandedFrom] = this.getNodeDemand(this.state.firstSelected);\n demandedTo = this.state.limitTraffic ? (1 - this.state.var) * demandedTo : demandedTo;\n demandedFrom = this.state.limitTraffic ? (1 - this.state.var) * demandedFrom : demandedFrom;\n tips.push({\n id: this.state.firstSelected,\n line1: `Sent: ${demandedFrom}`,\n line2: `Received ${demandedTo}`,\n })\n }\n \n this.setState({\n tunnelIndex,\n dashLinks,\n colorNodes,\n secondaryTunnels,\n secondaryNodes,\n tips,\n }, this.updateGraph);\n }\n\n getNodeDemand(id) {\n let demandedFrom = 0;\n let demandedTo = 0;\n Object.values(this.state.flows).forEach(flow => {\n if (id === flow.src) { demandedFrom += this.state.demand[flow.id] }\n if (id === flow.dst) { demandedTo += this.state.demand[flow.id] }\n });\n return [demandedTo, demandedFrom]\n }\n\n\n click(d) {\n if (this.state.numSelected === 0 || this.state.numSelected === 2) {\n // document.removeEventListener(\"keydown\", this.arrowPress, false);\n let [demandedTo, demandedFrom] = this.getNodeDemand(d.id);\n let permissable = this.state.limitTraffic ? 1 - this.state.var : 1;\n this.setState({\n numSelected: 1,\n firstSelected: d.id,\n secondSelected: null,\n showPaths: false,\n dashLinks: [],\n colorNodes: [],\n secondaryTunnels: [],\n secondaryTunnels: [],\n flowid: null,\n tips: [\n {\n id: d.id,\n line1: `Sent: ${demandedFrom * permissable}`,\n line2: `Received ${demandedTo * permissable}`,\n }\n ],\n }, this.updateGraph);\n } else if (this.state.numSelected === 1) {\n if (this.state.firstSelected === d.id) {\n this.setState({\n numSelected: 0,\n firstSelected: null,\n secondSelected: null,\n tips: [],\n showPaths: false,\n colorNodes: [],\n dashLinks: [],\n }, this.updateGraph);\n } else {\n let flow = this.getFlow(this.state.firstSelected, d.id);\n let backFlow = this.getFlow(d.id, this.state.firstSelected);\n this.setState({\n numSelected: 2,\n secondSelected: d.id,\n showPaths: true,\n flowid: flow ? flow.id : null,\n backFlowid: backFlow ? backFlow.id : null,\n }, () => { this.changeTunnel(0) })\n }\n }\n }\n\n drawGraph(topology) {\n document.addEventListener(\"keydown\", this.arrowPress, false);\n var simulation = d3.forceSimulation()\n .force(\"link\", d3\n .forceLink().id(function(d) { return d.id; })\n .distance(function (d) {\n return 100;\n })\n )\n .force(\"charge\", d3.forceManyBody().strength(-500))\n .force(\"center\", d3.forceCenter(this.svg.getBoundingClientRect().width / 2, this.svg.getBoundingClientRect().height / 2));\n\n\n this.setState({\n simulation: simulation,\n }, () => {\n const svg = d3.select(this.svg);\n svg.append('defs').append('marker')\n .attr('id', 'arrowhead')\n .attr('viewBox', '-0 -5 10 10')\n .attr('refX', 13)\n .attr('refY', 0)\n .attr('orient', 'auto')\n .attr('markerWidth', 3)\n .attr('markerHeight', 13)\n .attr('xoverflow', 'visible')\n .append('svg:path')\n .attr('d', 'M 0,-5 L 10 ,0 L 0,5')\n .attr('fill', '#999')\n .style('stroke','none');\n\n d3.json(`./data/${topology}.json`)\n .then((graph, error) => {\n if (error) throw error;\n this.setState({\n ...this.state,\n graph: graph,\n })\n\n graph.links.forEach((link, i) => {\n link.capacity = this.state.capacity[i]\n })\n var linkg = svg.append(\"g\")\n .attr(\"class\", \"links\")\n .selectAll(\"line\")\n .data(graph.links)\n .enter()\n .append(\"g\")\n .attr(\"class\", \"link\")\n\n\n var link = linkg\n .append(\"line\")\n .attr(\"class\", \"link-line\")\n\n var labelLine = svg.selectAll(\".link\")\n .append(\"text\")\n .attr('class', 'aEnd')\n .data(graph.links)\n .attr('x', function(d) { return d.source.x; })\n .attr('y', function(d) { return d.source.y; })\n .attr('text-anchor', 'middle')\n .style(\"font-size\", \"10px\")\n .style(\"opacity\", 0)\n .text(\"yo\");\n\n var div = d3.select(\"body\").append(\"div\")\n .attr(\"class\", \"tooltip\")\n .style(\"opacity\", 0);\n\n // var edgepaths = svg.selectAll(\".edgepath\")\n // .data(graph.links)\n // .enter()\n // .append('path')\n // .attrs({'d': function(d) {return 'M '+d.source.x+' '+d.source.y+' L '+ d.target.x +' '+d.target.y},\n // 'class':'edgepath',\n // 'fill-opacity':0,\n // 'stroke-opacity':0,\n // 'fill':'blue',\n // 'stroke':'red',\n // 'id':function(d,i) {return 'edgepath'+i}})\n // .style(\"pointer-events\", \"none\");\n\n // var edgelabels = svg.selectAll(\".edgelabel\")\n // .data(graph.links)\n // .enter()\n // .append('text')\n // .style(\"pointer-events\", \"none\")\n // .attrs({'class':'edgelabel',\n // 'id':function(d,i){return 'edgelabel'+i},\n // 'dx':80,\n // 'dy':0,\n // 'font-size':10,\n // 'fill':'#aaa'});\n\n // edgelabels.append('textPath')\n // .attr('xlink:href',function(d,i) {return '#edgepath'+i})\n // .style(\"pointer-events\", \"none\")\n // .text(function(d,i){return 'label '+i});\n\n var node = svg.append(\"g\")\n .attr(\"class\", \"nodes\")\n .selectAll(\"circle\")\n .data(graph.nodes)\n .enter()\n .append('g').attr(\"class\", \"wrapper\")\n .attr(\"width\", 10)\n .attr(\"height\", 10)\n .on(\"click\", this.click)\n .call(d3.drag()\n .on(\"start\", this.dragstarted)\n .on(\"drag\", this.dragged)\n .on(\"end\", this.dragended));\n\n var circle = node.append(\"circle\")\n .attr(\"r\", 14)\n\n node.append(\"text\")\n .text(function (d) { return d.id; })\n .style(\"text-anchor\", \"middle\")\n .style(\"fill\", \"#999\")\n .style(\"cursor\", \"pointer\")\n .style(\"font-size\", 18)\n .attr(\"transform\", function(d) {\n return \"translate(\" + 0 + \",\" + 6+ \")\"\n });\n\n node.append(\"title\")\n .text(function(d) { return d.id; });\n\n //add tooltip\n let that = this;\n svg.selectAll(\"line\")\n .on(\"mouseover\", function(d) {\n div.transition()\n .duration(200)\n .style(\"opacity\", .9);\n div.html(\"p = \" + Math.round(that.state.failure_probabilities[d.index]*10000000)/100000 + \"%\") //+ \"
\" + d.close\n .style(\"width\", \"90px\")\n .style(\"left\", (d3.event.pageX) + \"px\")\n .style(\"top\", (d3.event.pageY - 28) + \"px\");\n })\n .on(\"mouseout\", function(d) {\n div.transition()\n .duration(200)\n .style(\"opacity\", 0);\n });\n\n this.state.simulation\n .nodes(graph.nodes)\n .on(\"tick\", ticked)\n\n this.state.simulation.force(\"link\")\n .links(graph.links);\n\n function xpos(s, t) {\n var angle = Math.atan2(t.y - s.y, t.x - s.x);\n return 30 * Math.cos(angle) + s.x;\n };\n\n function ypos(s, t) {\n var angle = Math.atan2(t.y - s.y, t.x - s.x);\n return 30 * Math.sin(angle) + s.y;\n };\n\n\n function ticked() {\n link\n .attr(\"x1\", function(d) { return d.source.x; })\n .attr(\"y1\", function(d) { return d.source.y; })\n .attr(\"x2\", function(d) { return d.target.x; })\n .attr(\"y2\", function(d) { return d.target.y; });\n\n svg.selectAll('text.aEnd')\n .attr('x', function(d) { return xpos(d.source, d.target); })\n .attr('y', function(d) { return ypos(d.source, d.target); });\n\n svg.selectAll('text.zEnd')\n .attr('x', function(d) { return xpos(d.target, d.source); })\n .attr('y', function(d) { return ypos(d.target, d.source); });\n\n // labelLine.attr('transform',function(d,i){\n // if (d.target.x {\n // return \n // })\n // console.log(d3.select(\"line\"))\n // }\n let path_info;\n if (this.state.flowid != null) {\n path_info = this.state.flows[this.state.flowid].tunnels.map((tunnel, i) => {\n return tunnel.weight > 0 ? this.changeTunnel(i)}\n key={i}\n >\n Tunnel {i}\n {tunnel.weight}\n {tunnel.availability}\n : \n });\n }\n\n let limitButton = this.state.limitTraffic ?\n
this.handleLimit(false)}>Unlimit
:\n
this.handleLimit(true)}>Limit
\n\n let utilizationButton = this.state.showUtilization === 0 ?\n
this.handleUtilization(.6)}>Utilization
:\n
this.handleUtilization(0)}>Off
\n\n let key = 0;\n let demand = [];\n let sentDemand = [];\n let satisfied = [];\n let thead = [];\n let demandRows = [];\n let sentRows = [];\n let satisfiedRows = [];\n let totalSatisfied = 0;\n let totalDemand = 0;\n\n for (let i = 1; i <= parseInt(this.state.num_nodes); i++) {\n thead.push({i})\n let demandRow = [];\n let sentRow = [];\n let satisfiedRow = [];\n for (let j = 1; j <= parseInt(this.state.num_nodes); j++) {\n let d = \"-\"\n let sentDemand = 0\n let satisfiedDemand = 0\n Object.values(this.state.flows).forEach((flow, f) => {\n if (flow.src === i.toString() && flow.dst === j.toString()) {\n satisfiedDemand = flow.satisfied;\n d = flow.demand;\n }\n })\n demandRow.push({d === \"-\" ? d : Math.round(d * 10000)/10000})\n sentRow.push({satisfiedDemand === 0 ? \"-\" : Math.round(satisfiedDemand * 100000)/100000})\n satisfiedRow.push({d === \"-\" ? \"-\" : `${Math.round((satisfiedDemand * 10000)/ d) / 100}%`})\n totalSatisfied += satisfiedDemand;\n totalDemand += d === \"-\" ? 0 : d;\n }\n demandRows.push({i}{demandRow})\n sentRows.push({i}{sentRow})\n satisfiedRows.push({i}{satisfiedRow})\n\n }\n demand.push({thead})\n demand.push(demandRows)\n sentDemand.push({thead})\n sentDemand.push(sentRows)\n satisfied.push({thead})\n satisfied.push(satisfiedRows)\n\n // let scenarios;\n // if (this.state.scenarios && this.state.scenarioSatisfaction) {\n // scenarios = this.state.scenarios.map((scenario, i) => {\n // return ({`Scenario ${i} (${Math.round(this.state.probabilities[i] * 1000000) / 10000}%)\n // (${Math.round((this.state.scenarioSatisfaction[i]) * 1000000) / 10000})`}\n // )\n // })\n // }\n\n\n let scenarios;\n if (this.state.scenarios && this.state.scenarioSatisfaction) {\n scenarios = this.state.scenarios.map((scenario, i) => {\n return this.handleScenario(i)}\n key={i}\n >\n Scenario {i}\n {Math.round(this.state.probabilities[i] * 1000000) / 10000}%\n {Math.round((this.state.scenarioSatisfaction[i]) * 1000000) / 10000}%\n \n });\n }\n\n let cvar;\n if (this.state.cvar) {\n cvar = (\n \n VAR\n CVAR\n \n \n {this.state.var}\n {`${Math.round(this.state.cvar * 1000000) / 10000}%`}\n \n )\n }\n\n return (\n \n this.svg = svg}\n >\n {/**\n { links }\n **/}\n \n { limitButton }\n \n \n { utilizationButton }\n \n {/* \n \n */}\n \n \n {this.state.scenarios && this.state.scenarioSatisfaction &&\n \n
\n \n \n \n availability\n demand satisfied\n \n { scenarios }\n \n
\n
\n }\n
\n {this.state.showPaths &&\n \n \n \n \n \n weight\n availability\n \n { path_info }\n \n \n \n }\n \n
Demand
\n \n \n { demand }\n \n \n
Successful Demand
\n \n \n { sentDemand }\n \n \n
Satisfied Demand
\n \n \n { satisfied }\n \n \n
Loss
\n \n { cvar }\n \n
\n\n )\n }\n}\n\nexport default ForceGraph;\n","import React, { Component } from 'react';\nimport Header from './Header';\nimport TEInputs from './TEInputs';\nimport StockInputs from './StockInputs';\nimport TEOutputs from './TEOutputs';\nimport Login from './Login';\nimport StockOutputs from './StockOutputs';\nimport ForceGraph from './ForceGraph';\n\nimport styled from 'styled-components';\nimport './style.css';\n\nconst TESection = styled.div`\n width: 100vw;\n height: 70vh;\n\n #inputs {\n text-align: center;\n padding-top: 40px;\n width: 100%;\n }\n #graph {\n background-color: #EEE;\n margin-top: 20px;\n border: 1px solid gray;\n height: 80vh;\n width: 90%;\n margin-left: auto;\n margin-right: auto;\n }\n`;\n\nconst StyledError = styled.div`\n background-color: #CCC\n padding: 20px;\n text-align: center;\n transition: .1s all;\n\n &:hover {\n background-color: #999;\n cursor: pointer;\n }\n`;\n\nclass App extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n login: false,\n te: {\n inputs: {\n topology: \"B4\",\n demand: \"1\",\n path: \"ED\",\n beta: \".9\",\n cutoff: \".0001\",\n k: \"4\",\n downscale_demand: \"1000\",\n zeroindex: \"false\",\n demand_matrix: \"true\",\n num_nodes: 0,\n },\n results: {\n var: 0,\n cvar: 0,\n allocation: [],\n flows: [],\n capacity: [],\n T: [],\n Tf: [],\n links: [],\n },\n show_results: false,\n },\n stocks: {\n inputs: {\n tickers: [\n \"\"\n ],\n beta: .9,\n roi: 50,\n target: 40,\n days: 800,\n budget: 1000,\n KEYS: [\"F6JGTHROSNY4A8MV\", \"EGZPCEQOXI85VKRT\", \"ASDPVYC2XRAJJ81K\", \"M4XW13HI1CWYH0KN\"],\n key: 0,\n },\n results: {\n\n },\n show_results: false,\n },\n error: \"\",\n mode: \"TE\",\n };\n this.setMode = this.setMode.bind(this);\n this.login = this.login.bind(this);\n this.removeError = this.removeError.bind(this);\n this.handleTESubmit = this.handleTESubmit.bind(this);\n this.handleTEInput = this.handleTEInput.bind(this);\n this.handleStockInput = this.handleStockInput.bind(this);\n this.handleTickerValue = this.handleTickerValue.bind(this);\n this.handleAddTicker = this.handleAddTicker.bind(this);\n this.handleTickerSubmit = this.handleTickerSubmit.bind(this);\n }\n\n setMode(mode) {\n this.setState({\n ...this.state,\n mode: mode,\n });\n }\n\n removeError() {\n this.setState({\n ...this.state,\n error: \"\",\n });\n }\n\n login(password) {\n if (password === \"CVaR2019!\") {\n this.setState({\n ...this.state,\n login: true,\n }); \n };\n }\n\n ////////////////////////////////////////////////////////////////////\n /////////////////////////// Stock Methods //////////////////////////\n ////////////////////////////////////////////////////////////////////\n handleStockInput(value, type) {\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n inputs: {\n ...this.state.stocks.inputs,\n [type]: value,\n },\n show_results: false,\n }\n })\n }\n\n handleTickerValue(value, num) {\n let newtickers = this.state.stocks.inputs.tickers;\n newtickers[num] = value;\n this.setState({\n ...this.state,\n stocks: {\n inputs: {\n ...this.state.stocks.inputs,\n tickers: newtickers,\n },\n show_results: false,\n },\n })\n // fetch(`https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=${value}&apikey=${this.state.stocks.inputs.KEY}`, {\n // method: \"GET\",\n // mode: \"cors\"\n // }).then(res => {\n // console.log(res);\n // return res.json();\n // })\n // .then(data => {\n // console.log(data.bestMatches);\n // this.setState({\n // stocks: {\n // ...this.state.stocks,\n // tickerMatches: data.bestMatches,\n // }\n // }, () => {\n // console.log(this.state)\n // })\n // })\n // .catch(err => console.log(err))\n\n\n }\n\n handleAddTicker() {\n let newtickers = this.state.stocks.inputs.tickers;\n newtickers.push(\"\");\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n inputs: {\n ...this.state.stocks.inputs,\n tickers: newtickers,\n },\n show_results: false,\n },\n })\n }\n\n handleTickerSubmit() {\n let returns = [];\n let ticker_ordered = [];\n console.log(this.state.stocks.inputs.key)\n Promise.all(\n this.state.stocks.inputs.tickers.map(ticker => {\n return new Promise((resolve, reject) => {\n fetch(`https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=${ticker}&outputsize=full&apikey=${this.state.stocks.inputs.KEYS[this.state.stocks.inputs.key]}`, {\n method: \"GET\",\n mode: \"cors\"\n }).then(res => res.json())\n .then(data => {\n let daily_returns = []\n let daily_data = data[\"Time Series (Daily)\"];\n let close = \"4. close\";\n let days = Object.keys(daily_data);\n let last = daily_data[days[this.state.stocks.inputs.days + 1]][close]\n for (let i = this.state.stocks.inputs.days; i >= 0; i--) {\n let curr = daily_data[days[i]][close];\n daily_returns.push((curr - last) / last);\n last = curr;\n }\n returns.push(daily_returns);\n ticker_ordered.push(ticker);\n resolve();\n })\n .catch(error => {\n reject(error);\n });\n })\n })\n )\n .then(() => {\n console.log({\n \"nstocks\": this.state.stocks.inputs.tickers.length,\n \"returns\": returns,\n \"beta\": this.state.stocks.inputs.beta,\n \"ticker_ordered\": ticker_ordered,\n })\n // var url = 'http://localhost:8080/api/cvarf';\n var url = 'http://128.30.92.156:8080/api/cvarf';\n fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n body: JSON.stringify({\n \"nstocks\": this.state.stocks.inputs.tickers.length,\n \"returns\": returns,\n \"beta\": parseFloat(this.state.stocks.inputs.beta),\n \"roi\": parseFloat(this.state.stocks.inputs.roi/this.state.stocks.inputs.budget),\n \"target\": parseFloat(this.state.stocks.inputs.target/this.state.stocks.inputs.budget),\n }),\n headers:{\n 'Content-Type': 'application/json'\n }\n }).then(res => res.json())\n .then(response => {\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n results: response,\n show_results: true,\n tickers: ticker_ordered,\n },\n })\n })\n .catch(error => console.error('Error:', error));\n })\n .catch(error => {\n console.log(error);\n let oldkey = this.state.stocks.inputs.key;\n let newkey = this.state.stocks.inputs.key+1 >= this.state.stocks.inputs.KEYS.length ? 0 : this.state.stocks.inputs.key+1\n this.setState({\n ...this.state,\n stocks: {\n ...this.state.stocks,\n inputs: {\n ...this.state.stocks.inputs,\n key: newkey,\n },\n },\n error: {\n error: error,\n message: `API error with key ${oldkey}...`,\n }\n })\n });\n }\n\n ////////////////////////////////////////////////////////////////////\n /////////////////////////// TE Methods /////////////////////////////\n ////////////////////////////////////////////////////////////////////\n handleTEInput(value, type) {\n console.log(this.state.te.inputs)\n this.setState({\n ...this.state,\n te: {\n ...this.state.te,\n inputs: {\n ...this.state.te.inputs,\n [type]: value,\n },\n show_results: false,\n }\n })\n }\n\n handleTESubmit() {\n // var url = 'http://localhost:8080/api/teavar';\n var url = 'http://128.30.92.156:8080/api/teavar';\n\n let data = {\n topology: this.state.te.inputs.topology,\n demand: this.state.te.inputs.demand,\n path: this.state.te.inputs.path,\n beta: this.state.te.inputs.beta,\n cutoff: this.state.te.inputs.cutoff,\n }\n if (this.state.te.inputs.path.includes(\"ksp\")) {\n data.k = `${this.state.te.inputs.path.split(\"_\")[1]}`;\n } else {\n data.k = \"4\";\n }\n switch (data.topology) {\n case \"Custom\":\n data.downscale_demand = \"1\";\n break;\n case \"B4\":\n data.downscale_demand = \"1\";\n break;\n case \"IBM\":\n data.downscale_demand = \"1000\";\n break;\n case \"Abilene\":\n data.downscale_demand = \"1\";\n break;\n default:\n data.downscale_demand = \"1000\";\n break;\n }\n\n fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n body: JSON.stringify(data),\n headers:{\n 'Content-Type': 'application/json'\n }\n }).then(res => res.json())\n .then(response => {\n console.log(response)\n this.setState({\n ...this.state,\n te: {\n ...this.state.te,\n inputs: {\n ...this.state.te.inputs,\n num_nodes: data.num_nodes,\n zeroindex: data.zeroindex,\n },\n results: response,\n show_results: true,\n },\n })\n })\n .catch(error => console.error('Error:', error));\n }\n\n render() {\n var home;\n var header;\n if (this.state.mode === \"TE\") {\n header = ()\n home = (\n
\n \n
\n \n \n
\n
\n {/*\"graph\"*/}\n \n
\n
\n {/**this.state.te.show_results &&\n **/\n }\n
\n )\n } else if (!this.state.login) {\n home = \n header = ()\n } else {\n header = ()\n home = (
\n \n \n {this.state.stocks.show_results &&\n \n }\n
)\n }\n return (\n
\n { header }\n {this.state.error !== \"\" &&\n {this.state.error.message}\n }\n { home }\n
\n );\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/www/frontend/src/App.js b/www/frontend/src/App.js index b49cc6a..505eb88 100644 --- a/www/frontend/src/App.js +++ b/www/frontend/src/App.js @@ -50,7 +50,7 @@ class App extends Component { login: false, te: { inputs: { - topology: "Custom", + topology: "B4", demand: "1", path: "ED", beta: ".9", diff --git a/www/frontend/src/TEInputs.jsx b/www/frontend/src/TEInputs.jsx index a072857..ab36d97 100644 --- a/www/frontend/src/TEInputs.jsx +++ b/www/frontend/src/TEInputs.jsx @@ -97,8 +97,8 @@ class TEInputs extends Component {
Topology