react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
165 lines (135 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9ncmFwaC5qcyJdLCJuYW1lcyI6WyJjcmVhdGVfYXJyYXkiLCJsZW5ndGgiLCJhcnJheSIsImkiLCJwdXNoIiwiRWRnZSIsInUiLCJ2IiwiR3JhcGgiLCJjb3VudCIsInN1YmdyYXBocyIsInRpbWUiLCJWIiwiRSIsImFkaiIsInciLCJkaXNjIiwibG93Iiwic3QiLCJwYXJlbnQiLCJjaGlsZHJlbiIsImZvckVhY2giLCJfQkNDVXRpbCIsInN1YmdyYXBoIiwic3BsaWNlIiwiaiIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7QUFFQSxTQUFTQSxZQUFULENBQXNCQyxNQUF0QixFQUE4QjtBQUM1QixNQUFJQyxRQUFRLEVBQVo7QUFDQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsTUFBcEIsRUFBNEIsRUFBRUUsQ0FBOUIsRUFBaUM7QUFDL0JELFVBQU1FLElBQU4sQ0FBVyxFQUFYO0FBQ0Q7QUFDRCxTQUFPRixLQUFQO0FBQ0Q7O0lBR0tHLEksR0FDSixjQUFZQyxDQUFaLEVBQWVDLENBQWYsRUFBa0I7QUFBQTs7QUFDaEIsT0FBS0QsQ0FBTCxHQUFTQSxDQUFUO0FBQ0EsT0FBS0MsQ0FBTCxHQUFTQSxDQUFUO0FBQ0QsQzs7SUFHR0MsSztBQUVKLGlCQUFZRCxDQUFaLEVBQWU7QUFBQTs7QUFDYixTQUFLRSxLQUFMLEdBQWEsQ0FBYixDQURhLENBQ0c7QUFDaEIsU0FBS0MsU0FBTCxHQUFpQixFQUFqQixDQUZhLENBRVE7QUFDckIsU0FBS0MsSUFBTCxHQUFZLENBQVosQ0FIYSxDQUdHOztBQUVoQixTQUFLQyxDQUFMLEdBQVNMLENBQVQsQ0FMYSxDQUtHO0FBQ2hCLFNBQUtNLENBQUwsR0FBUyxDQUFULENBTmEsQ0FNRztBQUNoQixTQUFLQyxHQUFMLEdBQVcsRUFBWCxDQVBhLENBT0c7O0FBRWhCLFNBQUtBLEdBQUwsR0FBV2QsYUFBYU8sQ0FBYixDQUFYO0FBQ0Q7O0FBRUQ7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QVQ7O0FBRUE7QUFDQSxXQUFLLElBQUlmLElBQUksQ0FBYixFQUFnQkEsSUFBSVMsQ0FBcEIsRUFBdUJULEdBQXZCLEVBQTRCO0FBQzFCYSxhQUFLYixDQUFMLElBQVUsQ0FBQyxDQUFYO0FBQ0FjLFlBQUlkLENBQUosSUFBUyxDQUFDLENBQVY7QUFDQWdCLGVBQU9oQixDQUFQLElBQVksQ0FBQyxDQUFiO0FBQ0Q7O0FBRUQsV0FBSyxJQUFJQSxLQUFJLENBQWIsRUFBZ0JBLEtBQUlTLENBQXBCLEVBQXVCVCxJQUF2QixFQUE0QjtBQUMxQixZQUFJYSxLQUFLYixFQUFMLEtBQVcsQ0FBQyxDQUFoQixFQUNFLEtBQUttQixRQUFMLENBQWNuQixFQUFkLEVBQWlCYSxJQUFqQixFQUF1QkMsR0FBdkIsRUFBNEJDLEVBQTVCLEVBQWdDQyxNQUFoQzs7QUFFRixZQUFJTSxJQUFJLENBQVI7O0FBRUE7QUFDQSxZQUFJRixXQUFXLEVBQWY7QUFDQSxlQUFPTCxHQUFHakIsTUFBSCxHQUFZLENBQW5CLEVBQXNCO0FBQ3BCd0IsY0FBSSxDQUFKO0FBQ0FGLG1CQUFTbkIsSUFBVCxDQUFjYyxHQUFHQSxHQUFHakIsTUFBSCxHQUFZLENBQWYsQ0FBZDtBQUNBO0FBQ0FpQixhQUFHTSxNQUFILENBQVVOLEdBQUdqQixNQUFILEdBQVksQ0FBdEIsRUFBeUIsQ0FBekI7QUFDRDs7QUFFRCxZQUFJd0IsS0FBSyxDQUFULEVBQVk7QUFDVixlQUFLZixTQUFMLENBQWVOLElBQWYsQ0FBb0JtQixRQUFwQjtBQUNBQSxxQkFBVyxFQUFYO0FBQ0E7QUFDQSxlQUFLZCxLQUFMO0FBQ0Q7QUFDRjtBQUNGOzs7Ozs7QUFHSGlCLE9BQU9DLE9BQVAsR0FBaUJuQixLQUFqQiIsImZpbGUiOiJncmFwaC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vSlMgcG9ydGluZyBvZiB0aGlzIGNvZGUgaHR0cDovL3d3dy5nZWVrc2ZvcmdlZWtzLm9yZy9iaWNvbm5lY3RlZC1jb21wb25lbnRzL1xuXG5mdW5jdGlvbiBjcmVhdGVfYXJyYXkobGVuZ3RoKSB7XG4gIGxldCBhcnJheSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgYXJyYXkucHVzaChbXSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5cbmNsYXNzIEVkZ2Uge1xuICBjb25zdHJ1Y3Rvcih1LCB2KSB7XG4gICAgdGhpcy51ID0gdTtcbiAgICB0aGlzLnYgPSB2O1xuICB9XG59XG5cbmNsYXNzIEdyYXBoIHtcblxuICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgdGhpcy5jb3VudCA9IDA7IC8vIGNvdW50IGlzIG51bWJlciBvZiBiaWNvbm5lY3RlZCBjb21wb25lbnRzXG4gICAgdGhpcy5zdWJncmFwaHMgPSBbXTsgLy9iaWNvbm5lY3RlZCBjb21wb25lbnRzXG4gICAgdGhpcy50aW1lID0gMDsgIC8vIHRpbWUgaXMgdXNlZCB0byBmaW5kIGRpc2NvdmVyeSB0aW1lc1xuXG4gICAgdGhpcy5WID0gdjsgICAgIC8vIE5vLiBvZiB2ZXJ0aWNlc1xuICAgIHRoaXMuRSA9IDA7ICAgICAvLyBOby4gb2YgRWRnZXNcbiAgICB0aGlzLmFkaiA9IFtdOyAgLy8gQWRqYWNlbmN5IExpc3RcblxuICAgIHRoaXMuYWRqID0gY3JlYXRlX2FycmF5KHYpO1xuICB9XG5cbiAgLy9GdW5jdGlvbiB0byBhZGQgYW4gZWRnZSBpbnRvIHRoZSBncmFwaFxuICBhZGRFZGdlKHYsIHcpIHtcbiAgICB0aGlzLmFkalt2XS5wdXNoKHcpO1xuICAgIHRoaXMuRSsrO1xuICB9XG5cbiAgLy8gQSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBmaW5kcyBhbmQgcHJpbnRzIHN0cm9uZ2x5IGNvbm5lY3RlZFxuICAvLyBjb21wb25lbnRzIHVzaW5nIERGUyB0cmF2ZXJzYWxcbiAgLy8gdSAtLT4gVGhlIHZlcnRleCB0byBiZSB2aXNpdGVkIG5leHRcbiAgLy8gZGlzY1tdIC0tPiBTdG9yZXMgZGlzY292ZXJ5IHRpbWVzIG9mIHZpc2l0ZWQgdmVydGljZXNcbiAgLy8gbG93W10gLS0gPj4gZWFybGllc3QgdmlzaXRlZCB2ZXJ0ZXggKHRoZSB2ZXJ0ZXggd2l0aCBtaW5pbXVtXG4gIC8vICAgICAgICAgICAgIGRpc2NvdmVyeSB0aW1lKSB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gc3VidHJlZVxuICAvLyAgICAgICAgICAgICByb290ZWQgd2l0aCBjdXJyZW50IHZlcnRleFxuICAvLyAqc3QgLS0gPj4gVG8gc3RvcmUgdmlzaXRlZCBlZGdlc1xuICAvLyAvLyBBIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGZpbmRzIGFuZCBwcmludHMgc3Ryb25nbHkgY29ubmVjdGVkXG4gIC8vIGNvbXBvbmVudHMgdXNpbmcgREZTIHRyYXZlcnNhbFxuICAvLyB1IC0tPiBUaGUgdmVydGV4IHRvIGJlIHZpc2l0ZWQgbmV4dFxuICAvLyBkaXNjW10gLS0+IFN0b3JlcyBkaXNjb3ZlcnkgdGltZXMgb2YgdmlzaXRlZCB2ZXJ0aWNlc1xuICAvLyBsb3dbXSAtLSA+PiBlYXJsaWVzdCB2aXNpdGVkIHZlcnRleCAodGhlIHZlcnRleCB3aXRoIG1pbmltdW1cbiAgLy8gICAgICAgICAgICAgZGlzY292ZXJ5IHRpbWUpIHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSBzdWJ0cmVlXG4gIC8vICAgICAgICAgICAgIHJvb3RlZCB3aXRoIGN1cnJlbnQgdmVydGV4XG4gIC8vICpzdCAtLSA+PiBUbyBzdG9yZSB2aXNpdGVkIGVkZ2VzXG4gIF9CQ0NVdGlsKHUsIGRpc2MsIGxvdywgc3QsIHBhcmVudCkge1xuICAgIC8vIEluaXRpYWxpemUgZGlzY292ZXJ5IHRpbWUgYW5kIGxvdyB2YWx1ZVxuICAgIGRpc2NbdV0gPSBsb3dbdV0gPSArK3RoaXMudGltZTtcbiAgICB0aGlzLmNoaWxkcmVuID0gMDtcblxuICAgIC8vIEdvIHRocm91Z2ggYWxsIHZlcnRpY2VzIGFkamFjZW50IHRvIHRoaXNcbiAgICAvLyB2IGlzIGN1cnJlbnQgYWRqYWNlbnQgb2YgJ3UnXG4gICAgdGhpcy5hZGpbdV0uZm9yRWFjaCh2ID0+IHtcblxuICAgICAgLy8gSWYgdiBpcyBub3QgdmlzaXRlZCB5ZXQsIHRoZW4gcmVjdXIgZm9yIGl0XG4gICAgICBpZiAoZGlzY1t2XSA9PSAtMSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuKys7XG4gICAgICAgIHBhcmVudFt2XSA9IHU7XG5cbiAgICAgICAgLy8gc3RvcmUgdGhlIGVkZ2UgaW4gc3RhY2tcbiAgICAgICAgc3QucHVzaChuZXcgRWRnZSh1LCB2KSk7XG4gICAgICAgIHRoaXMuX0JDQ1V0aWwodiwgZGlzYywgbG93LCBzdCwgcGFyZW50KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VidHJlZSByb290ZWQgd2l0aCAndicgaGFzIGFcbiAgICAgICAgLy8gY29ubmVjdGlvbiB0byBvbmUgb2YgdGhlIGFuY2VzdG9ycyBvZiAndSdcbiAgICAgICAgLy8gQ2FzZSAxIC0tIHBlciBTdHJvbmdseSBDb25uZWN0ZWQgQ29tcG9uZW50cyBBcnRpY2xlXG4gICAgICAgIGlmIChsb3dbdV0gPiBsb3dbdl0pXG4gICAgICAgICAgbG93W3VdID0gbG93W3ZdO1xuXG4gICAgICAgIC8vIElmIHUgaXMgYW4gYXJ0aWN1bGF0aW9uIHBvaW50LFxuICAgICAgICAvLyBwb3AgYWxsIGVkZ2VzIGZyb20gc3RhY2sgdGlsbCB1IC0tIHZcbiAgICAgICAgaWYgKChkaXNjW3VdID09IDEgJiYgdGhpcy5jaGlsZHJlbiA+IDEpIHx8IChkaXNjW3VdID4gMSAmJiBsb3dbdl0gPj0gZGlzY1t1XSkpIHtcbiAgICAgICAgICBsZXQgc3ViZ3JhcGggPSBbXTtcbiAgICAgICAgICB3aGlsZSAoc3Rbc3QubGVuZ3RoIC0gMV0udSAhPSB1IHx8IHN0W3N0Lmxlbmd0aCAtIDFdLnYgIT0gdikge1xuICAgICAgICAgICAgc3ViZ3JhcGgucHVzaChzdFtzdC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHN0W3N0Lmxlbmd0aCAtIDFdLnUgKyBcIi0tXCIgKyBzdFtzdC5sZW5ndGggLSAxXS52ICsgXCIgXCIpO1xuICAgICAgICAgICAgc3Quc3BsaWNlKHN0Lmxlbmd0aCAtIDEsIDEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN1YmdyYXBoLnB1c2goc3Rbc3QubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgIC8vY29uc29sZS5sb2coc3Rbc3QubGVuZ3RoIC0gMV0udSArIFwiLS1cIiArIHN0W3N0Lmxlbmd0aCAtIDFdLnYgKyBcIiBcIik7XG4gICAgICAgICAgdGhpcy5zdWJncmFwaHMucHVzaChzdWJncmFwaCk7XG4gICAgICAgICAgc3ViZ3JhcGggPSBbXTtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKClcbiAgICAgICAgICBzdC5zcGxpY2Uoc3QubGVuZ3RoIC0gMSwgMSk7XG5cbiAgICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxvdyB2YWx1ZSBvZiAndScgb25seSBvZiAndicgaXMgc3RpbGwgaW4gc3RhY2tcbiAgICAgIC8vIChpLmUuIGl0J3MgYSBiYWNrIGVkZ2UsIG5vdCBjcm9zcyBlZGdlKS5cbiAgICAgIC8vIENhc2UgMiAtLSBwZXIgU3Ryb25nbHkgQ29ubmVjdGVkIENvbXBvbmVudHMgQXJ0aWNsZVxuICAgICAgZWxzZSBpZiAodiAhPSBwYXJlbnRbdV0gJiYgZGlzY1t2XSA8IGxvd1t1XSkge1xuICAgICAgICBpZiAobG93W3VdID4gZGlzY1t2XSlcbiAgICAgICAgICBsb3dbdV0gPSBkaXNjW3ZdO1xuICAgICAgICBzdC5wdXNoKG5ldyBFZGdlKHUsIHYpKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgQkNDKCkge1xuICAgIGxldCBWID0gdGhpcy5WO1xuICAgIGxldCBkaXNjID0gY3JlYXRlX2FycmF5KFYpO1xuICAgIGxldCBsb3cgPSBjcmVhdGVfYXJyYXkoVik7XG4gICAgbGV0IHBhcmVudCA9IGNyZWF0ZV9hcnJheShWKTtcbiAgICBsZXQgc3QgPSBbXTtcblxuICAgIC8vIEluaXRpYWxpemUgZGlzYyBhbmQgbG93LCBhbmQgcGFyZW50IGFycmF5c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVjsgaSsrKSB7XG4gICAgICBkaXNjW2ldID0gLTE7XG4gICAgICBsb3dbaV0gPSAtMTtcbiAgICAgIHBhcmVudFtpXSA9IC0xO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVjsgaSsrKSB7XG4gICAgICBpZiAoZGlzY1tpXSA9PSAtMSlcbiAgICAgICAgdGhpcy5fQkNDVXRpbChpLCBkaXNjLCBsb3csIHN0LCBwYXJlbnQpO1xuXG4gICAgICBsZXQgaiA9IDA7XG5cbiAgICAgIC8vIElmIHN0YWNrIGlzIG5vdCBlbXB0eSwgcG9wIGFsbCBlZGdlcyBmcm9tIHN0YWNrXG4gICAgICBsZXQgc3ViZ3JhcGggPSBbXTtcbiAgICAgIHdoaWxlIChzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGogPSAxO1xuICAgICAgICBzdWJncmFwaC5wdXNoKHN0W3N0Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzdFtzdC5sZW5ndGggLSAxXS51ICsgXCItLVwiICsgc3Rbc3QubGVuZ3RoIC0gMV0udiArIFwiIFwiKTtcbiAgICAgICAgc3Quc3BsaWNlKHN0Lmxlbmd0aCAtIDEsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaiA9PSAxKSB7XG4gICAgICAgIHRoaXMuc3ViZ3JhcGhzLnB1c2goc3ViZ3JhcGgpO1xuICAgICAgICBzdWJncmFwaCA9IFtdO1xuICAgICAgICAvL2NvbnNvbGUubG9nKCk7XG4gICAgICAgIHRoaXMuY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaDtcbiJdfQ==