UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

167 lines (136 loc) 16.2 kB
"use strict"; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } //JS porting of this code http://www.geeksforgeeks.org/biconnected-components/ function create_array(length) { var array = []; for (var i = 0; i < length; ++i) { array.push([]); } return array; } var Edge = function Edge(u, v) { _classCallCheck(this, Edge); this.u = u; this.v = v; }; var Graph = function () { function Graph(v) { _classCallCheck(this, Graph); this.count = 0; // count is number of biconnected components this.subgraphs = []; //biconnected components this.time = 0; // time is used to find discovery times this.V = v; // No. of vertices this.E = 0; // No. of Edges this.adj = []; // Adjacency List this.adj = create_array(v); } //Function to add an edge into the graph _createClass(Graph, [{ key: "addEdge", value: function addEdge(v, w) { this.adj[v].push(w); this.E++; } // A recursive function that finds and prints strongly connected // components using DFS traversal // u --> The vertex to be visited next // disc[] --> Stores discovery times of visited vertices // low[] -- >> earliest visited vertex (the vertex with minimum // discovery time) that can be reached from subtree // rooted with current vertex // *st -- >> To store visited edges // // A recursive function that finds and prints strongly connected // components using DFS traversal // u --> The vertex to be visited next // disc[] --> Stores discovery times of visited vertices // low[] -- >> earliest visited vertex (the vertex with minimum // discovery time) that can be reached from subtree // rooted with current vertex // *st -- >> To store visited edges }, { key: "_BCCUtil", value: function _BCCUtil(u, disc, low, st, parent) { var _this = this; // Initialize discovery time and low value disc[u] = low[u] = ++this.time; this.children = 0; // Go through all vertices adjacent to this // v is current adjacent of 'u' this.adj[u].forEach(function (v) { // If v is not visited yet, then recur for it if (disc[v] == -1) { _this.children++; parent[v] = u; // store the edge in stack st.push(new Edge(u, v)); _this._BCCUtil(v, disc, low, st, parent); // Check if the subtree rooted with 'v' has a // connection to one of the ancestors of 'u' // Case 1 -- per Strongly Connected Components Article if (low[u] > low[v]) low[u] = low[v]; // If u is an articulation point, // pop all edges from stack till u -- v if (disc[u] == 1 && _this.children > 1 || disc[u] > 1 && low[v] >= disc[u]) { var subgraph = []; while (st[st.length - 1].u != u || st[st.length - 1].v != v) { subgraph.push(st[st.length - 1]); //console.log(st[st.length - 1].u + "--" + st[st.length - 1].v + " "); st.splice(st.length - 1, 1); } subgraph.push(st[st.length - 1]); //console.log(st[st.length - 1].u + "--" + st[st.length - 1].v + " "); _this.subgraphs.push(subgraph); subgraph = []; //console.log() st.splice(st.length - 1, 1); _this.count++; } } // Update low value of 'u' only of 'v' is still in stack // (i.e. it's a back edge, not cross edge). // Case 2 -- per Strongly Connected Components Article else if (v != parent[u] && disc[v] < low[u]) { if (low[u] > disc[v]) low[u] = disc[v]; st.push(new Edge(u, v)); } }); } }, { key: "BCC", value: function BCC() { var V = this.V; var disc = create_array(V); var low = create_array(V); var parent = create_array(V); var st = []; // Initialize disc and low, and parent arrays for (var i = 0; i < V; i++) { disc[i] = -1; low[i] = -1; parent[i] = -1; } for (var _i = 0; _i < V; _i++) { if (disc[_i] == -1) this._BCCUtil(_i, disc, low, st, parent); var j = 0; // If stack is not empty, pop all edges from stack var subgraph = []; while (st.length > 0) { j = 1; subgraph.push(st[st.length - 1]); //console.log(st[st.length - 1].u + "--" + st[st.length - 1].v + " "); st.splice(st.length - 1, 1); } if (j == 1) { this.subgraphs.push(subgraph); subgraph = []; //console.log(); this.count++; } } } }]); return Graph; }(); module.exports = Graph; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9ncmFwaC5qcyJdLCJuYW1lcyI6WyJjcmVhdGVfYXJyYXkiLCJsZW5ndGgiLCJhcnJheSIsImkiLCJwdXNoIiwiRWRnZSIsInUiLCJ2IiwiR3JhcGgiLCJjb3VudCIsInN1YmdyYXBocyIsInRpbWUiLCJWIiwiRSIsImFkaiIsInciLCJkaXNjIiwibG93Iiwic3QiLCJwYXJlbnQiLCJjaGlsZHJlbiIsImZvckVhY2giLCJfQkNDVXRpbCIsInN1YmdyYXBoIiwic3BsaWNlIiwiaiIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUVBLFNBQVNBLFlBQVQsQ0FBc0JDLE1BQXRCLEVBQThCO0FBQzVCLE1BQUlDLFFBQVEsRUFBWjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixNQUFwQixFQUE0QixFQUFFRSxDQUE5QixFQUFpQztBQUMvQkQsVUFBTUUsSUFBTixDQUFXLEVBQVg7QUFDRDtBQUNELFNBQU9GLEtBQVA7QUFDRDs7SUFHS0csSSxHQUNKLGNBQVlDLENBQVosRUFBZUMsQ0FBZixFQUFrQjtBQUFBOztBQUNoQixPQUFLRCxDQUFMLEdBQVNBLENBQVQ7QUFDQSxPQUFLQyxDQUFMLEdBQVNBLENBQVQ7QUFDRCxDOztJQUdHQyxLO0FBRUosaUJBQVlELENBQVosRUFBZTtBQUFBOztBQUNiLFNBQUtFLEtBQUwsR0FBYSxDQUFiLENBRGEsQ0FDRztBQUNoQixTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBRmEsQ0FFUTtBQUNyQixTQUFLQyxJQUFMLEdBQVksQ0FBWixDQUhhLENBR0c7O0FBRWhCLFNBQUtDLENBQUwsR0FBU0wsQ0FBVCxDQUxhLENBS0c7QUFDaEIsU0FBS00sQ0FBTCxHQUFTLENBQVQsQ0FOYSxDQU1HO0FBQ2hCLFNBQUtDLEdBQUwsR0FBVyxFQUFYLENBUGEsQ0FPRzs7QUFFaEIsU0FBS0EsR0FBTCxHQUFXZCxhQUFhTyxDQUFiLENBQVg7QUFDRDs7QUFF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RUFBVDs7QUFFQTtBQUNBLFdBQUssSUFBSWYsSUFBSSxDQUFiLEVBQWdCQSxJQUFJUyxDQUFwQixFQUF1QlQsR0FBdkIsRUFBNEI7QUFDMUJhLGFBQUtiLENBQUwsSUFBVSxDQUFDLENBQVg7QUFDQWMsWUFBSWQsQ0FBSixJQUFTLENBQUMsQ0FBVjtBQUNBZ0IsZUFBT2hCLENBQVAsSUFBWSxDQUFDLENBQWI7QUFDRDs7QUFFRCxXQUFLLElBQUlBLEtBQUksQ0FBYixFQUFnQkEsS0FBSVMsQ0FBcEIsRUFBdUJULElBQXZCLEVBQTRCO0FBQzFCLFlBQUlhLEtBQUtiLEVBQUwsS0FBVyxDQUFDLENBQWhCLEVBQ0UsS0FBS21CLFFBQUwsQ0FBY25CLEVBQWQsRUFBaUJhLElBQWpCLEVBQXVCQyxHQUF2QixFQUE0QkMsRUFBNUIsRUFBZ0NDLE1BQWhDOztBQUVGLFlBQUlNLElBQUksQ0FBUjs7QUFFQTtBQUNBLFlBQUlGLFdBQVcsRUFBZjtBQUNBLGVBQU9MLEdBQUdqQixNQUFILEdBQVksQ0FBbkIsRUFBc0I7QUFDcEJ3QixjQUFJLENBQUo7QUFDQUYsbUJBQVNuQixJQUFULENBQWNjLEdBQUdBLEdBQUdqQixNQUFILEdBQVksQ0FBZixDQUFkO0FBQ0E7QUFDQWlCLGFBQUdNLE1BQUgsQ0FBVU4sR0FBR2pCLE1BQUgsR0FBWSxDQUF0QixFQUF5QixDQUF6QjtBQUNEOztBQUVELFlBQUl3QixLQUFLLENBQVQsRUFBWTtBQUNWLGVBQUtmLFNBQUwsQ0FBZU4sSUFBZixDQUFvQm1CLFFBQXBCO0FBQ0FBLHFCQUFXLEVBQVg7QUFDQTtBQUNBLGVBQUtkLEtBQUw7QUFDRDtBQUNGO0FBQ0Y7Ozs7OztBQUdIaUIsT0FBT0MsT0FBUCxHQUFpQm5CLEtBQWpCIiwiZmlsZSI6ImdyYXBoLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy9KUyBwb3J0aW5nIG9mIHRoaXMgY29kZSBodHRwOi8vd3d3LmdlZWtzZm9yZ2Vla3Mub3JnL2JpY29ubmVjdGVkLWNvbXBvbmVudHMvXG5cbmZ1bmN0aW9uIGNyZWF0ZV9hcnJheShsZW5ndGgpIHtcbiAgbGV0IGFycmF5ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBhcnJheS5wdXNoKFtdKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cblxuY2xhc3MgRWRnZSB7XG4gIGNvbnN0cnVjdG9yKHUsIHYpIHtcbiAgICB0aGlzLnUgPSB1O1xuICAgIHRoaXMudiA9IHY7XG4gIH1cbn1cblxuY2xhc3MgR3JhcGgge1xuXG4gIGNvbnN0cnVjdG9yKHYpIHtcbiAgICB0aGlzLmNvdW50ID0gMDsgLy8gY291bnQgaXMgbnVtYmVyIG9mIGJpY29ubmVjdGVkIGNvbXBvbmVudHNcbiAgICB0aGlzLnN1YmdyYXBocyA9IFtdOyAvL2JpY29ubmVjdGVkIGNvbXBvbmVudHNcbiAgICB0aGlzLnRpbWUgPSAwOyAgLy8gdGltZSBpcyB1c2VkIHRvIGZpbmQgZGlzY292ZXJ5IHRpbWVzXG5cbiAgICB0aGlzLlYgPSB2OyAgICAgLy8gTm8uIG9mIHZlcnRpY2VzXG4gICAgdGhpcy5FID0gMDsgICAgIC8vIE5vLiBvZiBFZGdlc1xuICAgIHRoaXMuYWRqID0gW107ICAvLyBBZGphY2VuY3kgTGlzdFxuXG4gICAgdGhpcy5hZGogPSBjcmVhdGVfYXJyYXkodik7XG4gIH1cblxuICAvL0Z1bmN0aW9uIHRvIGFkZCBhbiBlZGdlIGludG8gdGhlIGdyYXBoXG4gIGFkZEVkZ2Uodiwgdykge1xuICAgIHRoaXMuYWRqW3ZdLnB1c2godyk7XG4gICAgdGhpcy5FKys7XG4gIH1cblxuICAvLyBBIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGZpbmRzIGFuZCBwcmludHMgc3Ryb25nbHkgY29ubmVjdGVkXG4gIC8vIGNvbXBvbmVudHMgdXNpbmcgREZTIHRyYXZlcnNhbFxuICAvLyB1IC0tPiBUaGUgdmVydGV4IHRvIGJlIHZpc2l0ZWQgbmV4dFxuICAvLyBkaXNjW10gLS0+IFN0b3JlcyBkaXNjb3ZlcnkgdGltZXMgb2YgdmlzaXRlZCB2ZXJ0aWNlc1xuICAvLyBsb3dbXSAtLSA+PiBlYXJsaWVzdCB2aXNpdGVkIHZlcnRleCAodGhlIHZlcnRleCB3aXRoIG1pbmltdW1cbiAgLy8gICAgICAgICAgICAgZGlzY292ZXJ5IHRpbWUpIHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSBzdWJ0cmVlXG4gIC8vICAgICAgICAgICAgIHJvb3RlZCB3aXRoIGN1cnJlbnQgdmVydGV4XG4gIC8vICpzdCAtLSA+PiBUbyBzdG9yZSB2aXNpdGVkIGVkZ2VzXG4gIC8vIC8vIEEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgZmluZHMgYW5kIHByaW50cyBzdHJvbmdseSBjb25uZWN0ZWRcbiAgLy8gY29tcG9uZW50cyB1c2luZyBERlMgdHJhdmVyc2FsXG4gIC8vIHUgLS0+IFRoZSB2ZXJ0ZXggdG8gYmUgdmlzaXRlZCBuZXh0XG4gIC8vIGRpc2NbXSAtLT4gU3RvcmVzIGRpc2NvdmVyeSB0aW1lcyBvZiB2aXNpdGVkIHZlcnRpY2VzXG4gIC8vIGxvd1tdIC0tID4+IGVhcmxpZXN0IHZpc2l0ZWQgdmVydGV4ICh0aGUgdmVydGV4IHdpdGggbWluaW11bVxuICAvLyAgICAgICAgICAgICBkaXNjb3ZlcnkgdGltZSkgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHN1YnRyZWVcbiAgLy8gICAgICAgICAgICAgcm9vdGVkIHdpdGggY3VycmVudCB2ZXJ0ZXhcbiAgLy8gKnN0IC0tID4+IFRvIHN0b3JlIHZpc2l0ZWQgZWRnZXNcbiAgX0JDQ1V0aWwodSwgZGlzYywgbG93LCBzdCwgcGFyZW50KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBkaXNjb3ZlcnkgdGltZSBhbmQgbG93IHZhbHVlXG4gICAgZGlzY1t1XSA9IGxvd1t1XSA9ICsrdGhpcy50aW1lO1xuICAgIHRoaXMuY2hpbGRyZW4gPSAwO1xuXG4gICAgLy8gR28gdGhyb3VnaCBhbGwgdmVydGljZXMgYWRqYWNlbnQgdG8gdGhpc1xuICAgIC8vIHYgaXMgY3VycmVudCBhZGphY2VudCBvZiAndSdcbiAgICB0aGlzLmFkalt1XS5mb3JFYWNoKHYgPT4ge1xuXG4gICAgICAvLyBJZiB2IGlzIG5vdCB2aXNpdGVkIHlldCwgdGhlbiByZWN1ciBmb3IgaXRcbiAgICAgIGlmIChkaXNjW3ZdID09IC0xKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4rKztcbiAgICAgICAgcGFyZW50W3ZdID0gdTtcblxuICAgICAgICAvLyBzdG9yZSB0aGUgZWRnZSBpbiBzdGFja1xuICAgICAgICBzdC5wdXNoKG5ldyBFZGdlKHUsIHYpKTtcbiAgICAgICAgdGhpcy5fQkNDVXRpbCh2LCBkaXNjLCBsb3csIHN0LCBwYXJlbnQpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdWJ0cmVlIHJvb3RlZCB3aXRoICd2JyBoYXMgYVxuICAgICAgICAvLyBjb25uZWN0aW9uIHRvIG9uZSBvZiB0aGUgYW5jZXN0b3JzIG9mICd1J1xuICAgICAgICAvLyBDYXNlIDEgLS0gcGVyIFN0cm9uZ2x5IENvbm5lY3RlZCBDb21wb25lbnRzIEFydGljbGVcbiAgICAgICAgaWYgKGxvd1t1XSA+IGxvd1t2XSlcbiAgICAgICAgICBsb3dbdV0gPSBsb3dbdl07XG5cbiAgICAgICAgLy8gSWYgdSBpcyBhbiBhcnRpY3VsYXRpb24gcG9pbnQsXG4gICAgICAgIC8vIHBvcCBhbGwgZWRnZXMgZnJvbSBzdGFjayB0aWxsIHUgLS0gdlxuICAgICAgICBpZiAoKGRpc2NbdV0gPT0gMSAmJiB0aGlzLmNoaWxkcmVuID4gMSkgfHwgKGRpc2NbdV0gPiAxICYmIGxvd1t2XSA+PSBkaXNjW3VdKSkge1xuICAgICAgICAgIGxldCBzdWJncmFwaCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChzdFtzdC5sZW5ndGggLSAxXS51ICE9IHUgfHwgc3Rbc3QubGVuZ3RoIC0gMV0udiAhPSB2KSB7XG4gICAgICAgICAgICBzdWJncmFwaC5wdXNoKHN0W3N0Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coc3Rbc3QubGVuZ3RoIC0gMV0udSArIFwiLS1cIiArIHN0W3N0Lmxlbmd0aCAtIDFdLnYgKyBcIiBcIik7XG4gICAgICAgICAgICBzdC5zcGxpY2Uoc3QubGVuZ3RoIC0gMSwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3ViZ3JhcGgucHVzaChzdFtzdC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhzdFtzdC5sZW5ndGggLSAxXS51ICsgXCItLVwiICsgc3Rbc3QubGVuZ3RoIC0gMV0udiArIFwiIFwiKTtcbiAgICAgICAgICB0aGlzLnN1YmdyYXBocy5wdXNoKHN1YmdyYXBoKTtcbiAgICAgICAgICBzdWJncmFwaCA9IFtdO1xuICAgICAgICAgIC8vY29uc29sZS5sb2coKVxuICAgICAgICAgIHN0LnNwbGljZShzdC5sZW5ndGggLSAxLCAxKTtcblxuICAgICAgICAgIHRoaXMuY291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgbG93IHZhbHVlIG9mICd1JyBvbmx5IG9mICd2JyBpcyBzdGlsbCBpbiBzdGFja1xuICAgICAgLy8gKGkuZS4gaXQncyBhIGJhY2sgZWRnZSwgbm90IGNyb3NzIGVkZ2UpLlxuICAgICAgLy8gQ2FzZSAyIC0tIHBlciBTdHJvbmdseSBDb25uZWN0ZWQgQ29tcG9uZW50cyBBcnRpY2xlXG4gICAgICBlbHNlIGlmICh2ICE9IHBhcmVudFt1XSAmJiBkaXNjW3ZdIDwgbG93W3VdKSB7XG4gICAgICAgIGlmIChsb3dbdV0gPiBkaXNjW3ZdKVxuICAgICAgICAgIGxvd1t1XSA9IGRpc2Nbdl07XG4gICAgICAgIHN0LnB1c2gobmV3IEVkZ2UodSwgdikpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBCQ0MoKSB7XG4gICAgbGV0IFYgPSB0aGlzLlY7XG4gICAgbGV0IGRpc2MgPSBjcmVhdGVfYXJyYXkoVik7XG4gICAgbGV0IGxvdyA9IGNyZWF0ZV9hcnJheShWKTtcbiAgICBsZXQgcGFyZW50ID0gY3JlYXRlX2FycmF5KFYpO1xuICAgIGxldCBzdCA9IFtdO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBkaXNjIGFuZCBsb3csIGFuZCBwYXJlbnQgYXJyYXlzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBWOyBpKyspIHtcbiAgICAgIGRpc2NbaV0gPSAtMTtcbiAgICAgIGxvd1tpXSA9IC0xO1xuICAgICAgcGFyZW50W2ldID0gLTE7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBWOyBpKyspIHtcbiAgICAgIGlmIChkaXNjW2ldID09IC0xKVxuICAgICAgICB0aGlzLl9CQ0NVdGlsKGksIGRpc2MsIGxvdywgc3QsIHBhcmVudCk7XG5cbiAgICAgIGxldCBqID0gMDtcblxuICAgICAgLy8gSWYgc3RhY2sgaXMgbm90IGVtcHR5LCBwb3AgYWxsIGVkZ2VzIGZyb20gc3RhY2tcbiAgICAgIGxldCBzdWJncmFwaCA9IFtdO1xuICAgICAgd2hpbGUgKHN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaiA9IDE7XG4gICAgICAgIHN1YmdyYXBoLnB1c2goc3Rbc3QubGVuZ3RoIC0gMV0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKHN0W3N0Lmxlbmd0aCAtIDFdLnUgKyBcIi0tXCIgKyBzdFtzdC5sZW5ndGggLSAxXS52ICsgXCIgXCIpO1xuICAgICAgICBzdC5zcGxpY2Uoc3QubGVuZ3RoIC0gMSwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChqID09IDEpIHtcbiAgICAgICAgdGhpcy5zdWJncmFwaHMucHVzaChzdWJncmFwaCk7XG4gICAgICAgIHN1YmdyYXBoID0gW107XG4gICAgICAgIC8vY29uc29sZS5sb2coKTtcbiAgICAgICAgdGhpcy5jb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXBoO1xuIl19