From b7b14e16e8e2320ca13c1ddaffa06bc0d3f4ff2e Mon Sep 17 00:00:00 2001 From: Oleg Sh <> Date: Fri, 5 Apr 2024 19:18:47 +0200 Subject: [PATCH] Fix searching of shortest path for graphs with negative edges. --- core/config/main.php | 2 +- .../model/plugins/FindShortPatchsFromOne.js | 2 +- .../algorithms/model/plugins/ShortestPath.js | 132 ++++++++++++++++-- .../graphoffline/Graphoffline.Emscripten.wasm | Bin 479032 -> 482687 bytes .../api/index.js.cache | 26 ++-- .../api/index.js.cache | 26 ++-- .../create_graph_by_matrix/api/index.js.cache | 4 +- script/pages/editor/api/index.js.cache | 2 +- script/shared/loader.js | 2 +- 9 files changed, 159 insertions(+), 37 deletions(-) diff --git a/core/config/main.php b/core/config/main.php index be7c0cf..2c1e8cb 100755 --- a/core/config/main.php +++ b/core/config/main.php @@ -93,5 +93,5 @@ $g_config['vote'] = "./tmp/vote/vote.txt"; $g_config['voteTopics'] = "./tmp/vote/voteTopics.txt_"; $g_config['use_js_cache'] = true; - $g_config['engine_version'] = 80; + $g_config['engine_version'] = 81; ?> diff --git a/script/features/algorithms/model/plugins/FindShortPatchsFromOne.js b/script/features/algorithms/model/plugins/FindShortPatchsFromOne.js index e8cc316..97136b9 100644 --- a/script/features/algorithms/model/plugins/FindShortPatchsFromOne.js +++ b/script/features/algorithms/model/plugins/FindShortPatchsFromOne.js @@ -211,7 +211,7 @@ FindShortPatchsFromOne.prototype.IsSupportMultiGraph = function() FindShortPatchsFromOne.prototype.IsSupportNegativeWeight = function() { - return false; + return true; } // Factory for connected components. diff --git a/script/features/algorithms/model/plugins/ShortestPath.js b/script/features/algorithms/model/plugins/ShortestPath.js index 83fd97d..00dd8ce 100644 --- a/script/features/algorithms/model/plugins/ShortestPath.js +++ b/script/features/algorithms/model/plugins/ShortestPath.js @@ -46,16 +46,28 @@ FindShortPathNew.prototype.result = function(resultCallback) { if (this.firstObject && this.secondObject) { - this.outResultCallback = function (result ) { resultCallback(result); }; - self = this; - this.CalculateAlgorithm("dsp", - [ - {name: "start", value: this.firstObject.id}, - {name: "finish", value: this.secondObject.id} - ], function (pathObjects, properties, results) - { - self.resultCallback(pathObjects, properties, results); - }); + if (!this.graph.hasNegative()) + { + this.outResultCallback = function (result ) { resultCallback(result); }; + self = this; + this.CalculateAlgorithm("dsp", + [ + {name: "start", value: this.firstObject.id}, + {name: "finish", value: this.secondObject.id} + ], function (pathObjects, properties, results) + { + self.resultCallback(pathObjects, properties, results); + }); + } else { + this.outResultCallback = function (result ) { resultCallback(result); }; + self = this; + this.CalculateAlgorithm("blf", [ + {name: "start", value : this.firstObject.id} + ], function (pathObjects, properties, results) + { + self.resultCallbackBellmanFord(pathObjects, properties, results); + }); + } } return null; } @@ -106,6 +118,104 @@ FindShortPathNew.prototype.resultCallback = function(pathObjects, properties, re this.outResultCallback(outputResult); } +FindShortPathNew.prototype.resultCallbackBellmanFord = function(pathObjects, properties, results) +{ + var outputResult = {}; + outputResult["version"] = 1; + outputResult["minPath"] = true; + + this.pathObjects = pathObjects; + this.properties = properties; + + var bFound = results.length > 0 && results[0].value < this.infinityValue && (results[0].type == 1 || results[0].type == 2); + + if (bFound) + { + this.selectedObjects = {}; + + let prevNodeId = -1; + + let currentDistance = 0; + let currentSelectedObjects = []; + let currentSelectedNodes = []; + + let dataForTargetVertex = {}; + + let pushVertex = function (currentDistance, currentSelectedObjects, currentSelectedNodes) { + let targetVertexId = currentSelectedObjects[currentSelectedObjects.length - 1]; + dataForTargetVertex[targetVertexId] = {distance: currentDistance, objects: currentSelectedObjects, nodes: currentSelectedNodes}; + } + + for (var i = 0; i < results.length; i++) + { + if (results[i].type == 6) + { + pushVertex(currentDistance, currentSelectedObjects, currentSelectedNodes); + currentDistance = 0; + prevNodeId = -1; + currentSelectedObjects = []; + currentSelectedNodes = []; + } + + if (results[i].type == 4) + { + var nodeId = parseInt(results[i].value); + var vertex = this.graph.FindVertex(nodeId); + if (prevNodeId >= 0) + { + var edgeObject = this.graph.FindEdgeMin(prevNodeId, nodeId); + currentSelectedObjects.push(edgeObject.id); + currentDistance += edgeObject.GetWeight(); + } + prevNodeId = nodeId; + currentSelectedObjects.push(nodeId); + currentSelectedNodes.push(nodeId); + } + } + + pushVertex(currentDistance, currentSelectedObjects, currentSelectedNodes); + + let pathObjectsToTarget = dataForTargetVertex[this.secondObject.id].objects; + let distanceToTarget = dataForTargetVertex[this.secondObject.id].distance; + let pathNodes = dataForTargetVertex[this.secondObject.id].nodes; + + for (var i = 0; i < pathObjectsToTarget.length; i++) + { + this.selectedObjects[pathObjectsToTarget[i]] = 1; + } + + this.message = g_shortestPathResult.replace("%d", (distanceToTarget * 1).toString()); + + outputResult["paths"] = []; + outputResult["paths"].push(pathNodes); + + this.message = this.message + ": "; + for (var i = 0; i < pathNodes.length; i++) + { + this.message = this.message + this.graph.FindVertex(pathNodes[i]).mainText + ((i < pathNodes.length - 1) ? "⇒" : ""); + } + + for (let targetId in dataForTargetVertex) + { + this.properties[targetId] = {}; + this.properties[targetId]['lowestDistance'] = dataForTargetVertex[targetId].distance; + } + + this.message = this.message + " "; + + this.updateUpText(); + } + else + { + this.message = g_pathNotExists; + } + this.secondObject = null; + this.firstObject = null; + + this.outResultCallback(outputResult); +} + + FindShortPathNew.prototype.selectVertex = function(vertex) { this.pathObjects = null; @@ -223,7 +333,7 @@ FindShortPathNew.prototype.IsSupportMultiGraph = function () FindShortPathNew.prototype.IsSupportNegativeWeight = function() { - return false; + return true; } diff --git a/script/features/graphoffline/Graphoffline.Emscripten.wasm b/script/features/graphoffline/Graphoffline.Emscripten.wasm index 12d16e68ba30050e6333bbabbc691d1c9e8cc4ba..fc6bf703111b91e8469de411359d51b6312c83cb 100644 GIT binary patch delta 36166 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
X-c!7^DoI#MSu6);P*sx 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 ML@V4xtG~kf3&54y5C8xG delta 32669 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%0Ah~Jpk&{Y@;QB3i*v% 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 diff --git a/script/pages/create_graph_by_edge_list/api/index.js.cache b/script/pages/create_graph_by_edge_list/api/index.js.cache index 5bccdc0..91330c9 100644 --- a/script/pages/create_graph_by_edge_list/api/index.js.cache +++ b/script/pages/create_graph_by_edge_list/api/index.js.cache @@ -1,4 +1,4 @@ -moduleLoader.beginCacheLoading(["/script/entities/graph/api/index.js?v=75","/script/shared/point.js?v=75","/script/entities/edge/api/index.js?v=75","/script/entities/edge/model/BaseEdge.js?v=75","/script/entities/edge/model/EdgeModel.js?v=75","/script/entities/vertex/api/index.js?v=75","/script/entities/vertex/model/BaseVertex.js?v=75","/script/entities/vertex/model/VertexModel.js?v=75","/script/entities/graph/model/Graph.js?v=75",]);{let modulDir="pages/create_graph_by_edge_list/";doInclude([include("entities/graph/api/index.js")]);} +moduleLoader.beginCacheLoading(["/script/entities/graph/api/index.js?v=77","/script/shared/point.js?v=77","/script/entities/edge/api/index.js?v=77","/script/entities/edge/model/BaseEdge.js?v=77","/script/entities/edge/model/EdgeModel.js?v=77","/script/entities/vertex/api/index.js?v=77","/script/entities/vertex/model/BaseVertex.js?v=77","/script/entities/vertex/model/VertexModel.js?v=77","/script/entities/graph/model/Graph.js?v=77",]);{let modulDir="pages/create_graph_by_edge_list/";doInclude([include("entities/graph/api/index.js")]);} {let modulDir="entities/graph/";doInclude([include("shared/point.js"),include("entities/edge/api/index.js"),include("entities/vertex/api/index.js"),include("model/Graph.js",modulDir)])}function Point(x,y){this.x=x||0;this.y=y||0;};Point.prototype.x=null;Point.prototype.y=null;Point.prototype.add=function(v){return new Point(this.x+v.x,this.y+v.y);};Point.prototype.addValue=function(v){return new Point(this.x+v,this.y+v);};Point.prototype.clone=function(){return new Point(this.x,this.y);};Point.prototype.degreesTo=function(v){var dx=this.x-v.x;var dy=this.y-v.y;var angle=Math.atan2(dy,dx);return angle*(180/Math.PI);};Point.prototype.distance=function(v){return Math.sqrt(this.distanceSqr(v));};Point.prototype.distanceSqr=function(v){var x=this.x-v.x;var y=this.y-v.y;return x*x+y*y;};Point.prototype.equals=function(toCompare){return this.x==toCompare.x&&this.y==toCompare.y;};Point.prototype.interpolate=function(v,f){return new Point((this.x+v.x)*f,(this.y+v.y)*f);};Point.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y);};Point.prototype.normalize=function(thickness){var l=this.length();this.x=this.x/l*thickness;this.y=this.y/l*thickness;return new Point(this.x,this.y);};Point.prototype.normalizeCopy=function(thickness){var l=this.length();return new Point(this.x/l*thickness,this.y/l*thickness);};Point.prototype.orbit=function(origin,arcWidth,arcHeight,degrees){var radians=degrees*(Math.PI/180);this.x=origin.x+arcWidth*Math.cos(radians);this.y=origin.y+arcHeight*Math.sin(radians);};Point.prototype.rotate=function(center,degrees){var radians=degrees*(Math.PI/180);offset=this.subtract(center);this.x=offset.x*Math.cos(radians)-offset.y*Math.sin(radians);this.y=offset.x*Math.sin(radians)+offset.y*Math.cos(radians);this.x=this.x+center.x;this.y=this.y+center.y;return this;};Point.prototype.offset=function(dx,dy){this.x+=dx;this.y+=dy;};Point.prototype.subtract=function(v){return new Point(this.x-v.x,this.y-v.y);};Point.prototype.subtractValue=function(value){return new Point(this.x-value,this.y-value);};Point.prototype.multiply=function(value){return new Point(this.x*value,this.y*value);};Point.prototype.toString=function(){return"(x="+this.x+", y="+this.y+")";};Point.prototype.normal=function(){return new Point(-this.y,this.x);};Point.prototype.min=function(point) {return new Point(Math.min(this.x,point.x),Math.min(this.y,point.y));};Point.prototype.max=function(point) {return new Point(Math.max(this.x,point.x),Math.max(this.y,point.y));};Point.prototype.inverse=function() @@ -88,7 +88,7 @@ else BaseEdge.prototype.SetWeight=function(weight) {var useWeight=false;if(!isNaN(parseInt(weight,10))) {useWeight=true;} -weight=(!isNaN(parseInt(weight,10))&&weight>=0)?weight:1;this.weight=Number(weight);this.useWeight=useWeight;} +weight=(!isNaN(parseInt(weight,10)))?weight:1;this.weight=Number(weight);this.useWeight=useWeight;} BaseEdge.prototype.SetUpText=function(text) {this.upText=text;} BaseEdge.prototype.resetOwnStyle=function(index) @@ -216,11 +216,11 @@ BaseVertex.prototype.hasOwnStyleFor=function(index) const defaultVertexDiameter=30;function VertexModel() {this.diameter=globalApplication.GetDefaultVertexSize();} function Graph() -{this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;};Graph.prototype.infinity=1E8;Graph.prototype.maxVertices=1000;Graph.prototype.edgesOffset=10000;Graph.prototype.AddNewVertex=function(vertex) +{this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;this.hasNegativeWeight=false;};Graph.prototype.infinity=1E8;Graph.prototype.maxVertices=1000;Graph.prototype.edgesOffset=10000;Graph.prototype.AddNewVertex=function(vertex) {if(this.vertices.length<=this.maxVertices) {vertex.SetId(this.uidGraph);this.uidGraph=this.uidGraph+1;this.vertices.push(vertex);} return this.vertices.length-1;} -Graph.prototype.ClearGraph=function(){this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;} +Graph.prototype.ClearGraph=function(){this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;this.hasNegativeWeight=false;} Graph.prototype.AddNewEdgeSafe=function(graph1,graph2,isDirect,weight,replaceIfExists=true) {return this.AddNewEdge(new BaseEdge(graph1,graph2,isDirect,weight),replaceIfExists);} Graph.prototype.AddNewEdge=function(edge,replaceIfExists) @@ -232,11 +232,11 @@ else {if(edge1!=null&&replaceIfExists) this.DeleteEdge(edge1);if(edgeRevert!=null&&!edgeRevert.isDirect&&replaceIfExists) this.DeleteEdge(edgeRevert);this.edges.push(edge);} -this.isMultiGraph=this.checkMutiGraph();return this.edges.length-1;} +this.isMultiGraph=this.checkMutiGraph();this.hasNegativeWeight=this.checkNegativeWeight();return this.edges.length-1;} Graph.prototype.DeleteEdge=function(edgeObject) {var index=this.edges.indexOf(edgeObject);if(index>-1) {this.edges.splice(index,1);} -this.isMultiGraph=this.checkMutiGraph();} +this.isMultiGraph=this.checkMutiGraph();this.hasNegativeWeight=this.checkNegativeWeight();} Graph.prototype.DeleteVertex=function(vertexObject) {var index=this.vertices.indexOf(vertexObject);if(index>-1) {for(var i=0;imaxWeight) {res=edge;maxWeight=edge.weight;}}} @@ -392,7 +392,7 @@ var newVertices=[];var bWeightGraph=false;for(var i=0;i=this.vertices.length) {var newPos=this.GetRandomPositionOfVertex(matrix,j,viewportSize);newVertices.push(new BaseVertex(newPos.x,newPos.y,currentEnumVerticesType));this.AddNewVertex(newVertices[newVertices.length-1]);} -if(cols[i][j]>0) +if(cols[i][j]!=0) {var nEdgeIndex=this.AddNewEdgeSafe(this.vertices[i],this.vertices[j],cols[i][j]!=cols[j][i],cols[i][j],true);this.FixEdgeCurve(nEdgeIndex);if(nEdgeIndex>=0) {bWeightGraph=bWeightGraph||this.edges[nEdgeIndex].weight!=1;}}}} if(!bWeightGraph) @@ -402,7 +402,7 @@ for(var i=rows.length;i(.+)$/g,/^(.+)<(.+)$/g,/^(.+)-\((\d+|\d+\.?\d+)\)-(.+)$/g,/^(.+)-\((\d+|\d+\.?\d+)\)\>(.+)$/g,/^(.+)<\((\d+|\d+\.?\d+)\)\-(.+)$/g,];let bWeightGraph=false;var newVertices=[];for(var i=0;i(.+)$/g,/^(.+)<(.+)$/g,/^(.+)-\((-?\d+|-?\d+\.?\d+)\)-(.+)$/g,/^(.+)-\((-?\d+|-?\d+\.?\d+)\)\>(.+)$/g,/^(.+)<\((-?\d+|-?\d+\.?\d+)\)\-(.+)$/g,];let bWeightGraph=false;var newVertices=[];for(var i=0;i=0;--j){if(!line.match(regExp[j])){continue;} let groupes=Array.from(line.matchAll(regExp[j]));let groupe=groupes[0];let vetext1Title=groupe[1];let vertex1=this.FindVertexByTitle(vetext1Title);if(vertex1==null){let newPosition=this.GetRandomPosition(viewportSize);vertex1=this.vertices[this.AddNewVertex(new BaseVertex(newPosition.x,newPosition.y,currentEnumVerticesType))];vertex1.mainText=vetext1Title;newVertices.push(vertex1);} @@ -509,7 +509,7 @@ Graph.prototype.LoadFromXML=function(xmlText,additionalData) this.uidGraph=loadedGraphId;this.uidEdge=loadedEdgeId;$nodes=$xml.find("node");var vertices=[];$nodes.each(function(){var vertex=new BaseVertex();vertex.LoadFromXML($(this));vertices.push(vertex);});this.vertices=vertices;$edges=$xml.find("edge");var edges=[];var graph=this;$edges.each(function(){var edge=new BaseEdge();edge.LoadFromXML($(this),graph);if(edge.id=0)?weight:1;this.weight=Number(weight);this.useWeight=useWeight;} +weight=(!isNaN(parseInt(weight,10)))?weight:1;this.weight=Number(weight);this.useWeight=useWeight;} BaseEdge.prototype.SetUpText=function(text) {this.upText=text;} BaseEdge.prototype.resetOwnStyle=function(index) @@ -216,11 +216,11 @@ BaseVertex.prototype.hasOwnStyleFor=function(index) const defaultVertexDiameter=30;function VertexModel() {this.diameter=globalApplication.GetDefaultVertexSize();} function Graph() -{this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;};Graph.prototype.infinity=1E8;Graph.prototype.maxVertices=1000;Graph.prototype.edgesOffset=10000;Graph.prototype.AddNewVertex=function(vertex) +{this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;this.hasNegativeWeight=false;};Graph.prototype.infinity=1E8;Graph.prototype.maxVertices=1000;Graph.prototype.edgesOffset=10000;Graph.prototype.AddNewVertex=function(vertex) {if(this.vertices.length<=this.maxVertices) {vertex.SetId(this.uidGraph);this.uidGraph=this.uidGraph+1;this.vertices.push(vertex);} return this.vertices.length-1;} -Graph.prototype.ClearGraph=function(){this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;} +Graph.prototype.ClearGraph=function(){this.vertices=[];this.edges=[];this.uidGraph=0;this.uidEdge=10000;this.hasDirect=false;this.isMultiGraph=false;this.hasNegativeWeight=false;} Graph.prototype.AddNewEdgeSafe=function(graph1,graph2,isDirect,weight,replaceIfExists=true) {return this.AddNewEdge(new BaseEdge(graph1,graph2,isDirect,weight),replaceIfExists);} Graph.prototype.AddNewEdge=function(edge,replaceIfExists) @@ -232,11 +232,11 @@ else {if(edge1!=null&&replaceIfExists) this.DeleteEdge(edge1);if(edgeRevert!=null&&!edgeRevert.isDirect&&replaceIfExists) this.DeleteEdge(edgeRevert);this.edges.push(edge);} -this.isMultiGraph=this.checkMutiGraph();return this.edges.length-1;} +this.isMultiGraph=this.checkMutiGraph();this.hasNegativeWeight=this.checkNegativeWeight();return this.edges.length-1;} Graph.prototype.DeleteEdge=function(edgeObject) {var index=this.edges.indexOf(edgeObject);if(index>-1) {this.edges.splice(index,1);} -this.isMultiGraph=this.checkMutiGraph();} +this.isMultiGraph=this.checkMutiGraph();this.hasNegativeWeight=this.checkNegativeWeight();} Graph.prototype.DeleteVertex=function(vertexObject) {var index=this.vertices.indexOf(vertexObject);if(index>-1) {for(var i=0;imaxWeight) {res=edge;maxWeight=edge.weight;}}} @@ -392,7 +392,7 @@ var newVertices=[];var bWeightGraph=false;for(var i=0;i=this.vertices.length) {var newPos=this.GetRandomPositionOfVertex(matrix,j,viewportSize);newVertices.push(new BaseVertex(newPos.x,newPos.y,currentEnumVerticesType));this.AddNewVertex(newVertices[newVertices.length-1]);} -if(cols[i][j]>0) +if(cols[i][j]!=0) {var nEdgeIndex=this.AddNewEdgeSafe(this.vertices[i],this.vertices[j],cols[i][j]!=cols[j][i],cols[i][j],true);this.FixEdgeCurve(nEdgeIndex);if(nEdgeIndex>=0) {bWeightGraph=bWeightGraph||this.edges[nEdgeIndex].weight!=1;}}}} if(!bWeightGraph) @@ -402,7 +402,7 @@ for(var i=rows.length;i(.+)$/g,/^(.+)<(.+)$/g,/^(.+)-\((\d+|\d+\.?\d+)\)-(.+)$/g,/^(.+)-\((\d+|\d+\.?\d+)\)\>(.+)$/g,/^(.+)<\((\d+|\d+\.?\d+)\)\-(.+)$/g,];let bWeightGraph=false;var newVertices=[];for(var i=0;i(.+)$/g,/^(.+)<(.+)$/g,/^(.+)-\((-?\d+|-?\d+\.?\d+)\)-(.+)$/g,/^(.+)-\((-?\d+|-?\d+\.?\d+)\)\>(.+)$/g,/^(.+)<\((-?\d+|-?\d+\.?\d+)\)\-(.+)$/g,];let bWeightGraph=false;var newVertices=[];for(var i=0;i=0;--j){if(!line.match(regExp[j])){continue;} let groupes=Array.from(line.matchAll(regExp[j]));let groupe=groupes[0];let vetext1Title=groupe[1];let vertex1=this.FindVertexByTitle(vetext1Title);if(vertex1==null){let newPosition=this.GetRandomPosition(viewportSize);vertex1=this.vertices[this.AddNewVertex(new BaseVertex(newPosition.x,newPosition.y,currentEnumVerticesType))];vertex1.mainText=vetext1Title;newVertices.push(vertex1);} @@ -509,7 +509,7 @@ Graph.prototype.LoadFromXML=function(xmlText,additionalData) this.uidGraph=loadedGraphId;this.uidEdge=loadedEdgeId;$nodes=$xml.find("node");var vertices=[];$nodes.each(function(){var vertex=new BaseVertex();vertex.LoadFromXML($(this));vertices.push(vertex);});this.vertices=vertices;$edges=$xml.find("edge");var edges=[];var graph=this;$edges.each(function(){var edge=new BaseEdge();edge.LoadFromXML($(this),graph);if(edge.idmaxWeight) {res=edge;maxWeight=edge.weight;}}} diff --git a/script/pages/editor/api/index.js.cache b/script/pages/editor/api/index.js.cache index 43fa614..73dc55a 100644 --- a/script/pages/editor/api/index.js.cache +++ b/script/pages/editor/api/index.js.cache @@ -1,4 +1,4 @@ -moduleLoader.beginCacheLoading(["/script/shared/utils.js?v=76","/script/entities/graph/api/index.js?v=76","/script/shared/point.js?v=76","/script/entities/edge/api/index.js?v=76","/script/entities/edge/model/BaseEdge.js?v=76","/script/entities/edge/model/EdgeModel.js?v=76","/script/entities/vertex/api/index.js?v=76","/script/entities/vertex/model/BaseVertex.js?v=76","/script/entities/vertex/model/VertexModel.js?v=76","/script/entities/graph/model/Graph.js?v=76","/script/features/draw_graph/api/index.js?v=76","/script/features/draw_graph/model/BaseBackgroundDrawer.js?v=76","/script/features/draw_graph/model/BaseEdgeDrawer.js?v=76","/script/features/draw_graph/model/BaseVertexDrawer.js?v=76","/script/features/algorithms/api/index.js?v=76","/script/features/algorithms/model/Algorithms.js?v=76","/script/features/algorithms/model/BaseTraversal.js?v=76","/script/features/base_handler/index.js?v=76","/script/features/default_handler/index.js?v=76","/script/features/add_vertices_handler/index.js?v=76","/script/features/connect_vertices_handler/index.js?v=76","/script/features/delete_objects_handler/index.js?v=76","/script/features/algorithm_handler/index.js?v=76","/script/features/serialization/api/index.js?v=76","/script/features/serialization/model/GraphMLCreator.js?v=76","/script/features/enum_vertices/EnumVertices.js?v=76","/script/pages/editor/model/texts.js?v=76","/script/pages/editor/model/UndoStack.js?v=76","/script/pages/editor/model/DiskSaveLoad.js?v=76","/script/pages/editor/model/Application.js?v=76","/script/pages/editor/ui/ya_metrika.js?v=76","/script/pages/editor/ui/editor.js?v=76","/script/pages/editor/ui/main.js?v=76",]);{function onloadEditor(){console.log("onload() call");doIncludeAsync([include("shared/canvas2svg.js"),include("features/group_rename_handler/index.js"),include("features/saved_graph_handler/index.js"),include("features/saved_graph_image_handler/index.js"),include("features/show_adjacency_matrix/index.js"),include("features/show_distance_matrix/index.js"),include("features/show_incidence_matrix/index.js"),include("features/setup_background_style/index.js"),include("features/setup_edge_style/index.js"),include("features/setup_vertex_style/index.js"),]);postLoadPage();} +moduleLoader.beginCacheLoading(["/script/shared/utils.js?v=77","/script/entities/graph/api/index.js?v=77","/script/shared/point.js?v=77","/script/entities/edge/api/index.js?v=77","/script/entities/edge/model/BaseEdge.js?v=77","/script/entities/edge/model/EdgeModel.js?v=77","/script/entities/vertex/api/index.js?v=77","/script/entities/vertex/model/BaseVertex.js?v=77","/script/entities/vertex/model/VertexModel.js?v=77","/script/entities/graph/model/Graph.js?v=77","/script/features/draw_graph/api/index.js?v=77","/script/features/draw_graph/model/BaseBackgroundDrawer.js?v=77","/script/features/draw_graph/model/BaseEdgeDrawer.js?v=77","/script/features/draw_graph/model/BaseVertexDrawer.js?v=77","/script/features/algorithms/api/index.js?v=77","/script/features/algorithms/model/Algorithms.js?v=77","/script/features/algorithms/model/BaseTraversal.js?v=77","/script/features/base_handler/index.js?v=77","/script/features/default_handler/index.js?v=77","/script/features/add_vertices_handler/index.js?v=77","/script/features/connect_vertices_handler/index.js?v=77","/script/features/delete_objects_handler/index.js?v=77","/script/features/algorithm_handler/index.js?v=77","/script/features/serialization/api/index.js?v=77","/script/features/serialization/model/GraphMLCreator.js?v=77","/script/features/enum_vertices/EnumVertices.js?v=77","/script/pages/editor/model/texts.js?v=77","/script/pages/editor/model/UndoStack.js?v=77","/script/pages/editor/model/DiskSaveLoad.js?v=77","/script/pages/editor/model/Application.js?v=77","/script/pages/editor/ui/ya_metrika.js?v=77","/script/pages/editor/ui/editor.js?v=77","/script/pages/editor/ui/main.js?v=77",]);{function onloadEditor(){console.log("onload() call");doIncludeAsync([include("shared/canvas2svg.js"),include("features/group_rename_handler/index.js"),include("features/saved_graph_handler/index.js"),include("features/saved_graph_image_handler/index.js"),include("features/show_adjacency_matrix/index.js"),include("features/show_distance_matrix/index.js"),include("features/show_incidence_matrix/index.js"),include("features/setup_background_style/index.js"),include("features/setup_edge_style/index.js"),include("features/setup_vertex_style/index.js"),]);postLoadPage();} let modulDir="pages/editor/";doInclude([include("shared/utils.js"),include("entities/graph/api/index.js"),include("features/draw_graph/api/index.js"),include("features/algorithms/api/index.js"),include("features/base_handler/index.js"),include("features/default_handler/index.js"),include("features/add_vertices_handler/index.js"),include("features/connect_vertices_handler/index.js"),include("features/delete_objects_handler/index.js"),include("features/algorithm_handler/index.js"),include("features/serialization/api/index.js"),include("features/enum_vertices/EnumVertices.js"),include("model/texts.js",modulDir),include("model/UndoStack.js",modulDir),include("model/DiskSaveLoad.js",modulDir),include("model/Application.js",modulDir),include("ui/ya_metrika.js",modulDir),include("ui/editor.js",modulDir),include("ui/main.js",modulDir)],onloadEditor);} function gEncodeToHTML(str) {if(typeof str!=='string') diff --git a/script/shared/loader.js b/script/shared/loader.js index 973d7e8..b880114 100644 --- a/script/shared/loader.js +++ b/script/shared/loader.js @@ -1,5 +1,5 @@ // Global version needs to force reload scripts from server. -let globalVersion = 76; +let globalVersion = 77; var include = function(filename, localDir) { return {filename: filename, localDir: localDir};