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
JavaScript
;
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