From ddc81330ab5bfb6b23abd203b0313e3fe796da12 Mon Sep 17 00:00:00 2001 From: Giacomo Bertolazzi <20015159@studenti.uniupo.it> Date: Fri, 21 Jun 2019 23:50:34 +0200 Subject: [PATCH] dsadasdasd * added a method where you can get all the marks * implemented and tested * moved main * changed README * builded JavaDoc * builded jar --- README.md | Bin 756 -> 916 bytes build.gradle | 9 +- doc/allclasses-frame.html | 53 + doc/allclasses-noframe.html | 53 + doc/berack96/lib/graph/Edge.html | 394 ++++ doc/berack96/lib/graph/Graph.html | 1915 ++++++++++++++++ doc/berack96/lib/graph/Vertex.html | 786 +++++++ doc/berack96/lib/graph/class-use/Edge.html | 517 +++++ doc/berack96/lib/graph/class-use/Graph.html | 479 ++++ doc/berack96/lib/graph/class-use/Vertex.html | 293 +++ doc/berack96/lib/graph/impl/AdjGraph.html | 1922 ++++++++++++++++ doc/berack96/lib/graph/impl/MapGraph.html | 1931 +++++++++++++++++ doc/berack96/lib/graph/impl/MatrixGraph.html | 1922 ++++++++++++++++ .../lib/graph/impl/class-use/AdjGraph.html | 124 ++ .../lib/graph/impl/class-use/MapGraph.html | 124 ++ .../lib/graph/impl/class-use/MatrixGraph.html | 124 ++ .../lib/graph/impl/package-frame.html | 22 + .../lib/graph/impl/package-summary.html | 156 ++ doc/berack96/lib/graph/impl/package-tree.html | 139 ++ doc/berack96/lib/graph/impl/package-use.html | 124 ++ .../lib/graph/models/EdgeSaveStructure.html | 323 +++ .../lib/graph/models/GraphSaveStructure.html | 318 +++ .../lib/graph/models/MarkSaveStructure.html | 308 +++ .../models/class-use/EdgeSaveStructure.html | 164 ++ .../models/class-use/GraphSaveStructure.html | 124 ++ .../models/class-use/MarkSaveStructure.html | 124 ++ .../lib/graph/models/package-frame.html | 22 + .../lib/graph/models/package-summary.html | 156 ++ .../lib/graph/models/package-tree.html | 139 ++ .../lib/graph/models/package-use.html | 159 ++ doc/berack96/lib/graph/package-frame.html | 25 + doc/berack96/lib/graph/package-summary.html | 171 ++ doc/berack96/lib/graph/package-tree.html | 146 ++ doc/berack96/lib/graph/package-use.html | 373 ++++ doc/berack96/lib/graph/view/GraphInfo.html | 364 ++++ .../lib/graph/view/GraphListener.html | 281 +++ doc/berack96/lib/graph/view/GraphPanel.html | 586 +++++ doc/berack96/lib/graph/view/GraphWindow.html | 452 ++++ .../lib/graph/view/GraphicalView.html | 276 +++ doc/berack96/lib/graph/view/Main.html | 271 +++ .../lib/graph/view/VisitListener.html | 494 +++++ .../lib/graph/view/class-use/GraphInfo.html | 124 ++ .../graph/view/class-use/GraphListener.html | 229 ++ .../lib/graph/view/class-use/GraphPanel.html | 246 +++ .../lib/graph/view/class-use/GraphWindow.html | 124 ++ .../graph/view/class-use/GraphicalView.html | 215 ++ .../lib/graph/view/class-use/Main.html | 124 ++ .../graph/view/class-use/VisitListener.html | 124 ++ .../lib/graph/view/edge/EdgeComponent.html | 367 ++++ .../lib/graph/view/edge/EdgeIntListener.html | 329 +++ .../lib/graph/view/edge/EdgeListener.html | 495 +++++ .../lib/graph/view/edge/EdgeView.html | 320 +++ .../view/edge/class-use/EdgeComponent.html | 207 ++ .../view/edge/class-use/EdgeIntListener.html | 124 ++ .../view/edge/class-use/EdgeListener.html | 192 ++ .../graph/view/edge/class-use/EdgeView.html | 124 ++ .../lib/graph/view/edge/package-frame.html | 23 + .../lib/graph/view/edge/package-summary.html | 154 ++ .../lib/graph/view/edge/package-tree.html | 147 ++ .../lib/graph/view/edge/package-use.html | 182 ++ .../lib/graph/view/package-frame.html | 29 + .../lib/graph/view/package-summary.html | 183 ++ doc/berack96/lib/graph/view/package-tree.html | 192 ++ doc/berack96/lib/graph/view/package-use.html | 225 ++ doc/berack96/lib/graph/view/stuff/Arrow.html | 291 +++ .../lib/graph/view/stuff/class-use/Arrow.html | 124 ++ .../lib/graph/view/stuff/package-frame.html | 20 + .../lib/graph/view/stuff/package-summary.html | 144 ++ .../lib/graph/view/stuff/package-tree.html | 141 ++ .../lib/graph/view/stuff/package-use.html | 124 ++ .../graph/view/vertex/VertexComponent.html | 377 ++++ .../graph/view/vertex/VertexIntListener.html | 325 +++ .../lib/graph/view/vertex/VertexListener.html | 516 +++++ .../lib/graph/view/vertex/VertexView.html | 320 +++ .../vertex/class-use/VertexComponent.html | 299 +++ .../vertex/class-use/VertexIntListener.html | 124 ++ .../view/vertex/class-use/VertexListener.html | 192 ++ .../view/vertex/class-use/VertexView.html | 124 ++ .../lib/graph/view/vertex/package-frame.html | 23 + .../graph/view/vertex/package-summary.html | 154 ++ .../lib/graph/view/vertex/package-tree.html | 147 ++ .../lib/graph/view/vertex/package-use.html | 201 ++ .../lib/graph/visit/VisitDistSourceDest.html | 267 +++ .../lib/graph/visit/VisitDistance.html | 285 +++ doc/berack96/lib/graph/visit/VisitSCC.html | 256 +++ .../lib/graph/visit/VisitStrategy.html | 267 +++ .../lib/graph/visit/VisitTopological.html | 258 +++ .../visit/class-use/VisitDistSourceDest.html | 124 ++ .../graph/visit/class-use/VisitDistance.html | 166 ++ .../lib/graph/visit/class-use/VisitSCC.html | 166 ++ .../graph/visit/class-use/VisitStrategy.html | 334 +++ .../visit/class-use/VisitTopological.html | 166 ++ doc/berack96/lib/graph/visit/impl/BFS.html | 316 +++ doc/berack96/lib/graph/visit/impl/DFS.html | 316 +++ .../lib/graph/visit/impl/Dijkstra.html | 369 ++++ doc/berack96/lib/graph/visit/impl/Tarjan.html | 358 +++ .../visit/impl/VisitInfo.VertexInfo.html | 343 +++ .../lib/graph/visit/impl/VisitInfo.html | 575 +++++ .../lib/graph/visit/impl/class-use/BFS.html | 124 ++ .../lib/graph/visit/impl/class-use/DFS.html | 124 ++ .../graph/visit/impl/class-use/Dijkstra.html | 124 ++ .../graph/visit/impl/class-use/Tarjan.html | 124 ++ .../impl/class-use/VisitInfo.VertexInfo.html | 194 ++ .../graph/visit/impl/class-use/VisitInfo.html | 285 +++ .../lib/graph/visit/impl/package-frame.html | 24 + .../lib/graph/visit/impl/package-summary.html | 171 ++ .../lib/graph/visit/impl/package-tree.html | 142 ++ .../lib/graph/visit/impl/package-use.html | 231 ++ .../lib/graph/visit/package-frame.html | 24 + .../lib/graph/visit/package-summary.html | 168 ++ .../lib/graph/visit/package-tree.html | 140 ++ doc/berack96/lib/graph/visit/package-use.html | 258 +++ doc/constant-values.html | 193 ++ doc/deprecated-list.html | 124 ++ doc/help-doc.html | 229 ++ doc/index-files/index-1.html | 256 +++ doc/index-files/index-10.html | 145 ++ doc/index-files/index-11.html | 133 ++ doc/index-files/index-12.html | 231 ++ doc/index-files/index-13.html | 151 ++ doc/index-files/index-14.html | 129 ++ doc/index-files/index-15.html | 143 ++ doc/index-files/index-16.html | 233 ++ doc/index-files/index-17.html | 192 ++ doc/index-files/index-18.html | 170 ++ doc/index-files/index-19.html | 177 ++ doc/index-files/index-2.html | 164 ++ doc/index-files/index-20.html | 247 +++ doc/index-files/index-21.html | 131 ++ doc/index-files/index-3.html | 155 ++ doc/index-files/index-4.html | 204 ++ doc/index-files/index-5.html | 195 ++ doc/index-files/index-6.html | 142 ++ doc/index-files/index-7.html | 398 ++++ doc/index-files/index-8.html | 131 ++ doc/index-files/index-9.html | 169 ++ doc/index.html | 75 + doc/overview-frame.html | 29 + doc/overview-summary.html | 167 ++ doc/overview-tree.html | 247 +++ doc/package-list | 9 + doc/script.js | 30 + doc/serialized-form.html | 304 +++ doc/stylesheet.css | 574 +++++ jar/graph.jar | Bin 0 -> 437648 bytes src/berack96/lib/graph/Graph.java | 41 +- src/berack96/lib/graph/impl/AdjGraph.java | 10 +- src/berack96/lib/graph/impl/MapGraph.java | 11 + src/berack96/lib/graph/impl/MatrixGraph.java | 10 +- src/berack96/lib/graph/view/GraphWindow.java | 31 +- src/berack96/lib/graph/view/Main.java | 25 + test/berack96/test/lib/TestGraph.java | 23 +- 152 files changed, 37171 insertions(+), 44 deletions(-) create mode 100644 doc/allclasses-frame.html create mode 100644 doc/allclasses-noframe.html create mode 100644 doc/berack96/lib/graph/Edge.html create mode 100644 doc/berack96/lib/graph/Graph.html create mode 100644 doc/berack96/lib/graph/Vertex.html create mode 100644 doc/berack96/lib/graph/class-use/Edge.html create mode 100644 doc/berack96/lib/graph/class-use/Graph.html create mode 100644 doc/berack96/lib/graph/class-use/Vertex.html create mode 100644 doc/berack96/lib/graph/impl/AdjGraph.html create mode 100644 doc/berack96/lib/graph/impl/MapGraph.html create mode 100644 doc/berack96/lib/graph/impl/MatrixGraph.html create mode 100644 doc/berack96/lib/graph/impl/class-use/AdjGraph.html create mode 100644 doc/berack96/lib/graph/impl/class-use/MapGraph.html create mode 100644 doc/berack96/lib/graph/impl/class-use/MatrixGraph.html create mode 100644 doc/berack96/lib/graph/impl/package-frame.html create mode 100644 doc/berack96/lib/graph/impl/package-summary.html create mode 100644 doc/berack96/lib/graph/impl/package-tree.html create mode 100644 doc/berack96/lib/graph/impl/package-use.html create mode 100644 doc/berack96/lib/graph/models/EdgeSaveStructure.html create mode 100644 doc/berack96/lib/graph/models/GraphSaveStructure.html create mode 100644 doc/berack96/lib/graph/models/MarkSaveStructure.html create mode 100644 doc/berack96/lib/graph/models/class-use/EdgeSaveStructure.html create mode 100644 doc/berack96/lib/graph/models/class-use/GraphSaveStructure.html create mode 100644 doc/berack96/lib/graph/models/class-use/MarkSaveStructure.html create mode 100644 doc/berack96/lib/graph/models/package-frame.html create mode 100644 doc/berack96/lib/graph/models/package-summary.html create mode 100644 doc/berack96/lib/graph/models/package-tree.html create mode 100644 doc/berack96/lib/graph/models/package-use.html create mode 100644 doc/berack96/lib/graph/package-frame.html create mode 100644 doc/berack96/lib/graph/package-summary.html create mode 100644 doc/berack96/lib/graph/package-tree.html create mode 100644 doc/berack96/lib/graph/package-use.html create mode 100644 doc/berack96/lib/graph/view/GraphInfo.html create mode 100644 doc/berack96/lib/graph/view/GraphListener.html create mode 100644 doc/berack96/lib/graph/view/GraphPanel.html create mode 100644 doc/berack96/lib/graph/view/GraphWindow.html create mode 100644 doc/berack96/lib/graph/view/GraphicalView.html create mode 100644 doc/berack96/lib/graph/view/Main.html create mode 100644 doc/berack96/lib/graph/view/VisitListener.html create mode 100644 doc/berack96/lib/graph/view/class-use/GraphInfo.html create mode 100644 doc/berack96/lib/graph/view/class-use/GraphListener.html create mode 100644 doc/berack96/lib/graph/view/class-use/GraphPanel.html create mode 100644 doc/berack96/lib/graph/view/class-use/GraphWindow.html create mode 100644 doc/berack96/lib/graph/view/class-use/GraphicalView.html create mode 100644 doc/berack96/lib/graph/view/class-use/Main.html create mode 100644 doc/berack96/lib/graph/view/class-use/VisitListener.html create mode 100644 doc/berack96/lib/graph/view/edge/EdgeComponent.html create mode 100644 doc/berack96/lib/graph/view/edge/EdgeIntListener.html create mode 100644 doc/berack96/lib/graph/view/edge/EdgeListener.html create mode 100644 doc/berack96/lib/graph/view/edge/EdgeView.html create mode 100644 doc/berack96/lib/graph/view/edge/class-use/EdgeComponent.html create mode 100644 doc/berack96/lib/graph/view/edge/class-use/EdgeIntListener.html create mode 100644 doc/berack96/lib/graph/view/edge/class-use/EdgeListener.html create mode 100644 doc/berack96/lib/graph/view/edge/class-use/EdgeView.html create mode 100644 doc/berack96/lib/graph/view/edge/package-frame.html create mode 100644 doc/berack96/lib/graph/view/edge/package-summary.html create mode 100644 doc/berack96/lib/graph/view/edge/package-tree.html create mode 100644 doc/berack96/lib/graph/view/edge/package-use.html create mode 100644 doc/berack96/lib/graph/view/package-frame.html create mode 100644 doc/berack96/lib/graph/view/package-summary.html create mode 100644 doc/berack96/lib/graph/view/package-tree.html create mode 100644 doc/berack96/lib/graph/view/package-use.html create mode 100644 doc/berack96/lib/graph/view/stuff/Arrow.html create mode 100644 doc/berack96/lib/graph/view/stuff/class-use/Arrow.html create mode 100644 doc/berack96/lib/graph/view/stuff/package-frame.html create mode 100644 doc/berack96/lib/graph/view/stuff/package-summary.html create mode 100644 doc/berack96/lib/graph/view/stuff/package-tree.html create mode 100644 doc/berack96/lib/graph/view/stuff/package-use.html create mode 100644 doc/berack96/lib/graph/view/vertex/VertexComponent.html create mode 100644 doc/berack96/lib/graph/view/vertex/VertexIntListener.html create mode 100644 doc/berack96/lib/graph/view/vertex/VertexListener.html create mode 100644 doc/berack96/lib/graph/view/vertex/VertexView.html create mode 100644 doc/berack96/lib/graph/view/vertex/class-use/VertexComponent.html create mode 100644 doc/berack96/lib/graph/view/vertex/class-use/VertexIntListener.html create mode 100644 doc/berack96/lib/graph/view/vertex/class-use/VertexListener.html create mode 100644 doc/berack96/lib/graph/view/vertex/class-use/VertexView.html create mode 100644 doc/berack96/lib/graph/view/vertex/package-frame.html create mode 100644 doc/berack96/lib/graph/view/vertex/package-summary.html create mode 100644 doc/berack96/lib/graph/view/vertex/package-tree.html create mode 100644 doc/berack96/lib/graph/view/vertex/package-use.html create mode 100644 doc/berack96/lib/graph/visit/VisitDistSourceDest.html create mode 100644 doc/berack96/lib/graph/visit/VisitDistance.html create mode 100644 doc/berack96/lib/graph/visit/VisitSCC.html create mode 100644 doc/berack96/lib/graph/visit/VisitStrategy.html create mode 100644 doc/berack96/lib/graph/visit/VisitTopological.html create mode 100644 doc/berack96/lib/graph/visit/class-use/VisitDistSourceDest.html create mode 100644 doc/berack96/lib/graph/visit/class-use/VisitDistance.html create mode 100644 doc/berack96/lib/graph/visit/class-use/VisitSCC.html create mode 100644 doc/berack96/lib/graph/visit/class-use/VisitStrategy.html create mode 100644 doc/berack96/lib/graph/visit/class-use/VisitTopological.html create mode 100644 doc/berack96/lib/graph/visit/impl/BFS.html create mode 100644 doc/berack96/lib/graph/visit/impl/DFS.html create mode 100644 doc/berack96/lib/graph/visit/impl/Dijkstra.html create mode 100644 doc/berack96/lib/graph/visit/impl/Tarjan.html create mode 100644 doc/berack96/lib/graph/visit/impl/VisitInfo.VertexInfo.html create mode 100644 doc/berack96/lib/graph/visit/impl/VisitInfo.html create mode 100644 doc/berack96/lib/graph/visit/impl/class-use/BFS.html create mode 100644 doc/berack96/lib/graph/visit/impl/class-use/DFS.html create mode 100644 doc/berack96/lib/graph/visit/impl/class-use/Dijkstra.html create mode 100644 doc/berack96/lib/graph/visit/impl/class-use/Tarjan.html create mode 100644 doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.VertexInfo.html create mode 100644 doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.html create mode 100644 doc/berack96/lib/graph/visit/impl/package-frame.html create mode 100644 doc/berack96/lib/graph/visit/impl/package-summary.html create mode 100644 doc/berack96/lib/graph/visit/impl/package-tree.html create mode 100644 doc/berack96/lib/graph/visit/impl/package-use.html create mode 100644 doc/berack96/lib/graph/visit/package-frame.html create mode 100644 doc/berack96/lib/graph/visit/package-summary.html create mode 100644 doc/berack96/lib/graph/visit/package-tree.html create mode 100644 doc/berack96/lib/graph/visit/package-use.html create mode 100644 doc/constant-values.html create mode 100644 doc/deprecated-list.html create mode 100644 doc/help-doc.html create mode 100644 doc/index-files/index-1.html create mode 100644 doc/index-files/index-10.html create mode 100644 doc/index-files/index-11.html create mode 100644 doc/index-files/index-12.html create mode 100644 doc/index-files/index-13.html create mode 100644 doc/index-files/index-14.html create mode 100644 doc/index-files/index-15.html create mode 100644 doc/index-files/index-16.html create mode 100644 doc/index-files/index-17.html create mode 100644 doc/index-files/index-18.html create mode 100644 doc/index-files/index-19.html create mode 100644 doc/index-files/index-2.html create mode 100644 doc/index-files/index-20.html create mode 100644 doc/index-files/index-21.html create mode 100644 doc/index-files/index-3.html create mode 100644 doc/index-files/index-4.html create mode 100644 doc/index-files/index-5.html create mode 100644 doc/index-files/index-6.html create mode 100644 doc/index-files/index-7.html create mode 100644 doc/index-files/index-8.html create mode 100644 doc/index-files/index-9.html create mode 100644 doc/index.html create mode 100644 doc/overview-frame.html create mode 100644 doc/overview-summary.html create mode 100644 doc/overview-tree.html create mode 100644 doc/package-list create mode 100644 doc/script.js create mode 100644 doc/serialized-form.html create mode 100644 doc/stylesheet.css create mode 100644 jar/graph.jar create mode 100644 src/berack96/lib/graph/view/Main.java diff --git a/README.md b/README.md index df8b6922a3be3ba60145f9873671faf62cbba436..7115f65a2d7f6e68d6b90fb26143ed75460532ad 100644 GIT binary patch literal 916 zcmZXT%TB{E5JhK=#6MVK(G4n}fmpC(!!k|NHqboermgsS;M}p@l%gt)J)ZlR8RzHw z!GgWompxmw%0}DSz1{iq#=5lw=g}HY2G*@jyd(L6Q$;3LRo;!{ZR}`!e#)rH=s@m? zPdvd+{72^*tY<%vpYYp@{=zle3$g>#gRgj65WOvL{LS7I<0h+!SzZFjo$IfNsEXP( zhbJ&?u)AF;SA0?xlj2CVAN;z_sF`;Ah^2?XVH~Qm51EF7Z@}}bwqCENHfti zQy(VYVm&+48m6=FbT4Xc- zj$mr=3+xD@~3Tx#N-vlcnNASOR4KW4>SwKV_aNgTr!(+K+j cTjMuru1>SKu0?lKJ`_z~g}#yKcksH}Uj&Au?f?J) literal 756 zcmZuv?P|j?47}fky@R2@*Oypfzcv_S56~t~YiOJ-ABFAV*WF3+NMV@7vUED>WZ!8Ayfp(9MR!?i--tn(UM@)~j;AUj=e$($(;vP_uEpboA zp$xGktC*Q9<|{Mhi-s4ktWvMBs646>a5An6XYP4n72k{tkrTaF^B#DXC*YmF7Ek<7 z)Vs4))V>lc*0UkAv3OQZd@zlXDiY%t_O<()(-vBRyrpAxI&rPL_i3rxBe5Tg0!^^7 zE{n<&vo!O>Nhp6{^k`N^OZO8NH9BW5;YZ?iQnX=?)UKx~MtN&P2&HVFuj~7y;z;IT zwRO{FGXL#G^WG|zn^~(<2YMBiRq{zTJbS<1jqcDVAe=Jp--=X;MV*co_pX(#*W?pQ Y)^%ahJ93tmc{M-XUF76?;#4Q%7j7bcY5)KL diff --git a/build.gradle b/build.gradle index f2ad5f6..bc2999e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,13 @@ apply plugin: 'eclipse' version='1.0-SNAPSHOT' +jar { + manifest { + attributes 'Main-Class': 'berack96.lib.graph.view.Main' + } + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } +} + test { useJUnitPlatform() } @@ -24,5 +31,5 @@ dependencies { compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5' /*compile group: 'commons-collections', name: 'commons-collections', version: '3.2'*/ - /*testCompile 'junit:junit:4.4'*/ + testCompile 'junit:junit:4.4' } \ No newline at end of file diff --git a/doc/allclasses-frame.html b/doc/allclasses-frame.html new file mode 100644 index 0000000..8841849 --- /dev/null +++ b/doc/allclasses-frame.html @@ -0,0 +1,53 @@ + + + + + +All Classes + + + + + +

All Classes

+
+ + diff --git a/doc/allclasses-noframe.html b/doc/allclasses-noframe.html new file mode 100644 index 0000000..80b3f0c --- /dev/null +++ b/doc/allclasses-noframe.html @@ -0,0 +1,53 @@ + + + + + +All Classes + + + + + +

All Classes

+ + + diff --git a/doc/berack96/lib/graph/Edge.html b/doc/berack96/lib/graph/Edge.html new file mode 100644 index 0000000..6222ad1 --- /dev/null +++ b/doc/berack96/lib/graph/Edge.html @@ -0,0 +1,394 @@ + + + + + +Edge + + + + + + + + + + + + +
+
berack96.lib.graph
+

Class Edge<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.Edge<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertices
    +
    W - the weight of the edge
    +
    +
    +
    +
    public class Edge<V,W extends java.lang.Number>
    +extends java.lang.Object
    +
    Class used for retrieving the edges of the graph.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Edge(V source, + V destination, + W weight) +
      Create an final version of this object
      +
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      booleanequals(java.lang.Object obj) 
      VgetDestination() +
      The vertex where the edge goes
      +
      VgetSource() +
      The vertex where the edge starts from
      +
      WgetWeight() +
      The weight of the edge
      +
      inthashCode() 
      java.lang.StringtoString() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + + + +
        +
      • +

        Edge

        +
        public Edge(V source,
        +            V destination,
        +            W weight)
        +
        Create an final version of this object
        +
        +
        Parameters:
        +
        source - the source of the edge
        +
        destination - the destination of the edge
        +
        weight - the weight of the edge
        +
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getDestination

        +
        public V getDestination()
        +
        The vertex where the edge goes
        +
        +
        Returns:
        +
        the vertex
        +
        +
      • +
      + + + +
        +
      • +

        getSource

        +
        public V getSource()
        +
        The vertex where the edge starts from
        +
        +
        Returns:
        +
        the vertex
        +
        +
      • +
      + + + +
        +
      • +

        getWeight

        +
        public W getWeight()
        +
        The weight of the edge
        +
        +
        Returns:
        +
        the weight
        +
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.lang.Object
        +
        +
      • +
      + + + +
        +
      • +

        hashCode

        +
        public int hashCode()
        +
        +
        Overrides:
        +
        hashCode in class java.lang.Object
        +
        +
      • +
      + + + +
        +
      • +

        equals

        +
        public boolean equals(java.lang.Object obj)
        +
        +
        Overrides:
        +
        equals in class java.lang.Object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/Graph.html b/doc/berack96/lib/graph/Graph.html new file mode 100644 index 0000000..78edcea --- /dev/null +++ b/doc/berack96/lib/graph/Graph.html @@ -0,0 +1,1915 @@ + + + + + +Graph + + + + + + + + + + + + +
+
berack96.lib.graph
+

Interface Graph<V,W extends java.lang.Number>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - The Object that represent a vertex
    +
    W - The Object that represent the edge (more specifically the weight of the edge)
    +
    +
    +
    All Superinterfaces:
    +
    java.lang.Iterable<V>
    +
    +
    +
    All Known Implementing Classes:
    +
    AdjGraph, MapGraph, MatrixGraph
    +
    +
    +
    +
    public interface Graph<V,W extends java.lang.Number>
    +extends java.lang.Iterable<V>
    +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      static com.google.gson.GsonGSON 
      static java.lang.StringNOT_CONNECTED 
      static java.lang.StringNOT_DAG 
      static java.lang.StringPARAM_NULL 
      static java.lang.StringVERTEX_NOT_CONTAINED 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Static Methods Instance Methods Abstract Methods Default Methods 
      Modifier and TypeMethod and Description
      voidaddAllEdges(java.util.Collection<Edge<V,W>> edges) +
      Add all the edges of the collection to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + Any null edges will be ignored.
      + This method will overwrite any existing edge between the two vertex.
      +
      voidaddAllVertices(java.util.Collection<V> vertices) +
      Add all the vertices contained in the collection to the graph.
      + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
      + Null vertices will be ignored and they will not be added to the graph.
      +
      WaddEdge(Edge<V,W> edge) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdge(V vertex1, + V vertex2, + W weight) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(Edge<V,W> edge) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(V vertex1, + V vertex2, + W weight) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      voidaddVertex(V vertex) +
      Add the vertex to the graph.
      +
      booleanaddVertexIfAbsent(V vertex) +
      Add the specified vertex to the graph only if the graph doesn't contains it.
      + The graph contains a vertex only if the method contains(Object) returns true.
      +
      booleancontains(V vertex) +
      Check if the vertex passed is contained in the graph or not.
      + The vertex V1 is contained in the graph G, if and only if:
      + exist V2 in G such that V2.equals(V1)
      +
      booleancontainsEdge(V vertex1, + V vertex2) +
      Check if the edge between the two vertex passed is contained in the graph or not.
      + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
      + If one of the two vertices is not contained in the graph, then even the edge isn't
      +
      intdegree(V vertex) +
      Tells the degree of a vertex.
      + The degree of a vertex is the quantity of edges that have.
      + Basically, it'll count how many edge it have.
      +
      intdegreeIn(V vertex) +
      Tells the degree of all the edges that goes to this vertex.
      + Basically, it'll count how many edge towards himself it have.
      +
      intdegreeOut(V vertex) +
      Tells the degree of all the edges that goes form this vertex to others.
      + Basically, it'll count how many edge towards any other vertex it have.
      +
      java.util.Map<V,java.util.List<Edge<V,W>>>distance(V source) +
      Get the minimum path from the source vertex to all the possible reachable vertices.
      +
      java.util.List<Edge<V,W>>distance(V source, + V destination) +
      Get the minimum path from the source vertex to the destination vertex.
      + If the source vertex can't reach the destination, then an exception is thrown.
      +
      java.util.Collection<Edge<V,W>>edges() +
      Get all the edges in the graph.
      + If the graph doesn't contains edges, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>edgesOf(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getAncestors(V vertex) +
      Get all the vertices that have the vertex passed as their child.
      + Basically is the opposite of getChildren(Object)
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getChildren(V vertex) +
      Get all the vertices that are children of the vertex passed as parameter.
      + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesIn(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as destination and another as source.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesOut(V vertex) +
      Retrieve all the edges that goes OUT of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getMarkedWith(java.lang.Object mark) +
      Get all the vertices that are marked with the specific mark passed.
      + If there aren't vertices with that mark then it is returned an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<java.lang.Object>getMarks(V vertex) +
      Get all the marker of this vertex.
      + If the vertex doesn't have any mark, then it will return an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      Vertex<V>getVertex(V vertex) +
      Get an instance of the vertex linked with this graph.
      + For more info see Vertex
      +
      WgetWeight(V vertex1, + V vertex2) +
      Get the weight of the selected edge.
      + If the edge doesn't exist, then null is returned
      +
      booleanisCyclic() +
      Tells if the graph has some cycle.
      + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
      +
      booleanisDAG() +
      Tells if the graph has the property of DAG (Directed Acyclic Graph).
      + A graph is a DAG only if absent of any cycle.
      +
      static <V,W extends java.lang.Number>
      java.lang.String
      load(Graph<V,W> graph, + java.lang.String file, + java.lang.Class<V> classV, + java.lang.Class<W> classW) +
      Load an already saved graph in an instance of a graph.
      +
      voidmark(V vertex, + java.lang.Object mark) +
      Add to the specified vertex the mark passed.
      + A vertex can have multiple marker.
      +
      java.util.Collection<java.lang.Object>marks() +
      Get all the marks of this graph.
      + Specifically it will return a collection of marks where every mark
      + as associated at least one vertex of the graph.
      + If the graph doesn't have vertex marked then it is returned an empty collection.
      +
      intnumberOfEdges() +
      Tells how many edges are in the graph.
      +
      intnumberOfVertices() +
      Tells how many vertices are in the graph.
      +
      voidremoveAllEdge() +
      Remove all the edges of the graph.
      + After this method's call the graph will have only vertices, and no edge.
      +
      voidremoveAllEdge(V vertex) +
      Remove all edges form a particular vertex of the graph.
      + After this method's call the selected vertex will have 0 edges.
      + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
      +
      voidremoveAllInEdge(V vertex) +
      Remove all the edges that goes in the vertex.
      + After this method's call it will be no longer possible travel to this vertex.
      +
      voidremoveAllOutEdge(V vertex) +
      Remove all the edges that start from this vertex.
      + After this method's call it will be no longer possible travel to any vertex from this one.
      +
      voidremoveAllVertex() +
      Remove all the vertex contained in the graph.
      + After this method's call the graph will be empty; no vertices nor edges.
      +
      voidremoveEdge(V vertex1, + V vertex2) +
      Remove the edge between the two vertex.
      + If the edge doesn't exist, then this call does nothing.
      + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
      +
      voidremoveVertex(V vertex) +
      Remove the selected vertex from the graph.
      + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
      +
      static voidsave(Graph<?,?> graph, + java.lang.String file) +
      Save the Graph passed as input to a file inserted as parameter.
      + The resulting file is a Json string representing all the graph.
      + If the directory for getting through the file do not exist,
      + then it is created.
      + For now the marks are not included.
      +
      static voidsave(Graph<?,?> graph, + java.lang.String other, + java.lang.String file) +
      Save the Graph passed as input to a file inserted as parameter.
      + The resulting file is a Json string representing all the graph.
      + If the directory for getting through the file do not exist,
      + then it is created.
      + For now the marks are not included.
      + The additional parameter is used if you want to save other as well as the graph.
      +
      java.util.Collection<java.util.Collection<V>>stronglyConnectedComponents() +
      The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
      +
      Graph<V,W>subGraph(java.lang.Object... marker) +
      Get a sub-graph of the current one with only the vertex marked with the selected markers.
      + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
      + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
      + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
      +
      Graph<V,W>subGraph(V source, + int depth) +
      Get a sub-graph of the current one based on the maximum depth that is given.
      + If the depth is 1 then only the source and it's children will be in the sub-graph.
      + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
      + And so on.
      + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
      +
      java.util.List<V>topologicalSort() +
      If the current graph is a DAG, it returns a topological sort of this graph.
      + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
      +
      Graph<V,W>transpose() +
      This method will create a new Graph that is the transposed version of the original.
      + At the end of this method the new graph will have all the edges inverted in orientation.
      + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
      +
      voidunMark(V vertex) +
      Unmark the vertex selected.
      + After this call the vertex will not have any marked object to himself.
      +
      voidunMark(V vertex, + java.lang.Object mark) +
      Remove the selected mark from the vertex.
      +
      voidunMarkAll() +
      Remove all the marker to all the vertex.
      + After this call the getMarks(Object) applied to any vertex will return an empty set
      +
      voidunMarkAll(java.lang.Object mark) +
      Remove the selected mark from all the vertices
      +
      java.util.Collection<V>vertices() +
      Get all the vertices in the graph.
      + If the graph doesn't contains vertices, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      VisitInfo<V>visit(V source, + VisitStrategy<V,W> strategy, + java.util.function.Consumer<V> visit) +
      Visit the graph accordingly to the strategy that is passed.
      + This method visit the graph from the source to all the vertex that are reachable form the source.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      +
      +
        +
      • + + +

        Methods inherited from interface java.lang.Iterable

        +forEach, iterator, spliterator
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        isCyclic

        +
        boolean isCyclic()
        +
        Tells if the graph has some cycle.
        + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
        +
        +
        Returns:
        +
        true if has cycle, false otherwise
        +
        +
      • +
      + + + +
        +
      • +

        isDAG

        +
        boolean isDAG()
        +
        Tells if the graph has the property of DAG (Directed Acyclic Graph).
        + A graph is a DAG only if absent of any cycle. ( see isCyclic() )
        +
        +
        Returns:
        +
        true if is a DAG, false otherwise
        +
        +
      • +
      + + + + + +
        +
      • +

        contains

        +
        boolean contains(V vertex)
        +          throws java.lang.NullPointerException
        +
        Check if the vertex passed is contained in the graph or not.
        + The vertex V1 is contained in the graph G, if and only if:
        + exist V2 in G such that V2.equals(V1)
        +
        +
        Parameters:
        +
        vertex - the vertex to check
        +
        Returns:
        +
        true if the vertex is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getVertex

        +
        Vertex<V> getVertex(V vertex)
        +             throws java.lang.NullPointerException,
        +                    java.lang.IllegalArgumentException
        +
        Get an instance of the vertex linked with this graph.
        + For more info see Vertex
        +
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        a vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertex

        +
        void addVertex(V vertex)
        +        throws java.lang.NullPointerException
        +
        Add the vertex to the graph. If it's already in the graph it will be replaced.
        + Of course the vertex added will have no edge to any other vertex nor form any other vertex.
        +
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertexIfAbsent

        +
        boolean addVertexIfAbsent(V vertex)
        +                   throws java.lang.NullPointerException
        +
        Add the specified vertex to the graph only if the graph doesn't contains it.
        + The graph contains a vertex only if the method contains(Object) returns true.
        +
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Returns:
        +
        true if the vertex is added, false if the graph contains the vertex and therefore the new one is not added
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        addAllVertices

        +
        void addAllVertices(java.util.Collection<V> vertices)
        +             throws java.lang.NullPointerException
        +
        Add all the vertices contained in the collection to the graph.
        + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
        + Null vertices will be ignored and they will not be added to the graph.
        +
        +
        Parameters:
        +
        vertices - a collection of the vertices to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        removeVertex

        +
        void removeVertex(V vertex)
        +           throws java.lang.NullPointerException,
        +                  java.lang.IllegalArgumentException
        +
        Remove the selected vertex from the graph.
        + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
        +
        +
        Parameters:
        +
        vertex - the vertex to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        removeAllVertex

        +
        void removeAllVertex()
        +
        Remove all the vertex contained in the graph.
        + After this method's call the graph will be empty; no vertices nor edges.
        +
      • +
      + + + +
        +
      • +

        marks

        +
        java.util.Collection<java.lang.Object> marks()
        +
        Get all the marks of this graph.
        + Specifically it will return a collection of marks where every mark
        + as associated at least one vertex of the graph.
        + If the graph doesn't have vertex marked then it is returned an empty collection.
        +
        +
        Returns:
        +
        a collection of marks
        +
        +
      • +
      + + + + + +
        +
      • +

        mark

        +
        void mark(V vertex,
        +          java.lang.Object mark)
        +   throws java.lang.NullPointerException,
        +          java.lang.IllegalArgumentException
        +
        Add to the specified vertex the mark passed.
        + A vertex can have multiple marker.
        +
        +
        Parameters:
        +
        vertex - the vertex to mark
        +
        mark - the mark to add
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        void unMark(V vertex,
        +            java.lang.Object mark)
        +     throws java.lang.NullPointerException,
        +            java.lang.IllegalArgumentException
        +
        Remove the selected mark from the vertex.
        +
        +
        Parameters:
        +
        vertex - the vertex where remove the mark
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if a param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        void unMark(V vertex)
        +     throws java.lang.NullPointerException,
        +            java.lang.IllegalArgumentException
        +
        Unmark the vertex selected.
        + After this call the vertex will not have any marked object to himself.
        +
        +
        Parameters:
        +
        vertex - the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        getMarkedWith

        +
        java.util.Collection<V> getMarkedWith(java.lang.Object mark)
        +                               throws java.lang.NullPointerException
        +
        Get all the vertices that are marked with the specific mark passed.
        + If there aren't vertices with that mark then it is returned an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        mark - the mark
        +
        Returns:
        +
        all the vertices that are marked with that specific mark
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getMarks

        +
        java.util.Collection<java.lang.Object> getMarks(V vertex)
        +                                         throws java.lang.NullPointerException,
        +                                                java.lang.IllegalArgumentException
        +
        Get all the marker of this vertex.
        + If the vertex doesn't have any mark, then it will return an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        all the mark to the vertex or an empty collection if none
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        void unMarkAll(java.lang.Object mark)
        +        throws java.lang.NullPointerException
        +
        Remove the selected mark from all the vertices
        +
        +
        Parameters:
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        void unMarkAll()
        +
        Remove all the marker to all the vertex.
        + After this call the getMarks(Object) applied to any vertex will return an empty set
        +
      • +
      + + + + + +
        +
      • +

        addEdge

        +
        W addEdge(V vertex1,
        +          V vertex2,
        +          W weight)
        +   throws java.lang.NullPointerException,
        +          java.lang.IllegalArgumentException
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        addEdge

        +
        W addEdge(Edge<V,W> edge)
        +   throws java.lang.NullPointerException,
        +          java.lang.IllegalArgumentException
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdgeAndVertices

        +
        W addEdgeAndVertices(V vertex1,
        +                     V vertex2,
        +                     W weight)
        +              throws java.lang.NullPointerException
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        +
      • +
      + + + +
        +
      • +

        addEdgeAndVertices

        +
        W addEdgeAndVertices(Edge<V,W> edge)
        +              throws java.lang.NullPointerException,
        +                     java.lang.IllegalArgumentException
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException
        +
        +
      • +
      + + + +
        +
      • +

        addAllEdges

        +
        void addAllEdges(java.util.Collection<Edge<V,W>> edges)
        +          throws java.lang.NullPointerException
        +
        Add all the edges of the collection to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + Any null edges will be ignored.
        + This method will overwrite any existing edge between the two vertex.
        +
        +
        Parameters:
        +
        edges - the edges to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getWeight

        +
        W getWeight(V vertex1,
        +            V vertex2)
        +     throws java.lang.NullPointerException,
        +            java.lang.IllegalArgumentException
        +
        Get the weight of the selected edge.
        + If the edge doesn't exist, then null is returned
        +
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        the weight previously set, or null if the edge doesn't exist
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeEdge

        +
        void removeEdge(V vertex1,
        +                V vertex2)
        +         throws java.lang.NullPointerException,
        +                java.lang.IllegalArgumentException
        +
        Remove the edge between the two vertex.
        + If the edge doesn't exist, then this call does nothing.
        + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
        +
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllInEdge

        +
        void removeAllInEdge(V vertex)
        +              throws java.lang.NullPointerException,
        +                     java.lang.IllegalArgumentException
        +
        Remove all the edges that goes in the vertex.
        + After this method's call it will be no longer possible travel to this vertex.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllOutEdge

        +
        void removeAllOutEdge(V vertex)
        +               throws java.lang.NullPointerException,
        +                      java.lang.IllegalArgumentException
        +
        Remove all the edges that start from this vertex.
        + After this method's call it will be no longer possible travel to any vertex from this one.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllEdge

        +
        void removeAllEdge(V vertex)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Remove all edges form a particular vertex of the graph.
        + After this method's call the selected vertex will have 0 edges.
        + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        removeAllEdge

        +
        void removeAllEdge()
        +
        Remove all the edges of the graph.
        + After this method's call the graph will have only vertices, and no edge.
        +
      • +
      + + + + + +
        +
      • +

        containsEdge

        +
        boolean containsEdge(V vertex1,
        +                     V vertex2)
        +              throws java.lang.NullPointerException
        +
        Check if the edge between the two vertex passed is contained in the graph or not.
        + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
        + If one of the two vertices is not contained in the graph, then even the edge isn't
        +
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        true if the edge is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        +
      • +
      + + + +
        +
      • +

        vertices

        +
        java.util.Collection<V> vertices()
        +
        Get all the vertices in the graph.
        + If the graph doesn't contains vertices, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Returns:
        +
        an array that include all the vertices
        +
        +
      • +
      + + + +
        +
      • +

        edges

        +
        java.util.Collection<Edge<V,W>> edges()
        +
        Get all the edges in the graph.
        + If the graph doesn't contains edges, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Returns:
        +
        a collection that include all the edges
        +
        +
      • +
      + + + + + +
        +
      • +

        edgesOf

        +
        java.util.Collection<Edge<V,W>> edgesOf(V vertex)
        +                                 throws java.lang.NullPointerException,
        +                                        java.lang.IllegalArgumentException
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesIn

        +
        java.util.Collection<Edge<V,W>> getEdgesIn(V vertex)
        +                                    throws java.lang.NullPointerException,
        +                                           java.lang.IllegalArgumentException
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as destination and another as source.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesOut

        +
        java.util.Collection<Edge<V,W>> getEdgesOut(V vertex)
        +                                     throws java.lang.NullPointerException,
        +                                            java.lang.IllegalArgumentException
        +
        Retrieve all the edges that goes OUT of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getChildren

        +
        java.util.Collection<V> getChildren(V vertex)
        +                             throws java.lang.NullPointerException,
        +                                    java.lang.IllegalArgumentException
        +
        Get all the vertices that are children of the vertex passed as parameter.
        + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        vertex - the source vertex
        +
        Returns:
        +
        an array of vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getAncestors

        +
        java.util.Collection<V> getAncestors(V vertex)
        +                              throws java.lang.NullPointerException,
        +                                     java.lang.IllegalArgumentException
        +
        Get all the vertices that have the vertex passed as their child.
        + Basically is the opposite of getChildren(Object)
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        an array of ancestors of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeIn

        +
        int degreeIn(V vertex)
        +      throws java.lang.NullPointerException,
        +             java.lang.IllegalArgumentException
        +
        Tells the degree of all the edges that goes to this vertex.
        + Basically, it'll count how many edge towards himself it have.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the in degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeOut

        +
        int degreeOut(V vertex)
        +       throws java.lang.NullPointerException,
        +              java.lang.IllegalArgumentException
        +
        Tells the degree of all the edges that goes form this vertex to others.
        + Basically, it'll count how many edge towards any other vertex it have.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the out degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degree

        +
        int degree(V vertex)
        +    throws java.lang.NullPointerException,
        +           java.lang.IllegalArgumentException
        +
        Tells the degree of a vertex.
        + The degree of a vertex is the quantity of edges that have.
        + Basically, it'll count how many edge it have.
        +
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        numberOfVertices

        +
        int numberOfVertices()
        +
        Tells how many vertices are in the graph.
        +
        +
        Returns:
        +
        the number of vertices
        +
        +
      • +
      + + + +
        +
      • +

        numberOfEdges

        +
        int numberOfEdges()
        +
        Tells how many edges are in the graph.
        +
        +
        Returns:
        +
        the number of edges
        +
        +
      • +
      + + + + + +
        +
      • +

        visit

        +
        VisitInfo<V> visit(V source,
        +                   VisitStrategy<V,W> strategy,
        +                   java.util.function.Consumer<V> visit)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Visit the graph accordingly to the strategy that is passed.
        + This method visit the graph from the source to all the vertex that are reachable form the source.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        +
        +
        Parameters:
        +
        source - the source vertex of the visit
        +
        strategy - the algorithm for visiting the graph
        +
        visit - the function to apply at each vertex
        +
        Returns:
        +
        an info of the visit
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      + + + +
        +
      • +

        transpose

        +
        Graph<V,W> transpose()
        +
        This method will create a new Graph that is the transposed version of the original.
        + At the end of this method the new graph will have all the edges inverted in orientation.
        + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
        +
        +
        Returns:
        +
        a transposed graph of this instance
        +
        +
      • +
      + + + +
        +
      • +

        topologicalSort

        +
        java.util.List<V> topologicalSort()
        +                           throws java.lang.UnsupportedOperationException
        +
        If the current graph is a DAG, it returns a topological sort of this graph.
        + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
        +
        +
        Returns:
        +
        an array containing the topological order of the vertices
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the graph is not a DAG (see isDAG())
        +
        +
      • +
      + + + +
        +
      • +

        stronglyConnectedComponents

        +
        java.util.Collection<java.util.Collection<V>> stronglyConnectedComponents()
        +
        The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
        +
        +
        Returns:
        +
        a collection containing the strongly connected components
        +
        +
      • +
      + + + + + +
        +
      • +

        subGraph

        +
        Graph<V,W> subGraph(V source,
        +                    int depth)
        +             throws java.lang.NullPointerException,
        +                    java.lang.IllegalArgumentException
        +
        Get a sub-graph of the current one based on the maximum depth that is given.
        + If the depth is 1 then only the source and it's children will be in the sub-graph.
        + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
        + And so on.
        + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
        +
        +
        Parameters:
        +
        source - the source vertex
        +
        depth - the maximum depth (must be a positive number, if >=0 a graph containing only the source is returned)
        +
        Returns:
        +
        a sub-graph of the original
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        subGraph

        +
        Graph<V,W> subGraph(java.lang.Object... marker)
        +
        Get a sub-graph of the current one with only the vertex marked with the selected markers.
        + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
        + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
        + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
        +
        +
        Parameters:
        +
        marker - one or more markers
        +
        Returns:
        +
        a sub-graph of the current graph
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        java.util.List<Edge<V,W>> distance(V source,
        +                                   V destination)
        +                            throws java.lang.NullPointerException,
        +                                   java.lang.IllegalArgumentException,
        +                                   java.lang.UnsupportedOperationException
        +
        Get the minimum path from the source vertex to the destination vertex.
        + If the source vertex can't reach the destination, then an exception is thrown.
        +
        +
        Parameters:
        +
        source - the vertex where to start
        +
        destination - the destination chosen
        +
        Returns:
        +
        an ordered list of edges from source to destination that represent the minimum path between the two vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        java.lang.UnsupportedOperationException - if from the source it's not possible to reach the destination
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        java.util.Map<V,java.util.List<Edge<V,W>>> distance(V source)
        +                                             throws java.lang.NullPointerException,
        +                                                    java.lang.IllegalArgumentException
        +
        Get the minimum path from the source vertex to all the possible reachable vertices.
        +
        +
        Parameters:
        +
        source - the vertex where to start
        +
        Returns:
        +
        a map containing all the possible reachable vertices from the source and the minimum path to reach them
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      + + + +
        +
      • +

        save

        +
        static void save(Graph<?,?> graph,
        +                 java.lang.String file)
        +          throws java.io.IOException
        +
        Save the Graph passed as input to a file inserted as parameter.
        + The resulting file is a Json string representing all the graph.
        + If the directory for getting through the file do not exist,
        + then it is created.
        + For now the marks are not included.
        +
        +
        Parameters:
        +
        graph - the graph to save
        +
        file - the name of the file
        +
        Throws:
        +
        java.io.IOException - for various reason that appear in the message, but the most common is that the file is not found.
        +
        +
      • +
      + + + +
        +
      • +

        save

        +
        static void save(Graph<?,?> graph,
        +                 java.lang.String other,
        +                 java.lang.String file)
        +          throws java.io.IOException
        +
        Save the Graph passed as input to a file inserted as parameter.
        + The resulting file is a Json string representing all the graph.
        + If the directory for getting through the file do not exist,
        + then it is created.
        + For now the marks are not included.
        + The additional parameter is used if you want to save other as well as the graph.
        +
        +
        Parameters:
        +
        graph - the graph to save
        +
        other - other things to save
        +
        file - the name of the file
        +
        Throws:
        +
        java.io.IOException - for various reason that appear in the message, but the most common is that the file is not found.
        +
        +
      • +
      + + + +
        +
      • +

        load

        +
        static <V,W extends java.lang.Number> java.lang.String load(Graph<V,W> graph,
        +                                                            java.lang.String file,
        +                                                            java.lang.Class<V> classV,
        +                                                            java.lang.Class<W> classW)
        +                                                     throws java.io.IOException,
        +                                                            java.lang.NullPointerException,
        +                                                            com.google.gson.JsonSyntaxException
        +
        Load an already saved graph in an instance of a graph. + Before loading the graph, it is emptied.
        +
        +
        Type Parameters:
        +
        V - the parameter needed for the vertex
        +
        W - the parameter needed for the weight
        +
        Parameters:
        +
        graph - the graph to load with
        +
        file - the file where the graph is saved
        +
        classV - the class used for the Vertex
        +
        classW - the class used for the Weight
        +
        Returns:
        +
        the string saved in other, if any
        +
        Throws:
        +
        java.io.IOException - for any possible reason, the most common: the file doesn't exist
        +
        java.lang.NullPointerException - if the graph is null
        +
        com.google.gson.JsonSyntaxException - if the file is malformed or corrupted
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/Vertex.html b/doc/berack96/lib/graph/Vertex.html new file mode 100644 index 0000000..a70d94e --- /dev/null +++ b/doc/berack96/lib/graph/Vertex.html @@ -0,0 +1,786 @@ + + + + + +Vertex + + + + + + + + + + + + +
+
berack96.lib.graph
+

Class Vertex<V>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.Vertex<V>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex
    +
    +
    +
    +
    public class Vertex<V>
    +extends java.lang.Object
    +
    Class used for represent a vertex of the graph.
    + The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      static java.lang.StringREMOVED 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Vertex(Graph<V,?> graph, + V vertex) +
      Get a Vertex linked with the graph
      +
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      voidaddChild(V child, + java.lang.Number weight) +
      Add a child to this vertex.
      + The added child must be in the graph or it will return an exception.
      +
      voidaddIfAbsent() +
      Add the vertex to the graph only if it's not already in the graph.
      +
      booleanequals(java.lang.Object obj) 
      java.util.Collection<V>getAncestors() +
      Get all the vertex ancestor of this vertex.
      + The ancestors are all the vertices that have as destination this vertex.
      +
      java.util.Collection<Vertex<V>>getAncestorsAsVertex() +
      Get all the ancestors of this vertex like getAncestors(), but as Vertex.
      + In this way they are linked to the graph as this one.
      + This method allocate a new object for each vertex, so it is more heavy.
      +
      java.util.Collection<V>getChildren() +
      Get all the vertex children of the current vertex
      +
      java.util.Collection<Vertex<V>>getChildrenAsVertex() +
      Get all the children of this vertex like getChildren(), but as Vertex.
      + In this way they are linked to the graph as this one.
      + * This method allocate a new object for each vertex, so it is more heavy.
      +
      java.util.Collection<Edge<V,java.lang.Number>>getEdgesIn() +
      Get all the edge that goes INTO this vertex
      +
      java.util.Collection<Edge<V,java.lang.Number>>getEdgesOut() +
      Get all the edge that goes OUT of this vertex
      +
      java.util.Collection<java.lang.Object>getMarks() +
      Get all the marks that are associated with this vertex
      +
      VgetValue() +
      Get the vertex
      +
      inthashCode() 
      booleanisStillContained() +
      This call tell if the current vertex is still contained in the graph linked.
      + While this function return false all the other methods will throw an exception.
      +
      voidmark(java.lang.Object mark) +
      Mark the vertex with the associated string
      +
      voidremove() +
      Remove the vertex from the graph.
      + After this call all the other methods will throw an exception
      +
      voidremoveChild(V child) +
      Removes a child of this vertex.
      +
      java.lang.StringtoString() 
      voidunMark() +
      Remove all the marker from the vertex
      +
      voidunMark(java.lang.Object mark) +
      Remove the specified mark from this vertex
      +
      VisitInfo<V>visit(VisitStrategy strategy, + java.util.function.Consumer<V> visit) +
      Visit the graph from this current vertex with the strategy assigned
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + + + +
        +
      • +

        Vertex

        +
        public Vertex(Graph<V,?> graph,
        +              V vertex)
        +       throws java.lang.NullPointerException
        +
        Get a Vertex linked with the graph
        +
        +
        Parameters:
        +
        graph - the graph of the vertex
        +
        vertex - the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the param is null
        +
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getValue

        +
        public V getValue()
        +
        Get the vertex
        +
        +
        Returns:
        +
        the vertex
        +
        +
      • +
      + + + +
        +
      • +

        mark

        +
        public void mark(java.lang.Object mark)
        +          throws java.lang.NullPointerException,
        +                 java.lang.UnsupportedOperationException
        +
        Mark the vertex with the associated string
        +
        +
        Parameters:
        +
        mark - the marker
        +
        Throws:
        +
        java.lang.NullPointerException - if the marker is null
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        unMark

        +
        public void unMark(java.lang.Object mark)
        +            throws java.lang.UnsupportedOperationException
        +
        Remove the specified mark from this vertex
        +
        +
        Parameters:
        +
        mark - the marker
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        unMark

        +
        public void unMark()
        +            throws java.lang.UnsupportedOperationException
        +
        Remove all the marker from the vertex
        +
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getMarks

        +
        public java.util.Collection<java.lang.Object> getMarks()
        +                                                throws java.lang.UnsupportedOperationException
        +
        Get all the marks that are associated with this vertex
        +
        +
        Returns:
        +
        a set of marks
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getChildren

        +
        public java.util.Collection<V> getChildren()
        +                                    throws java.lang.UnsupportedOperationException
        +
        Get all the vertex children of the current vertex
        +
        +
        Returns:
        +
        all the children
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getChildrenAsVertex

        +
        public java.util.Collection<Vertex<V>> getChildrenAsVertex()
        +                                                    throws java.lang.UnsupportedOperationException
        +
        Get all the children of this vertex like getChildren(), but as Vertex.
        + In this way they are linked to the graph as this one.
        + * This method allocate a new object for each vertex, so it is more heavy.
        +
        +
        Returns:
        +
        a collection of vertices that are children of the current one
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getAncestors

        +
        public java.util.Collection<V> getAncestors()
        +                                     throws java.lang.UnsupportedOperationException
        +
        Get all the vertex ancestor of this vertex.
        + The ancestors are all the vertices that have as destination this vertex.
        +
        +
        Returns:
        +
        a collection of vertices
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getAncestorsAsVertex

        +
        public java.util.Collection<Vertex<V>> getAncestorsAsVertex()
        +                                                     throws java.lang.UnsupportedOperationException
        +
        Get all the ancestors of this vertex like getAncestors(), but as Vertex.
        + In this way they are linked to the graph as this one.
        + This method allocate a new object for each vertex, so it is more heavy.
        +
        +
        Returns:
        +
        a collection of vertices that are children of the current one
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getEdgesOut

        +
        public java.util.Collection<Edge<V,java.lang.Number>> getEdgesOut()
        +                                                           throws java.lang.UnsupportedOperationException
        +
        Get all the edge that goes OUT of this vertex
        +
        +
        Returns:
        +
        a collection of edges with source this one
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        getEdgesIn

        +
        public java.util.Collection<Edge<V,java.lang.Number>> getEdgesIn()
        +                                                          throws java.lang.UnsupportedOperationException
        +
        Get all the edge that goes INTO this vertex
        +
        +
        Returns:
        +
        a collection of edges with destination this one
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + + + +
        +
      • +

        addChild

        +
        public void addChild(V child,
        +                     java.lang.Number weight)
        +              throws java.lang.NullPointerException,
        +                     java.lang.IllegalArgumentException,
        +                     java.lang.UnsupportedOperationException
        +
        Add a child to this vertex.
        + The added child must be in the graph or it will return an exception.
        +
        +
        Parameters:
        +
        child - the destination vertex of this edge
        +
        weight - the weight of the edge
        +
        Throws:
        +
        java.lang.NullPointerException - if the param is null
        +
        java.lang.IllegalArgumentException - if the child vertex is not contained in the graph
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + + + +
        +
      • +

        removeChild

        +
        public void removeChild(V child)
        +                 throws java.lang.NullPointerException,
        +                        java.lang.IllegalArgumentException,
        +                        java.lang.UnsupportedOperationException
        +
        Removes a child of this vertex. + If the vertex passed as param is not a child, then this call does nothing.
        +
        +
        Parameters:
        +
        child - the child of the current vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the param is null
        +
        java.lang.IllegalArgumentException - if the child vertex is not contained in the graph
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        isStillContained

        +
        public boolean isStillContained()
        +
        This call tell if the current vertex is still contained in the graph linked.
        + While this function return false all the other methods will throw an exception.
        +
        +
        Returns:
        +
        true if it is, false otherwise
        +
        +
      • +
      + + + +
        +
      • +

        addIfAbsent

        +
        public void addIfAbsent()
        +
        Add the vertex to the graph only if it's not already in the graph.
        +
      • +
      + + + +
        +
      • +

        remove

        +
        public void remove()
        +
        Remove the vertex from the graph.
        + After this call all the other methods will throw an exception
        +
      • +
      + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(VisitStrategy strategy,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.UnsupportedOperationException
        +
        Visit the graph from this current vertex with the strategy assigned
        +
        +
        Parameters:
        +
        strategy - the strategy of the visit
        +
        visit - the function to apply at each vertex (can be null)
        +
        Returns:
        +
        an info of the visit if supported by the strategy
        +
        Throws:
        +
        java.lang.NullPointerException - if the strategy is null
        +
        java.lang.UnsupportedOperationException - if the vertex is not in the graph anymore
        +
        +
      • +
      + + + +
        +
      • +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.lang.Object
        +
        +
      • +
      + + + +
        +
      • +

        hashCode

        +
        public int hashCode()
        +
        +
        Overrides:
        +
        hashCode in class java.lang.Object
        +
        +
      • +
      + + + +
        +
      • +

        equals

        +
        public boolean equals(java.lang.Object obj)
        +
        +
        Overrides:
        +
        equals in class java.lang.Object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/class-use/Edge.html b/doc/berack96/lib/graph/class-use/Edge.html new file mode 100644 index 0000000..e02f339 --- /dev/null +++ b/doc/berack96/lib/graph/class-use/Edge.html @@ -0,0 +1,517 @@ + + + + + +Uses of Class berack96.lib.graph.Edge + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.Edge

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Packages that use Edge 
    PackageDescription
    berack96.lib.graph 
    berack96.lib.graph.impl 
    berack96.lib.graph.view 
    berack96.lib.graph.view.edge 
    berack96.lib.graph.visit 
    berack96.lib.graph.visit.impl 
    +
  • +
  • +
      +
    • + + +

      Uses of Edge in berack96.lib.graph

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph that return types with arguments of type Edge 
      Modifier and TypeMethod and Description
      java.util.Map<V,java.util.List<Edge<V,W>>>Graph.distance(V source) +
      Get the minimum path from the source vertex to all the possible reachable vertices.
      +
      java.util.List<Edge<V,W>>Graph.distance(V source, + V destination) +
      Get the minimum path from the source vertex to the destination vertex.
      + If the source vertex can't reach the destination, then an exception is thrown.
      +
      java.util.Collection<Edge<V,W>>Graph.edges() +
      Get all the edges in the graph.
      + If the graph doesn't contains edges, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>Graph.edgesOf(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,java.lang.Number>>Vertex.getEdgesIn() +
      Get all the edge that goes INTO this vertex
      +
      java.util.Collection<Edge<V,W>>Graph.getEdgesIn(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as destination and another as source.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,java.lang.Number>>Vertex.getEdgesOut() +
      Get all the edge that goes OUT of this vertex
      +
      java.util.Collection<Edge<V,W>>Graph.getEdgesOut(V vertex) +
      Retrieve all the edges that goes OUT of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph with parameters of type Edge 
      Modifier and TypeMethod and Description
      WGraph.addEdge(Edge<V,W> edge) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WGraph.addEdgeAndVertices(Edge<V,W> edge) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      + + + + + + + + + + + + +
      Method parameters in berack96.lib.graph with type arguments of type Edge 
      Modifier and TypeMethod and Description
      voidGraph.addAllEdges(java.util.Collection<Edge<V,W>> edges) +
      Add all the edges of the collection to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + Any null edges will be ignored.
      + This method will overwrite any existing edge between the two vertex.
      +
      +
    • +
    • + + +

      Uses of Edge in berack96.lib.graph.impl

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.impl that return types with arguments of type Edge 
      Modifier and TypeMethod and Description
      java.util.Map<V,java.util.List<Edge<V,W>>>MatrixGraph.distance(V source) 
      java.util.Map<V,java.util.List<Edge<V,W>>>MapGraph.distance(V source) 
      java.util.Map<V,java.util.List<Edge<V,W>>>AdjGraph.distance(V source) 
      java.util.List<Edge<V,W>>MatrixGraph.distance(V source, + V destination) 
      java.util.List<Edge<V,W>>MapGraph.distance(V source, + V destination) 
      java.util.List<Edge<V,W>>AdjGraph.distance(V source, + V destination) 
      java.util.Collection<Edge<V,W>>MatrixGraph.edges() 
      java.util.Collection<Edge<V,W>>MapGraph.edges() 
      java.util.Collection<Edge<V,W>>AdjGraph.edges() 
      java.util.Collection<Edge<V,W>>MatrixGraph.edgesOf(V vertex) 
      java.util.Collection<Edge<V,W>>MapGraph.edgesOf(V vertex) 
      java.util.Collection<Edge<V,W>>AdjGraph.edgesOf(V vertex) 
      java.util.Collection<Edge<V,W>>MatrixGraph.getEdgesIn(V vertex) 
      java.util.Collection<Edge<V,W>>MapGraph.getEdgesIn(V vertex) 
      java.util.Collection<Edge<V,W>>AdjGraph.getEdgesIn(V vertex) 
      java.util.Collection<Edge<V,W>>MatrixGraph.getEdgesOut(V vertex) 
      java.util.Collection<Edge<V,W>>MapGraph.getEdgesOut(V vertex) 
      java.util.Collection<Edge<V,W>>AdjGraph.getEdgesOut(V vertex) 
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.impl with parameters of type Edge 
      Modifier and TypeMethod and Description
      WMatrixGraph.addEdge(Edge<V,W> edge) 
      WMapGraph.addEdge(Edge<V,W> edge) 
      WAdjGraph.addEdge(Edge<V,W> edge) 
      WMatrixGraph.addEdgeAndVertices(Edge<V,W> edge) 
      WMapGraph.addEdgeAndVertices(Edge<V,W> edge) 
      WAdjGraph.addEdgeAndVertices(Edge<V,W> edge) 
      + + + + + + + + + + + + + + + + + + + + +
      Method parameters in berack96.lib.graph.impl with type arguments of type Edge 
      Modifier and TypeMethod and Description
      voidMatrixGraph.addAllEdges(java.util.Collection<Edge<V,W>> edges) 
      voidMapGraph.addAllEdges(java.util.Collection<Edge<V,W>> edges) 
      voidAdjGraph.addAllEdges(java.util.Collection<Edge<V,W>> edges) 
      +
    • +
    • + + +

      Uses of Edge in berack96.lib.graph.view

      + + + + + + + + + + + + +
      Methods in berack96.lib.graph.view with parameters of type Edge 
      Modifier and TypeMethod and Description
      voidGraphPanel.addEdge(Edge<V,W> edge) 
      +
    • +
    • + + +

      Uses of Edge in berack96.lib.graph.view.edge

      + + + + + + + + + + + + +
      Fields in berack96.lib.graph.view.edge declared as Edge 
      Modifier and TypeField and Description
      Edge<V,W>EdgeComponent.edge 
      +
    • +
    • + + +

      Uses of Edge in berack96.lib.graph.visit

      + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.visit that return types with arguments of type Edge 
      Modifier and TypeMethod and Description
      java.util.List<Edge<V,W>>VisitDistSourceDest.distance(Graph<V,W> graph, + V source, + V destination) +
      Get the distance from the source to the destination
      + The list contains the minimum path from the vertex marked as source to the destination vertex
      +
      java.util.Map<V,java.util.List<Edge<V,W>>>VisitDistance.getLastDistance() +
      Get the last calculated distance to all the possible destinations
      + The map contains all the possible vertices that are reachable from the source set in the visit
      + If there is no path between the destination and the source, then null is returned as accordingly to the map interface
      + If the visit is not already been done, then the map is null.
      +
      +
    • +
    • + + +

      Uses of Edge in berack96.lib.graph.visit.impl

      + + + + + + + + + + + + +
      Methods in berack96.lib.graph.visit.impl that return types with arguments of type Edge 
      Modifier and TypeMethod and Description
      java.util.Map<V,java.util.List<Edge<V,W>>>Dijkstra.getLastDistance() 
      +
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/class-use/Graph.html b/doc/berack96/lib/graph/class-use/Graph.html new file mode 100644 index 0000000..d8ec6a1 --- /dev/null +++ b/doc/berack96/lib/graph/class-use/Graph.html @@ -0,0 +1,479 @@ + + + + + +Uses of Interface berack96.lib.graph.Graph + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.Graph

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Packages that use Graph 
    PackageDescription
    berack96.lib.graph 
    berack96.lib.graph.impl 
    berack96.lib.graph.models 
    berack96.lib.graph.view 
    berack96.lib.graph.view.vertex 
    berack96.lib.graph.visit 
    berack96.lib.graph.visit.impl 
    +
  • +
  • +
      +
    • + + +

      Uses of Graph in berack96.lib.graph

      + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph that return Graph 
      Modifier and TypeMethod and Description
      Graph<V,W>Graph.subGraph(java.lang.Object... marker) +
      Get a sub-graph of the current one with only the vertex marked with the selected markers.
      + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
      + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
      + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
      +
      Graph<V,W>Graph.subGraph(V source, + int depth) +
      Get a sub-graph of the current one based on the maximum depth that is given.
      + If the depth is 1 then only the source and it's children will be in the sub-graph.
      + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
      + And so on.
      + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
      +
      Graph<V,W>Graph.transpose() +
      This method will create a new Graph that is the transposed version of the original.
      + At the end of this method the new graph will have all the edges inverted in orientation.
      + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
      +
      + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph with parameters of type Graph 
      Modifier and TypeMethod and Description
      static <V,W extends java.lang.Number>
      java.lang.String
      Graph.load(Graph<V,W> graph, + java.lang.String file, + java.lang.Class<V> classV, + java.lang.Class<W> classW) +
      Load an already saved graph in an instance of a graph.
      +
      static voidGraph.save(Graph<?,?> graph, + java.lang.String file) +
      Save the Graph passed as input to a file inserted as parameter.
      + The resulting file is a Json string representing all the graph.
      + If the directory for getting through the file do not exist,
      + then it is created.
      + For now the marks are not included.
      +
      static voidGraph.save(Graph<?,?> graph, + java.lang.String other, + java.lang.String file) +
      Save the Graph passed as input to a file inserted as parameter.
      + The resulting file is a Json string representing all the graph.
      + If the directory for getting through the file do not exist,
      + then it is created.
      + For now the marks are not included.
      + The additional parameter is used if you want to save other as well as the graph.
      +
      + + + + + + + + + + +
      Constructors in berack96.lib.graph with parameters of type Graph 
      Constructor and Description
      Vertex(Graph<V,?> graph, + V vertex) +
      Get a Vertex linked with the graph
      +
      +
    • +
    • + + +

      Uses of Graph in berack96.lib.graph.impl

      + + + + + + + + + + + + + + + + + + + + +
      Classes in berack96.lib.graph.impl that implement Graph 
      Modifier and TypeClass and Description
      class AdjGraph<V,W extends java.lang.Number> 
      class MapGraph<V,W extends java.lang.Number> +
      Graph that uses HashMap for vertices and edges
      + More specifically it utilizes a Map containing all the vertices mapped to all their edges
      + Technically this version of the graph combine the fast adding/removing of the edges of the Matrix implementation, + with the low memory and fast adding/removing of vertices of the Linked List implementation.
      + This happen if the HashMap is not reallocated.
      +
      class MatrixGraph<V,W extends java.lang.Number> 
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.impl that return Graph 
      Modifier and TypeMethod and Description
      Graph<V,W>MatrixGraph.subGraph(java.lang.Object... marker) 
      Graph<V,W>MapGraph.subGraph(java.lang.Object... marker) 
      Graph<V,W>AdjGraph.subGraph(java.lang.Object... marker) 
      Graph<V,W>MatrixGraph.subGraph(V source, + int depth) 
      Graph<V,W>MapGraph.subGraph(V source, + int depth) 
      Graph<V,W>AdjGraph.subGraph(V source, + int depth) 
      Graph<V,W>MatrixGraph.transpose() 
      Graph<V,W>MapGraph.transpose() 
      Graph<V,W>AdjGraph.transpose() 
      +
    • +
    • + + +

      Uses of Graph in berack96.lib.graph.models

      + + + + + + + + + + +
      Constructors in berack96.lib.graph.models with parameters of type Graph 
      Constructor and Description
      GraphSaveStructure(Graph<?,?> graph, + java.lang.String other) 
      +
    • +
    • + + +

      Uses of Graph in berack96.lib.graph.view

      + + + + + + + + + + + + +
      Methods in berack96.lib.graph.view that return Graph 
      Modifier and TypeMethod and Description
      Graph<V,W>GraphPanel.getGraph() 
      +
    • +
    • + + +

      Uses of Graph in berack96.lib.graph.view.vertex

      + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.view.vertex with parameters of type Graph 
      Modifier and TypeMethod and Description
      protected java.lang.IntegerVertexIntListener.buildNewVertex(Graph<java.lang.Integer,?> graph) 
      protected abstract VVertexListener.buildNewVertex(Graph<V,?> graph) 
      +
    • +
    • + + +

      Uses of Graph in berack96.lib.graph.visit

      + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.visit with parameters of type Graph 
      Modifier and TypeMethod and Description
      java.util.List<Edge<V,W>>VisitDistSourceDest.distance(Graph<V,W> graph, + V source, + V destination) +
      Get the distance from the source to the destination
      + The list contains the minimum path from the vertex marked as source to the destination vertex
      +
      VisitInfo<V>VisitStrategy.visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      With this the graph will be visited accordingly to the strategy of the visit.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
      +
      +
    • +
    • + + +

      Uses of Graph in berack96.lib.graph.visit.impl

      + + + + + + + + + + + + + + + + + + + + + + + + +
      Methods in berack96.lib.graph.visit.impl with parameters of type Graph 
      Modifier and TypeMethod and Description
      VisitInfo<V>Tarjan.visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      This particular visit strategy use only the graph and the visit, so the source param is not needed.
      +
      VisitInfo<V>Dijkstra.visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) 
      VisitInfo<V>DFS.visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) 
      VisitInfo<V>BFS.visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) 
      +
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/class-use/Vertex.html b/doc/berack96/lib/graph/class-use/Vertex.html new file mode 100644 index 0000000..ca3a1d1 --- /dev/null +++ b/doc/berack96/lib/graph/class-use/Vertex.html @@ -0,0 +1,293 @@ + + + + + +Uses of Class berack96.lib.graph.Vertex + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.Vertex

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/impl/AdjGraph.html b/doc/berack96/lib/graph/impl/AdjGraph.html new file mode 100644 index 0000000..5bc8959 --- /dev/null +++ b/doc/berack96/lib/graph/impl/AdjGraph.html @@ -0,0 +1,1922 @@ + + + + + +AdjGraph + + + + + + + + + + + + +
+
berack96.lib.graph.impl
+

Class AdjGraph<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.impl.AdjGraph<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    Graph<V,W>, java.lang.Iterable<V>
    +
    +
    +
    +
    public class AdjGraph<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements Graph<V,W>
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      AdjGraph() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      voidaddAllEdges(java.util.Collection<Edge<V,W>> edges) +
      Add all the edges of the collection to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + Any null edges will be ignored.
      + This method will overwrite any existing edge between the two vertex.
      +
      voidaddAllVertices(java.util.Collection<V> vertices) +
      Add all the vertices contained in the collection to the graph.
      + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
      + Null vertices will be ignored and they will not be added to the graph.
      +
      WaddEdge(Edge<V,W> edge) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdge(V vertex1, + V vertex2, + W weight) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(Edge<V,W> edge) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(V vertex1, + V vertex2, + W weight) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      voidaddVertex(V vertex) +
      Add the vertex to the graph.
      +
      booleanaddVertexIfAbsent(V vertex) +
      Add the specified vertex to the graph only if the graph doesn't contains it.
      + The graph contains a vertex only if the method Graph.contains(Object) returns true.
      +
      booleancontains(V vertex) +
      Check if the vertex passed is contained in the graph or not.
      + The vertex V1 is contained in the graph G, if and only if:
      + exist V2 in G such that V2.equals(V1)
      +
      booleancontainsEdge(V vertex1, + V vertex2) +
      Check if the edge between the two vertex passed is contained in the graph or not.
      + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
      + If one of the two vertices is not contained in the graph, then even the edge isn't
      +
      intdegree(V vertex) +
      Tells the degree of a vertex.
      + The degree of a vertex is the quantity of edges that have.
      + Basically, it'll count how many edge it have.
      +
      intdegreeIn(V vertex) +
      Tells the degree of all the edges that goes to this vertex.
      + Basically, it'll count how many edge towards himself it have.
      +
      intdegreeOut(V vertex) +
      Tells the degree of all the edges that goes form this vertex to others.
      + Basically, it'll count how many edge towards any other vertex it have.
      +
      java.util.Map<V,java.util.List<Edge<V,W>>>distance(V source) +
      Get the minimum path from the source vertex to all the possible reachable vertices.
      +
      java.util.List<Edge<V,W>>distance(V source, + V destination) +
      Get the minimum path from the source vertex to the destination vertex.
      + If the source vertex can't reach the destination, then an exception is thrown.
      +
      java.util.Collection<Edge<V,W>>edges() +
      Get all the edges in the graph.
      + If the graph doesn't contains edges, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>edgesOf(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getAncestors(V vertex) +
      Get all the vertices that have the vertex passed as their child.
      + Basically is the opposite of Graph.getChildren(Object)
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getChildren(V vertex) +
      Get all the vertices that are children of the vertex passed as parameter.
      + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesIn(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as destination and another as source.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesOut(V vertex) +
      Retrieve all the edges that goes OUT of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getMarkedWith(java.lang.Object mark) +
      Get all the vertices that are marked with the specific mark passed.
      + If there aren't vertices with that mark then it is returned an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<java.lang.Object>getMarks(V vertex) +
      Get all the marker of this vertex.
      + If the vertex doesn't have any mark, then it will return an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      Vertex<V>getVertex(V vertex) +
      Get an instance of the vertex linked with this graph.
      + For more info see Vertex
      +
      WgetWeight(V vertex1, + V vertex2) +
      Get the weight of the selected edge.
      + If the edge doesn't exist, then null is returned
      +
      booleanisCyclic() +
      Tells if the graph has some cycle.
      + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
      +
      booleanisDAG() +
      Tells if the graph has the property of DAG (Directed Acyclic Graph).
      + A graph is a DAG only if absent of any cycle.
      +
      java.util.Iterator<V>iterator() 
      voidmark(V vertex, + java.lang.Object mark) +
      Add to the specified vertex the mark passed.
      + A vertex can have multiple marker.
      +
      java.util.Collection<java.lang.Object>marks() +
      Get all the marks of this graph.
      + Specifically it will return a collection of marks where every mark
      + as associated at least one vertex of the graph.
      + If the graph doesn't have vertex marked then it is returned an empty collection.
      +
      intnumberOfEdges() +
      Tells how many edges are in the graph.
      +
      intnumberOfVertices() +
      Tells how many vertices are in the graph.
      +
      voidremoveAllEdge() +
      Remove all the edges of the graph.
      + After this method's call the graph will have only vertices, and no edge.
      +
      voidremoveAllEdge(V vertex) +
      Remove all edges form a particular vertex of the graph.
      + After this method's call the selected vertex will have 0 edges.
      + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
      +
      voidremoveAllInEdge(V vertex) +
      Remove all the edges that goes in the vertex.
      + After this method's call it will be no longer possible travel to this vertex.
      +
      voidremoveAllOutEdge(V vertex) +
      Remove all the edges that start from this vertex.
      + After this method's call it will be no longer possible travel to any vertex from this one.
      +
      voidremoveAllVertex() +
      Remove all the vertex contained in the graph.
      + After this method's call the graph will be empty; no vertices nor edges.
      +
      voidremoveEdge(V vertex1, + V vertex2) +
      Remove the edge between the two vertex.
      + If the edge doesn't exist, then this call does nothing.
      + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
      +
      voidremoveVertex(V vertex) +
      Remove the selected vertex from the graph.
      + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
      +
      java.util.Collection<java.util.Collection<V>>stronglyConnectedComponents() +
      The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
      +
      Graph<V,W>subGraph(java.lang.Object... marker) +
      Get a sub-graph of the current one with only the vertex marked with the selected markers.
      + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
      + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
      + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
      +
      Graph<V,W>subGraph(V source, + int depth) +
      Get a sub-graph of the current one based on the maximum depth that is given.
      + If the depth is 1 then only the source and it's children will be in the sub-graph.
      + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
      + And so on.
      + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
      +
      java.util.List<V>topologicalSort() +
      If the current graph is a DAG, it returns a topological sort of this graph.
      + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
      +
      Graph<V,W>transpose() +
      This method will create a new Graph that is the transposed version of the original.
      + At the end of this method the new graph will have all the edges inverted in orientation.
      + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
      +
      voidunMark(V vertex) +
      Unmark the vertex selected.
      + After this call the vertex will not have any marked object to himself.
      +
      voidunMark(V vertex, + java.lang.Object mark) +
      Remove the selected mark from the vertex.
      +
      voidunMarkAll() +
      Remove all the marker to all the vertex.
      + After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
      +
      voidunMarkAll(java.lang.Object mark) +
      Remove the selected mark from all the vertices
      +
      java.util.Collection<V>vertices() +
      Get all the vertices in the graph.
      + If the graph doesn't contains vertices, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      VisitInfo<V>visit(V source, + VisitStrategy<V,W> strategy, + java.util.function.Consumer<V> visit) +
      Visit the graph accordingly to the strategy that is passed.
      + This method visit the graph from the source to all the vertex that are reachable form the source.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      + +
        +
      • + + +

        Methods inherited from interface java.lang.Iterable

        +forEach, spliterator
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        AdjGraph

        +
        public AdjGraph()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        iterator

        +
        public java.util.Iterator<V> iterator()
        +
        +
        Specified by:
        +
        iterator in interface java.lang.Iterable<V>
        +
        +
      • +
      + + + +
        +
      • +

        isCyclic

        +
        public boolean isCyclic()
        +
        Description copied from interface: Graph
        +
        Tells if the graph has some cycle.
        + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
        +
        +
        Specified by:
        +
        isCyclic in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        true if has cycle, false otherwise
        +
        +
      • +
      + + + +
        +
      • +

        isDAG

        +
        public boolean isDAG()
        +
        Description copied from interface: Graph
        +
        Tells if the graph has the property of DAG (Directed Acyclic Graph).
        + A graph is a DAG only if absent of any cycle. ( see Graph.isCyclic() )
        +
        +
        Specified by:
        +
        isDAG in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        true if is a DAG, false otherwise
        +
        +
      • +
      + + + + + +
        +
      • +

        getVertex

        +
        public Vertex<V> getVertex(V vertex)
        +                    throws java.lang.NullPointerException,
        +                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get an instance of the vertex linked with this graph.
        + For more info see Vertex
        +
        +
        Specified by:
        +
        getVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        a vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertex

        +
        public void addVertex(V vertex)
        +               throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add the vertex to the graph. If it's already in the graph it will be replaced.
        + Of course the vertex added will have no edge to any other vertex nor form any other vertex.
        +
        +
        Specified by:
        +
        addVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertexIfAbsent

        +
        public boolean addVertexIfAbsent(V vertex)
        +                          throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add the specified vertex to the graph only if the graph doesn't contains it.
        + The graph contains a vertex only if the method Graph.contains(Object) returns true.
        +
        +
        Specified by:
        +
        addVertexIfAbsent in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Returns:
        +
        true if the vertex is added, false if the graph contains the vertex and therefore the new one is not added
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        addAllVertices

        +
        public void addAllVertices(java.util.Collection<V> vertices)
        +                    throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add all the vertices contained in the collection to the graph.
        + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
        + Null vertices will be ignored and they will not be added to the graph.
        +
        +
        Specified by:
        +
        addAllVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertices - a collection of the vertices to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        removeVertex

        +
        public void removeVertex(V vertex)
        +                  throws java.lang.NullPointerException,
        +                         java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the selected vertex from the graph.
        + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
        +
        +
        Specified by:
        +
        removeVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        removeAllVertex

        +
        public void removeAllVertex()
        +
        Description copied from interface: Graph
        +
        Remove all the vertex contained in the graph.
        + After this method's call the graph will be empty; no vertices nor edges.
        +
        +
        Specified by:
        +
        removeAllVertex in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        contains

        +
        public boolean contains(V vertex)
        +                 throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Check if the vertex passed is contained in the graph or not.
        + The vertex V1 is contained in the graph G, if and only if:
        + exist V2 in G such that V2.equals(V1)
        +
        +
        Specified by:
        +
        contains in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to check
        +
        Returns:
        +
        true if the vertex is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        marks

        +
        public java.util.Collection<java.lang.Object> marks()
        +
        Description copied from interface: Graph
        +
        Get all the marks of this graph.
        + Specifically it will return a collection of marks where every mark
        + as associated at least one vertex of the graph.
        + If the graph doesn't have vertex marked then it is returned an empty collection.
        +
        +
        Specified by:
        +
        marks in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection of marks
        +
        +
      • +
      + + + + + +
        +
      • +

        mark

        +
        public void mark(V vertex,
        +                 java.lang.Object mark)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add to the specified vertex the mark passed.
        + A vertex can have multiple marker.
        +
        +
        Specified by:
        +
        mark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to mark
        +
        mark - the mark to add
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        public void unMark(V vertex,
        +                   java.lang.Object mark)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the selected mark from the vertex.
        +
        +
        Specified by:
        +
        unMark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex where remove the mark
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if a param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        public void unMark(V vertex)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Unmark the vertex selected.
        + After this call the vertex will not have any marked object to himself.
        +
        +
        Specified by:
        +
        unMark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        getMarkedWith

        +
        public java.util.Collection<V> getMarkedWith(java.lang.Object mark)
        +                                      throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that are marked with the specific mark passed.
        + If there aren't vertices with that mark then it is returned an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getMarkedWith in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        mark - the mark
        +
        Returns:
        +
        all the vertices that are marked with that specific mark
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getMarks

        +
        public java.util.Collection<java.lang.Object> getMarks(V vertex)
        +                                                throws java.lang.NullPointerException,
        +                                                       java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the marker of this vertex.
        + If the vertex doesn't have any mark, then it will return an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getMarks in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        all the mark to the vertex or an empty collection if none
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        public void unMarkAll(java.lang.Object mark)
        +               throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Remove the selected mark from all the vertices
        +
        +
        Specified by:
        +
        unMarkAll in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        public void unMarkAll()
        +
        Description copied from interface: Graph
        +
        Remove all the marker to all the vertex.
        + After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
        +
        +
        Specified by:
        +
        unMarkAll in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdge

        +
        public W addEdge(V vertex1,
        +                 V vertex2,
        +                 W weight)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        addEdge

        +
        public W addEdge(Edge<V,W> edge)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdgeAndVertices

        +
        public W addEdgeAndVertices(V vertex1,
        +                            V vertex2,
        +                            W weight)
        +                     throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdgeAndVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        +
      • +
      + + + +
        +
      • +

        addEdgeAndVertices

        +
        public W addEdgeAndVertices(Edge<V,W> edge)
        +                     throws java.lang.NullPointerException,
        +                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdgeAndVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException
        +
        +
      • +
      + + + +
        +
      • +

        addAllEdges

        +
        public void addAllEdges(java.util.Collection<Edge<V,W>> edges)
        +                 throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add all the edges of the collection to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + Any null edges will be ignored.
        + This method will overwrite any existing edge between the two vertex.
        +
        +
        Specified by:
        +
        addAllEdges in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edges - the edges to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getWeight

        +
        public W getWeight(V vertex1,
        +                   V vertex2)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get the weight of the selected edge.
        + If the edge doesn't exist, then null is returned
        +
        +
        Specified by:
        +
        getWeight in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        the weight previously set, or null if the edge doesn't exist
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeEdge

        +
        public void removeEdge(V vertex1,
        +                       V vertex2)
        +                throws java.lang.NullPointerException,
        +                       java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the edge between the two vertex.
        + If the edge doesn't exist, then this call does nothing.
        + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
        +
        +
        Specified by:
        +
        removeEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllInEdge

        +
        public void removeAllInEdge(V vertex)
        +                     throws java.lang.NullPointerException,
        +                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all the edges that goes in the vertex.
        + After this method's call it will be no longer possible travel to this vertex.
        +
        +
        Specified by:
        +
        removeAllInEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllOutEdge

        +
        public void removeAllOutEdge(V vertex)
        +                      throws java.lang.NullPointerException,
        +                             java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all the edges that start from this vertex.
        + After this method's call it will be no longer possible travel to any vertex from this one.
        +
        +
        Specified by:
        +
        removeAllOutEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllEdge

        +
        public void removeAllEdge(V vertex)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all edges form a particular vertex of the graph.
        + After this method's call the selected vertex will have 0 edges.
        + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
        +
        +
        Specified by:
        +
        removeAllEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        removeAllEdge

        +
        public void removeAllEdge()
        +
        Description copied from interface: Graph
        +
        Remove all the edges of the graph.
        + After this method's call the graph will have only vertices, and no edge.
        +
        +
        Specified by:
        +
        removeAllEdge in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        containsEdge

        +
        public boolean containsEdge(V vertex1,
        +                            V vertex2)
        +                     throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Check if the edge between the two vertex passed is contained in the graph or not.
        + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
        + If one of the two vertices is not contained in the graph, then even the edge isn't
        +
        +
        Specified by:
        +
        containsEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        true if the edge is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        +
      • +
      + + + +
        +
      • +

        vertices

        +
        public java.util.Collection<V> vertices()
        +
        Description copied from interface: Graph
        +
        Get all the vertices in the graph.
        + If the graph doesn't contains vertices, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        vertices in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        an array that include all the vertices
        +
        +
      • +
      + + + +
        +
      • +

        edges

        +
        public java.util.Collection<Edge<V,W>> edges()
        +
        Description copied from interface: Graph
        +
        Get all the edges in the graph.
        + If the graph doesn't contains edges, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        edges in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection that include all the edges
        +
        +
      • +
      + + + + + +
        +
      • +

        edgesOf

        +
        public java.util.Collection<Edge<V,W>> edgesOf(V vertex)
        +                                        throws java.lang.NullPointerException,
        +                                               java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        edgesOf in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesIn

        +
        public java.util.Collection<Edge<V,W>> getEdgesIn(V vertex)
        +                                           throws java.lang.NullPointerException,
        +                                                  java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as destination and another as source.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getEdgesIn in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesOut

        +
        public java.util.Collection<Edge<V,W>> getEdgesOut(V vertex)
        +                                            throws java.lang.NullPointerException,
        +                                                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges that goes OUT of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getEdgesOut in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getChildren

        +
        public java.util.Collection<V> getChildren(V vertex)
        +                                    throws java.lang.NullPointerException,
        +                                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that are children of the vertex passed as parameter.
        + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getChildren in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the source vertex
        +
        Returns:
        +
        an array of vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getAncestors

        +
        public java.util.Collection<V> getAncestors(V vertex)
        +                                     throws java.lang.NullPointerException,
        +                                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that have the vertex passed as their child.
        + Basically is the opposite of Graph.getChildren(Object)
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getAncestors in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        an array of ancestors of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeIn

        +
        public int degreeIn(V vertex)
        +             throws java.lang.NullPointerException,
        +                    java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of all the edges that goes to this vertex.
        + Basically, it'll count how many edge towards himself it have.
        +
        +
        Specified by:
        +
        degreeIn in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the in degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeOut

        +
        public int degreeOut(V vertex)
        +              throws java.lang.NullPointerException,
        +                     java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of all the edges that goes form this vertex to others.
        + Basically, it'll count how many edge towards any other vertex it have.
        +
        +
        Specified by:
        +
        degreeOut in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the out degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degree

        +
        public int degree(V vertex)
        +           throws java.lang.NullPointerException,
        +                  java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of a vertex.
        + The degree of a vertex is the quantity of edges that have.
        + Basically, it'll count how many edge it have.
        +
        +
        Specified by:
        +
        degree in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        numberOfVertices

        +
        public int numberOfVertices()
        +
        Description copied from interface: Graph
        +
        Tells how many vertices are in the graph.
        +
        +
        Specified by:
        +
        numberOfVertices in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        the number of vertices
        +
        +
      • +
      + + + +
        +
      • +

        numberOfEdges

        +
        public int numberOfEdges()
        +
        Description copied from interface: Graph
        +
        Tells how many edges are in the graph.
        +
        +
        Specified by:
        +
        numberOfEdges in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        the number of edges
        +
        +
      • +
      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(V source,
        +                          VisitStrategy<V,W> strategy,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Visit the graph accordingly to the strategy that is passed.
        + This method visit the graph from the source to all the vertex that are reachable form the source.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        +
        +
        Specified by:
        +
        visit in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the source vertex of the visit
        +
        strategy - the algorithm for visiting the graph
        +
        visit - the function to apply at each vertex
        +
        Returns:
        +
        an info of the visit
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      + + + +
        +
      • +

        transpose

        +
        public Graph<V,W> transpose()
        +
        Description copied from interface: Graph
        +
        This method will create a new Graph that is the transposed version of the original.
        + At the end of this method the new graph will have all the edges inverted in orientation.
        + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
        +
        +
        Specified by:
        +
        transpose in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a transposed graph of this instance
        +
        +
      • +
      + + + +
        +
      • +

        topologicalSort

        +
        public java.util.List<V> topologicalSort()
        +                                  throws java.lang.UnsupportedOperationException
        +
        Description copied from interface: Graph
        +
        If the current graph is a DAG, it returns a topological sort of this graph.
        + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
        +
        +
        Specified by:
        +
        topologicalSort in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        an array containing the topological order of the vertices
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the graph is not a DAG (see Graph.isDAG())
        +
        +
      • +
      + + + +
        +
      • +

        stronglyConnectedComponents

        +
        public java.util.Collection<java.util.Collection<V>> stronglyConnectedComponents()
        +
        Description copied from interface: Graph
        +
        The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
        +
        +
        Specified by:
        +
        stronglyConnectedComponents in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection containing the strongly connected components
        +
        +
      • +
      + + + + + +
        +
      • +

        subGraph

        +
        public Graph<V,W> subGraph(V source,
        +                           int depth)
        +                    throws java.lang.NullPointerException,
        +                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get a sub-graph of the current one based on the maximum depth that is given.
        + If the depth is 1 then only the source and it's children will be in the sub-graph.
        + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
        + And so on.
        + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
        +
        +
        Specified by:
        +
        subGraph in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the source vertex
        +
        depth - the maximum depth (must be a positive number, if >=0 a graph containing only the source is returned)
        +
        Returns:
        +
        a sub-graph of the original
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        subGraph

        +
        public Graph<V,W> subGraph(java.lang.Object... marker)
        +
        Description copied from interface: Graph
        +
        Get a sub-graph of the current one with only the vertex marked with the selected markers.
        + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
        + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
        + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
        +
        +
        Specified by:
        +
        subGraph in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        marker - one or more markers
        +
        Returns:
        +
        a sub-graph of the current graph
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        public java.util.List<Edge<V,W>> distance(V source,
        +                                          V destination)
        +                                   throws java.lang.NullPointerException,
        +                                          java.lang.IllegalArgumentException,
        +                                          java.lang.UnsupportedOperationException
        +
        Description copied from interface: Graph
        +
        Get the minimum path from the source vertex to the destination vertex.
        + If the source vertex can't reach the destination, then an exception is thrown.
        +
        +
        Specified by:
        +
        distance in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the vertex where to start
        +
        destination - the destination chosen
        +
        Returns:
        +
        an ordered list of edges from source to destination that represent the minimum path between the two vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        java.lang.UnsupportedOperationException - if from the source it's not possible to reach the destination
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        public java.util.Map<V,java.util.List<Edge<V,W>>> distance(V source)
        +                                                    throws java.lang.NullPointerException,
        +                                                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get the minimum path from the source vertex to all the possible reachable vertices.
        +
        +
        Specified by:
        +
        distance in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the vertex where to start
        +
        Returns:
        +
        a map containing all the possible reachable vertices from the source and the minimum path to reach them
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/impl/MapGraph.html b/doc/berack96/lib/graph/impl/MapGraph.html new file mode 100644 index 0000000..fa71f11 --- /dev/null +++ b/doc/berack96/lib/graph/impl/MapGraph.html @@ -0,0 +1,1931 @@ + + + + + +MapGraph + + + + + + + + + + + + +
+
berack96.lib.graph.impl
+

Class MapGraph<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.impl.MapGraph<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertices
    +
    W - the weight of the edges
    +
    +
    +
    All Implemented Interfaces:
    +
    Graph<V,W>, java.lang.Iterable<V>
    +
    +
    +
    +
    public class MapGraph<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements Graph<V,W>
    +
    Graph that uses HashMap for vertices and edges
    + More specifically it utilizes a Map containing all the vertices mapped to all their edges
    + Technically this version of the graph combine the fast adding/removing of the edges of the Matrix implementation, + with the low memory and fast adding/removing of vertices of the Linked List implementation.
    + This happen if the HashMap is not reallocated. So in the end each operation of adding or removing has O(n)
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      MapGraph() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      voidaddAllEdges(java.util.Collection<Edge<V,W>> edges) +
      Add all the edges of the collection to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + Any null edges will be ignored.
      + This method will overwrite any existing edge between the two vertex.
      +
      voidaddAllVertices(java.util.Collection<V> vertices) +
      Add all the vertices contained in the collection to the graph.
      + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
      + Null vertices will be ignored and they will not be added to the graph.
      +
      WaddEdge(Edge<V,W> edge) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdge(V vertex1, + V vertex2, + W weight) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(Edge<V,W> edge) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(V vertex1, + V vertex2, + W weight) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      voidaddVertex(V vertex) +
      Add the vertex to the graph.
      +
      booleanaddVertexIfAbsent(V vertex) +
      Add the specified vertex to the graph only if the graph doesn't contains it.
      + The graph contains a vertex only if the method Graph.contains(Object) returns true.
      +
      booleancontains(V vertex) +
      Check if the vertex passed is contained in the graph or not.
      + The vertex V1 is contained in the graph G, if and only if:
      + exist V2 in G such that V2.equals(V1)
      +
      booleancontainsEdge(V vertex1, + V vertex2) +
      Check if the edge between the two vertex passed is contained in the graph or not.
      + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
      + If one of the two vertices is not contained in the graph, then even the edge isn't
      +
      intdegree(V vertex) +
      Tells the degree of a vertex.
      + The degree of a vertex is the quantity of edges that have.
      + Basically, it'll count how many edge it have.
      +
      intdegreeIn(V vertex) +
      Tells the degree of all the edges that goes to this vertex.
      + Basically, it'll count how many edge towards himself it have.
      +
      intdegreeOut(V vertex) +
      Tells the degree of all the edges that goes form this vertex to others.
      + Basically, it'll count how many edge towards any other vertex it have.
      +
      java.util.Map<V,java.util.List<Edge<V,W>>>distance(V source) +
      Get the minimum path from the source vertex to all the possible reachable vertices.
      +
      java.util.List<Edge<V,W>>distance(V source, + V destination) +
      Get the minimum path from the source vertex to the destination vertex.
      + If the source vertex can't reach the destination, then an exception is thrown.
      +
      java.util.Collection<Edge<V,W>>edges() +
      Get all the edges in the graph.
      + If the graph doesn't contains edges, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>edgesOf(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getAncestors(V vertex) +
      Get all the vertices that have the vertex passed as their child.
      + Basically is the opposite of Graph.getChildren(Object)
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getChildren(V vertex) +
      Get all the vertices that are children of the vertex passed as parameter.
      + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesIn(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as destination and another as source.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesOut(V vertex) +
      Retrieve all the edges that goes OUT of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getMarkedWith(java.lang.Object mark) +
      Get all the vertices that are marked with the specific mark passed.
      + If there aren't vertices with that mark then it is returned an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<java.lang.Object>getMarks(V vertex) +
      Get all the marker of this vertex.
      + If the vertex doesn't have any mark, then it will return an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      Vertex<V>getVertex(V vertex) +
      Get an instance of the vertex linked with this graph.
      + For more info see Vertex
      +
      WgetWeight(V vertex1, + V vertex2) +
      Get the weight of the selected edge.
      + If the edge doesn't exist, then null is returned
      +
      booleanisCyclic() +
      Tells if the graph has some cycle.
      + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
      +
      booleanisDAG() +
      Tells if the graph has the property of DAG (Directed Acyclic Graph).
      + A graph is a DAG only if absent of any cycle.
      +
      java.util.Iterator<V>iterator() 
      voidmark(V vertex, + java.lang.Object mark) +
      Add to the specified vertex the mark passed.
      + A vertex can have multiple marker.
      +
      java.util.Collection<java.lang.Object>marks() +
      Get all the marks of this graph.
      + Specifically it will return a collection of marks where every mark
      + as associated at least one vertex of the graph.
      + If the graph doesn't have vertex marked then it is returned an empty collection.
      +
      intnumberOfEdges() +
      Tells how many edges are in the graph.
      +
      intnumberOfVertices() +
      Tells how many vertices are in the graph.
      +
      voidremoveAllEdge() +
      Remove all the edges of the graph.
      + After this method's call the graph will have only vertices, and no edge.
      +
      voidremoveAllEdge(V vertex) +
      Remove all edges form a particular vertex of the graph.
      + After this method's call the selected vertex will have 0 edges.
      + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
      +
      voidremoveAllInEdge(V vertex) +
      Remove all the edges that goes in the vertex.
      + After this method's call it will be no longer possible travel to this vertex.
      +
      voidremoveAllOutEdge(V vertex) +
      Remove all the edges that start from this vertex.
      + After this method's call it will be no longer possible travel to any vertex from this one.
      +
      voidremoveAllVertex() +
      Remove all the vertex contained in the graph.
      + After this method's call the graph will be empty; no vertices nor edges.
      +
      voidremoveEdge(V vertex1, + V vertex2) +
      Remove the edge between the two vertex.
      + If the edge doesn't exist, then this call does nothing.
      + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
      +
      voidremoveVertex(V vertex) +
      Remove the selected vertex from the graph.
      + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
      +
      java.util.Collection<java.util.Collection<V>>stronglyConnectedComponents() +
      The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
      +
      Graph<V,W>subGraph(java.lang.Object... marker) +
      Get a sub-graph of the current one with only the vertex marked with the selected markers.
      + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
      + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
      + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
      +
      Graph<V,W>subGraph(V source, + int depth) +
      Get a sub-graph of the current one based on the maximum depth that is given.
      + If the depth is 1 then only the source and it's children will be in the sub-graph.
      + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
      + And so on.
      + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
      +
      java.util.List<V>topologicalSort() +
      If the current graph is a DAG, it returns a topological sort of this graph.
      + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
      +
      Graph<V,W>transpose() +
      This method will create a new Graph that is the transposed version of the original.
      + At the end of this method the new graph will have all the edges inverted in orientation.
      + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
      +
      voidunMark(V vertex) +
      Unmark the vertex selected.
      + After this call the vertex will not have any marked object to himself.
      +
      voidunMark(V vertex, + java.lang.Object mark) +
      Remove the selected mark from the vertex.
      +
      voidunMarkAll() +
      Remove all the marker to all the vertex.
      + After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
      +
      voidunMarkAll(java.lang.Object mark) +
      Remove the selected mark from all the vertices
      +
      java.util.Collection<V>vertices() +
      Get all the vertices in the graph.
      + If the graph doesn't contains vertices, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      VisitInfo<V>visit(V source, + VisitStrategy<V,W> strategy, + java.util.function.Consumer<V> visit) +
      Visit the graph accordingly to the strategy that is passed.
      + This method visit the graph from the source to all the vertex that are reachable form the source.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      + +
        +
      • + + +

        Methods inherited from interface java.lang.Iterable

        +forEach, spliterator
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        MapGraph

        +
        public MapGraph()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        isCyclic

        +
        public boolean isCyclic()
        +
        Description copied from interface: Graph
        +
        Tells if the graph has some cycle.
        + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
        +
        +
        Specified by:
        +
        isCyclic in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        true if has cycle, false otherwise
        +
        +
      • +
      + + + +
        +
      • +

        isDAG

        +
        public boolean isDAG()
        +
        Description copied from interface: Graph
        +
        Tells if the graph has the property of DAG (Directed Acyclic Graph).
        + A graph is a DAG only if absent of any cycle. ( see Graph.isCyclic() )
        +
        +
        Specified by:
        +
        isDAG in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        true if is a DAG, false otherwise
        +
        +
      • +
      + + + + + +
        +
      • +

        getVertex

        +
        public Vertex<V> getVertex(V vertex)
        +                    throws java.lang.NullPointerException,
        +                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get an instance of the vertex linked with this graph.
        + For more info see Vertex
        +
        +
        Specified by:
        +
        getVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        a vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertex

        +
        public void addVertex(V vertex)
        +               throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add the vertex to the graph. If it's already in the graph it will be replaced.
        + Of course the vertex added will have no edge to any other vertex nor form any other vertex.
        +
        +
        Specified by:
        +
        addVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertexIfAbsent

        +
        public boolean addVertexIfAbsent(V vertex)
        +                          throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add the specified vertex to the graph only if the graph doesn't contains it.
        + The graph contains a vertex only if the method Graph.contains(Object) returns true.
        +
        +
        Specified by:
        +
        addVertexIfAbsent in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Returns:
        +
        true if the vertex is added, false if the graph contains the vertex and therefore the new one is not added
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        addAllVertices

        +
        public void addAllVertices(java.util.Collection<V> vertices)
        +                    throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add all the vertices contained in the collection to the graph.
        + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
        + Null vertices will be ignored and they will not be added to the graph.
        +
        +
        Specified by:
        +
        addAllVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertices - a collection of the vertices to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        removeVertex

        +
        public void removeVertex(V vertex)
        +                  throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Remove the selected vertex from the graph.
        + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
        +
        +
        Specified by:
        +
        removeVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        removeAllVertex

        +
        public void removeAllVertex()
        +
        Description copied from interface: Graph
        +
        Remove all the vertex contained in the graph.
        + After this method's call the graph will be empty; no vertices nor edges.
        +
        +
        Specified by:
        +
        removeAllVertex in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        contains

        +
        public boolean contains(V vertex)
        +                 throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Check if the vertex passed is contained in the graph or not.
        + The vertex V1 is contained in the graph G, if and only if:
        + exist V2 in G such that V2.equals(V1)
        +
        +
        Specified by:
        +
        contains in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to check
        +
        Returns:
        +
        true if the vertex is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        marks

        +
        public java.util.Collection<java.lang.Object> marks()
        +
        Description copied from interface: Graph
        +
        Get all the marks of this graph.
        + Specifically it will return a collection of marks where every mark
        + as associated at least one vertex of the graph.
        + If the graph doesn't have vertex marked then it is returned an empty collection.
        +
        +
        Specified by:
        +
        marks in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection of marks
        +
        +
      • +
      + + + + + +
        +
      • +

        mark

        +
        public void mark(V vertex,
        +                 java.lang.Object mark)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add to the specified vertex the mark passed.
        + A vertex can have multiple marker.
        +
        +
        Specified by:
        +
        mark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to mark
        +
        mark - the mark to add
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        public void unMark(V vertex,
        +                   java.lang.Object mark)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the selected mark from the vertex.
        +
        +
        Specified by:
        +
        unMark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex where remove the mark
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if a param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        public void unMark(V vertex)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Unmark the vertex selected.
        + After this call the vertex will not have any marked object to himself.
        +
        +
        Specified by:
        +
        unMark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        getMarkedWith

        +
        public java.util.Collection<V> getMarkedWith(java.lang.Object mark)
        +                                      throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that are marked with the specific mark passed.
        + If there aren't vertices with that mark then it is returned an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getMarkedWith in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        mark - the mark
        +
        Returns:
        +
        all the vertices that are marked with that specific mark
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getMarks

        +
        public java.util.Collection<java.lang.Object> getMarks(V vertex)
        +                                                throws java.lang.NullPointerException,
        +                                                       java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the marker of this vertex.
        + If the vertex doesn't have any mark, then it will return an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getMarks in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        all the mark to the vertex or an empty collection if none
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        public void unMarkAll(java.lang.Object mark)
        +
        Description copied from interface: Graph
        +
        Remove the selected mark from all the vertices
        +
        +
        Specified by:
        +
        unMarkAll in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        mark - the mark to remove
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        public void unMarkAll()
        +
        Description copied from interface: Graph
        +
        Remove all the marker to all the vertex.
        + After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
        +
        +
        Specified by:
        +
        unMarkAll in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdge

        +
        public W addEdge(V vertex1,
        +                 V vertex2,
        +                 W weight)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        addEdge

        +
        public W addEdge(Edge<V,W> edge)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdgeAndVertices

        +
        public W addEdgeAndVertices(V vertex1,
        +                            V vertex2,
        +                            W weight)
        +                     throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdgeAndVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        +
      • +
      + + + +
        +
      • +

        addEdgeAndVertices

        +
        public W addEdgeAndVertices(Edge<V,W> edge)
        +                     throws java.lang.NullPointerException,
        +                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdgeAndVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException
        +
        +
      • +
      + + + +
        +
      • +

        addAllEdges

        +
        public void addAllEdges(java.util.Collection<Edge<V,W>> edges)
        +                 throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add all the edges of the collection to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + Any null edges will be ignored.
        + This method will overwrite any existing edge between the two vertex.
        +
        +
        Specified by:
        +
        addAllEdges in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edges - the edges to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getWeight

        +
        public W getWeight(V vertex1,
        +                   V vertex2)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get the weight of the selected edge.
        + If the edge doesn't exist, then null is returned
        +
        +
        Specified by:
        +
        getWeight in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        the weight previously set, or null if the edge doesn't exist
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeEdge

        +
        public void removeEdge(V vertex1,
        +                       V vertex2)
        +                throws java.lang.NullPointerException,
        +                       java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the edge between the two vertex.
        + If the edge doesn't exist, then this call does nothing.
        + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
        +
        +
        Specified by:
        +
        removeEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllInEdge

        +
        public void removeAllInEdge(V vertex)
        +                     throws java.lang.NullPointerException,
        +                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all the edges that goes in the vertex.
        + After this method's call it will be no longer possible travel to this vertex.
        +
        +
        Specified by:
        +
        removeAllInEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllOutEdge

        +
        public void removeAllOutEdge(V vertex)
        +                      throws java.lang.NullPointerException,
        +                             java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all the edges that start from this vertex.
        + After this method's call it will be no longer possible travel to any vertex from this one.
        +
        +
        Specified by:
        +
        removeAllOutEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllEdge

        +
        public void removeAllEdge(V vertex)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all edges form a particular vertex of the graph.
        + After this method's call the selected vertex will have 0 edges.
        + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
        +
        +
        Specified by:
        +
        removeAllEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        removeAllEdge

        +
        public void removeAllEdge()
        +
        Description copied from interface: Graph
        +
        Remove all the edges of the graph.
        + After this method's call the graph will have only vertices, and no edge.
        +
        +
        Specified by:
        +
        removeAllEdge in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        containsEdge

        +
        public boolean containsEdge(V vertex1,
        +                            V vertex2)
        +                     throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Check if the edge between the two vertex passed is contained in the graph or not.
        + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
        + If one of the two vertices is not contained in the graph, then even the edge isn't
        +
        +
        Specified by:
        +
        containsEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        true if the edge is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        +
      • +
      + + + +
        +
      • +

        vertices

        +
        public java.util.Collection<V> vertices()
        +
        Description copied from interface: Graph
        +
        Get all the vertices in the graph.
        + If the graph doesn't contains vertices, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        vertices in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        an array that include all the vertices
        +
        +
      • +
      + + + +
        +
      • +

        edges

        +
        public java.util.Collection<Edge<V,W>> edges()
        +
        Description copied from interface: Graph
        +
        Get all the edges in the graph.
        + If the graph doesn't contains edges, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        edges in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection that include all the edges
        +
        +
      • +
      + + + + + +
        +
      • +

        edgesOf

        +
        public java.util.Collection<Edge<V,W>> edgesOf(V vertex)
        +                                        throws java.lang.NullPointerException,
        +                                               java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        edgesOf in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesIn

        +
        public java.util.Collection<Edge<V,W>> getEdgesIn(V vertex)
        +                                           throws java.lang.NullPointerException,
        +                                                  java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as destination and another as source.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getEdgesIn in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesOut

        +
        public java.util.Collection<Edge<V,W>> getEdgesOut(V vertex)
        +                                            throws java.lang.NullPointerException,
        +                                                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges that goes OUT of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getEdgesOut in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getChildren

        +
        public java.util.Collection<V> getChildren(V vertex)
        +                                    throws java.lang.NullPointerException,
        +                                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that are children of the vertex passed as parameter.
        + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getChildren in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the source vertex
        +
        Returns:
        +
        an array of vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getAncestors

        +
        public java.util.Collection<V> getAncestors(V vertex)
        +                                     throws java.lang.NullPointerException,
        +                                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that have the vertex passed as their child.
        + Basically is the opposite of Graph.getChildren(Object)
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getAncestors in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        an array of ancestors of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeIn

        +
        public int degreeIn(V vertex)
        +             throws java.lang.NullPointerException,
        +                    java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of all the edges that goes to this vertex.
        + Basically, it'll count how many edge towards himself it have.
        +
        +
        Specified by:
        +
        degreeIn in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the in degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeOut

        +
        public int degreeOut(V vertex)
        +              throws java.lang.NullPointerException,
        +                     java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of all the edges that goes form this vertex to others.
        + Basically, it'll count how many edge towards any other vertex it have.
        +
        +
        Specified by:
        +
        degreeOut in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the out degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degree

        +
        public int degree(V vertex)
        +           throws java.lang.NullPointerException,
        +                  java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of a vertex.
        + The degree of a vertex is the quantity of edges that have.
        + Basically, it'll count how many edge it have.
        +
        +
        Specified by:
        +
        degree in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        numberOfVertices

        +
        public int numberOfVertices()
        +
        Description copied from interface: Graph
        +
        Tells how many vertices are in the graph.
        +
        +
        Specified by:
        +
        numberOfVertices in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        the number of vertices
        +
        +
      • +
      + + + +
        +
      • +

        numberOfEdges

        +
        public int numberOfEdges()
        +
        Description copied from interface: Graph
        +
        Tells how many edges are in the graph.
        +
        +
        Specified by:
        +
        numberOfEdges in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        the number of edges
        +
        +
      • +
      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(V source,
        +                          VisitStrategy<V,W> strategy,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Visit the graph accordingly to the strategy that is passed.
        + This method visit the graph from the source to all the vertex that are reachable form the source.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        +
        +
        Specified by:
        +
        visit in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the source vertex of the visit
        +
        strategy - the algorithm for visiting the graph
        +
        visit - the function to apply at each vertex
        +
        Returns:
        +
        an info of the visit
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      + + + +
        +
      • +

        transpose

        +
        public Graph<V,W> transpose()
        +
        Description copied from interface: Graph
        +
        This method will create a new Graph that is the transposed version of the original.
        + At the end of this method the new graph will have all the edges inverted in orientation.
        + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
        +
        +
        Specified by:
        +
        transpose in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a transposed graph of this instance
        +
        +
      • +
      + + + +
        +
      • +

        topologicalSort

        +
        public java.util.List<V> topologicalSort()
        +                                  throws java.lang.UnsupportedOperationException
        +
        Description copied from interface: Graph
        +
        If the current graph is a DAG, it returns a topological sort of this graph.
        + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
        +
        +
        Specified by:
        +
        topologicalSort in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        an array containing the topological order of the vertices
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the graph is not a DAG (see Graph.isDAG())
        +
        +
      • +
      + + + +
        +
      • +

        stronglyConnectedComponents

        +
        public java.util.Collection<java.util.Collection<V>> stronglyConnectedComponents()
        +
        Description copied from interface: Graph
        +
        The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
        +
        +
        Specified by:
        +
        stronglyConnectedComponents in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection containing the strongly connected components
        +
        +
      • +
      + + + + + +
        +
      • +

        subGraph

        +
        public Graph<V,W> subGraph(V source,
        +                           int depth)
        +                    throws java.lang.NullPointerException,
        +                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get a sub-graph of the current one based on the maximum depth that is given.
        + If the depth is 1 then only the source and it's children will be in the sub-graph.
        + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
        + And so on.
        + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
        +
        +
        Specified by:
        +
        subGraph in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the source vertex
        +
        depth - the maximum depth (must be a positive number, if >=0 a graph containing only the source is returned)
        +
        Returns:
        +
        a sub-graph of the original
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        subGraph

        +
        public Graph<V,W> subGraph(java.lang.Object... marker)
        +
        Description copied from interface: Graph
        +
        Get a sub-graph of the current one with only the vertex marked with the selected markers.
        + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
        + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
        + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
        +
        +
        Specified by:
        +
        subGraph in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        marker - one or more markers
        +
        Returns:
        +
        a sub-graph of the current graph
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        public java.util.List<Edge<V,W>> distance(V source,
        +                                          V destination)
        +                                   throws java.lang.NullPointerException,
        +                                          java.lang.IllegalArgumentException,
        +                                          java.lang.UnsupportedOperationException
        +
        Description copied from interface: Graph
        +
        Get the minimum path from the source vertex to the destination vertex.
        + If the source vertex can't reach the destination, then an exception is thrown.
        +
        +
        Specified by:
        +
        distance in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the vertex where to start
        +
        destination - the destination chosen
        +
        Returns:
        +
        an ordered list of edges from source to destination that represent the minimum path between the two vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        java.lang.UnsupportedOperationException - if from the source it's not possible to reach the destination
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        public java.util.Map<V,java.util.List<Edge<V,W>>> distance(V source)
        +                                                    throws java.lang.NullPointerException,
        +                                                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get the minimum path from the source vertex to all the possible reachable vertices.
        +
        +
        Specified by:
        +
        distance in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the vertex where to start
        +
        Returns:
        +
        a map containing all the possible reachable vertices from the source and the minimum path to reach them
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      + + + +
        +
      • +

        iterator

        +
        public java.util.Iterator<V> iterator()
        +
        +
        Specified by:
        +
        iterator in interface java.lang.Iterable<V>
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/impl/MatrixGraph.html b/doc/berack96/lib/graph/impl/MatrixGraph.html new file mode 100644 index 0000000..4e3fe66 --- /dev/null +++ b/doc/berack96/lib/graph/impl/MatrixGraph.html @@ -0,0 +1,1922 @@ + + + + + +MatrixGraph + + + + + + + + + + + + +
+
berack96.lib.graph.impl
+

Class MatrixGraph<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.impl.MatrixGraph<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    Graph<V,W>, java.lang.Iterable<V>
    +
    +
    +
    +
    public class MatrixGraph<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements Graph<V,W>
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      MatrixGraph() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      voidaddAllEdges(java.util.Collection<Edge<V,W>> edges) +
      Add all the edges of the collection to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + Any null edges will be ignored.
      + This method will overwrite any existing edge between the two vertex.
      +
      voidaddAllVertices(java.util.Collection<V> vertices) +
      Add all the vertices contained in the collection to the graph.
      + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
      + Null vertices will be ignored and they will not be added to the graph.
      +
      WaddEdge(Edge<V,W> edge) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdge(V vertex1, + V vertex2, + W weight) +
      Add an edge between the two vertex.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(Edge<V,W> edge) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex source of the edge and the vertex destination of it
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      WaddEdgeAndVertices(V vertex1, + V vertex2, + W weight) +
      This particular function add an edge to the graph.
      + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
      + The edge will be created from the vertex V1 and the vertex V2
      + This method will overwrite any existing edge between the two vertex.
      + If there was a previous edge then it is returned
      +
      voidaddVertex(V vertex) +
      Add the vertex to the graph.
      +
      booleanaddVertexIfAbsent(V vertex) +
      Add the specified vertex to the graph only if the graph doesn't contains it.
      + The graph contains a vertex only if the method Graph.contains(Object) returns true.
      +
      booleancontains(V vertex) +
      Check if the vertex passed is contained in the graph or not.
      + The vertex V1 is contained in the graph G, if and only if:
      + exist V2 in G such that V2.equals(V1)
      +
      booleancontainsEdge(V vertex1, + V vertex2) +
      Check if the edge between the two vertex passed is contained in the graph or not.
      + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
      + If one of the two vertices is not contained in the graph, then even the edge isn't
      +
      intdegree(V vertex) +
      Tells the degree of a vertex.
      + The degree of a vertex is the quantity of edges that have.
      + Basically, it'll count how many edge it have.
      +
      intdegreeIn(V vertex) +
      Tells the degree of all the edges that goes to this vertex.
      + Basically, it'll count how many edge towards himself it have.
      +
      intdegreeOut(V vertex) +
      Tells the degree of all the edges that goes form this vertex to others.
      + Basically, it'll count how many edge towards any other vertex it have.
      +
      java.util.Map<V,java.util.List<Edge<V,W>>>distance(V source) +
      Get the minimum path from the source vertex to all the possible reachable vertices.
      +
      java.util.List<Edge<V,W>>distance(V source, + V destination) +
      Get the minimum path from the source vertex to the destination vertex.
      + If the source vertex can't reach the destination, then an exception is thrown.
      +
      java.util.Collection<Edge<V,W>>edges() +
      Get all the edges in the graph.
      + If the graph doesn't contains edges, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>edgesOf(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getAncestors(V vertex) +
      Get all the vertices that have the vertex passed as their child.
      + Basically is the opposite of Graph.getChildren(Object)
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getChildren(V vertex) +
      Get all the vertices that are children of the vertex passed as parameter.
      + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesIn(V vertex) +
      Retrieve all the edges of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as destination and another as source.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<Edge<V,W>>getEdgesOut(V vertex) +
      Retrieve all the edges that goes OUT of a particular vertex.
      + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
      + Note2: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<V>getMarkedWith(java.lang.Object mark) +
      Get all the vertices that are marked with the specific mark passed.
      + If there aren't vertices with that mark then it is returned an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      java.util.Collection<java.lang.Object>getMarks(V vertex) +
      Get all the marker of this vertex.
      + If the vertex doesn't have any mark, then it will return an empty set.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      Vertex<V>getVertex(V vertex) +
      Get an instance of the vertex linked with this graph.
      + For more info see Vertex
      +
      WgetWeight(V vertex1, + V vertex2) +
      Get the weight of the selected edge.
      + If the edge doesn't exist, then null is returned
      +
      booleanisCyclic() +
      Tells if the graph has some cycle.
      + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
      +
      booleanisDAG() +
      Tells if the graph has the property of DAG (Directed Acyclic Graph).
      + A graph is a DAG only if absent of any cycle.
      +
      java.util.Iterator<V>iterator() 
      voidmark(V vertex, + java.lang.Object mark) +
      Add to the specified vertex the mark passed.
      + A vertex can have multiple marker.
      +
      java.util.Collection<java.lang.Object>marks() +
      Get all the marks of this graph.
      + Specifically it will return a collection of marks where every mark
      + as associated at least one vertex of the graph.
      + If the graph doesn't have vertex marked then it is returned an empty collection.
      +
      intnumberOfEdges() +
      Tells how many edges are in the graph.
      +
      intnumberOfVertices() +
      Tells how many vertices are in the graph.
      +
      voidremoveAllEdge() +
      Remove all the edges of the graph.
      + After this method's call the graph will have only vertices, and no edge.
      +
      voidremoveAllEdge(V vertex) +
      Remove all edges form a particular vertex of the graph.
      + After this method's call the selected vertex will have 0 edges.
      + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
      +
      voidremoveAllInEdge(V vertex) +
      Remove all the edges that goes in the vertex.
      + After this method's call it will be no longer possible travel to this vertex.
      +
      voidremoveAllOutEdge(V vertex) +
      Remove all the edges that start from this vertex.
      + After this method's call it will be no longer possible travel to any vertex from this one.
      +
      voidremoveAllVertex() +
      Remove all the vertex contained in the graph.
      + After this method's call the graph will be empty; no vertices nor edges.
      +
      voidremoveEdge(V vertex1, + V vertex2) +
      Remove the edge between the two vertex.
      + If the edge doesn't exist, then this call does nothing.
      + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
      +
      voidremoveVertex(V vertex) +
      Remove the selected vertex from the graph.
      + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
      +
      java.util.Collection<java.util.Collection<V>>stronglyConnectedComponents() +
      The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
      +
      Graph<V,W>subGraph(java.lang.Object... marker) +
      Get a sub-graph of the current one with only the vertex marked with the selected markers.
      + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
      + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
      + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
      +
      Graph<V,W>subGraph(V source, + int depth) +
      Get a sub-graph of the current one based on the maximum depth that is given.
      + If the depth is 1 then only the source and it's children will be in the sub-graph.
      + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
      + And so on.
      + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
      +
      java.util.List<V>topologicalSort() +
      If the current graph is a DAG, it returns a topological sort of this graph.
      + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
      +
      Graph<V,W>transpose() +
      This method will create a new Graph that is the transposed version of the original.
      + At the end of this method the new graph will have all the edges inverted in orientation.
      + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
      +
      voidunMark(V vertex) +
      Unmark the vertex selected.
      + After this call the vertex will not have any marked object to himself.
      +
      voidunMark(V vertex, + java.lang.Object mark) +
      Remove the selected mark from the vertex.
      +
      voidunMarkAll() +
      Remove all the marker to all the vertex.
      + After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
      +
      voidunMarkAll(java.lang.Object mark) +
      Remove the selected mark from all the vertices
      +
      java.util.Collection<V>vertices() +
      Get all the vertices in the graph.
      + If the graph doesn't contains vertices, it'll return an empty collection.
      + Note: depending on the implementation, modifying the returned collection
      + could affect the graph behavior and the changes could be reflected to the graph.
      +
      VisitInfo<V>visit(V source, + VisitStrategy<V,W> strategy, + java.util.function.Consumer<V> visit) +
      Visit the graph accordingly to the strategy that is passed.
      + This method visit the graph from the source to all the vertex that are reachable form the source.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      + +
        +
      • + + +

        Methods inherited from interface java.lang.Iterable

        +forEach, spliterator
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        MatrixGraph

        +
        public MatrixGraph()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        iterator

        +
        public java.util.Iterator<V> iterator()
        +
        +
        Specified by:
        +
        iterator in interface java.lang.Iterable<V>
        +
        +
      • +
      + + + +
        +
      • +

        isCyclic

        +
        public boolean isCyclic()
        +
        Description copied from interface: Graph
        +
        Tells if the graph has some cycle.
        + A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
        +
        +
        Specified by:
        +
        isCyclic in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        true if has cycle, false otherwise
        +
        +
      • +
      + + + +
        +
      • +

        isDAG

        +
        public boolean isDAG()
        +
        Description copied from interface: Graph
        +
        Tells if the graph has the property of DAG (Directed Acyclic Graph).
        + A graph is a DAG only if absent of any cycle. ( see Graph.isCyclic() )
        +
        +
        Specified by:
        +
        isDAG in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        true if is a DAG, false otherwise
        +
        +
      • +
      + + + + + +
        +
      • +

        getVertex

        +
        public Vertex<V> getVertex(V vertex)
        +                    throws java.lang.NullPointerException,
        +                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get an instance of the vertex linked with this graph.
        + For more info see Vertex
        +
        +
        Specified by:
        +
        getVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        a vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertex

        +
        public void addVertex(V vertex)
        +               throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add the vertex to the graph. If it's already in the graph it will be replaced.
        + Of course the vertex added will have no edge to any other vertex nor form any other vertex.
        +
        +
        Specified by:
        +
        addVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        addVertexIfAbsent

        +
        public boolean addVertexIfAbsent(V vertex)
        +                          throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add the specified vertex to the graph only if the graph doesn't contains it.
        + The graph contains a vertex only if the method Graph.contains(Object) returns true.
        +
        +
        Specified by:
        +
        addVertexIfAbsent in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to add
        +
        Returns:
        +
        true if the vertex is added, false if the graph contains the vertex and therefore the new one is not added
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        addAllVertices

        +
        public void addAllVertices(java.util.Collection<V> vertices)
        +                    throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add all the vertices contained in the collection to the graph.
        + If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
        + Null vertices will be ignored and they will not be added to the graph.
        +
        +
        Specified by:
        +
        addAllVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertices - a collection of the vertices to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        removeVertex

        +
        public void removeVertex(V vertex)
        +                  throws java.lang.NullPointerException,
        +                         java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the selected vertex from the graph.
        + After this method's call the vertex will be no longer present in the graph, and nether all his edges.
        +
        +
        Specified by:
        +
        removeVertex in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        removeAllVertex

        +
        public void removeAllVertex()
        +
        Description copied from interface: Graph
        +
        Remove all the vertex contained in the graph.
        + After this method's call the graph will be empty; no vertices nor edges.
        +
        +
        Specified by:
        +
        removeAllVertex in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        contains

        +
        public boolean contains(V vertex)
        +                 throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Check if the vertex passed is contained in the graph or not.
        + The vertex V1 is contained in the graph G, if and only if:
        + exist V2 in G such that V2.equals(V1)
        +
        +
        Specified by:
        +
        contains in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to check
        +
        Returns:
        +
        true if the vertex is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + +
        +
      • +

        marks

        +
        public java.util.Collection<java.lang.Object> marks()
        +
        Description copied from interface: Graph
        +
        Get all the marks of this graph.
        + Specifically it will return a collection of marks where every mark
        + as associated at least one vertex of the graph.
        + If the graph doesn't have vertex marked then it is returned an empty collection.
        +
        +
        Specified by:
        +
        marks in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection of marks
        +
        +
      • +
      + + + + + +
        +
      • +

        mark

        +
        public void mark(V vertex,
        +                 java.lang.Object mark)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add to the specified vertex the mark passed.
        + A vertex can have multiple marker.
        +
        +
        Specified by:
        +
        mark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex to mark
        +
        mark - the mark to add
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        public void unMark(V vertex,
        +                   java.lang.Object mark)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the selected mark from the vertex.
        +
        +
        Specified by:
        +
        unMark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex where remove the mark
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if a param is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        unMark

        +
        public void unMark(V vertex)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Unmark the vertex selected.
        + After this call the vertex will not have any marked object to himself.
        +
        +
        Specified by:
        +
        unMark in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        getMarkedWith

        +
        public java.util.Collection<V> getMarkedWith(java.lang.Object mark)
        +                                      throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that are marked with the specific mark passed.
        + If there aren't vertices with that mark then it is returned an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getMarkedWith in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        mark - the mark
        +
        Returns:
        +
        all the vertices that are marked with that specific mark
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getMarks

        +
        public java.util.Collection<java.lang.Object> getMarks(V vertex)
        +                                                throws java.lang.NullPointerException,
        +                                                       java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the marker of this vertex.
        + If the vertex doesn't have any mark, then it will return an empty set.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getMarks in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the vertex
        +
        Returns:
        +
        all the mark to the vertex or an empty collection if none
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        public void unMarkAll(java.lang.Object mark)
        +               throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Remove the selected mark from all the vertices
        +
        +
        Specified by:
        +
        unMarkAll in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        mark - the mark to remove
        +
        Throws:
        +
        java.lang.NullPointerException - if the mark is null
        +
        +
      • +
      + + + +
        +
      • +

        unMarkAll

        +
        public void unMarkAll()
        +
        Description copied from interface: Graph
        +
        Remove all the marker to all the vertex.
        + After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
        +
        +
        Specified by:
        +
        unMarkAll in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdge

        +
        public W addEdge(V vertex1,
        +                 V vertex2,
        +                 W weight)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        addEdge

        +
        public W addEdge(Edge<V,W> edge)
        +          throws java.lang.NullPointerException,
        +                 java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Add an edge between the two vertex.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        addEdgeAndVertices

        +
        public W addEdgeAndVertices(V vertex1,
        +                            V vertex2,
        +                            W weight)
        +                     throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex V1 and the vertex V2
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdgeAndVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        weight - the weight of the edge
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        +
      • +
      + + + +
        +
      • +

        addEdgeAndVertices

        +
        public W addEdgeAndVertices(Edge<V,W> edge)
        +                     throws java.lang.NullPointerException,
        +                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        This particular function add an edge to the graph.
        + If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
        + The edge will be created from the vertex source of the edge and the vertex destination of it
        + This method will overwrite any existing edge between the two vertex.
        + If there was a previous edge then it is returned
        +
        +
        Specified by:
        +
        addEdgeAndVertices in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edge - the edge to add
        +
        Returns:
        +
        null or the previous weight of the edge if there was already one
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null
        +
        java.lang.IllegalArgumentException
        +
        +
      • +
      + + + +
        +
      • +

        addAllEdges

        +
        public void addAllEdges(java.util.Collection<Edge<V,W>> edges)
        +                 throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Add all the edges of the collection to the graph.
        + If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
        + Any null edges will be ignored.
        + This method will overwrite any existing edge between the two vertex.
        +
        +
        Specified by:
        +
        addAllEdges in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        edges - the edges to add
        +
        Throws:
        +
        java.lang.NullPointerException - if the set is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getWeight

        +
        public W getWeight(V vertex1,
        +                   V vertex2)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get the weight of the selected edge.
        + If the edge doesn't exist, then null is returned
        +
        +
        Specified by:
        +
        getWeight in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        the weight previously set, or null if the edge doesn't exist
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeEdge

        +
        public void removeEdge(V vertex1,
        +                       V vertex2)
        +                throws java.lang.NullPointerException,
        +                       java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove the edge between the two vertex.
        + If the edge doesn't exist, then this call does nothing.
        + After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
        +
        +
        Specified by:
        +
        removeEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllInEdge

        +
        public void removeAllInEdge(V vertex)
        +                     throws java.lang.NullPointerException,
        +                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all the edges that goes in the vertex.
        + After this method's call it will be no longer possible travel to this vertex.
        +
        +
        Specified by:
        +
        removeAllInEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllOutEdge

        +
        public void removeAllOutEdge(V vertex)
        +                      throws java.lang.NullPointerException,
        +                             java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all the edges that start from this vertex.
        + After this method's call it will be no longer possible travel to any vertex from this one.
        +
        +
        Specified by:
        +
        removeAllOutEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        removeAllEdge

        +
        public void removeAllEdge(V vertex)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Remove all edges form a particular vertex of the graph.
        + After this method's call the selected vertex will have 0 edges.
        + It will be no longer possible to reach this vertex from any other vertex, and vice versa.
        +
        +
        Specified by:
        +
        removeAllEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        removeAllEdge

        +
        public void removeAllEdge()
        +
        Description copied from interface: Graph
        +
        Remove all the edges of the graph.
        + After this method's call the graph will have only vertices, and no edge.
        +
        +
        Specified by:
        +
        removeAllEdge in interface Graph<V,W extends java.lang.Number>
        +
        +
      • +
      + + + + + +
        +
      • +

        containsEdge

        +
        public boolean containsEdge(V vertex1,
        +                            V vertex2)
        +                     throws java.lang.NullPointerException
        +
        Description copied from interface: Graph
        +
        Check if the edge between the two vertex passed is contained in the graph or not.
        + An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
        + If one of the two vertices is not contained in the graph, then even the edge isn't
        +
        +
        Specified by:
        +
        containsEdge in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex1 - a vertex of the graph
        +
        vertex2 - a vertex of the graph
        +
        Returns:
        +
        true if the edge is contained, false otherwise
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        +
      • +
      + + + +
        +
      • +

        vertices

        +
        public java.util.Collection<V> vertices()
        +
        Description copied from interface: Graph
        +
        Get all the vertices in the graph.
        + If the graph doesn't contains vertices, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        vertices in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        an array that include all the vertices
        +
        +
      • +
      + + + +
        +
      • +

        edges

        +
        public java.util.Collection<Edge<V,W>> edges()
        +
        Description copied from interface: Graph
        +
        Get all the edges in the graph.
        + If the graph doesn't contains edges, it'll return an empty collection.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        edges in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection that include all the edges
        +
        +
      • +
      + + + + + +
        +
      • +

        edgesOf

        +
        public java.util.Collection<Edge<V,W>> edgesOf(V vertex)
        +                                        throws java.lang.NullPointerException,
        +                                               java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        edgesOf in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesIn

        +
        public java.util.Collection<Edge<V,W>> getEdgesIn(V vertex)
        +                                           throws java.lang.NullPointerException,
        +                                                  java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as destination and another as source.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getEdgesIn in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getEdgesOut

        +
        public java.util.Collection<Edge<V,W>> getEdgesOut(V vertex)
        +                                            throws java.lang.NullPointerException,
        +                                                   java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Retrieve all the edges that goes OUT of a particular vertex.
        + Note: the edges that are returned are the one that have this vertex as source and another one as destination.
        + Note2: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getEdgesOut in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        a collection of edges
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getChildren

        +
        public java.util.Collection<V> getChildren(V vertex)
        +                                    throws java.lang.NullPointerException,
        +                                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that are children of the vertex passed as parameter.
        + The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getChildren in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - the source vertex
        +
        Returns:
        +
        an array of vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        getAncestors

        +
        public java.util.Collection<V> getAncestors(V vertex)
        +                                     throws java.lang.NullPointerException,
        +                                            java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get all the vertices that have the vertex passed as their child.
        + Basically is the opposite of Graph.getChildren(Object)
        + Note: depending on the implementation, modifying the returned collection
        + could affect the graph behavior and the changes could be reflected to the graph.
        +
        +
        Specified by:
        +
        getAncestors in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        an array of ancestors of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameters is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeIn

        +
        public int degreeIn(V vertex)
        +             throws java.lang.NullPointerException,
        +                    java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of all the edges that goes to this vertex.
        + Basically, it'll count how many edge towards himself it have.
        +
        +
        Specified by:
        +
        degreeIn in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the in degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degreeOut

        +
        public int degreeOut(V vertex)
        +              throws java.lang.NullPointerException,
        +                     java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of all the edges that goes form this vertex to others.
        + Basically, it'll count how many edge towards any other vertex it have.
        +
        +
        Specified by:
        +
        degreeOut in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the out degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + + + +
        +
      • +

        degree

        +
        public int degree(V vertex)
        +           throws java.lang.NullPointerException,
        +                  java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Tells the degree of a vertex.
        + The degree of a vertex is the quantity of edges that have.
        + Basically, it'll count how many edge it have.
        +
        +
        Specified by:
        +
        degree in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        vertex - a vertex of the graph
        +
        Returns:
        +
        the degree of the vertex
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained in the graph
        +
        +
      • +
      + + + +
        +
      • +

        numberOfVertices

        +
        public int numberOfVertices()
        +
        Description copied from interface: Graph
        +
        Tells how many vertices are in the graph.
        +
        +
        Specified by:
        +
        numberOfVertices in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        the number of vertices
        +
        +
      • +
      + + + +
        +
      • +

        numberOfEdges

        +
        public int numberOfEdges()
        +
        Description copied from interface: Graph
        +
        Tells how many edges are in the graph.
        +
        +
        Specified by:
        +
        numberOfEdges in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        the number of edges
        +
        +
      • +
      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(V source,
        +                          VisitStrategy<V,W> strategy,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Visit the graph accordingly to the strategy that is passed.
        + This method visit the graph from the source to all the vertex that are reachable form the source.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        +
        +
        Specified by:
        +
        visit in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the source vertex of the visit
        +
        strategy - the algorithm for visiting the graph
        +
        visit - the function to apply at each vertex
        +
        Returns:
        +
        an info of the visit
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      + + + +
        +
      • +

        transpose

        +
        public Graph<V,W> transpose()
        +
        Description copied from interface: Graph
        +
        This method will create a new Graph that is the transposed version of the original.
        + At the end of this method the new graph will have all the edges inverted in orientation.
        + Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
        +
        +
        Specified by:
        +
        transpose in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a transposed graph of this instance
        +
        +
      • +
      + + + +
        +
      • +

        topologicalSort

        +
        public java.util.List<V> topologicalSort()
        +                                  throws java.lang.UnsupportedOperationException
        +
        Description copied from interface: Graph
        +
        If the current graph is a DAG, it returns a topological sort of this graph.
        + A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
        +
        +
        Specified by:
        +
        topologicalSort in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        an array containing the topological order of the vertices
        +
        Throws:
        +
        java.lang.UnsupportedOperationException - if the graph is not a DAG (see Graph.isDAG())
        +
        +
      • +
      + + + +
        +
      • +

        stronglyConnectedComponents

        +
        public java.util.Collection<java.util.Collection<V>> stronglyConnectedComponents()
        +
        Description copied from interface: Graph
        +
        The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
        +
        +
        Specified by:
        +
        stronglyConnectedComponents in interface Graph<V,W extends java.lang.Number>
        +
        Returns:
        +
        a collection containing the strongly connected components
        +
        +
      • +
      + + + + + +
        +
      • +

        subGraph

        +
        public Graph<V,W> subGraph(V source,
        +                           int depth)
        +                    throws java.lang.NullPointerException,
        +                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get a sub-graph of the current one based on the maximum depth that is given.
        + If the depth is 1 then only the source and it's children will be in the sub-graph.
        + If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
        + And so on.
        + Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
        +
        +
        Specified by:
        +
        subGraph in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the source vertex
        +
        depth - the maximum depth (must be a positive number, if >=0 a graph containing only the source is returned)
        +
        Returns:
        +
        a sub-graph of the original
        +
        Throws:
        +
        java.lang.NullPointerException - if the vertex is null
        +
        java.lang.IllegalArgumentException - if the vertex is not contained
        +
        +
      • +
      + + + +
        +
      • +

        subGraph

        +
        public Graph<V,W> subGraph(java.lang.Object... marker)
        +
        Description copied from interface: Graph
        +
        Get a sub-graph of the current one with only the vertex marked with the selected markers.
        + Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
        + If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
        + If the graph doesn't contain any vertex with that marker then an empty graph is returned.
        +
        +
        Specified by:
        +
        subGraph in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        marker - one or more markers
        +
        Returns:
        +
        a sub-graph of the current graph
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        public java.util.List<Edge<V,W>> distance(V source,
        +                                          V destination)
        +                                   throws java.lang.NullPointerException,
        +                                          java.lang.IllegalArgumentException,
        +                                          java.lang.UnsupportedOperationException
        +
        Description copied from interface: Graph
        +
        Get the minimum path from the source vertex to the destination vertex.
        + If the source vertex can't reach the destination, then an exception is thrown.
        +
        +
        Specified by:
        +
        distance in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the vertex where to start
        +
        destination - the destination chosen
        +
        Returns:
        +
        an ordered list of edges from source to destination that represent the minimum path between the two vertices
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        java.lang.UnsupportedOperationException - if from the source it's not possible to reach the destination
        +
        +
      • +
      + + + + + +
        +
      • +

        distance

        +
        public java.util.Map<V,java.util.List<Edge<V,W>>> distance(V source)
        +                                                    throws java.lang.NullPointerException,
        +                                                           java.lang.IllegalArgumentException
        +
        Description copied from interface: Graph
        +
        Get the minimum path from the source vertex to all the possible reachable vertices.
        +
        +
        Specified by:
        +
        distance in interface Graph<V,W extends java.lang.Number>
        +
        Parameters:
        +
        source - the vertex where to start
        +
        Returns:
        +
        a map containing all the possible reachable vertices from the source and the minimum path to reach them
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the parameter is null (except the consumer)
        +
        java.lang.IllegalArgumentException - if the vertex is not in the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/impl/class-use/AdjGraph.html b/doc/berack96/lib/graph/impl/class-use/AdjGraph.html new file mode 100644 index 0000000..fb452be --- /dev/null +++ b/doc/berack96/lib/graph/impl/class-use/AdjGraph.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.impl.AdjGraph + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.impl.AdjGraph

+
+
No usage of berack96.lib.graph.impl.AdjGraph
+ + + + + + diff --git a/doc/berack96/lib/graph/impl/class-use/MapGraph.html b/doc/berack96/lib/graph/impl/class-use/MapGraph.html new file mode 100644 index 0000000..2614aaa --- /dev/null +++ b/doc/berack96/lib/graph/impl/class-use/MapGraph.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.impl.MapGraph + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.impl.MapGraph

+
+
No usage of berack96.lib.graph.impl.MapGraph
+ + + + + + diff --git a/doc/berack96/lib/graph/impl/class-use/MatrixGraph.html b/doc/berack96/lib/graph/impl/class-use/MatrixGraph.html new file mode 100644 index 0000000..4ad658d --- /dev/null +++ b/doc/berack96/lib/graph/impl/class-use/MatrixGraph.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.impl.MatrixGraph + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.impl.MatrixGraph

+
+
No usage of berack96.lib.graph.impl.MatrixGraph
+ + + + + + diff --git a/doc/berack96/lib/graph/impl/package-frame.html b/doc/berack96/lib/graph/impl/package-frame.html new file mode 100644 index 0000000..4d86a6d --- /dev/null +++ b/doc/berack96/lib/graph/impl/package-frame.html @@ -0,0 +1,22 @@ + + + + + +berack96.lib.graph.impl + + + + + +

berack96.lib.graph.impl

+
+

Classes

+ +
+ + diff --git a/doc/berack96/lib/graph/impl/package-summary.html b/doc/berack96/lib/graph/impl/package-summary.html new file mode 100644 index 0000000..af3c99d --- /dev/null +++ b/doc/berack96/lib/graph/impl/package-summary.html @@ -0,0 +1,156 @@ + + + + + +berack96.lib.graph.impl + + + + + + + + + + + +
+

Package berack96.lib.graph.impl

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    AdjGraph<V,W extends java.lang.Number> 
    MapGraph<V,W extends java.lang.Number> +
    Graph that uses HashMap for vertices and edges
    + More specifically it utilizes a Map containing all the vertices mapped to all their edges
    + Technically this version of the graph combine the fast adding/removing of the edges of the Matrix implementation, + with the low memory and fast adding/removing of vertices of the Linked List implementation.
    + This happen if the HashMap is not reallocated.
    +
    MatrixGraph<V,W extends java.lang.Number> 
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/impl/package-tree.html b/doc/berack96/lib/graph/impl/package-tree.html new file mode 100644 index 0000000..88f510a --- /dev/null +++ b/doc/berack96/lib/graph/impl/package-tree.html @@ -0,0 +1,139 @@ + + + + + +berack96.lib.graph.impl Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.impl

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • berack96.lib.graph.impl.AdjGraph<V,W> (implements berack96.lib.graph.Graph<V,W>)
    • +
    • berack96.lib.graph.impl.MapGraph<V,W> (implements berack96.lib.graph.Graph<V,W>)
    • +
    • berack96.lib.graph.impl.MatrixGraph<V,W> (implements berack96.lib.graph.Graph<V,W>)
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/impl/package-use.html b/doc/berack96/lib/graph/impl/package-use.html new file mode 100644 index 0000000..1fa8869 --- /dev/null +++ b/doc/berack96/lib/graph/impl/package-use.html @@ -0,0 +1,124 @@ + + + + + +Uses of Package berack96.lib.graph.impl + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.impl

+
+
No usage of berack96.lib.graph.impl
+ + + + + + diff --git a/doc/berack96/lib/graph/models/EdgeSaveStructure.html b/doc/berack96/lib/graph/models/EdgeSaveStructure.html new file mode 100644 index 0000000..233f5ce --- /dev/null +++ b/doc/berack96/lib/graph/models/EdgeSaveStructure.html @@ -0,0 +1,323 @@ + + + + + +EdgeSaveStructure + + + + + + + + + + + + +
+
berack96.lib.graph.models
+

Class EdgeSaveStructure

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.models.EdgeSaveStructure
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class EdgeSaveStructure
    +extends java.lang.Object
    +
    Support class used for saving a Graph in a file.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      java.lang.Stringdest 
      java.lang.Stringsrc 
      java.lang.Stringweight 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      ModifierConstructor and Description
       EdgeSaveStructure() 
      protected EdgeSaveStructure(java.lang.String s, + java.lang.String d, + java.lang.String w) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        src

        +
        public java.lang.String src
        +
      • +
      + + + +
        +
      • +

        dest

        +
        public java.lang.String dest
        +
      • +
      + + + +
        +
      • +

        weight

        +
        public java.lang.String weight
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        EdgeSaveStructure

        +
        public EdgeSaveStructure()
        +
      • +
      + + + +
        +
      • +

        EdgeSaveStructure

        +
        protected EdgeSaveStructure(java.lang.String s,
        +                            java.lang.String d,
        +                            java.lang.String w)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/models/GraphSaveStructure.html b/doc/berack96/lib/graph/models/GraphSaveStructure.html new file mode 100644 index 0000000..59e7533 --- /dev/null +++ b/doc/berack96/lib/graph/models/GraphSaveStructure.html @@ -0,0 +1,318 @@ + + + + + +GraphSaveStructure + + + + + + + + + + + + +
+
berack96.lib.graph.models
+

Class GraphSaveStructure

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.models.GraphSaveStructure
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class GraphSaveStructure
    +extends java.lang.Object
    +
    Support class used for saving a Graph in a file.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + + + + + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        vertices

        +
        public java.lang.String[] vertices
        +
      • +
      + + + + + + + +
        +
      • +

        other

        +
        public java.lang.String other
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        GraphSaveStructure

        +
        public GraphSaveStructure()
        +
      • +
      + + + +
        +
      • +

        GraphSaveStructure

        +
        public GraphSaveStructure(Graph<?,?> graph,
        +                          java.lang.String other)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/models/MarkSaveStructure.html b/doc/berack96/lib/graph/models/MarkSaveStructure.html new file mode 100644 index 0000000..5990bbe --- /dev/null +++ b/doc/berack96/lib/graph/models/MarkSaveStructure.html @@ -0,0 +1,308 @@ + + + + + +MarkSaveStructure + + + + + + + + + + + + +
+
berack96.lib.graph.models
+

Class MarkSaveStructure

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.models.MarkSaveStructure
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class MarkSaveStructure
    +extends java.lang.Object
    +
    Support class used for saving a Graph in a file.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      java.lang.Objectmark 
      java.lang.Stringvert 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      ModifierConstructor and Description
       MarkSaveStructure() 
      protected MarkSaveStructure(java.lang.String v, + java.lang.Object m) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        vert

        +
        public java.lang.String vert
        +
      • +
      + + + +
        +
      • +

        mark

        +
        public java.lang.Object mark
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        MarkSaveStructure

        +
        public MarkSaveStructure()
        +
      • +
      + + + +
        +
      • +

        MarkSaveStructure

        +
        protected MarkSaveStructure(java.lang.String v,
        +                            java.lang.Object m)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/models/class-use/EdgeSaveStructure.html b/doc/berack96/lib/graph/models/class-use/EdgeSaveStructure.html new file mode 100644 index 0000000..0814c68 --- /dev/null +++ b/doc/berack96/lib/graph/models/class-use/EdgeSaveStructure.html @@ -0,0 +1,164 @@ + + + + + +Uses of Class berack96.lib.graph.models.EdgeSaveStructure + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.models.EdgeSaveStructure

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/models/class-use/GraphSaveStructure.html b/doc/berack96/lib/graph/models/class-use/GraphSaveStructure.html new file mode 100644 index 0000000..8c48938 --- /dev/null +++ b/doc/berack96/lib/graph/models/class-use/GraphSaveStructure.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.models.GraphSaveStructure + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.models.GraphSaveStructure

+
+
No usage of berack96.lib.graph.models.GraphSaveStructure
+ + + + + + diff --git a/doc/berack96/lib/graph/models/class-use/MarkSaveStructure.html b/doc/berack96/lib/graph/models/class-use/MarkSaveStructure.html new file mode 100644 index 0000000..71b92e0 --- /dev/null +++ b/doc/berack96/lib/graph/models/class-use/MarkSaveStructure.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.models.MarkSaveStructure + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.models.MarkSaveStructure

+
+
No usage of berack96.lib.graph.models.MarkSaveStructure
+ + + + + + diff --git a/doc/berack96/lib/graph/models/package-frame.html b/doc/berack96/lib/graph/models/package-frame.html new file mode 100644 index 0000000..57a2c47 --- /dev/null +++ b/doc/berack96/lib/graph/models/package-frame.html @@ -0,0 +1,22 @@ + + + + + +berack96.lib.graph.models + + + + + +

berack96.lib.graph.models

+ + + diff --git a/doc/berack96/lib/graph/models/package-summary.html b/doc/berack96/lib/graph/models/package-summary.html new file mode 100644 index 0000000..6a02bd0 --- /dev/null +++ b/doc/berack96/lib/graph/models/package-summary.html @@ -0,0 +1,156 @@ + + + + + +berack96.lib.graph.models + + + + + + + + + + + +
+

Package berack96.lib.graph.models

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    EdgeSaveStructure +
    Support class used for saving a Graph in a file.
    +
    GraphSaveStructure +
    Support class used for saving a Graph in a file.
    +
    MarkSaveStructure +
    Support class used for saving a Graph in a file.
    +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/models/package-tree.html b/doc/berack96/lib/graph/models/package-tree.html new file mode 100644 index 0000000..fa70226 --- /dev/null +++ b/doc/berack96/lib/graph/models/package-tree.html @@ -0,0 +1,139 @@ + + + + + +berack96.lib.graph.models Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.models

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/models/package-use.html b/doc/berack96/lib/graph/models/package-use.html new file mode 100644 index 0000000..a99edaf --- /dev/null +++ b/doc/berack96/lib/graph/models/package-use.html @@ -0,0 +1,159 @@ + + + + + +Uses of Package berack96.lib.graph.models + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.models

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/package-frame.html b/doc/berack96/lib/graph/package-frame.html new file mode 100644 index 0000000..5a10f31 --- /dev/null +++ b/doc/berack96/lib/graph/package-frame.html @@ -0,0 +1,25 @@ + + + + + +berack96.lib.graph + + + + + +

berack96.lib.graph

+
+

Interfaces

+ +

Classes

+ +
+ + diff --git a/doc/berack96/lib/graph/package-summary.html b/doc/berack96/lib/graph/package-summary.html new file mode 100644 index 0000000..f6aa311 --- /dev/null +++ b/doc/berack96/lib/graph/package-summary.html @@ -0,0 +1,171 @@ + + + + + +berack96.lib.graph + + + + + + + + + + + +
+

Package berack96.lib.graph

+
+
+
    +
  • + + + + + + + + + + + + +
    Interface Summary 
    InterfaceDescription
    Graph<V,W extends java.lang.Number> +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    +
  • +
  • + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    Edge<V,W extends java.lang.Number> +
    Class used for retrieving the edges of the graph.
    +
    Vertex<V> +
    Class used for represent a vertex of the graph.
    + The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
    +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/package-tree.html b/doc/berack96/lib/graph/package-tree.html new file mode 100644 index 0000000..d84fbe0 --- /dev/null +++ b/doc/berack96/lib/graph/package-tree.html @@ -0,0 +1,146 @@ + + + + + +berack96.lib.graph Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • berack96.lib.graph.Edge<V,W>
    • +
    • berack96.lib.graph.Vertex<V>
    • +
    +
  • +
+

Interface Hierarchy

+
    +
  • java.lang.Iterable<T> +
      +
    • berack96.lib.graph.Graph<V,W>
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/package-use.html b/doc/berack96/lib/graph/package-use.html new file mode 100644 index 0000000..23f267a --- /dev/null +++ b/doc/berack96/lib/graph/package-use.html @@ -0,0 +1,373 @@ + + + + + +Uses of Package berack96.lib.graph + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Packages that use berack96.lib.graph 
    PackageDescription
    berack96.lib.graph 
    berack96.lib.graph.impl 
    berack96.lib.graph.models 
    berack96.lib.graph.view 
    berack96.lib.graph.view.edge 
    berack96.lib.graph.view.vertex 
    berack96.lib.graph.visit 
    berack96.lib.graph.visit.impl 
    +
  • +
  • + + + + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph 
    Class and Description
    Edge +
    Class used for retrieving the edges of the graph.
    +
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    Vertex +
    Class used for represent a vertex of the graph.
    + The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
    +
    +
  • +
  • + + + + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.impl 
    Class and Description
    Edge +
    Class used for retrieving the edges of the graph.
    +
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    Vertex +
    Class used for represent a vertex of the graph.
    + The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
    +
    +
  • +
  • + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.models 
    Class and Description
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    +
  • +
  • + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.view 
    Class and Description
    Edge +
    Class used for retrieving the edges of the graph.
    +
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    +
  • +
  • + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.view.edge 
    Class and Description
    Edge +
    Class used for retrieving the edges of the graph.
    +
    Vertex +
    Class used for represent a vertex of the graph.
    + The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
    +
    +
  • +
  • + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.view.vertex 
    Class and Description
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    Vertex +
    Class used for represent a vertex of the graph.
    + The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
    +
    +
  • +
  • + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.visit 
    Class and Description
    Edge +
    Class used for retrieving the edges of the graph.
    +
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    +
  • +
  • + + + + + + + + + + + + + + + +
    Classes in berack96.lib.graph used by berack96.lib.graph.visit.impl 
    Class and Description
    Edge +
    Class used for retrieving the edges of the graph.
    +
    Graph +
    An interface for the graphs.
    + This interface is used for the graphs with Directed edges.
    + A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
    +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/GraphInfo.html b/doc/berack96/lib/graph/view/GraphInfo.html new file mode 100644 index 0000000..f09fbef --- /dev/null +++ b/doc/berack96/lib/graph/view/GraphInfo.html @@ -0,0 +1,364 @@ + + + + + +GraphInfo + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Class GraphInfo<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • java.awt.Container
      • +
      • +
          +
        • javax.swing.JComponent
        • +
        • +
            +
          • javax.swing.JPanel
          • +
          • +
              +
            • berack96.lib.graph.view.GraphInfo<V,W>
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible
    +
    +
    +
    +
    public class GraphInfo<V,W extends java.lang.Number>
    +extends javax.swing.JPanel
    +
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JPanel

        +javax.swing.JPanel.AccessibleJPanel
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JComponent

        +javax.swing.JComponent.AccessibleJComponent
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Container

        +java.awt.Container.AccessibleAWTContainer
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    + +
      +
    • + + +

      Field Summary

      +
        +
      • + + +

        Fields inherited from class javax.swing.JComponent

        +listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
    • +
    + + + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class javax.swing.JPanel

        +getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
      • +
      +
        +
      • + + +

        Methods inherited from class javax.swing.JComponent

        +addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Container

        +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+ +
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/GraphListener.html b/doc/berack96/lib/graph/view/GraphListener.html new file mode 100644 index 0000000..948fc61 --- /dev/null +++ b/doc/berack96/lib/graph/view/GraphListener.html @@ -0,0 +1,281 @@ + + + + + +GraphListener + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Interface GraphListener

+
+
+
+
    +
  • +
    +
    All Superinterfaces:
    +
    java.util.EventListener, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener
    +
    +
    +
    All Known Implementing Classes:
    +
    EdgeIntListener, EdgeListener, VertexIntListener, VertexListener, VisitListener
    +
    +
    +
    +
    public interface GraphListener
    +extends java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.awt.event.KeyListener
    +
    An interface for creating a listener of the Graph.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.lang.StringgetDescription() +
      Get the description of this listener, in a way to interact with the user.
      +
      voidremove() +
      Remove the listener to the graph.
      +
      +
        +
      • + + +

        Methods inherited from interface java.awt.event.MouseListener

        +mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.event.MouseMotionListener

        +mouseDragged, mouseMoved
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.event.KeyListener

        +keyPressed, keyReleased, keyTyped
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        remove

        +
        void remove()
        +
        Remove the listener to the graph. + This function is called when the listener is removed to the graph. + Here you could remove any other thing that you have done.
        +
      • +
      + + + +
        +
      • +

        getDescription

        +
        java.lang.String getDescription()
        +
        Get the description of this listener, in a way to interact with the user.
        +
        +
        Returns:
        +
        a string describing the functionalities of this listener
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/GraphPanel.html b/doc/berack96/lib/graph/view/GraphPanel.html new file mode 100644 index 0000000..3e443e9 --- /dev/null +++ b/doc/berack96/lib/graph/view/GraphPanel.html @@ -0,0 +1,586 @@ + + + + + +GraphPanel + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Class GraphPanel<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • berack96.lib.graph.view.GraphPanel<V,W>
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable
    +
    +
    +
    +
    public class GraphPanel<V,W extends java.lang.Number>
    +extends java.awt.Component
    +
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    + +
      +
    • + + +

      Field Summary

      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
    • +
    + + + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      voidaddEdge(Edge<V,W> edge) 
      voidaddEdge(VertexComponent<V> source, + VertexComponent<V> dest, + W weight) 
      voidaddObserver(java.util.Observer observer) 
      voidaddVertex(java.awt.Point center, + V vertex) 
      EdgeComponent<V,W>getEdgeAt(java.awt.Point point) 
      Graph<V,W>getGraph() 
      VertexComponent<V>getVertexAt(java.awt.Point point) 
      voidload(java.lang.String fileName) 
      voidmodEdge(VertexComponent<V> source, + VertexComponent<V> dest, + W weight) 
      voidmoveVertex(VertexComponent<V> vertex, + java.awt.Point destination) 
      voidpaint(java.awt.Graphics g) 
      voidremoveEdge(VertexComponent<V> source, + VertexComponent<V> dest) 
      voidremoveObserver(java.util.Observer observer) 
      voidremoveVertex(java.awt.Point center) 
      voidsave(java.lang.String fileName) 
      voidsetBounds(int x, + int y, + int width, + int height) 
      voidsetGraphListener(GraphListener listener) 
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, addNotify, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, deliverEvent, disable, disableEvents, dispatchEvent, doLayout, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, getAlignmentX, getAlignmentY, getBackground, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentAt, getComponentAt, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeys, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getListeners, getLocale, getLocation, getLocation, getLocationOnScreen, getMaximumSize, getMinimumSize, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPreferredSize, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, invalidate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusCycleRoot, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, layout, list, list, list, list, list, locate, location, lostFocus, minimumSize, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, paramString, postEvent, preferredSize, prepareImage, prepareImage, print, printAll, processComponentEvent, processEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removeNotify, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, resize, resize, revalidate, setBackground, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeys, setFocusTraversalKeysEnabled, setFont, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setMinimumSize, setName, setPreferredSize, setSize, setSize, setVisible, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle, update, validate
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getGraph

        +
        public Graph<V,W> getGraph()
        +
      • +
      + + + +
        +
      • +

        setGraphListener

        +
        public void setGraphListener(GraphListener listener)
        +
      • +
      + + + + + +
        +
      • +

        addVertex

        +
        public void addVertex(java.awt.Point center,
        +                      V vertex)
        +
      • +
      + + + +
        +
      • +

        removeVertex

        +
        public void removeVertex(java.awt.Point center)
        +
      • +
      + + + +
        +
      • +

        moveVertex

        +
        public void moveVertex(VertexComponent<V> vertex,
        +                       java.awt.Point destination)
        +
      • +
      + + + +
        +
      • +

        addEdge

        +
        public void addEdge(Edge<V,W> edge)
        +
      • +
      + + + + + + + + + + + + + + + + + + + +
        +
      • +

        getVertexAt

        +
        public VertexComponent<V> getVertexAt(java.awt.Point point)
        +
      • +
      + + + +
        +
      • +

        getEdgeAt

        +
        public EdgeComponent<V,W> getEdgeAt(java.awt.Point point)
        +
      • +
      + + + +
        +
      • +

        addObserver

        +
        public void addObserver(java.util.Observer observer)
        +
      • +
      + + + +
        +
      • +

        removeObserver

        +
        public void removeObserver(java.util.Observer observer)
        +
      • +
      + + + +
        +
      • +

        save

        +
        public void save(java.lang.String fileName)
        +          throws java.io.IOException
        +
        +
        Throws:
        +
        java.io.IOException
        +
        +
      • +
      + + + +
        +
      • +

        load

        +
        public void load(java.lang.String fileName)
        +          throws java.io.IOException
        +
        +
        Throws:
        +
        java.io.IOException
        +
        +
      • +
      + + + +
        +
      • +

        setBounds

        +
        public void setBounds(int x,
        +                      int y,
        +                      int width,
        +                      int height)
        +
        +
        Overrides:
        +
        setBounds in class java.awt.Component
        +
        +
      • +
      + + + +
        +
      • +

        paint

        +
        public void paint(java.awt.Graphics g)
        +
        +
        Overrides:
        +
        paint in class java.awt.Component
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/GraphWindow.html b/doc/berack96/lib/graph/view/GraphWindow.html new file mode 100644 index 0000000..a56cf6e --- /dev/null +++ b/doc/berack96/lib/graph/view/GraphWindow.html @@ -0,0 +1,452 @@ + + + + + +GraphWindow + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Class GraphWindow<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • java.awt.Container
      • +
      • +
          +
        • java.awt.Window
        • +
        • +
            +
          • java.awt.Frame
          • +
          • +
              +
            • javax.swing.JFrame
            • +
            • +
                +
              • berack96.lib.graph.view.GraphWindow<V,W>
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants
    +
    +
    +
    +
    public class GraphWindow<V,W extends java.lang.Number>
    +extends javax.swing.JFrame
    +
    This class is the Window that appear for building the graph and playing around with it
    +
    +
    Author:
    +
    Berack96
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class javax.swing.JFrame

        +javax.swing.JFrame.AccessibleJFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Frame

        +java.awt.Frame.AccessibleAWTFrame
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Window

        +java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Container

        +java.awt.Container.AccessibleAWTContainer
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    + +
      +
    • + + +

      Field Summary

      +
        +
      • + + +

        Fields inherited from class javax.swing.JFrame

        +accessibleContext, EXIT_ON_CLOSE, rootPane, rootPaneCheckingEnabled
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Frame

        +CROSSHAIR_CURSOR, DEFAULT_CURSOR, E_RESIZE_CURSOR, HAND_CURSOR, ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT, MOVE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR, NORMAL, NW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR, SW_RESIZE_CURSOR, TEXT_CURSOR, W_RESIZE_CURSOR, WAIT_CURSOR
      • +
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface javax.swing.WindowConstants

        +DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
    • +
    + + + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      GraphPanel<V,W>getGraphPanel() 
      voidvisitRefresh(int millisec) 
      +
        +
      • + + +

        Methods inherited from class javax.swing.JFrame

        +addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Frame

        +addNotify, getCursorType, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setBackground, setCursor, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Window

        +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, hide, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, show, toBack, toFront
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Container

        +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
      • +
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface java.awt.MenuContainer

        +getFont, postEvent
      • +
      +
    • +
    +
  • +
+
+
+ +
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/GraphicalView.html b/doc/berack96/lib/graph/view/GraphicalView.html new file mode 100644 index 0000000..dd33e16 --- /dev/null +++ b/doc/berack96/lib/graph/view/GraphicalView.html @@ -0,0 +1,276 @@ + + + + + +GraphicalView + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Interface GraphicalView<O>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    O - the object to paint
    +
    +
    +
    All Known Implementing Classes:
    +
    EdgeView, VertexView
    +
    +
    +
    +
    public interface GraphicalView<O>
    +
    An interface for divide the "hitbox" and the "paint" of the various items
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.awt.RectanglegetBox(O obj, + java.awt.Point center) +
      Box where the object is sensible at listeners (like Hitbox)
      +
      voidpaint(java.awt.Graphics2D g2, + O obj, + java.awt.Point center) +
      The paint function, aka the part where you can draw things (like Mesh)
      +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + + + +
        +
      • +

        getBox

        +
        java.awt.Rectangle getBox(O obj,
        +                          java.awt.Point center)
        +
        Box where the object is sensible at listeners (like Hitbox)
        +
        +
        Parameters:
        +
        obj - the object to draw
        +
        center - the center point of the object
        +
        Returns:
        +
        a rectangle where the object is sensible to the listeners
        +
        +
      • +
      + + + + + +
        +
      • +

        paint

        +
        void paint(java.awt.Graphics2D g2,
        +           O obj,
        +           java.awt.Point center)
        +
        The paint function, aka the part where you can draw things (like Mesh)
        +
        +
        Parameters:
        +
        g2 - the graphics object used for painting
        +
        obj - the object to paint
        +
        center - the center point of the object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/Main.html b/doc/berack96/lib/graph/view/Main.html new file mode 100644 index 0000000..3d512e6 --- /dev/null +++ b/doc/berack96/lib/graph/view/Main.html @@ -0,0 +1,271 @@ + + + + + +Main + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Class Main

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.view.Main
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Main
    +extends java.lang.Object
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Main() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static voidmain(java.lang.String[] args) 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Main

        +
        public Main()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        main

        +
        public static void main(java.lang.String[] args)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/VisitListener.html b/doc/berack96/lib/graph/view/VisitListener.html new file mode 100644 index 0000000..6fa9a11 --- /dev/null +++ b/doc/berack96/lib/graph/view/VisitListener.html @@ -0,0 +1,494 @@ + + + + + +VisitListener + + + + + + + + + + + + +
+
berack96.lib.graph.view
+

Class VisitListener<V>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.view.VisitListener<V>
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    GraphListener, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.util.EventListener
    +
    +
    +
    +
    public class VisitListener<V>
    +extends java.lang.Object
    +implements GraphListener
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static voidchangeRefresh(int millisec) 
      java.lang.StringgetDescription() +
      Get the description of this listener, in a way to interact with the user.
      +
      voidkeyPressed(java.awt.event.KeyEvent e) 
      voidkeyReleased(java.awt.event.KeyEvent e) 
      voidkeyTyped(java.awt.event.KeyEvent e) 
      voidmouseClicked(java.awt.event.MouseEvent e) 
      voidmouseDragged(java.awt.event.MouseEvent e) 
      voidmouseEntered(java.awt.event.MouseEvent e) 
      voidmouseExited(java.awt.event.MouseEvent e) 
      voidmouseMoved(java.awt.event.MouseEvent e) 
      voidmousePressed(java.awt.event.MouseEvent e) 
      voidmouseReleased(java.awt.event.MouseEvent e) 
      voidremove() +
      Remove the listener to the graph.
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        changeRefresh

        +
        public static void changeRefresh(int millisec)
        +
      • +
      + + + +
        +
      • +

        remove

        +
        public void remove()
        +
        Description copied from interface: GraphListener
        +
        Remove the listener to the graph. + This function is called when the listener is removed to the graph. + Here you could remove any other thing that you have done.
        +
        +
        Specified by:
        +
        remove in interface GraphListener
        +
        +
      • +
      + + + +
        +
      • +

        getDescription

        +
        public java.lang.String getDescription()
        +
        Description copied from interface: GraphListener
        +
        Get the description of this listener, in a way to interact with the user.
        +
        +
        Specified by:
        +
        getDescription in interface GraphListener
        +
        Returns:
        +
        a string describing the functionalities of this listener
        +
        +
      • +
      + + + +
        +
      • +

        mousePressed

        +
        public void mousePressed(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mousePressed in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseClicked

        +
        public void mouseClicked(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseClicked in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseReleased

        +
        public void mouseReleased(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseReleased in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseEntered

        +
        public void mouseEntered(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseEntered in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseExited

        +
        public void mouseExited(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseExited in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseDragged

        +
        public void mouseDragged(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseDragged in interface java.awt.event.MouseMotionListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseMoved

        +
        public void mouseMoved(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseMoved in interface java.awt.event.MouseMotionListener
        +
        +
      • +
      + + + +
        +
      • +

        keyPressed

        +
        public void keyPressed(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyPressed in interface java.awt.event.KeyListener
        +
        +
      • +
      + + + +
        +
      • +

        keyReleased

        +
        public void keyReleased(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyReleased in interface java.awt.event.KeyListener
        +
        +
      • +
      + + + +
        +
      • +

        keyTyped

        +
        public void keyTyped(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyTyped in interface java.awt.event.KeyListener
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/GraphInfo.html b/doc/berack96/lib/graph/view/class-use/GraphInfo.html new file mode 100644 index 0000000..0447b6d --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/GraphInfo.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.GraphInfo + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.GraphInfo

+
+
No usage of berack96.lib.graph.view.GraphInfo
+ + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/GraphListener.html b/doc/berack96/lib/graph/view/class-use/GraphListener.html new file mode 100644 index 0000000..1a1eb4b --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/GraphListener.html @@ -0,0 +1,229 @@ + + + + + +Uses of Interface berack96.lib.graph.view.GraphListener + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.view.GraphListener

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/GraphPanel.html b/doc/berack96/lib/graph/view/class-use/GraphPanel.html new file mode 100644 index 0000000..a2c05ea --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/GraphPanel.html @@ -0,0 +1,246 @@ + + + + + +Uses of Class berack96.lib.graph.view.GraphPanel + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.GraphPanel

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/GraphWindow.html b/doc/berack96/lib/graph/view/class-use/GraphWindow.html new file mode 100644 index 0000000..eae9e4d --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/GraphWindow.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.GraphWindow + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.GraphWindow

+
+
No usage of berack96.lib.graph.view.GraphWindow
+ + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/GraphicalView.html b/doc/berack96/lib/graph/view/class-use/GraphicalView.html new file mode 100644 index 0000000..f5c97e5 --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/GraphicalView.html @@ -0,0 +1,215 @@ + + + + + +Uses of Interface berack96.lib.graph.view.GraphicalView + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.view.GraphicalView

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/Main.html b/doc/berack96/lib/graph/view/class-use/Main.html new file mode 100644 index 0000000..09aa29b --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/Main.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.Main + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.Main

+
+
No usage of berack96.lib.graph.view.Main
+ + + + + + diff --git a/doc/berack96/lib/graph/view/class-use/VisitListener.html b/doc/berack96/lib/graph/view/class-use/VisitListener.html new file mode 100644 index 0000000..ba37265 --- /dev/null +++ b/doc/berack96/lib/graph/view/class-use/VisitListener.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.VisitListener + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.VisitListener

+
+
No usage of berack96.lib.graph.view.VisitListener
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/EdgeComponent.html b/doc/berack96/lib/graph/view/edge/EdgeComponent.html new file mode 100644 index 0000000..67211ed --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/EdgeComponent.html @@ -0,0 +1,367 @@ + + + + + +EdgeComponent + + + + + + + + + + + + +
+
berack96.lib.graph.view.edge
+

Class EdgeComponent<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • berack96.lib.graph.view.edge.EdgeComponent<V,W>
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable
    +
    +
    +
    +
    public class EdgeComponent<V,W extends java.lang.Number>
    +extends java.awt.Component
    +
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      VertexComponent<V>destination 
      Edge<V,W>edge 
      VertexComponent<V>source 
      Wweight 
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
    • +
    + + + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, addNotify, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, deliverEvent, disable, disableEvents, dispatchEvent, doLayout, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, getAlignmentX, getAlignmentY, getBackground, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentAt, getComponentAt, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeys, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getListeners, getLocale, getLocation, getLocation, getLocationOnScreen, getMaximumSize, getMinimumSize, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPreferredSize, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, invalidate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusCycleRoot, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, layout, list, list, list, list, list, locate, location, lostFocus, minimumSize, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paint, paintAll, paramString, postEvent, preferredSize, prepareImage, prepareImage, print, printAll, processComponentEvent, processEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removeNotify, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, resize, resize, revalidate, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeys, setFocusTraversalKeysEnabled, setFont, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setMinimumSize, setName, setPreferredSize, setSize, setSize, setVisible, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle, update, validate
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+ +
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/edge/EdgeIntListener.html b/doc/berack96/lib/graph/view/edge/EdgeIntListener.html new file mode 100644 index 0000000..3c18d56 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/EdgeIntListener.html @@ -0,0 +1,329 @@ + + + + + +EdgeIntListener + + + + + + + + + + + + +
+
berack96.lib.graph.view.edge
+

Class EdgeIntListener<V>

+
+
+ +
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    GraphListener, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.util.EventListener
    +
    +
    +
    +
    public class EdgeIntListener<V>
    +extends EdgeListener<V,java.lang.Integer>
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        EdgeIntListener

        +
        public EdgeIntListener(GraphPanel<V,java.lang.Integer> graphPanel)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        remove

        +
        public void remove()
        +
        Description copied from interface: GraphListener
        +
        Remove the listener to the graph. + This function is called when the listener is removed to the graph. + Here you could remove any other thing that you have done.
        +
      • +
      + + + + + + + +
        +
      • +

        buildEdgeFrom

        +
        protected java.lang.Integer buildEdgeFrom(java.lang.String string)
        +
        +
        Specified by:
        +
        buildEdgeFrom in class EdgeListener<V,java.lang.Integer>
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/edge/EdgeListener.html b/doc/berack96/lib/graph/view/edge/EdgeListener.html new file mode 100644 index 0000000..aa3dd7d --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/EdgeListener.html @@ -0,0 +1,495 @@ + + + + + +EdgeListener + + + + + + + + + + + + +
+
berack96.lib.graph.view.edge
+

Class EdgeListener<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.view.edge.EdgeListener<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    GraphListener, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.util.EventListener
    +
    +
    +
    Direct Known Subclasses:
    +
    EdgeIntListener
    +
    +
    +
    +
    public abstract class EdgeListener<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements GraphListener
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        EdgeListener

        +
        public EdgeListener(GraphPanel<V,W> graphPanel)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        buildNewEdge

        +
        protected abstract W buildNewEdge(Vertex<V> vertex,
        +                                  Vertex<V> vertex1)
        +
      • +
      + + + +
        +
      • +

        buildEdgeFrom

        +
        protected abstract W buildEdgeFrom(java.lang.String string)
        +
      • +
      + + + +
        +
      • +

        getDescription

        +
        public java.lang.String getDescription()
        +
        Description copied from interface: GraphListener
        +
        Get the description of this listener, in a way to interact with the user.
        +
        +
        Specified by:
        +
        getDescription in interface GraphListener
        +
        Returns:
        +
        a string describing the functionalities of this listener
        +
        +
      • +
      + + + +
        +
      • +

        mousePressed

        +
        public void mousePressed(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mousePressed in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseReleased

        +
        public void mouseReleased(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseReleased in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        keyPressed

        +
        public void keyPressed(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyPressed in interface java.awt.event.KeyListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseDragged

        +
        public void mouseDragged(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseDragged in interface java.awt.event.MouseMotionListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseClicked

        +
        public void mouseClicked(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseClicked in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseEntered

        +
        public void mouseEntered(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseEntered in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseExited

        +
        public void mouseExited(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseExited in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseMoved

        +
        public void mouseMoved(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseMoved in interface java.awt.event.MouseMotionListener
        +
        +
      • +
      + + + +
        +
      • +

        keyReleased

        +
        public void keyReleased(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyReleased in interface java.awt.event.KeyListener
        +
        +
      • +
      + + + +
        +
      • +

        keyTyped

        +
        public void keyTyped(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyTyped in interface java.awt.event.KeyListener
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/edge/EdgeView.html b/doc/berack96/lib/graph/view/edge/EdgeView.html new file mode 100644 index 0000000..301bc75 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/EdgeView.html @@ -0,0 +1,320 @@ + + + + + +EdgeView + + + + + + + + + + + + +
+
berack96.lib.graph.view.edge
+

Class EdgeView<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.view.edge.EdgeView<V,W>
    • +
    +
  • +
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      EdgeView() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.awt.RectanglegetBox(EdgeComponent<V,W> edge, + java.awt.Point center) +
      Box where the object is sensible at listeners (like Hitbox)
      +
      voidpaint(java.awt.Graphics2D g2, + EdgeComponent<V,W> edge, + java.awt.Point center) +
      The paint function, aka the part where you can draw things (like Mesh)
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        EdgeView

        +
        public EdgeView()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getBox

        +
        public java.awt.Rectangle getBox(EdgeComponent<V,W> edge,
        +                                 java.awt.Point center)
        +
        Description copied from interface: GraphicalView
        +
        Box where the object is sensible at listeners (like Hitbox)
        +
        +
        Specified by:
        +
        getBox in interface GraphicalView<EdgeComponent<V,W extends java.lang.Number>>
        +
        Parameters:
        +
        edge - the object to draw
        +
        center - the center point of the object
        +
        Returns:
        +
        a rectangle where the object is sensible to the listeners
        +
        +
      • +
      + + + +
        +
      • +

        paint

        +
        public void paint(java.awt.Graphics2D g2,
        +                  EdgeComponent<V,W> edge,
        +                  java.awt.Point center)
        +
        Description copied from interface: GraphicalView
        +
        The paint function, aka the part where you can draw things (like Mesh)
        +
        +
        Specified by:
        +
        paint in interface GraphicalView<EdgeComponent<V,W extends java.lang.Number>>
        +
        Parameters:
        +
        g2 - the graphics object used for painting
        +
        edge - the object to paint
        +
        center - the center point of the object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/edge/class-use/EdgeComponent.html b/doc/berack96/lib/graph/view/edge/class-use/EdgeComponent.html new file mode 100644 index 0000000..afdc4af --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/class-use/EdgeComponent.html @@ -0,0 +1,207 @@ + + + + + +Uses of Class berack96.lib.graph.view.edge.EdgeComponent + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.edge.EdgeComponent

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/class-use/EdgeIntListener.html b/doc/berack96/lib/graph/view/edge/class-use/EdgeIntListener.html new file mode 100644 index 0000000..4e2cb42 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/class-use/EdgeIntListener.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.edge.EdgeIntListener + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.edge.EdgeIntListener

+
+
No usage of berack96.lib.graph.view.edge.EdgeIntListener
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/class-use/EdgeListener.html b/doc/berack96/lib/graph/view/edge/class-use/EdgeListener.html new file mode 100644 index 0000000..7886be9 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/class-use/EdgeListener.html @@ -0,0 +1,192 @@ + + + + + +Uses of Class berack96.lib.graph.view.edge.EdgeListener + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.edge.EdgeListener

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/class-use/EdgeView.html b/doc/berack96/lib/graph/view/edge/class-use/EdgeView.html new file mode 100644 index 0000000..5d2e9ed --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/class-use/EdgeView.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.edge.EdgeView + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.edge.EdgeView

+
+
No usage of berack96.lib.graph.view.edge.EdgeView
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/package-frame.html b/doc/berack96/lib/graph/view/edge/package-frame.html new file mode 100644 index 0000000..232b848 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/package-frame.html @@ -0,0 +1,23 @@ + + + + + +berack96.lib.graph.view.edge + + + + + +

berack96.lib.graph.view.edge

+ + + diff --git a/doc/berack96/lib/graph/view/edge/package-summary.html b/doc/berack96/lib/graph/view/edge/package-summary.html new file mode 100644 index 0000000..45379f6 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/package-summary.html @@ -0,0 +1,154 @@ + + + + + +berack96.lib.graph.view.edge + + + + + + + + + + + +
+

Package berack96.lib.graph.view.edge

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/package-tree.html b/doc/berack96/lib/graph/view/edge/package-tree.html new file mode 100644 index 0000000..8573343 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/package-tree.html @@ -0,0 +1,147 @@ + + + + + +berack96.lib.graph.view.edge Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.view.edge

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable) + +
    • +
    • berack96.lib.graph.view.edge.EdgeListener<V,W> (implements berack96.lib.graph.view.GraphListener) + +
    • +
    • berack96.lib.graph.view.edge.EdgeView<V,W> (implements berack96.lib.graph.view.GraphicalView<O>)
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/edge/package-use.html b/doc/berack96/lib/graph/view/edge/package-use.html new file mode 100644 index 0000000..8d41ae5 --- /dev/null +++ b/doc/berack96/lib/graph/view/edge/package-use.html @@ -0,0 +1,182 @@ + + + + + +Uses of Package berack96.lib.graph.view.edge + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.view.edge

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/package-frame.html b/doc/berack96/lib/graph/view/package-frame.html new file mode 100644 index 0000000..1b21f02 --- /dev/null +++ b/doc/berack96/lib/graph/view/package-frame.html @@ -0,0 +1,29 @@ + + + + + +berack96.lib.graph.view + + + + + +

berack96.lib.graph.view

+ + + diff --git a/doc/berack96/lib/graph/view/package-summary.html b/doc/berack96/lib/graph/view/package-summary.html new file mode 100644 index 0000000..e3c63bf --- /dev/null +++ b/doc/berack96/lib/graph/view/package-summary.html @@ -0,0 +1,183 @@ + + + + + +berack96.lib.graph.view + + + + + + + + + + + +
+

Package berack96.lib.graph.view

+
+
+
    +
  • + + + + + + + + + + + + + + + + +
    Interface Summary 
    InterfaceDescription
    GraphicalView<O> +
    An interface for divide the "hitbox" and the "paint" of the various items
    +
    GraphListener +
    An interface for creating a listener of the Graph.
    +
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    GraphInfo<V,W extends java.lang.Number> 
    GraphPanel<V,W extends java.lang.Number> 
    GraphWindow<V,W extends java.lang.Number> +
    This class is the Window that appear for building the graph and playing around with it
    +
    Main 
    VisitListener<V> 
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/package-tree.html b/doc/berack96/lib/graph/view/package-tree.html new file mode 100644 index 0000000..34aa805 --- /dev/null +++ b/doc/berack96/lib/graph/view/package-tree.html @@ -0,0 +1,192 @@ + + + + + +berack96.lib.graph.view Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.view

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable) +
        +
      • java.awt.Container +
          +
        • javax.swing.JComponent (implements java.io.Serializable) +
            +
          • javax.swing.JPanel (implements javax.accessibility.Accessible) + +
          • +
          +
        • +
        • java.awt.Window (implements javax.accessibility.Accessible) +
            +
          • java.awt.Frame (implements java.awt.MenuContainer) +
              +
            • javax.swing.JFrame (implements javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants) + +
            • +
            +
          • +
          +
        • +
        +
      • +
      • berack96.lib.graph.view.GraphPanel<V,W>
      • +
      +
    • +
    • berack96.lib.graph.view.Main
    • +
    • berack96.lib.graph.view.VisitListener<V> (implements berack96.lib.graph.view.GraphListener)
    • +
    +
  • +
+

Interface Hierarchy

+
    +
  • java.util.EventListener +
      +
    • java.awt.event.KeyListener +
        +
      • berack96.lib.graph.view.GraphListener (also extends java.awt.event.MouseListener, java.awt.event.MouseMotionListener)
      • +
      +
    • +
    • java.awt.event.MouseListener +
        +
      • berack96.lib.graph.view.GraphListener (also extends java.awt.event.KeyListener, java.awt.event.MouseMotionListener)
      • +
      +
    • +
    • java.awt.event.MouseMotionListener +
        +
      • berack96.lib.graph.view.GraphListener (also extends java.awt.event.KeyListener, java.awt.event.MouseListener)
      • +
      +
    • +
    +
  • +
  • berack96.lib.graph.view.GraphicalView<O>
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/package-use.html b/doc/berack96/lib/graph/view/package-use.html new file mode 100644 index 0000000..4b342f7 --- /dev/null +++ b/doc/berack96/lib/graph/view/package-use.html @@ -0,0 +1,225 @@ + + + + + +Uses of Package berack96.lib.graph.view + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.view

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/stuff/Arrow.html b/doc/berack96/lib/graph/view/stuff/Arrow.html new file mode 100644 index 0000000..3a2d1ac --- /dev/null +++ b/doc/berack96/lib/graph/view/stuff/Arrow.html @@ -0,0 +1,291 @@ + + + + + +Arrow + + + + + + + + + + + + +
+
berack96.lib.graph.view.stuff
+

Class Arrow

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Polygon
    • +
    • +
        +
      • berack96.lib.graph.view.stuff.Arrow
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.Shape, java.io.Serializable
    +
    +
    +
    +
    public class Arrow
    +extends java.awt.Polygon
    +
    Class that create a Polygon that has a shape of an arrow
    +
    +
    Author:
    +
    Berack96
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      +
        +
      • + + +

        Fields inherited from class java.awt.Polygon

        +bounds, npoints, xpoints, ypoints
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Arrow(java.awt.Point start, + java.awt.Point end, + int size, + int headSize) +
      Create an arrow
      +
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.awt.Polygon

        +addPoint, contains, contains, contains, contains, contains, contains, getBoundingBox, getBounds, getBounds2D, getPathIterator, getPathIterator, inside, intersects, intersects, invalidate, reset, translate
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Arrow

        +
        public Arrow(java.awt.Point start,
        +             java.awt.Point end,
        +             int size,
        +             int headSize)
        +
        Create an arrow
        +
        +
        Parameters:
        +
        start - the starting point of your arrow (the base)
        +
        end - the ending point of your arrow (the head)
        +
        size - the size of the arrow base
        +
        headSize - the size of the arrow's head
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/stuff/class-use/Arrow.html b/doc/berack96/lib/graph/view/stuff/class-use/Arrow.html new file mode 100644 index 0000000..0672b6b --- /dev/null +++ b/doc/berack96/lib/graph/view/stuff/class-use/Arrow.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.stuff.Arrow + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.stuff.Arrow

+
+
No usage of berack96.lib.graph.view.stuff.Arrow
+ + + + + + diff --git a/doc/berack96/lib/graph/view/stuff/package-frame.html b/doc/berack96/lib/graph/view/stuff/package-frame.html new file mode 100644 index 0000000..2036158 --- /dev/null +++ b/doc/berack96/lib/graph/view/stuff/package-frame.html @@ -0,0 +1,20 @@ + + + + + +berack96.lib.graph.view.stuff + + + + + +

berack96.lib.graph.view.stuff

+
+

Classes

+ +
+ + diff --git a/doc/berack96/lib/graph/view/stuff/package-summary.html b/doc/berack96/lib/graph/view/stuff/package-summary.html new file mode 100644 index 0000000..81b6c0e --- /dev/null +++ b/doc/berack96/lib/graph/view/stuff/package-summary.html @@ -0,0 +1,144 @@ + + + + + +berack96.lib.graph.view.stuff + + + + + + + + + + + +
+

Package berack96.lib.graph.view.stuff

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    Arrow +
    Class that create a Polygon that has a shape of an arrow
    +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/stuff/package-tree.html b/doc/berack96/lib/graph/view/stuff/package-tree.html new file mode 100644 index 0000000..a3928fd --- /dev/null +++ b/doc/berack96/lib/graph/view/stuff/package-tree.html @@ -0,0 +1,141 @@ + + + + + +berack96.lib.graph.view.stuff Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.view.stuff

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • java.awt.Polygon (implements java.io.Serializable, java.awt.Shape) +
        +
      • berack96.lib.graph.view.stuff.Arrow
      • +
      +
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/stuff/package-use.html b/doc/berack96/lib/graph/view/stuff/package-use.html new file mode 100644 index 0000000..6ec2ad0 --- /dev/null +++ b/doc/berack96/lib/graph/view/stuff/package-use.html @@ -0,0 +1,124 @@ + + + + + +Uses of Package berack96.lib.graph.view.stuff + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.view.stuff

+
+
No usage of berack96.lib.graph.view.stuff
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/VertexComponent.html b/doc/berack96/lib/graph/view/vertex/VertexComponent.html new file mode 100644 index 0000000..1f5f604 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/VertexComponent.html @@ -0,0 +1,377 @@ + + + + + +VertexComponent + + + + + + + + + + + + +
+
berack96.lib.graph.view.vertex
+

Class VertexComponent<V>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • java.awt.Component
    • +
    • +
        +
      • berack96.lib.graph.view.vertex.VertexComponent<V>
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable
    +
    +
    +
    +
    public class VertexComponent<V>
    +extends java.awt.Component
    +
    +
    See Also:
    +
    Serialized Form
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class java.awt.Component

        +java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
      • +
      +
    • +
    + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      Vertex<V>vertex 
      +
        +
      • + + +

        Fields inherited from class java.awt.Component

        +accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
      • +
      +
        +
      • + + +

        Fields inherited from interface java.awt.image.ImageObserver

        +ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
      • +
      +
    • +
    + + + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      booleanequals(java.lang.Object obj) 
      java.lang.StringtoString() 
      +
        +
      • + + +

        Methods inherited from class java.awt.Component

        +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, addNotify, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, deliverEvent, disable, disableEvents, dispatchEvent, doLayout, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, getAlignmentX, getAlignmentY, getBackground, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentAt, getComponentAt, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeys, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getListeners, getLocale, getLocation, getLocation, getLocationOnScreen, getMaximumSize, getMinimumSize, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPreferredSize, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, invalidate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusCycleRoot, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, layout, list, list, list, list, list, locate, location, lostFocus, minimumSize, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paint, paintAll, paramString, postEvent, preferredSize, prepareImage, prepareImage, print, printAll, processComponentEvent, processEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removeNotify, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, resize, resize, revalidate, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeys, setFocusTraversalKeysEnabled, setFont, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setMinimumSize, setName, setPreferredSize, setSize, setSize, setVisible, show, show, size, transferFocus, transferFocusBackward, transferFocusUpCycle, update, validate
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        vertex

        +
        public final Vertex<V> vertex
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        VertexComponent

        +
        public VertexComponent(Vertex<V> vertex)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.awt.Component
        +
        +
      • +
      + + + +
        +
      • +

        equals

        +
        public boolean equals(java.lang.Object obj)
        +
        +
        Overrides:
        +
        equals in class java.lang.Object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/VertexIntListener.html b/doc/berack96/lib/graph/view/vertex/VertexIntListener.html new file mode 100644 index 0000000..217bd70 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/VertexIntListener.html @@ -0,0 +1,325 @@ + + + + + +VertexIntListener + + + + + + + + + + + + +
+
berack96.lib.graph.view.vertex
+

Class VertexIntListener

+
+
+ +
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    GraphListener, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.util.EventListener
    +
    +
    +
    +
    public class VertexIntListener
    +extends VertexListener<java.lang.Integer>
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        VertexIntListener

        +
        public VertexIntListener(GraphPanel<java.lang.Integer,?> panel)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        remove

        +
        public void remove()
        +
        Description copied from interface: GraphListener
        +
        Remove the listener to the graph. + This function is called when the listener is removed to the graph. + Here you could remove any other thing that you have done.
        +
      • +
      + + + +
        +
      • +

        buildNewVertex

        +
        protected java.lang.Integer buildNewVertex(Graph<java.lang.Integer,?> graph)
        +
        +
        Specified by:
        +
        buildNewVertex in class VertexListener<java.lang.Integer>
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/VertexListener.html b/doc/berack96/lib/graph/view/vertex/VertexListener.html new file mode 100644 index 0000000..06b32e3 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/VertexListener.html @@ -0,0 +1,516 @@ + + + + + +VertexListener + + + + + + + + + + + + +
+
berack96.lib.graph.view.vertex
+

Class VertexListener<V>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.view.vertex.VertexListener<V>
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    GraphListener, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.util.EventListener
    +
    +
    +
    Direct Known Subclasses:
    +
    VertexIntListener
    +
    +
    +
    +
    public abstract class VertexListener<V>
    +extends java.lang.Object
    +implements GraphListener
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected GraphPanel<V,?>panel 
      +
    • +
    + + + + +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        VertexListener

        +
        public VertexListener(GraphPanel<V,?> panel)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        buildNewVertex

        +
        protected abstract V buildNewVertex(Graph<V,?> graph)
        +
      • +
      + + + +
        +
      • +

        getDescription

        +
        public java.lang.String getDescription()
        +
        Description copied from interface: GraphListener
        +
        Get the description of this listener, in a way to interact with the user.
        +
        +
        Specified by:
        +
        getDescription in interface GraphListener
        +
        Returns:
        +
        a string describing the functionalities of this listener
        +
        +
      • +
      + + + +
        +
      • +

        mousePressed

        +
        public void mousePressed(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mousePressed in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseReleased

        +
        public void mouseReleased(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseReleased in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseDragged

        +
        public void mouseDragged(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseDragged in interface java.awt.event.MouseMotionListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseClicked

        +
        public void mouseClicked(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseClicked in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseEntered

        +
        public void mouseEntered(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseEntered in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseExited

        +
        public void mouseExited(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseExited in interface java.awt.event.MouseListener
        +
        +
      • +
      + + + +
        +
      • +

        mouseMoved

        +
        public void mouseMoved(java.awt.event.MouseEvent e)
        +
        +
        Specified by:
        +
        mouseMoved in interface java.awt.event.MouseMotionListener
        +
        +
      • +
      + + + +
        +
      • +

        keyPressed

        +
        public void keyPressed(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyPressed in interface java.awt.event.KeyListener
        +
        +
      • +
      + + + +
        +
      • +

        keyReleased

        +
        public void keyReleased(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyReleased in interface java.awt.event.KeyListener
        +
        +
      • +
      + + + +
        +
      • +

        keyTyped

        +
        public void keyTyped(java.awt.event.KeyEvent e)
        +
        +
        Specified by:
        +
        keyTyped in interface java.awt.event.KeyListener
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/VertexView.html b/doc/berack96/lib/graph/view/vertex/VertexView.html new file mode 100644 index 0000000..9d5c237 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/VertexView.html @@ -0,0 +1,320 @@ + + + + + +VertexView + + + + + + + + + + + + +
+
berack96.lib.graph.view.vertex
+

Class VertexView<V>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.view.vertex.VertexView<V>
    • +
    +
  • +
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      VertexView() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.awt.RectanglegetBox(VertexComponent<V> obj, + java.awt.Point center) +
      Box where the object is sensible at listeners (like Hitbox)
      +
      voidpaint(java.awt.Graphics2D g2, + VertexComponent<V> obj, + java.awt.Point center) +
      The paint function, aka the part where you can draw things (like Mesh)
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        VertexView

        +
        public VertexView()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getBox

        +
        public java.awt.Rectangle getBox(VertexComponent<V> obj,
        +                                 java.awt.Point center)
        +
        Description copied from interface: GraphicalView
        +
        Box where the object is sensible at listeners (like Hitbox)
        +
        +
        Specified by:
        +
        getBox in interface GraphicalView<VertexComponent<V>>
        +
        Parameters:
        +
        obj - the object to draw
        +
        center - the center point of the object
        +
        Returns:
        +
        a rectangle where the object is sensible to the listeners
        +
        +
      • +
      + + + +
        +
      • +

        paint

        +
        public void paint(java.awt.Graphics2D g2,
        +                  VertexComponent<V> obj,
        +                  java.awt.Point center)
        +
        Description copied from interface: GraphicalView
        +
        The paint function, aka the part where you can draw things (like Mesh)
        +
        +
        Specified by:
        +
        paint in interface GraphicalView<VertexComponent<V>>
        +
        Parameters:
        +
        g2 - the graphics object used for painting
        +
        obj - the object to paint
        +
        center - the center point of the object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/class-use/VertexComponent.html b/doc/berack96/lib/graph/view/vertex/class-use/VertexComponent.html new file mode 100644 index 0000000..2c54bf9 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/class-use/VertexComponent.html @@ -0,0 +1,299 @@ + + + + + +Uses of Class berack96.lib.graph.view.vertex.VertexComponent + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.vertex.VertexComponent

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/class-use/VertexIntListener.html b/doc/berack96/lib/graph/view/vertex/class-use/VertexIntListener.html new file mode 100644 index 0000000..8777792 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/class-use/VertexIntListener.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.vertex.VertexIntListener + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.vertex.VertexIntListener

+
+
No usage of berack96.lib.graph.view.vertex.VertexIntListener
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/class-use/VertexListener.html b/doc/berack96/lib/graph/view/vertex/class-use/VertexListener.html new file mode 100644 index 0000000..6e425b3 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/class-use/VertexListener.html @@ -0,0 +1,192 @@ + + + + + +Uses of Class berack96.lib.graph.view.vertex.VertexListener + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.vertex.VertexListener

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/class-use/VertexView.html b/doc/berack96/lib/graph/view/vertex/class-use/VertexView.html new file mode 100644 index 0000000..bd956f0 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/class-use/VertexView.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.view.vertex.VertexView + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.view.vertex.VertexView

+
+
No usage of berack96.lib.graph.view.vertex.VertexView
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/package-frame.html b/doc/berack96/lib/graph/view/vertex/package-frame.html new file mode 100644 index 0000000..9b32129 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/package-frame.html @@ -0,0 +1,23 @@ + + + + + +berack96.lib.graph.view.vertex + + + + + +

berack96.lib.graph.view.vertex

+ + + diff --git a/doc/berack96/lib/graph/view/vertex/package-summary.html b/doc/berack96/lib/graph/view/vertex/package-summary.html new file mode 100644 index 0000000..8432a51 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/package-summary.html @@ -0,0 +1,154 @@ + + + + + +berack96.lib.graph.view.vertex + + + + + + + + + + + +
+

Package berack96.lib.graph.view.vertex

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/package-tree.html b/doc/berack96/lib/graph/view/vertex/package-tree.html new file mode 100644 index 0000000..3af09f9 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/package-tree.html @@ -0,0 +1,147 @@ + + + + + +berack96.lib.graph.view.vertex Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.view.vertex

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable) + +
    • +
    • berack96.lib.graph.view.vertex.VertexListener<V> (implements berack96.lib.graph.view.GraphListener) + +
    • +
    • berack96.lib.graph.view.vertex.VertexView<V> (implements berack96.lib.graph.view.GraphicalView<O>)
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/view/vertex/package-use.html b/doc/berack96/lib/graph/view/vertex/package-use.html new file mode 100644 index 0000000..e63e289 --- /dev/null +++ b/doc/berack96/lib/graph/view/vertex/package-use.html @@ -0,0 +1,201 @@ + + + + + +Uses of Package berack96.lib.graph.view.vertex + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.view.vertex

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/VisitDistSourceDest.html b/doc/berack96/lib/graph/visit/VisitDistSourceDest.html new file mode 100644 index 0000000..496a12f --- /dev/null +++ b/doc/berack96/lib/graph/visit/VisitDistSourceDest.html @@ -0,0 +1,267 @@ + + + + + +VisitDistSourceDest + + + + + + + + + + + + +
+
berack96.lib.graph.visit
+

Interface VisitDistSourceDest<V,W extends java.lang.Number>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex
    +
    W - the weight
    +
    +
    +
    All Superinterfaces:
    +
    VisitStrategy<V,W>
    +
    +
    +
    +
    public interface VisitDistSourceDest<V,W extends java.lang.Number>
    +extends VisitStrategy<V,W>
    +
    Interface that is helpful for implements visit that needs to retrieve the distance between a vertex to all the others
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.util.List<Edge<V,W>>distance(Graph<V,W> graph, + V source, + V destination) +
      Get the distance from the source to the destination
      + The list contains the minimum path from the vertex marked as source to the destination vertex
      +
      + +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + + + +
        +
      • +

        distance

        +
        java.util.List<Edge<V,W>> distance(Graph<V,W> graph,
        +                                   V source,
        +                                   V destination)
        +                            throws java.lang.NullPointerException,
        +                                   java.lang.IllegalArgumentException
        +
        Get the distance from the source to the destination
        + The list contains the minimum path from the vertex marked as source to the destination vertex
        +
        +
        Parameters:
        +
        graph - the graph were to find the min path
        +
        source - the source vertex
        +
        destination - the destination vertex
        +
        Returns:
        +
        the distance
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the vertex is null
        +
        java.lang.IllegalArgumentException - if one of the vertex is not contained in the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/VisitDistance.html b/doc/berack96/lib/graph/visit/VisitDistance.html new file mode 100644 index 0000000..e35f4ff --- /dev/null +++ b/doc/berack96/lib/graph/visit/VisitDistance.html @@ -0,0 +1,285 @@ + + + + + +VisitDistance + + + + + + + + + + + + +
+
berack96.lib.graph.visit
+

Interface VisitDistance<V,W extends java.lang.Number>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex
    +
    W - the weight
    +
    +
    +
    All Superinterfaces:
    +
    VisitStrategy<V,W>
    +
    +
    +
    All Known Implementing Classes:
    +
    Dijkstra
    +
    +
    +
    +
    public interface VisitDistance<V,W extends java.lang.Number>
    +extends VisitStrategy<V,W>
    +
    Interface that is helpful for implements visit that needs to retrieve the distance between a vertex to all the others
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.util.Map<V,java.util.List<Edge<V,W>>>getLastDistance() +
      Get the last calculated distance to all the possible destinations
      + The map contains all the possible vertices that are reachable from the source set in the visit
      + If there is no path between the destination and the source, then null is returned as accordingly to the map interface
      + If the visit is not already been done, then the map is null.
      +
      VgetLastSource() +
      Get the last source vertex of the visit for calculating the destinations.
      + Returns null if the visit is not already been done
      +
      + +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getLastDistance

        +
        java.util.Map<V,java.util.List<Edge<V,W>>> getLastDistance()
        +                                                    throws java.lang.NullPointerException
        +
        Get the last calculated distance to all the possible destinations
        + The map contains all the possible vertices that are reachable from the source set in the visit
        + If there is no path between the destination and the source, then null is returned as accordingly to the map interface
        + If the visit is not already been done, then the map is null.
        +
        +
        Returns:
        +
        the last distance
        +
        Throws:
        +
        java.lang.NullPointerException - if the visit is not already been done
        +
        +
      • +
      + + + +
        +
      • +

        getLastSource

        +
        V getLastSource()
        +
        Get the last source vertex of the visit for calculating the destinations.
        + Returns null if the visit is not already been done
        +
        +
        Returns:
        +
        the last vertex
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/VisitSCC.html b/doc/berack96/lib/graph/visit/VisitSCC.html new file mode 100644 index 0000000..22010fc --- /dev/null +++ b/doc/berack96/lib/graph/visit/VisitSCC.html @@ -0,0 +1,256 @@ + + + + + +VisitSCC + + + + + + + + + + + + +
+
berack96.lib.graph.visit
+

Interface VisitSCC<V,W extends java.lang.Number>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex
    +
    W - the weight
    +
    +
    +
    All Superinterfaces:
    +
    VisitStrategy<V,W>
    +
    +
    +
    All Known Implementing Classes:
    +
    Tarjan
    +
    +
    +
    +
    public interface VisitSCC<V,W extends java.lang.Number>
    +extends VisitStrategy<V,W>
    +
    Interface that is helpful for implements visit that needs to retrieve the SCC
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.util.Collection<java.util.Collection<V>>getSCC() +
      Return the latest calculated strongly connected components of the graph.
      +
      + +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getSCC

        +
        java.util.Collection<java.util.Collection<V>> getSCC()
        +
        Return the latest calculated strongly connected components of the graph.
        +
        +
        Returns:
        +
        the latest SCC
        +
        Throws:
        +
        java.lang.NullPointerException - if there is no last calculated SCC
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/VisitStrategy.html b/doc/berack96/lib/graph/visit/VisitStrategy.html new file mode 100644 index 0000000..d759f8f --- /dev/null +++ b/doc/berack96/lib/graph/visit/VisitStrategy.html @@ -0,0 +1,267 @@ + + + + + +VisitStrategy + + + + + + + + + + + + +
+
berack96.lib.graph.visit
+

Interface VisitStrategy<V,W extends java.lang.Number>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - The Object that represent a vertex
    +
    W - The Object that represent the edge (more specifically the weight of the edge)
    +
    +
    +
    All Known Subinterfaces:
    +
    VisitDistance<V,W>, VisitDistSourceDest<V,W>, VisitSCC<V,W>, VisitTopological<V,W>
    +
    +
    +
    All Known Implementing Classes:
    +
    BFS, DFS, Dijkstra, Tarjan
    +
    +
    +
    +
    public interface VisitStrategy<V,W extends java.lang.Number>
    +
    This class is used for define some strategy for the visit of a graph.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      VisitInfo<V>visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      With this the graph will be visited accordingly to the strategy of the visit.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
      +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + + + +
        +
      • +

        visit

        +
        VisitInfo<V> visit(Graph<V,W> graph,
        +                   V source,
        +                   java.util.function.Consumer<V> visit)
        +            throws java.lang.NullPointerException,
        +                   java.lang.IllegalArgumentException,
        +                   java.lang.UnsupportedOperationException
        +
        With this the graph will be visited accordingly to the strategy of the visit.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
        +
        +
        Parameters:
        +
        graph - the graph to visit
        +
        source - the source of the visit
        +
        visit - the function to apply at each vertex when they are visited
        +
        Returns:
        +
        an info of the view
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the arguments is null (only the consumers can be null)
        +
        java.lang.IllegalArgumentException - if the source vertex is not in the graph
        +
        java.lang.UnsupportedOperationException - in the case that the visit algorithm cannot be applied to the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/VisitTopological.html b/doc/berack96/lib/graph/visit/VisitTopological.html new file mode 100644 index 0000000..ed7d80d --- /dev/null +++ b/doc/berack96/lib/graph/visit/VisitTopological.html @@ -0,0 +1,258 @@ + + + + + +VisitTopological + + + + + + + + + + + + +
+
berack96.lib.graph.visit
+

Interface VisitTopological<V,W extends java.lang.Number>

+
+
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex
    +
    W - the weight
    +
    +
    +
    All Superinterfaces:
    +
    VisitStrategy<V,W>
    +
    +
    +
    All Known Implementing Classes:
    +
    Tarjan
    +
    +
    +
    +
    public interface VisitTopological<V,W extends java.lang.Number>
    +extends VisitStrategy<V,W>
    +
    Interface that is helpful for implements visit that needs to retrieve the topological sort
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.util.List<V>getTopologicalSort() +
      Return the latest calculated Topological sort of the graph.
      + If the latest visited graph is not a DAG, it will return null.
      +
      + +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getTopologicalSort

        +
        java.util.List<V> getTopologicalSort()
        +
        Return the latest calculated Topological sort of the graph.
        + If the latest visited graph is not a DAG, it will return null.
        +
        +
        Returns:
        +
        the topological order of the DAG
        +
        Throws:
        +
        java.lang.NullPointerException - if there is no last calculated topological sort
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/class-use/VisitDistSourceDest.html b/doc/berack96/lib/graph/visit/class-use/VisitDistSourceDest.html new file mode 100644 index 0000000..01d03fa --- /dev/null +++ b/doc/berack96/lib/graph/visit/class-use/VisitDistSourceDest.html @@ -0,0 +1,124 @@ + + + + + +Uses of Interface berack96.lib.graph.visit.VisitDistSourceDest + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.visit.VisitDistSourceDest

+
+
No usage of berack96.lib.graph.visit.VisitDistSourceDest
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/class-use/VisitDistance.html b/doc/berack96/lib/graph/visit/class-use/VisitDistance.html new file mode 100644 index 0000000..63b1b82 --- /dev/null +++ b/doc/berack96/lib/graph/visit/class-use/VisitDistance.html @@ -0,0 +1,166 @@ + + + + + +Uses of Interface berack96.lib.graph.visit.VisitDistance + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.visit.VisitDistance

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/class-use/VisitSCC.html b/doc/berack96/lib/graph/visit/class-use/VisitSCC.html new file mode 100644 index 0000000..07db92c --- /dev/null +++ b/doc/berack96/lib/graph/visit/class-use/VisitSCC.html @@ -0,0 +1,166 @@ + + + + + +Uses of Interface berack96.lib.graph.visit.VisitSCC + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.visit.VisitSCC

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/class-use/VisitStrategy.html b/doc/berack96/lib/graph/visit/class-use/VisitStrategy.html new file mode 100644 index 0000000..ceacc82 --- /dev/null +++ b/doc/berack96/lib/graph/visit/class-use/VisitStrategy.html @@ -0,0 +1,334 @@ + + + + + +Uses of Interface berack96.lib.graph.visit.VisitStrategy + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.visit.VisitStrategy

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/class-use/VisitTopological.html b/doc/berack96/lib/graph/visit/class-use/VisitTopological.html new file mode 100644 index 0000000..ca1f244 --- /dev/null +++ b/doc/berack96/lib/graph/visit/class-use/VisitTopological.html @@ -0,0 +1,166 @@ + + + + + +Uses of Interface berack96.lib.graph.visit.VisitTopological + + + + + + + + + + + +
+

Uses of Interface
berack96.lib.graph.visit.VisitTopological

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/BFS.html b/doc/berack96/lib/graph/visit/impl/BFS.html new file mode 100644 index 0000000..32f4922 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/BFS.html @@ -0,0 +1,316 @@ + + + + + +BFS + + + + + + + + + + + + +
+
berack96.lib.graph.visit.impl
+

Class BFS<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.visit.impl.BFS<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex of the graph
    +
    W - the weight of the graph
    +
    +
    +
    All Implemented Interfaces:
    +
    VisitStrategy<V,W>
    +
    +
    +
    +
    public class BFS<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements VisitStrategy<V,W>
    +
    Breadth-first search
    + The algorithm starts at the root node and explores all of the neighbor nodes at the present depth prior to moving on to the nodes at the next depth level.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      BFS() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      VisitInfo<V>visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      With this the graph will be visited accordingly to the strategy of the visit.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        BFS

        +
        public BFS()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(Graph<V,W> graph,
        +                          V source,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: VisitStrategy
        +
        With this the graph will be visited accordingly to the strategy of the visit.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
        +
        +
        Specified by:
        +
        visit in interface VisitStrategy<V,W extends java.lang.Number>
        +
        Parameters:
        +
        graph - the graph to visit
        +
        source - the source of the visit
        +
        visit - the function to apply at each vertex when they are visited
        +
        Returns:
        +
        an info of the view
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the arguments is null (only the consumers can be null)
        +
        java.lang.IllegalArgumentException - if the source vertex is not in the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/DFS.html b/doc/berack96/lib/graph/visit/impl/DFS.html new file mode 100644 index 0000000..d43516d --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/DFS.html @@ -0,0 +1,316 @@ + + + + + +DFS + + + + + + + + + + + + +
+
berack96.lib.graph.visit.impl
+

Class DFS<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.visit.impl.DFS<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex of the graph
    +
    W - the weight of the graph
    +
    +
    +
    All Implemented Interfaces:
    +
    VisitStrategy<V,W>
    +
    +
    +
    +
    public class DFS<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements VisitStrategy<V,W>
    +
    Depth-first search
    + The algorithm starts at the root node and explores as far as possible along each branch before backtracking.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      DFS() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      VisitInfo<V>visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      With this the graph will be visited accordingly to the strategy of the visit.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        DFS

        +
        public DFS()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(Graph<V,W> graph,
        +                          V source,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: VisitStrategy
        +
        With this the graph will be visited accordingly to the strategy of the visit.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
        +
        +
        Specified by:
        +
        visit in interface VisitStrategy<V,W extends java.lang.Number>
        +
        Parameters:
        +
        graph - the graph to visit
        +
        source - the source of the visit
        +
        visit - the function to apply at each vertex when they are visited
        +
        Returns:
        +
        an info of the view
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the arguments is null (only the consumers can be null)
        +
        java.lang.IllegalArgumentException - if the source vertex is not in the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/Dijkstra.html b/doc/berack96/lib/graph/visit/impl/Dijkstra.html new file mode 100644 index 0000000..e028c47 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/Dijkstra.html @@ -0,0 +1,369 @@ + + + + + +Dijkstra + + + + + + + + + + + + +
+
berack96.lib.graph.visit.impl
+

Class Dijkstra<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.visit.impl.Dijkstra<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - vertex
    +
    W - weight
    +
    +
    +
    All Implemented Interfaces:
    +
    VisitDistance<V,W>, VisitStrategy<V,W>
    +
    +
    +
    +
    public class Dijkstra<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements VisitDistance<V,W>
    +
    Class that implements the Dijkstra algorithm and uses it for getting all the distance from a source
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Dijkstra() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.Map<V,java.util.List<Edge<V,W>>>getLastDistance() +
      Get the last calculated distance to all the possible destinations
      + The map contains all the possible vertices that are reachable from the source set in the visit
      + If there is no path between the destination and the source, then null is returned as accordingly to the map interface
      + If the visit is not already been done, then the map is null.
      +
      VgetLastSource() +
      Get the last source vertex of the visit for calculating the destinations.
      + Returns null if the visit is not already been done
      +
      VisitInfo<V>visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      With this the graph will be visited accordingly to the strategy of the visit.
      + Some strategy can accept a source vertex null, because they visit all the graph anyway.
      + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Dijkstra

        +
        public Dijkstra()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getLastDistance

        +
        public java.util.Map<V,java.util.List<Edge<V,W>>> getLastDistance()
        +
        Description copied from interface: VisitDistance
        +
        Get the last calculated distance to all the possible destinations
        + The map contains all the possible vertices that are reachable from the source set in the visit
        + If there is no path between the destination and the source, then null is returned as accordingly to the map interface
        + If the visit is not already been done, then the map is null.
        +
        +
        Specified by:
        +
        getLastDistance in interface VisitDistance<V,W extends java.lang.Number>
        +
        Returns:
        +
        the last distance
        +
        +
      • +
      + + + +
        +
      • +

        getLastSource

        +
        public V getLastSource()
        +
        Description copied from interface: VisitDistance
        +
        Get the last source vertex of the visit for calculating the destinations.
        + Returns null if the visit is not already been done
        +
        +
        Specified by:
        +
        getLastSource in interface VisitDistance<V,W extends java.lang.Number>
        +
        Returns:
        +
        the last vertex
        +
        +
      • +
      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(Graph<V,W> graph,
        +                          V source,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        Description copied from interface: VisitStrategy
        +
        With this the graph will be visited accordingly to the strategy of the visit.
        + Some strategy can accept a source vertex null, because they visit all the graph anyway.
        + If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
        +
        +
        Specified by:
        +
        visit in interface VisitStrategy<V,W extends java.lang.Number>
        +
        Parameters:
        +
        graph - the graph to visit
        +
        source - the source of the visit
        +
        visit - the function to apply at each vertex when they are visited
        +
        Returns:
        +
        an info of the view
        +
        Throws:
        +
        java.lang.NullPointerException - if one of the arguments is null (only the consumers can be null)
        +
        java.lang.IllegalArgumentException - if the source vertex is not in the graph
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/Tarjan.html b/doc/berack96/lib/graph/visit/impl/Tarjan.html new file mode 100644 index 0000000..e2495ee --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/Tarjan.html @@ -0,0 +1,358 @@ + + + + + +Tarjan + + + + + + + + + + + + +
+
berack96.lib.graph.visit.impl
+

Class Tarjan<V,W extends java.lang.Number>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.visit.impl.Tarjan<V,W>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - vertex
    +
    W - weight
    +
    +
    +
    All Implemented Interfaces:
    +
    VisitSCC<V,W>, VisitStrategy<V,W>, VisitTopological<V,W>
    +
    +
    +
    +
    public class Tarjan<V,W extends java.lang.Number>
    +extends java.lang.Object
    +implements VisitSCC<V,W>, VisitTopological<V,W>
    +
    Class that implements the Tarjan algorithm and uses it for getting the SCC and the topological sort
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Tarjan() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.Collection<java.util.Collection<V>>getSCC() +
      Return the latest calculated strongly connected components of the graph.
      +
      java.util.List<V>getTopologicalSort() +
      Return the latest calculated Topological sort of the graph.
      + If the latest visited graph is not a DAG, it will return null.
      +
      VisitInfo<V>visit(Graph<V,W> graph, + V source, + java.util.function.Consumer<V> visit) +
      This particular visit strategy use only the graph and the visit, so the source param is not needed.
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Tarjan

        +
        public Tarjan()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getSCC

        +
        public java.util.Collection<java.util.Collection<V>> getSCC()
        +
        Description copied from interface: VisitSCC
        +
        Return the latest calculated strongly connected components of the graph.
        +
        +
        Specified by:
        +
        getSCC in interface VisitSCC<V,W extends java.lang.Number>
        +
        Returns:
        +
        the latest SCC
        +
        +
      • +
      + + + +
        +
      • +

        getTopologicalSort

        +
        public java.util.List<V> getTopologicalSort()
        +
        Description copied from interface: VisitTopological
        +
        Return the latest calculated Topological sort of the graph.
        + If the latest visited graph is not a DAG, it will return null.
        +
        +
        Specified by:
        +
        getTopologicalSort in interface VisitTopological<V,W extends java.lang.Number>
        +
        Returns:
        +
        the topological order of the DAG
        +
        +
      • +
      + + + + + +
        +
      • +

        visit

        +
        public VisitInfo<V> visit(Graph<V,W> graph,
        +                          V source,
        +                          java.util.function.Consumer<V> visit)
        +                   throws java.lang.NullPointerException,
        +                          java.lang.IllegalArgumentException
        +
        This particular visit strategy use only the graph and the visit, so the source param is not needed.
        +
        +
        Specified by:
        +
        visit in interface VisitStrategy<V,W extends java.lang.Number>
        +
        Parameters:
        +
        graph - the graph to visit
        +
        source - not needed
        +
        visit - the function to apply at each vertex when they are visited
        +
        Returns:
        +
        an info of the view
        +
        Throws:
        +
        java.lang.NullPointerException - if the graph is null
        +
        java.lang.IllegalArgumentException - doesn't throw this
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/VisitInfo.VertexInfo.html b/doc/berack96/lib/graph/visit/impl/VisitInfo.VertexInfo.html new file mode 100644 index 0000000..11b3c2b --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/VisitInfo.VertexInfo.html @@ -0,0 +1,343 @@ + + + + + +VisitInfo.VertexInfo + + + + + + + + + + + + +
+
berack96.lib.graph.visit.impl
+

Class VisitInfo.VertexInfo

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    java.lang.Comparable<VisitInfo.VertexInfo>
    +
    +
    +
    Enclosing class:
    +
    VisitInfo<V>
    +
    +
    +
    +
    public class VisitInfo.VertexInfo
    +extends java.lang.Object
    +implements java.lang.Comparable<VisitInfo.VertexInfo>
    +
    Class used mainly for storing the data of the visit
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Field Detail

      + + + +
        +
      • +

        vertex

        +
        public final V vertex
        +
      • +
      + + + +
        +
      • +

        parent

        +
        public final V parent
        +
      • +
      + + + +
        +
      • +

        timeDiscovered

        +
        public final long timeDiscovered
        +
      • +
      + + + +
        +
      • +

        timeVisited

        +
        public final long timeVisited
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + + + + + +
        +
      • +

        toString

        +
        public java.lang.String toString()
        +
        +
        Overrides:
        +
        toString in class java.lang.Object
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/VisitInfo.html b/doc/berack96/lib/graph/visit/impl/VisitInfo.html new file mode 100644 index 0000000..b7113e1 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/VisitInfo.html @@ -0,0 +1,575 @@ + + + + + +VisitInfo + + + + + + + + + + + + +
+
berack96.lib.graph.visit.impl
+

Class VisitInfo<V>

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • berack96.lib.graph.visit.impl.VisitInfo<V>
    • +
    +
  • +
+
+
    +
  • +
    +
    Type Parameters:
    +
    V - the vertex of the visit
    +
    +
    +
    +
    public class VisitInfo<V>
    +extends java.lang.Object
    +
    The class used for getting the info of the visit.
    + It could be used with the algorithm of the visit for set some useful data.
    +
    +
    Author:
    +
    Berack96
    +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Nested Class Summary

      + + + + + + + + + + +
      Nested Classes 
      Modifier and TypeClass and Description
      class VisitInfo.VertexInfo +
      Class used mainly for storing the data of the visit
      +
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      VisitInfo(V source) +
      Need a source for initialize the basic values
      +
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      voidforEach(java.util.function.Consumer<VisitInfo.VertexInfo> consumer) +
      Iterate through all the vertices discovered and visited with the correct timeline.
      + The vertices will be visited in the order that they are discovered and visited, so a vertex can appear two times (one for the discovery, anc the other for the visit)
      +
      voidforEachDiscovered(java.util.function.Consumer<VisitInfo.VertexInfo> consumer) +
      Iterate through all the vertices that are discovered.
      + The vertices will be ordered by the time of their discover.
      +
      voidforEachVisited(java.util.function.Consumer<VisitInfo.VertexInfo> consumer) +
      Iterate through all the vertices that are visited.
      + The vertices will be ordered by the time of their visit.
      +
      java.util.Set<V>getDiscovered() +
      Get all the discovered vertices so far.
      +
      VgetParentOf(V vertex) +
      Get the parent of a particular vertex.
      + The parent of a vertex is the one that has discovered it
      + If the vertex has no parent (it has not been set by the visit algorithm or it's the source) then null is returned.
      +
      VgetSource() +
      Get the source of the visit.
      +
      longgetTimeDiscover(V vertex) +
      The time of the vertex when it is discovered in the visit.
      + For "discovered" i mean when the node is first found by the visit algorithm.
      +
      longgetTimeVisit(V vertex) +
      The time when the vertex is visited by the algorithm
      + For "visited" i mean when the node is finally visited by the visit algorithm.
      +
      java.util.Set<V>getVisited() +
      Get all the visited vertices so far.
      +
      booleanisDiscovered(V vertex) +
      Tells if a vertex is discovered or not
      +
      booleanisVisited(V vertex) +
      Tells if the vertex is visited or not
      +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + + + +
        +
      • +

        VisitInfo

        +
        public VisitInfo(V source)
        +
        Need a source for initialize the basic values
        +
        +
        Parameters:
        +
        source - the source of the visit
        +
        Throws:
        +
        java.lang.NullPointerException - if the source is null
        +
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + + + +
        +
      • +

        getTimeDiscover

        +
        public long getTimeDiscover(V vertex)
        +                     throws java.lang.IllegalArgumentException,
        +                            java.lang.NullPointerException
        +
        The time of the vertex when it is discovered in the visit.
        + For "discovered" i mean when the node is first found by the visit algorithm. It may depends form VisitStrategy
        + The time starts at 0 and for each vertex discovered it is increased by one. If a vertex is visited it also increase the time
        +
        +
        Parameters:
        +
        vertex - the vertex needed
        +
        Returns:
        +
        the time of it's discovery
        +
        Throws:
        +
        java.lang.IllegalArgumentException - if the vertex is not discovered
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        getTimeVisit

        +
        public long getTimeVisit(V vertex)
        +                  throws java.lang.IllegalArgumentException,
        +                         java.lang.NullPointerException
        +
        The time when the vertex is visited by the algorithm
        + For "visited" i mean when the node is finally visited by the visit algorithm. It may depends form VisitStrategy
        + The time starts at 0 and for each vertex discovered or visited is increased by one
        +
        +
        Parameters:
        +
        vertex - the vertex needed
        +
        Returns:
        +
        the time of it's visit
        +
        Throws:
        +
        java.lang.IllegalArgumentException - if the vertex is not visited
        +
        java.lang.NullPointerException - if the vertex is null
        +
        +
      • +
      + + + + + +
        +
      • +

        isDiscovered

        +
        public boolean isDiscovered(V vertex)
        +                     throws java.lang.NullPointerException
        +
        Tells if a vertex is discovered or not
        +
        +
        Parameters:
        +
        vertex - the vertex chosen
        +
        Returns:
        +
        true if is discovered
        +
        Throws:
        +
        java.lang.NullPointerException
        +
        +
      • +
      + + + + + +
        +
      • +

        isVisited

        +
        public boolean isVisited(V vertex)
        +                  throws java.lang.NullPointerException
        +
        Tells if the vertex is visited or not
        +
        +
        Parameters:
        +
        vertex - the vertex chosen
        +
        Returns:
        +
        true if is visited
        +
        Throws:
        +
        java.lang.NullPointerException
        +
        +
      • +
      + + + +
        +
      • +

        getSource

        +
        public V getSource()
        +
        Get the source of the visit.
        +
        +
        Returns:
        +
        the source vertex where it's started the visit
        +
        +
      • +
      + + + + + +
        +
      • +

        getParentOf

        +
        public V getParentOf(V vertex)
        +              throws java.lang.IllegalArgumentException
        +
        Get the parent of a particular vertex.
        + The parent of a vertex is the one that has discovered it
        + If the vertex has no parent (it has not been set by the visit algorithm or it's the source) then null is returned.
        +
        +
        Parameters:
        +
        vertex - the child vertex
        +
        Returns:
        +
        the parent of the child
        +
        Throws:
        +
        java.lang.IllegalArgumentException - if the vertex has not been discovered yet
        +
        +
      • +
      + + + +
        +
      • +

        getVisited

        +
        public java.util.Set<V> getVisited()
        +
        Get all the visited vertices so far.
        +
        +
        Returns:
        +
        the visited vertices
        +
        +
      • +
      + + + +
        +
      • +

        getDiscovered

        +
        public java.util.Set<V> getDiscovered()
        +
        Get all the discovered vertices so far.
        +
        +
        Returns:
        +
        the discovered vertices
        +
        +
      • +
      + + + +
        +
      • +

        forEachDiscovered

        +
        public void forEachDiscovered(java.util.function.Consumer<VisitInfo.VertexInfo> consumer)
        +
        Iterate through all the vertices that are discovered.
        + The vertices will be ordered by the time of their discover.
        +
        +
        Parameters:
        +
        consumer - the function to apply to each
        +
        +
      • +
      + + + +
        +
      • +

        forEachVisited

        +
        public void forEachVisited(java.util.function.Consumer<VisitInfo.VertexInfo> consumer)
        +
        Iterate through all the vertices that are visited.
        + The vertices will be ordered by the time of their visit.
        +
        +
        Parameters:
        +
        consumer - the function to apply to each
        +
        +
      • +
      + + + +
        +
      • +

        forEach

        +
        public void forEach(java.util.function.Consumer<VisitInfo.VertexInfo> consumer)
        +
        Iterate through all the vertices discovered and visited with the correct timeline.
        + The vertices will be visited in the order that they are discovered and visited, so a vertex can appear two times (one for the discovery, anc the other for the visit)
        +
        +
        Parameters:
        +
        consumer - the function to apply at each vertex
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/class-use/BFS.html b/doc/berack96/lib/graph/visit/impl/class-use/BFS.html new file mode 100644 index 0000000..76ef3d9 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/class-use/BFS.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.visit.impl.BFS + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.visit.impl.BFS

+
+
No usage of berack96.lib.graph.visit.impl.BFS
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/class-use/DFS.html b/doc/berack96/lib/graph/visit/impl/class-use/DFS.html new file mode 100644 index 0000000..85bcf0f --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/class-use/DFS.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.visit.impl.DFS + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.visit.impl.DFS

+
+
No usage of berack96.lib.graph.visit.impl.DFS
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/class-use/Dijkstra.html b/doc/berack96/lib/graph/visit/impl/class-use/Dijkstra.html new file mode 100644 index 0000000..6fdb1c4 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/class-use/Dijkstra.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.visit.impl.Dijkstra + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.visit.impl.Dijkstra

+
+
No usage of berack96.lib.graph.visit.impl.Dijkstra
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/class-use/Tarjan.html b/doc/berack96/lib/graph/visit/impl/class-use/Tarjan.html new file mode 100644 index 0000000..eab819f --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/class-use/Tarjan.html @@ -0,0 +1,124 @@ + + + + + +Uses of Class berack96.lib.graph.visit.impl.Tarjan + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.visit.impl.Tarjan

+
+
No usage of berack96.lib.graph.visit.impl.Tarjan
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.VertexInfo.html b/doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.VertexInfo.html new file mode 100644 index 0000000..ad8b6ea --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.VertexInfo.html @@ -0,0 +1,194 @@ + + + + + +Uses of Class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.visit.impl.VisitInfo.VertexInfo

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.html b/doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.html new file mode 100644 index 0000000..e5fb7f4 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/class-use/VisitInfo.html @@ -0,0 +1,285 @@ + + + + + +Uses of Class berack96.lib.graph.visit.impl.VisitInfo + + + + + + + + + + + +
+

Uses of Class
berack96.lib.graph.visit.impl.VisitInfo

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/package-frame.html b/doc/berack96/lib/graph/visit/impl/package-frame.html new file mode 100644 index 0000000..0ee98e6 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/package-frame.html @@ -0,0 +1,24 @@ + + + + + +berack96.lib.graph.visit.impl + + + + + +

berack96.lib.graph.visit.impl

+
+

Classes

+ +
+ + diff --git a/doc/berack96/lib/graph/visit/impl/package-summary.html b/doc/berack96/lib/graph/visit/impl/package-summary.html new file mode 100644 index 0000000..f74d3ff --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/package-summary.html @@ -0,0 +1,171 @@ + + + + + +berack96.lib.graph.visit.impl + + + + + + + + + + + +
+

Package berack96.lib.graph.visit.impl

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    BFS<V,W extends java.lang.Number> +
    Breadth-first search
    + The algorithm starts at the root node and explores all of the neighbor nodes at the present depth prior to moving on to the nodes at the next depth level.
    +
    DFS<V,W extends java.lang.Number> +
    Depth-first search
    + The algorithm starts at the root node and explores as far as possible along each branch before backtracking.
    +
    Dijkstra<V,W extends java.lang.Number> +
    Class that implements the Dijkstra algorithm and uses it for getting all the distance from a source
    +
    Tarjan<V,W extends java.lang.Number> +
    Class that implements the Tarjan algorithm and uses it for getting the SCC and the topological sort
    +
    VisitInfo<V> +
    The class used for getting the info of the visit.
    + It could be used with the algorithm of the visit for set some useful data.
    +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/package-tree.html b/doc/berack96/lib/graph/visit/impl/package-tree.html new file mode 100644 index 0000000..2f21087 --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/package-tree.html @@ -0,0 +1,142 @@ + + + + + +berack96.lib.graph.visit.impl Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.visit.impl

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • berack96.lib.graph.visit.impl.BFS<V,W> (implements berack96.lib.graph.visit.VisitStrategy<V,W>)
    • +
    • berack96.lib.graph.visit.impl.DFS<V,W> (implements berack96.lib.graph.visit.VisitStrategy<V,W>)
    • +
    • berack96.lib.graph.visit.impl.Dijkstra<V,W> (implements berack96.lib.graph.visit.VisitDistance<V,W>)
    • +
    • berack96.lib.graph.visit.impl.Tarjan<V,W> (implements berack96.lib.graph.visit.VisitSCC<V,W>, berack96.lib.graph.visit.VisitTopological<V,W>)
    • +
    • berack96.lib.graph.visit.impl.VisitInfo<V>
    • +
    • berack96.lib.graph.visit.impl.VisitInfo.VertexInfo (implements java.lang.Comparable<T>)
    • +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/impl/package-use.html b/doc/berack96/lib/graph/visit/impl/package-use.html new file mode 100644 index 0000000..198eb1f --- /dev/null +++ b/doc/berack96/lib/graph/visit/impl/package-use.html @@ -0,0 +1,231 @@ + + + + + +Uses of Package berack96.lib.graph.visit.impl + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.visit.impl

+
+
+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/package-frame.html b/doc/berack96/lib/graph/visit/package-frame.html new file mode 100644 index 0000000..793ff00 --- /dev/null +++ b/doc/berack96/lib/graph/visit/package-frame.html @@ -0,0 +1,24 @@ + + + + + +berack96.lib.graph.visit + + + + + +

berack96.lib.graph.visit

+ + + diff --git a/doc/berack96/lib/graph/visit/package-summary.html b/doc/berack96/lib/graph/visit/package-summary.html new file mode 100644 index 0000000..4dcca50 --- /dev/null +++ b/doc/berack96/lib/graph/visit/package-summary.html @@ -0,0 +1,168 @@ + + + + + +berack96.lib.graph.visit + + + + + + + + + + + +
+

Package berack96.lib.graph.visit

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Interface Summary 
    InterfaceDescription
    VisitDistance<V,W extends java.lang.Number> +
    Interface that is helpful for implements visit that needs to retrieve the distance between a vertex to all the others
    +
    VisitDistSourceDest<V,W extends java.lang.Number> +
    Interface that is helpful for implements visit that needs to retrieve the distance between a vertex to all the others
    +
    VisitSCC<V,W extends java.lang.Number> +
    Interface that is helpful for implements visit that needs to retrieve the SCC
    +
    VisitStrategy<V,W extends java.lang.Number> +
    This class is used for define some strategy for the visit of a graph.
    +
    VisitTopological<V,W extends java.lang.Number> +
    Interface that is helpful for implements visit that needs to retrieve the topological sort
    +
    +
  • +
+
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/package-tree.html b/doc/berack96/lib/graph/visit/package-tree.html new file mode 100644 index 0000000..3d1e729 --- /dev/null +++ b/doc/berack96/lib/graph/visit/package-tree.html @@ -0,0 +1,140 @@ + + + + + +berack96.lib.graph.visit Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package berack96.lib.graph.visit

+Package Hierarchies: + +
+
+

Interface Hierarchy

+ +
+ + + + + + diff --git a/doc/berack96/lib/graph/visit/package-use.html b/doc/berack96/lib/graph/visit/package-use.html new file mode 100644 index 0000000..9334d4e --- /dev/null +++ b/doc/berack96/lib/graph/visit/package-use.html @@ -0,0 +1,258 @@ + + + + + +Uses of Package berack96.lib.graph.visit + + + + + + + + + + + +
+

Uses of Package
berack96.lib.graph.visit

+
+
+ +
+ + + + + + diff --git a/doc/constant-values.html b/doc/constant-values.html new file mode 100644 index 0000000..9625794 --- /dev/null +++ b/doc/constant-values.html @@ -0,0 +1,193 @@ + + + + + +Constant Field Values + + + + + + + + +
+ + + + + + + +
+ + +
+

Constant Field Values

+

Contents

+ +
+
+ + +

berack96.lib.*

+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    berack96.lib.graph.Graph<V,W extends java.lang.Number> 
    Modifier and TypeConstant FieldValue
    + +public static final java.lang.StringNOT_CONNECTED"The source vertex doesn\'t have a path that reach the destination"
    + +public static final java.lang.StringNOT_DAG"The graph is not a DAG"
    + +public static final java.lang.StringPARAM_NULL"The parameter must not be null"
    + +public static final java.lang.StringVERTEX_NOT_CONTAINED"The vertex must be contained in the graph"
    +
  • +
  • + + + + + + + + + + + + + + +
    berack96.lib.graph.Vertex<V> 
    Modifier and TypeConstant FieldValue
    + +public static final java.lang.StringREMOVED"The vertex is no longer in the graph"
    +
  • +
+
+ +
+ + + + + + + +
+ + + + diff --git a/doc/deprecated-list.html b/doc/deprecated-list.html new file mode 100644 index 0000000..88d9999 --- /dev/null +++ b/doc/deprecated-list.html @@ -0,0 +1,124 @@ + + + + + +Deprecated List + + + + + + + + +
+ + + + + + + +
+ + +
+

Deprecated API

+

Contents

+
+ +
+ + + + + + + +
+ + + + diff --git a/doc/help-doc.html b/doc/help-doc.html new file mode 100644 index 0000000..7dbcba0 --- /dev/null +++ b/doc/help-doc.html @@ -0,0 +1,229 @@ + + + + + +API Help + + + + + + + + +
+ + + + + + + +
+ + +
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+
    +
  • +

    Overview

    +

    The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

    +
  • +
  • +

    Package

    +

    Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

    +
      +
    • Interfaces (italic)
    • +
    • Classes
    • +
    • Enums
    • +
    • Exceptions
    • +
    • Errors
    • +
    • Annotation Types
    • +
    +
  • +
  • +

    Class/Interface

    +

    Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
      +
    • Class inheritance diagram
    • +
    • Direct Subclasses
    • +
    • All Known Subinterfaces
    • +
    • All Known Implementing Classes
    • +
    • Class/interface declaration
    • +
    • Class/interface description
    • +
    +
      +
    • Nested Class Summary
    • +
    • Field Summary
    • +
    • Constructor Summary
    • +
    • Method Summary
    • +
    +
      +
    • Field Detail
    • +
    • Constructor Detail
    • +
    • Method Detail
    • +
    +

    Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    +
  • +
  • +

    Annotation Type

    +

    Each annotation type has its own separate page with the following sections:

    +
      +
    • Annotation Type declaration
    • +
    • Annotation Type description
    • +
    • Required Element Summary
    • +
    • Optional Element Summary
    • +
    • Element Detail
    • +
    +
  • +
  • +

    Enum

    +

    Each enum has its own separate page with the following sections:

    +
      +
    • Enum declaration
    • +
    • Enum description
    • +
    • Enum Constant Summary
    • +
    • Enum Constant Detail
    • +
    +
  • +
  • +

    Use

    +

    Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

    +
  • +
  • +

    Tree (Class Hierarchy)

    +

    There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

    +
      +
    • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
    • +
    • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
    • +
    +
  • +
  • +

    Deprecated API

    +

    The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

    +
  • +
  • +

    Index

    +

    The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

    +
  • +
  • +

    Prev/Next

    +

    These links take you to the next or previous class, interface, package, or related page.

    +
  • +
  • +

    Frames/No Frames

    +

    These links show and hide the HTML frames. All pages are available with or without frames.

    +
  • +
  • +

    All Classes

    +

    The All Classes link shows all classes and interfaces except non-static nested types.

    +
  • +
  • +

    Serialized Form

    +

    Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

    +
  • +
  • +

    Constant Field Values

    +

    The Constant Field Values page lists the static final fields and their values.

    +
  • +
+This help file applies to API documentation generated using the standard doclet.
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-1.html b/doc/index-files/index-1.html new file mode 100644 index 0000000..fa96b5b --- /dev/null +++ b/doc/index-files/index-1.html @@ -0,0 +1,256 @@ + + + + + +A-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

A

+
+
addAllEdges(Collection<Edge<V, W>>) - Method in interface berack96.lib.graph.Graph
+
+
Add all the edges of the collection to the graph.
+ If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
+ Any null edges will be ignored.
+ This method will overwrite any existing edge between the two vertex.
+
+
addAllEdges(Collection<Edge<V, W>>) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addAllEdges(Collection<Edge<V, W>>) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addAllEdges(Collection<Edge<V, W>>) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addAllVertices(Collection<V>) - Method in interface berack96.lib.graph.Graph
+
+
Add all the vertices contained in the collection to the graph.
+ If a vertex is contained in the collection and in the graph is ignored and it will not be replaced.
+ Null vertices will be ignored and they will not be added to the graph.
+
+
addAllVertices(Collection<V>) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addAllVertices(Collection<V>) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addAllVertices(Collection<V>) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addChild(V, Number) - Method in class berack96.lib.graph.Vertex
+
+
Add a child to this vertex.
+ The added child must be in the graph or it will return an exception.
+
+
addEdge(V, V, W) - Method in interface berack96.lib.graph.Graph
+
+
Add an edge between the two vertex.
+ The edge will be created from the vertex V1 and the vertex V2
+ This method will overwrite any existing edge between the two vertex.
+ If there was a previous edge then it is returned
+
+
addEdge(Edge<V, W>) - Method in interface berack96.lib.graph.Graph
+
+
Add an edge between the two vertex.
+ The edge will be created from the vertex source of the edge and the vertex destination of it
+ This method will overwrite any existing edge between the two vertex.
+ If there was a previous edge then it is returned
+
+
addEdge(V, V, W) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addEdge(Edge<V, W>) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addEdge(V, V, W) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addEdge(Edge<V, W>) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addEdge(V, V, W) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addEdge(Edge<V, W>) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addEdge(Edge<V, W>) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
addEdge(VertexComponent<V>, VertexComponent<V>, W) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
addEdgeAndVertices(V, V, W) - Method in interface berack96.lib.graph.Graph
+
+
This particular function add an edge to the graph.
+ If one of the two, or both vertices aren't contained in the graph, then the vertices will be added.
+ The edge will be created from the vertex V1 and the vertex V2
+ This method will overwrite any existing edge between the two vertex.
+ If there was a previous edge then it is returned
+
+
addEdgeAndVertices(Edge<V, W>) - Method in interface berack96.lib.graph.Graph
+
+
This particular function add an edge to the graph.
+ If one of the two, or both vertices of the edge aren't contained in the graph, then the vertices will be added.
+ The edge will be created from the vertex source of the edge and the vertex destination of it
+ This method will overwrite any existing edge between the two vertex.
+ If there was a previous edge then it is returned
+
+
addEdgeAndVertices(V, V, W) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addEdgeAndVertices(Edge<V, W>) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addEdgeAndVertices(V, V, W) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addEdgeAndVertices(Edge<V, W>) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addEdgeAndVertices(V, V, W) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addEdgeAndVertices(Edge<V, W>) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addIfAbsent() - Method in class berack96.lib.graph.Vertex
+
+
Add the vertex to the graph only if it's not already in the graph.
+
+
addObserver(Observer) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
addVertex(V) - Method in interface berack96.lib.graph.Graph
+
+
Add the vertex to the graph.
+
+
addVertex(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addVertex(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addVertex(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
addVertex(Point, V) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
addVertexIfAbsent(V) - Method in interface berack96.lib.graph.Graph
+
+
Add the specified vertex to the graph only if the graph doesn't contains it.
+ The graph contains a vertex only if the method Graph.contains(Object) returns true.
+
+
addVertexIfAbsent(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
addVertexIfAbsent(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
addVertexIfAbsent(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
AdjGraph<V,W extends java.lang.Number> - Class in berack96.lib.graph.impl
+
 
+
AdjGraph() - Constructor for class berack96.lib.graph.impl.AdjGraph
+
 
+
Arrow - Class in berack96.lib.graph.view.stuff
+
+
Class that create a Polygon that has a shape of an arrow
+
+
Arrow(Point, Point, int, int) - Constructor for class berack96.lib.graph.view.stuff.Arrow
+
+
Create an arrow
+
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-10.html b/doc/index-files/index-10.html new file mode 100644 index 0000000..8aa5fe9 --- /dev/null +++ b/doc/index-files/index-10.html @@ -0,0 +1,145 @@ + + + + + +K-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

K

+
+
keyPressed(KeyEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
keyPressed(KeyEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
keyPressed(KeyEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
keyReleased(KeyEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
keyReleased(KeyEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
keyReleased(KeyEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
keyTyped(KeyEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
keyTyped(KeyEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
keyTyped(KeyEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-11.html b/doc/index-files/index-11.html new file mode 100644 index 0000000..d4cb0f8 --- /dev/null +++ b/doc/index-files/index-11.html @@ -0,0 +1,133 @@ + + + + + +L-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

L

+
+
load(Graph<V, W>, String, Class<V>, Class<W>) - Static method in interface berack96.lib.graph.Graph
+
+
Load an already saved graph in an instance of a graph.
+
+
load(String) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-12.html b/doc/index-files/index-12.html new file mode 100644 index 0000000..3f89ad4 --- /dev/null +++ b/doc/index-files/index-12.html @@ -0,0 +1,231 @@ + + + + + +M-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

M

+
+
Main - Class in berack96.lib.graph.view
+
 
+
Main() - Constructor for class berack96.lib.graph.view.Main
+
 
+
main(String[]) - Static method in class berack96.lib.graph.view.Main
+
 
+
MapGraph<V,W extends java.lang.Number> - Class in berack96.lib.graph.impl
+
+
Graph that uses HashMap for vertices and edges
+ More specifically it utilizes a Map containing all the vertices mapped to all their edges
+ Technically this version of the graph combine the fast adding/removing of the edges of the Matrix implementation, + with the low memory and fast adding/removing of vertices of the Linked List implementation.
+ This happen if the HashMap is not reallocated.
+
+
MapGraph() - Constructor for class berack96.lib.graph.impl.MapGraph
+
 
+
mark(V, Object) - Method in interface berack96.lib.graph.Graph
+
+
Add to the specified vertex the mark passed.
+ A vertex can have multiple marker.
+
+
mark(V, Object) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
mark(V, Object) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
mark(V, Object) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
mark - Variable in class berack96.lib.graph.models.MarkSaveStructure
+
 
+
mark(Object) - Method in class berack96.lib.graph.Vertex
+
+
Mark the vertex with the associated string
+
+
marks() - Method in interface berack96.lib.graph.Graph
+
+
Get all the marks of this graph.
+ Specifically it will return a collection of marks where every mark
+ as associated at least one vertex of the graph.
+ If the graph doesn't have vertex marked then it is returned an empty collection.
+
+
marks() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
marks() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
marks() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
MarkSaveStructure - Class in berack96.lib.graph.models
+
+
Support class used for saving a Graph in a file.
+
+
MarkSaveStructure() - Constructor for class berack96.lib.graph.models.MarkSaveStructure
+
 
+
MarkSaveStructure(String, Object) - Constructor for class berack96.lib.graph.models.MarkSaveStructure
+
 
+
MatrixGraph<V,W extends java.lang.Number> - Class in berack96.lib.graph.impl
+
 
+
MatrixGraph() - Constructor for class berack96.lib.graph.impl.MatrixGraph
+
 
+
modEdge(VertexComponent<V>, VertexComponent<V>, W) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
mouseClicked(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mouseClicked(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mouseClicked(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
mouseDragged(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mouseDragged(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mouseDragged(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
mouseEntered(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mouseEntered(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mouseEntered(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
mouseExited(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mouseExited(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mouseExited(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
mouseMoved(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mouseMoved(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mouseMoved(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
mousePressed(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mousePressed(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mousePressed(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
mouseReleased(MouseEvent) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
mouseReleased(MouseEvent) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
mouseReleased(MouseEvent) - Method in class berack96.lib.graph.view.VisitListener
+
 
+
moveVertex(VertexComponent<V>, Point) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-13.html b/doc/index-files/index-13.html new file mode 100644 index 0000000..3ff0492 --- /dev/null +++ b/doc/index-files/index-13.html @@ -0,0 +1,151 @@ + + + + + +N-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

N

+
+
NOT_CONNECTED - Static variable in interface berack96.lib.graph.Graph
+
 
+
NOT_DAG - Static variable in interface berack96.lib.graph.Graph
+
 
+
numberOfEdges() - Method in interface berack96.lib.graph.Graph
+
+
Tells how many edges are in the graph.
+
+
numberOfEdges() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
numberOfEdges() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
numberOfEdges() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
numberOfVertices() - Method in interface berack96.lib.graph.Graph
+
+
Tells how many vertices are in the graph.
+
+
numberOfVertices() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
numberOfVertices() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
numberOfVertices() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-14.html b/doc/index-files/index-14.html new file mode 100644 index 0000000..d4078f0 --- /dev/null +++ b/doc/index-files/index-14.html @@ -0,0 +1,129 @@ + + + + + +O-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

O

+
+
other - Variable in class berack96.lib.graph.models.GraphSaveStructure
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-15.html b/doc/index-files/index-15.html new file mode 100644 index 0000000..bec791b --- /dev/null +++ b/doc/index-files/index-15.html @@ -0,0 +1,143 @@ + + + + + +P-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

P

+
+
paint(Graphics2D, EdgeComponent<V, W>, Point) - Method in class berack96.lib.graph.view.edge.EdgeView
+
 
+
paint(Graphics2D, O, Point) - Method in interface berack96.lib.graph.view.GraphicalView
+
+
The paint function, aka the part where you can draw things (like Mesh)
+
+
paint(Graphics) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
paint(Graphics2D, VertexComponent<V>, Point) - Method in class berack96.lib.graph.view.vertex.VertexView
+
 
+
panel - Variable in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
PARAM_NULL - Static variable in interface berack96.lib.graph.Graph
+
 
+
parent - Variable in class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-16.html b/doc/index-files/index-16.html new file mode 100644 index 0000000..86e0c89 --- /dev/null +++ b/doc/index-files/index-16.html @@ -0,0 +1,233 @@ + + + + + +R-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

R

+
+
remove() - Method in class berack96.lib.graph.Vertex
+
+
Remove the vertex from the graph.
+ After this call all the other methods will throw an exception
+
+
remove() - Method in class berack96.lib.graph.view.edge.EdgeIntListener
+
 
+
remove() - Method in interface berack96.lib.graph.view.GraphListener
+
+
Remove the listener to the graph.
+
+
remove() - Method in class berack96.lib.graph.view.vertex.VertexIntListener
+
 
+
remove() - Method in class berack96.lib.graph.view.VisitListener
+
 
+
removeAllEdge(V) - Method in interface berack96.lib.graph.Graph
+
+
Remove all edges form a particular vertex of the graph.
+ After this method's call the selected vertex will have 0 edges.
+ It will be no longer possible to reach this vertex from any other vertex, and vice versa.
+
+
removeAllEdge() - Method in interface berack96.lib.graph.Graph
+
+
Remove all the edges of the graph.
+ After this method's call the graph will have only vertices, and no edge.
+
+
removeAllEdge(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeAllEdge() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeAllEdge(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeAllEdge() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeAllEdge(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeAllEdge() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeAllInEdge(V) - Method in interface berack96.lib.graph.Graph
+
+
Remove all the edges that goes in the vertex.
+ After this method's call it will be no longer possible travel to this vertex.
+
+
removeAllInEdge(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeAllInEdge(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeAllInEdge(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeAllOutEdge(V) - Method in interface berack96.lib.graph.Graph
+
+
Remove all the edges that start from this vertex.
+ After this method's call it will be no longer possible travel to any vertex from this one.
+
+
removeAllOutEdge(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeAllOutEdge(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeAllOutEdge(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeAllVertex() - Method in interface berack96.lib.graph.Graph
+
+
Remove all the vertex contained in the graph.
+ After this method's call the graph will be empty; no vertices nor edges.
+
+
removeAllVertex() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeAllVertex() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeAllVertex() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeChild(V) - Method in class berack96.lib.graph.Vertex
+
+
Removes a child of this vertex.
+
+
REMOVED - Static variable in class berack96.lib.graph.Vertex
+
 
+
removeEdge(V, V) - Method in interface berack96.lib.graph.Graph
+
+
Remove the edge between the two vertex.
+ If the edge doesn't exist, then this call does nothing.
+ After this method's call it will be no longer possible to travel from V1 to V2, nether from V2 to V1.
+
+
removeEdge(V, V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeEdge(V, V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeEdge(V, V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeEdge(VertexComponent<V>, VertexComponent<V>) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
removeObserver(Observer) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
removeVertex(V) - Method in interface berack96.lib.graph.Graph
+
+
Remove the selected vertex from the graph.
+ After this method's call the vertex will be no longer present in the graph, and nether all his edges.
+
+
removeVertex(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
removeVertex(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
removeVertex(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
removeVertex(Point) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-17.html b/doc/index-files/index-17.html new file mode 100644 index 0000000..42f3b33 --- /dev/null +++ b/doc/index-files/index-17.html @@ -0,0 +1,192 @@ + + + + + +S-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

S

+
+
save(Graph<?, ?>, String) - Static method in interface berack96.lib.graph.Graph
+
+
Save the Graph passed as input to a file inserted as parameter.
+ The resulting file is a Json string representing all the graph.
+ If the directory for getting through the file do not exist,
+ then it is created.
+ For now the marks are not included.
+
+
save(Graph<?, ?>, String, String) - Static method in interface berack96.lib.graph.Graph
+
+
Save the Graph passed as input to a file inserted as parameter.
+ The resulting file is a Json string representing all the graph.
+ If the directory for getting through the file do not exist,
+ then it is created.
+ For now the marks are not included.
+ The additional parameter is used if you want to save other as well as the graph.
+
+
save(String) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
setBounds(int, int, int, int) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
setGraphListener(GraphListener) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
source - Variable in class berack96.lib.graph.view.edge.EdgeComponent
+
 
+
src - Variable in class berack96.lib.graph.models.EdgeSaveStructure
+
 
+
stronglyConnectedComponents() - Method in interface berack96.lib.graph.Graph
+
+
The strongly connected components or disconnected components of an arbitrary directed graph + form a partition into subgraphs that are themselves strongly connected.
+
+
stronglyConnectedComponents() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
stronglyConnectedComponents() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
stronglyConnectedComponents() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
subGraph(V, int) - Method in interface berack96.lib.graph.Graph
+
+
Get a sub-graph of the current one based on the maximum depth that is given.
+ If the depth is 1 then only the source and it's children will be in the sub-graph.
+ If the depth is 2 then only the source, it's children and it's children of it's children will be in the sub-graph.
+ And so on.
+ Of course the sub-graph will contain the edges that link the vertices, but only the one selected.
+
+
subGraph(Object...) - Method in interface berack96.lib.graph.Graph
+
+
Get a sub-graph of the current one with only the vertex marked with the selected markers.
+ Each vertex will have all his edges, but only the ones with the destination marked with the same marker.
+ If the marker is not specified or is null then the returning graph will have all the vertices that are not marked by any marker.
+ If the graph doesn't contain any vertex with that marker then an empty graph is returned.
+
+
subGraph(V, int) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
subGraph(Object...) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
subGraph(V, int) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
subGraph(Object...) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
subGraph(V, int) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
subGraph(Object...) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-18.html b/doc/index-files/index-18.html new file mode 100644 index 0000000..d45cc40 --- /dev/null +++ b/doc/index-files/index-18.html @@ -0,0 +1,170 @@ + + + + + +T-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

T

+
+
Tarjan<V,W extends java.lang.Number> - Class in berack96.lib.graph.visit.impl
+
+
Class that implements the Tarjan algorithm and uses it for getting the SCC and the topological sort
+
+
Tarjan() - Constructor for class berack96.lib.graph.visit.impl.Tarjan
+
 
+
timeDiscovered - Variable in class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
+
 
+
timeVisited - Variable in class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
+
 
+
topologicalSort() - Method in interface berack96.lib.graph.Graph
+
+
If the current graph is a DAG, it returns a topological sort of this graph.
+ A topological ordering of a graph is a linear ordering of its vertices such that for + every directed edge (V1, V2) from vertex V1 to vertex V2, V2 comes before V1 in the ordering.
+
+
topologicalSort() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
topologicalSort() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
topologicalSort() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
toString() - Method in class berack96.lib.graph.Edge
+
 
+
toString() - Method in class berack96.lib.graph.Vertex
+
 
+
toString() - Method in class berack96.lib.graph.view.vertex.VertexComponent
+
 
+
toString() - Method in class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
+
 
+
transpose() - Method in interface berack96.lib.graph.Graph
+
+
This method will create a new Graph that is the transposed version of the original.
+ At the end of this method the new graph will have all the edges inverted in orientation.
+ Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges.
+
+
transpose() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
transpose() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
transpose() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-19.html b/doc/index-files/index-19.html new file mode 100644 index 0000000..873fe3c --- /dev/null +++ b/doc/index-files/index-19.html @@ -0,0 +1,177 @@ + + + + + +U-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

U

+
+
unMark(V, Object) - Method in interface berack96.lib.graph.Graph
+
+
Remove the selected mark from the vertex.
+
+
unMark(V) - Method in interface berack96.lib.graph.Graph
+
+
Unmark the vertex selected.
+ After this call the vertex will not have any marked object to himself.
+
+
unMark(V, Object) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
unMark(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
unMark(V, Object) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
unMark(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
unMark(V, Object) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
unMark(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
unMark(Object) - Method in class berack96.lib.graph.Vertex
+
+
Remove the specified mark from this vertex
+
+
unMark() - Method in class berack96.lib.graph.Vertex
+
+
Remove all the marker from the vertex
+
+
unMarkAll(Object) - Method in interface berack96.lib.graph.Graph
+
+
Remove the selected mark from all the vertices
+
+
unMarkAll() - Method in interface berack96.lib.graph.Graph
+
+
Remove all the marker to all the vertex.
+ After this call the Graph.getMarks(Object) applied to any vertex will return an empty set
+
+
unMarkAll(Object) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
unMarkAll() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
unMarkAll(Object) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
unMarkAll() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
unMarkAll(Object) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
unMarkAll() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-2.html b/doc/index-files/index-2.html new file mode 100644 index 0000000..fb2586d --- /dev/null +++ b/doc/index-files/index-2.html @@ -0,0 +1,164 @@ + + + + + +B-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

B

+
+
berack96.lib.graph - package berack96.lib.graph
+
 
+
berack96.lib.graph.impl - package berack96.lib.graph.impl
+
 
+
berack96.lib.graph.models - package berack96.lib.graph.models
+
 
+
berack96.lib.graph.view - package berack96.lib.graph.view
+
 
+
berack96.lib.graph.view.edge - package berack96.lib.graph.view.edge
+
 
+
berack96.lib.graph.view.stuff - package berack96.lib.graph.view.stuff
+
 
+
berack96.lib.graph.view.vertex - package berack96.lib.graph.view.vertex
+
 
+
berack96.lib.graph.visit - package berack96.lib.graph.visit
+
 
+
berack96.lib.graph.visit.impl - package berack96.lib.graph.visit.impl
+
 
+
BFS<V,W extends java.lang.Number> - Class in berack96.lib.graph.visit.impl
+
+
Breadth-first search
+ The algorithm starts at the root node and explores all of the neighbor nodes at the present depth prior to moving on to the nodes at the next depth level.
+
+
BFS() - Constructor for class berack96.lib.graph.visit.impl.BFS
+
 
+
buildEdgeFrom(String) - Method in class berack96.lib.graph.view.edge.EdgeIntListener
+
 
+
buildEdgeFrom(String) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
buildNewEdge(Vertex<V>, Vertex<V>) - Method in class berack96.lib.graph.view.edge.EdgeIntListener
+
 
+
buildNewEdge(Vertex<V>, Vertex<V>) - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
buildNewVertex(Graph<Integer, ?>) - Method in class berack96.lib.graph.view.vertex.VertexIntListener
+
 
+
buildNewVertex(Graph<V, ?>) - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-20.html b/doc/index-files/index-20.html new file mode 100644 index 0000000..efce4bd --- /dev/null +++ b/doc/index-files/index-20.html @@ -0,0 +1,247 @@ + + + + + +V-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

V

+
+
vert - Variable in class berack96.lib.graph.models.MarkSaveStructure
+
 
+
Vertex<V> - Class in berack96.lib.graph
+
+
Class used for represent a vertex of the graph.
+ The vertex contained is linked with the graph, so if any changes are made to + it, then they will be reflected here.
+
+
Vertex(Graph<V, ?>, V) - Constructor for class berack96.lib.graph.Vertex
+
+
Get a Vertex linked with the graph
+
+
vertex - Variable in class berack96.lib.graph.view.vertex.VertexComponent
+
 
+
vertex - Variable in class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
+
 
+
VERTEX_NOT_CONTAINED - Static variable in interface berack96.lib.graph.Graph
+
 
+
VertexComponent<V> - Class in berack96.lib.graph.view.vertex
+
 
+
VertexComponent(Vertex<V>) - Constructor for class berack96.lib.graph.view.vertex.VertexComponent
+
 
+
VertexIntListener - Class in berack96.lib.graph.view.vertex
+
 
+
VertexIntListener(GraphPanel<Integer, ?>) - Constructor for class berack96.lib.graph.view.vertex.VertexIntListener
+
 
+
VertexListener<V> - Class in berack96.lib.graph.view.vertex
+
 
+
VertexListener(GraphPanel<V, ?>) - Constructor for class berack96.lib.graph.view.vertex.VertexListener
+
 
+
VertexView<V> - Class in berack96.lib.graph.view.vertex
+
 
+
VertexView() - Constructor for class berack96.lib.graph.view.vertex.VertexView
+
 
+
vertices() - Method in interface berack96.lib.graph.Graph
+
+
Get all the vertices in the graph.
+ If the graph doesn't contains vertices, it'll return an empty collection.
+ Note: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
vertices() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
vertices() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
vertices() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
vertices - Variable in class berack96.lib.graph.models.GraphSaveStructure
+
 
+
visit(V, VisitStrategy<V, W>, Consumer<V>) - Method in interface berack96.lib.graph.Graph
+
+
Visit the graph accordingly to the strategy that is passed.
+ This method visit the graph from the source to all the vertex that are reachable form the source.
+ Some strategy can accept a source vertex null, because they visit all the graph anyway.
+
+
visit(V, VisitStrategy<V, W>, Consumer<V>) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
visit(V, VisitStrategy<V, W>, Consumer<V>) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
visit(V, VisitStrategy<V, W>, Consumer<V>) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
visit(VisitStrategy, Consumer<V>) - Method in class berack96.lib.graph.Vertex
+
+
Visit the graph from this current vertex with the strategy assigned
+
+
visit(Graph<V, W>, V, Consumer<V>) - Method in class berack96.lib.graph.visit.impl.BFS
+
 
+
visit(Graph<V, W>, V, Consumer<V>) - Method in class berack96.lib.graph.visit.impl.DFS
+
 
+
visit(Graph<V, W>, V, Consumer<V>) - Method in class berack96.lib.graph.visit.impl.Dijkstra
+
 
+
visit(Graph<V, W>, V, Consumer<V>) - Method in class berack96.lib.graph.visit.impl.Tarjan
+
+
This particular visit strategy use only the graph and the visit, so the source param is not needed.
+
+
visit(Graph<V, W>, V, Consumer<V>) - Method in interface berack96.lib.graph.visit.VisitStrategy
+
+
With this the graph will be visited accordingly to the strategy of the visit.
+ Some strategy can accept a source vertex null, because they visit all the graph anyway.
+ If you want to stop the visit of the graph, you just have to throw any exception in the visit function, but be sure to catch it
+
+
VisitDistance<V,W extends java.lang.Number> - Interface in berack96.lib.graph.visit
+
+
Interface that is helpful for implements visit that needs to retrieve the distance between a vertex to all the others
+
+
VisitDistSourceDest<V,W extends java.lang.Number> - Interface in berack96.lib.graph.visit
+
+
Interface that is helpful for implements visit that needs to retrieve the distance between a vertex to all the others
+
+
VisitInfo<V> - Class in berack96.lib.graph.visit.impl
+
+
The class used for getting the info of the visit.
+ It could be used with the algorithm of the visit for set some useful data.
+
+
VisitInfo(V) - Constructor for class berack96.lib.graph.visit.impl.VisitInfo
+
+
Need a source for initialize the basic values
+
+
VisitInfo.VertexInfo - Class in berack96.lib.graph.visit.impl
+
+
Class used mainly for storing the data of the visit
+
+
VisitListener<V> - Class in berack96.lib.graph.view
+
 
+
VisitListener(GraphPanel<V, ?>, VisitStrategy<V, ?>) - Constructor for class berack96.lib.graph.view.VisitListener
+
 
+
visitRefresh(int) - Method in class berack96.lib.graph.view.GraphWindow
+
 
+
VisitSCC<V,W extends java.lang.Number> - Interface in berack96.lib.graph.visit
+
+
Interface that is helpful for implements visit that needs to retrieve the SCC
+
+
VisitStrategy<V,W extends java.lang.Number> - Interface in berack96.lib.graph.visit
+
+
This class is used for define some strategy for the visit of a graph.
+
+
VisitTopological<V,W extends java.lang.Number> - Interface in berack96.lib.graph.visit
+
+
Interface that is helpful for implements visit that needs to retrieve the topological sort
+
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-21.html b/doc/index-files/index-21.html new file mode 100644 index 0000000..2ad888a --- /dev/null +++ b/doc/index-files/index-21.html @@ -0,0 +1,131 @@ + + + + + +W-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

W

+
+
weight - Variable in class berack96.lib.graph.models.EdgeSaveStructure
+
 
+
weight - Variable in class berack96.lib.graph.view.edge.EdgeComponent
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-3.html b/doc/index-files/index-3.html new file mode 100644 index 0000000..1e916aa --- /dev/null +++ b/doc/index-files/index-3.html @@ -0,0 +1,155 @@ + + + + + +C-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

C

+
+
changeRefresh(int) - Static method in class berack96.lib.graph.view.VisitListener
+
 
+
compareTo(VisitInfo<V>.VertexInfo) - Method in class berack96.lib.graph.visit.impl.VisitInfo.VertexInfo
+
 
+
contains(V) - Method in interface berack96.lib.graph.Graph
+
+
Check if the vertex passed is contained in the graph or not.
+ The vertex V1 is contained in the graph G, if and only if:
+ exist V2 in G such that V2.equals(V1)
+
+
contains(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
contains(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
contains(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
containsEdge(V, V) - Method in interface berack96.lib.graph.Graph
+
+
Check if the edge between the two vertex passed is contained in the graph or not.
+ An edge between V1 and V2 is contained in the graph if and only if i can travel from V1 to V2.
+ If one of the two vertices is not contained in the graph, then even the edge isn't
+
+
containsEdge(V, V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
containsEdge(V, V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
containsEdge(V, V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-4.html b/doc/index-files/index-4.html new file mode 100644 index 0000000..b13e041 --- /dev/null +++ b/doc/index-files/index-4.html @@ -0,0 +1,204 @@ + + + + + +D-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

D

+
+
degree(V) - Method in interface berack96.lib.graph.Graph
+
+
Tells the degree of a vertex.
+ The degree of a vertex is the quantity of edges that have.
+ Basically, it'll count how many edge it have.
+
+
degree(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
degree(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
degree(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
degreeIn(V) - Method in interface berack96.lib.graph.Graph
+
+
Tells the degree of all the edges that goes to this vertex.
+ Basically, it'll count how many edge towards himself it have.
+
+
degreeIn(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
degreeIn(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
degreeIn(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
degreeOut(V) - Method in interface berack96.lib.graph.Graph
+
+
Tells the degree of all the edges that goes form this vertex to others.
+ Basically, it'll count how many edge towards any other vertex it have.
+
+
degreeOut(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
degreeOut(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
degreeOut(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
dest - Variable in class berack96.lib.graph.models.EdgeSaveStructure
+
 
+
destination - Variable in class berack96.lib.graph.view.edge.EdgeComponent
+
 
+
DFS<V,W extends java.lang.Number> - Class in berack96.lib.graph.visit.impl
+
+
Depth-first search
+ The algorithm starts at the root node and explores as far as possible along each branch before backtracking.
+
+
DFS() - Constructor for class berack96.lib.graph.visit.impl.DFS
+
 
+
Dijkstra<V,W extends java.lang.Number> - Class in berack96.lib.graph.visit.impl
+
+
Class that implements the Dijkstra algorithm and uses it for getting all the distance from a source
+
+
Dijkstra() - Constructor for class berack96.lib.graph.visit.impl.Dijkstra
+
 
+
distance(V, V) - Method in interface berack96.lib.graph.Graph
+
+
Get the minimum path from the source vertex to the destination vertex.
+ If the source vertex can't reach the destination, then an exception is thrown.
+
+
distance(V) - Method in interface berack96.lib.graph.Graph
+
+
Get the minimum path from the source vertex to all the possible reachable vertices.
+
+
distance(V, V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
distance(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
distance(V, V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
distance(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
distance(V, V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
distance(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
distance(Graph<V, W>, V, V) - Method in interface berack96.lib.graph.visit.VisitDistSourceDest
+
+
Get the distance from the source to the destination
+ The list contains the minimum path from the vertex marked as source to the destination vertex
+
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-5.html b/doc/index-files/index-5.html new file mode 100644 index 0000000..9c1e9f3 --- /dev/null +++ b/doc/index-files/index-5.html @@ -0,0 +1,195 @@ + + + + + +E-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

E

+
+
Edge<V,W extends java.lang.Number> - Class in berack96.lib.graph
+
+
Class used for retrieving the edges of the graph.
+
+
Edge(V, V, W) - Constructor for class berack96.lib.graph.Edge
+
+
Create an final version of this object
+
+
edge - Variable in class berack96.lib.graph.view.edge.EdgeComponent
+
 
+
EdgeComponent<V,W extends java.lang.Number> - Class in berack96.lib.graph.view.edge
+
 
+
EdgeComponent(VertexComponent<V>, VertexComponent<V>, W) - Constructor for class berack96.lib.graph.view.edge.EdgeComponent
+
 
+
EdgeIntListener<V> - Class in berack96.lib.graph.view.edge
+
 
+
EdgeIntListener(GraphPanel<V, Integer>) - Constructor for class berack96.lib.graph.view.edge.EdgeIntListener
+
 
+
EdgeListener<V,W extends java.lang.Number> - Class in berack96.lib.graph.view.edge
+
 
+
EdgeListener(GraphPanel<V, W>) - Constructor for class berack96.lib.graph.view.edge.EdgeListener
+
 
+
edges() - Method in interface berack96.lib.graph.Graph
+
+
Get all the edges in the graph.
+ If the graph doesn't contains edges, it'll return an empty collection.
+ Note: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
edges() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
edges() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
edges() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
edges - Variable in class berack96.lib.graph.models.GraphSaveStructure
+
 
+
EdgeSaveStructure - Class in berack96.lib.graph.models
+
+
Support class used for saving a Graph in a file.
+
+
EdgeSaveStructure() - Constructor for class berack96.lib.graph.models.EdgeSaveStructure
+
 
+
EdgeSaveStructure(String, String, String) - Constructor for class berack96.lib.graph.models.EdgeSaveStructure
+
 
+
edgesOf(V) - Method in interface berack96.lib.graph.Graph
+
+
Retrieve all the edges of a particular vertex.
+ Note: the edges that are returned are the one that goes IN this vertex AND the edges that goes OUT of it.
+ Note2: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
edgesOf(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
edgesOf(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
edgesOf(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
EdgeView<V,W extends java.lang.Number> - Class in berack96.lib.graph.view.edge
+
 
+
EdgeView() - Constructor for class berack96.lib.graph.view.edge.EdgeView
+
 
+
equals(Object) - Method in class berack96.lib.graph.Edge
+
 
+
equals(Object) - Method in class berack96.lib.graph.Vertex
+
 
+
equals(Object) - Method in class berack96.lib.graph.view.vertex.VertexComponent
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-6.html b/doc/index-files/index-6.html new file mode 100644 index 0000000..9261e9a --- /dev/null +++ b/doc/index-files/index-6.html @@ -0,0 +1,142 @@ + + + + + +F-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

F

+
+
forEach(Consumer<VisitInfo<V>.VertexInfo>) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Iterate through all the vertices discovered and visited with the correct timeline.
+ The vertices will be visited in the order that they are discovered and visited, so a vertex can appear two times (one for the discovery, anc the other for the visit)
+
+
forEachDiscovered(Consumer<VisitInfo<V>.VertexInfo>) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Iterate through all the vertices that are discovered.
+ The vertices will be ordered by the time of their discover.
+
+
forEachVisited(Consumer<VisitInfo<V>.VertexInfo>) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Iterate through all the vertices that are visited.
+ The vertices will be ordered by the time of their visit.
+
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-7.html b/doc/index-files/index-7.html new file mode 100644 index 0000000..d556fa3 --- /dev/null +++ b/doc/index-files/index-7.html @@ -0,0 +1,398 @@ + + + + + +G-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

G

+
+
getAncestors(V) - Method in interface berack96.lib.graph.Graph
+
+
Get all the vertices that have the vertex passed as their child.
+ Basically is the opposite of Graph.getChildren(Object)
+ Note: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
getAncestors(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getAncestors(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getAncestors(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getAncestors() - Method in class berack96.lib.graph.Vertex
+
+
Get all the vertex ancestor of this vertex.
+ The ancestors are all the vertices that have as destination this vertex.
+
+
getAncestorsAsVertex() - Method in class berack96.lib.graph.Vertex
+
+
Get all the ancestors of this vertex like Vertex.getAncestors(), but as Vertex.
+ In this way they are linked to the graph as this one.
+ This method allocate a new object for each vertex, so it is more heavy.
+
+
getBox(EdgeComponent<V, W>, Point) - Method in class berack96.lib.graph.view.edge.EdgeView
+
 
+
getBox(O, Point) - Method in interface berack96.lib.graph.view.GraphicalView
+
+
Box where the object is sensible at listeners (like Hitbox)
+
+
getBox(VertexComponent<V>, Point) - Method in class berack96.lib.graph.view.vertex.VertexView
+
 
+
getChildren(V) - Method in interface berack96.lib.graph.Graph
+
+
Get all the vertices that are children of the vertex passed as parameter.
+ The vertices V(0-N) that are 'children' of a vertex V1, are all the vertices that have an edge + where V1 is the source of that edge.
+ Note: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
getChildren(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getChildren(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getChildren(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getChildren() - Method in class berack96.lib.graph.Vertex
+
+
Get all the vertex children of the current vertex
+
+
getChildrenAsVertex() - Method in class berack96.lib.graph.Vertex
+
+
Get all the children of this vertex like Vertex.getChildren(), but as Vertex.
+ In this way they are linked to the graph as this one.
+ * This method allocate a new object for each vertex, so it is more heavy.
+
+
getDescription() - Method in class berack96.lib.graph.view.edge.EdgeListener
+
 
+
getDescription() - Method in interface berack96.lib.graph.view.GraphListener
+
+
Get the description of this listener, in a way to interact with the user.
+
+
getDescription() - Method in class berack96.lib.graph.view.vertex.VertexListener
+
 
+
getDescription() - Method in class berack96.lib.graph.view.VisitListener
+
 
+
getDestination() - Method in class berack96.lib.graph.Edge
+
+
The vertex where the edge goes
+
+
getDiscovered() - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Get all the discovered vertices so far.
+
+
getEdgeAt(Point) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
getEdgesIn(V) - Method in interface berack96.lib.graph.Graph
+
+
Retrieve all the edges of a particular vertex.
+ Note: the edges that are returned are the one that have this vertex as destination and another as source.
+ Note2: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
getEdgesIn(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getEdgesIn(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getEdgesIn(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getEdgesIn() - Method in class berack96.lib.graph.Vertex
+
+
Get all the edge that goes INTO this vertex
+
+
getEdgesOut(V) - Method in interface berack96.lib.graph.Graph
+
+
Retrieve all the edges that goes OUT of a particular vertex.
+ Note: the edges that are returned are the one that have this vertex as source and another one as destination.
+ Note2: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
getEdgesOut(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getEdgesOut(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getEdgesOut(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getEdgesOut() - Method in class berack96.lib.graph.Vertex
+
+
Get all the edge that goes OUT of this vertex
+
+
getGraph() - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
getGraphPanel() - Method in class berack96.lib.graph.view.GraphWindow
+
 
+
getLastDistance() - Method in class berack96.lib.graph.visit.impl.Dijkstra
+
 
+
getLastDistance() - Method in interface berack96.lib.graph.visit.VisitDistance
+
+
Get the last calculated distance to all the possible destinations
+ The map contains all the possible vertices that are reachable from the source set in the visit
+ If there is no path between the destination and the source, then null is returned as accordingly to the map interface
+ If the visit is not already been done, then the map is null.
+
+
getLastSource() - Method in class berack96.lib.graph.visit.impl.Dijkstra
+
 
+
getLastSource() - Method in interface berack96.lib.graph.visit.VisitDistance
+
+
Get the last source vertex of the visit for calculating the destinations.
+ Returns null if the visit is not already been done
+
+
getMarkedWith(Object) - Method in interface berack96.lib.graph.Graph
+
+
Get all the vertices that are marked with the specific mark passed.
+ If there aren't vertices with that mark then it is returned an empty set.
+ Note: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
getMarkedWith(Object) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getMarkedWith(Object) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getMarkedWith(Object) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getMarks(V) - Method in interface berack96.lib.graph.Graph
+
+
Get all the marker of this vertex.
+ If the vertex doesn't have any mark, then it will return an empty set.
+ Note: depending on the implementation, modifying the returned collection
+ could affect the graph behavior and the changes could be reflected to the graph.
+
+
getMarks(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getMarks(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getMarks(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getMarks() - Method in class berack96.lib.graph.Vertex
+
+
Get all the marks that are associated with this vertex
+
+
getParentOf(V) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Get the parent of a particular vertex.
+ The parent of a vertex is the one that has discovered it
+ If the vertex has no parent (it has not been set by the visit algorithm or it's the source) then null is returned.
+
+
getSCC() - Method in class berack96.lib.graph.visit.impl.Tarjan
+
 
+
getSCC() - Method in interface berack96.lib.graph.visit.VisitSCC
+
+
Return the latest calculated strongly connected components of the graph.
+
+
getSource() - Method in class berack96.lib.graph.Edge
+
+
The vertex where the edge starts from
+
+
getSource() - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Get the source of the visit.
+
+
getTimeDiscover(V) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
The time of the vertex when it is discovered in the visit.
+ For "discovered" i mean when the node is first found by the visit algorithm.
+
+
getTimeVisit(V) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
The time when the vertex is visited by the algorithm
+ For "visited" i mean when the node is finally visited by the visit algorithm.
+
+
getTopologicalSort() - Method in class berack96.lib.graph.visit.impl.Tarjan
+
 
+
getTopologicalSort() - Method in interface berack96.lib.graph.visit.VisitTopological
+
+
Return the latest calculated Topological sort of the graph.
+ If the latest visited graph is not a DAG, it will return null.
+
+
getValue() - Method in class berack96.lib.graph.Vertex
+
+
Get the vertex
+
+
getVertex(V) - Method in interface berack96.lib.graph.Graph
+
+
Get an instance of the vertex linked with this graph.
+ For more info see Vertex
+
+
getVertex(V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getVertex(V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getVertex(V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
getVertexAt(Point) - Method in class berack96.lib.graph.view.GraphPanel
+
 
+
getVisited() - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Get all the visited vertices so far.
+
+
getWeight() - Method in class berack96.lib.graph.Edge
+
+
The weight of the edge
+
+
getWeight(V, V) - Method in interface berack96.lib.graph.Graph
+
+
Get the weight of the selected edge.
+ If the edge doesn't exist, then null is returned
+
+
getWeight(V, V) - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
getWeight(V, V) - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
getWeight(V, V) - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
Graph<V,W extends java.lang.Number> - Interface in berack96.lib.graph
+
+
An interface for the graphs.
+ This interface is used for the graphs with Directed edges.
+ A directed edge between V1 and V2 is an edge that has V1 as source and V2 as destination.
+
+
GraphicalView<O> - Interface in berack96.lib.graph.view
+
+
An interface for divide the "hitbox" and the "paint" of the various items
+
+
GraphInfo<V,W extends java.lang.Number> - Class in berack96.lib.graph.view
+
 
+
GraphInfo(GraphPanel<V, W>, VertexListener<V>, EdgeListener<V, W>, Set<VisitStrategy<V, W>>) - Constructor for class berack96.lib.graph.view.GraphInfo
+
 
+
GraphListener - Interface in berack96.lib.graph.view
+
+
An interface for creating a listener of the Graph.
+
+
GraphPanel<V,W extends java.lang.Number> - Class in berack96.lib.graph.view
+
 
+
GraphPanel(GraphicalView<VertexComponent<V>>, GraphicalView<EdgeComponent<V, W>>, Class<V>, Class<W>) - Constructor for class berack96.lib.graph.view.GraphPanel
+
 
+
GraphSaveStructure - Class in berack96.lib.graph.models
+
+
Support class used for saving a Graph in a file.
+
+
GraphSaveStructure() - Constructor for class berack96.lib.graph.models.GraphSaveStructure
+
 
+
GraphSaveStructure(Graph<?, ?>, String) - Constructor for class berack96.lib.graph.models.GraphSaveStructure
+
 
+
GraphWindow<V,W extends java.lang.Number> - Class in berack96.lib.graph.view
+
+
This class is the Window that appear for building the graph and playing around with it
+
+
GraphWindow(GraphPanel<V, W>, VertexListener<V>, EdgeListener<V, W>) - Constructor for class berack96.lib.graph.view.GraphWindow
+
 
+
GSON - Static variable in interface berack96.lib.graph.Graph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-8.html b/doc/index-files/index-8.html new file mode 100644 index 0000000..60c9e08 --- /dev/null +++ b/doc/index-files/index-8.html @@ -0,0 +1,131 @@ + + + + + +H-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

H

+
+
hashCode() - Method in class berack96.lib.graph.Edge
+
 
+
hashCode() - Method in class berack96.lib.graph.Vertex
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index-files/index-9.html b/doc/index-files/index-9.html new file mode 100644 index 0000000..afa50b4 --- /dev/null +++ b/doc/index-files/index-9.html @@ -0,0 +1,169 @@ + + + + + +I-Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D E F G H I K L M N O P R S T U V W  + + +

I

+
+
isCyclic() - Method in interface berack96.lib.graph.Graph
+
+
Tells if the graph has some cycle.
+ A cycle is detected if visiting the graph G starting from V1 (that is any of the vertex of G), + the visit can return to V1 in any point.
+
+
isCyclic() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
isCyclic() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
isCyclic() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
isDAG() - Method in interface berack96.lib.graph.Graph
+
+
Tells if the graph has the property of DAG (Directed Acyclic Graph).
+ A graph is a DAG only if absent of any cycle.
+
+
isDAG() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
isDAG() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
isDAG() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
isDiscovered(V) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Tells if a vertex is discovered or not
+
+
isStillContained() - Method in class berack96.lib.graph.Vertex
+
+
This call tell if the current vertex is still contained in the graph linked.
+ While this function return false all the other methods will throw an exception.
+
+
isVisited(V) - Method in class berack96.lib.graph.visit.impl.VisitInfo
+
+
Tells if the vertex is visited or not
+
+
iterator() - Method in class berack96.lib.graph.impl.AdjGraph
+
 
+
iterator() - Method in class berack96.lib.graph.impl.MapGraph
+
 
+
iterator() - Method in class berack96.lib.graph.impl.MatrixGraph
+
 
+
+A B C D E F G H I K L M N O P R S T U V W 
+ +
+ + + + + + + +
+ + + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..d281a8d --- /dev/null +++ b/doc/index.html @@ -0,0 +1,75 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> + + + diff --git a/doc/overview-frame.html b/doc/overview-frame.html new file mode 100644 index 0000000..5f395af --- /dev/null +++ b/doc/overview-frame.html @@ -0,0 +1,29 @@ + + + + + +Overview List + + + + + + + +

 

+ + diff --git a/doc/overview-summary.html b/doc/overview-summary.html new file mode 100644 index 0000000..16513f3 --- /dev/null +++ b/doc/overview-summary.html @@ -0,0 +1,167 @@ + + + + + +Overview + + + + + + + + +
+ + + + + + + +
+ + + + +
+ + + + + + + +
+ + + + diff --git a/doc/overview-tree.html b/doc/overview-tree.html new file mode 100644 index 0000000..6e161c0 --- /dev/null +++ b/doc/overview-tree.html @@ -0,0 +1,247 @@ + + + + + +Class Hierarchy + + + + + + + + +
+ + + + + + + +
+ + + +
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • berack96.lib.graph.impl.AdjGraph<V,W> (implements berack96.lib.graph.Graph<V,W>)
    • +
    • berack96.lib.graph.visit.impl.BFS<V,W> (implements berack96.lib.graph.visit.VisitStrategy<V,W>)
    • +
    • java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable) +
        +
      • java.awt.Container +
          +
        • javax.swing.JComponent (implements java.io.Serializable) +
            +
          • javax.swing.JPanel (implements javax.accessibility.Accessible) + +
          • +
          +
        • +
        • java.awt.Window (implements javax.accessibility.Accessible) +
            +
          • java.awt.Frame (implements java.awt.MenuContainer) +
              +
            • javax.swing.JFrame (implements javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants) + +
            • +
            +
          • +
          +
        • +
        +
      • +
      • berack96.lib.graph.view.edge.EdgeComponent<V,W>
      • +
      • berack96.lib.graph.view.GraphPanel<V,W>
      • +
      • berack96.lib.graph.view.vertex.VertexComponent<V>
      • +
      +
    • +
    • berack96.lib.graph.visit.impl.DFS<V,W> (implements berack96.lib.graph.visit.VisitStrategy<V,W>)
    • +
    • berack96.lib.graph.visit.impl.Dijkstra<V,W> (implements berack96.lib.graph.visit.VisitDistance<V,W>)
    • +
    • berack96.lib.graph.Edge<V,W>
    • +
    • berack96.lib.graph.view.edge.EdgeListener<V,W> (implements berack96.lib.graph.view.GraphListener) + +
    • +
    • berack96.lib.graph.models.EdgeSaveStructure
    • +
    • berack96.lib.graph.view.edge.EdgeView<V,W> (implements berack96.lib.graph.view.GraphicalView<O>)
    • +
    • berack96.lib.graph.models.GraphSaveStructure
    • +
    • berack96.lib.graph.view.Main
    • +
    • berack96.lib.graph.impl.MapGraph<V,W> (implements berack96.lib.graph.Graph<V,W>)
    • +
    • berack96.lib.graph.models.MarkSaveStructure
    • +
    • berack96.lib.graph.impl.MatrixGraph<V,W> (implements berack96.lib.graph.Graph<V,W>)
    • +
    • java.awt.Polygon (implements java.io.Serializable, java.awt.Shape) +
        +
      • berack96.lib.graph.view.stuff.Arrow
      • +
      +
    • +
    • berack96.lib.graph.visit.impl.Tarjan<V,W> (implements berack96.lib.graph.visit.VisitSCC<V,W>, berack96.lib.graph.visit.VisitTopological<V,W>)
    • +
    • berack96.lib.graph.Vertex<V>
    • +
    • berack96.lib.graph.view.vertex.VertexListener<V> (implements berack96.lib.graph.view.GraphListener) + +
    • +
    • berack96.lib.graph.view.vertex.VertexView<V> (implements berack96.lib.graph.view.GraphicalView<O>)
    • +
    • berack96.lib.graph.visit.impl.VisitInfo<V>
    • +
    • berack96.lib.graph.visit.impl.VisitInfo.VertexInfo (implements java.lang.Comparable<T>)
    • +
    • berack96.lib.graph.view.VisitListener<V> (implements berack96.lib.graph.view.GraphListener)
    • +
    +
  • +
+

Interface Hierarchy

+
    +
  • java.util.EventListener +
      +
    • berack96.lib.graph.view.GraphListener (also extends java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener)
    • +
    • java.awt.event.KeyListener +
        +
      • berack96.lib.graph.view.GraphListener (also extends java.awt.event.MouseListener, java.awt.event.MouseMotionListener)
      • +
      +
    • +
    • java.awt.event.MouseListener +
        +
      • berack96.lib.graph.view.GraphListener (also extends java.awt.event.KeyListener, java.awt.event.MouseMotionListener)
      • +
      +
    • +
    • java.awt.event.MouseMotionListener +
        +
      • berack96.lib.graph.view.GraphListener (also extends java.awt.event.KeyListener, java.awt.event.MouseListener)
      • +
      +
    • +
    +
  • +
  • berack96.lib.graph.view.GraphicalView<O>
  • +
  • java.lang.Iterable<T> +
      +
    • berack96.lib.graph.Graph<V,W>
    • +
    +
  • +
  • berack96.lib.graph.visit.VisitStrategy<V,W> + +
  • +
+
+ +
+ + + + + + + +
+ + + + diff --git a/doc/package-list b/doc/package-list new file mode 100644 index 0000000..6eb5b73 --- /dev/null +++ b/doc/package-list @@ -0,0 +1,9 @@ +berack96.lib.graph +berack96.lib.graph.impl +berack96.lib.graph.models +berack96.lib.graph.view +berack96.lib.graph.view.edge +berack96.lib.graph.view.stuff +berack96.lib.graph.view.vertex +berack96.lib.graph.visit +berack96.lib.graph.visit.impl diff --git a/doc/script.js b/doc/script.js new file mode 100644 index 0000000..c3a1cae --- /dev/null +++ b/doc/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/doc/serialized-form.html b/doc/serialized-form.html new file mode 100644 index 0000000..8a71b59 --- /dev/null +++ b/doc/serialized-form.html @@ -0,0 +1,304 @@ + + + + + +Serialized Form + + + + + + + + +
+ + + + + + + +
+ + +
+

Serialized Form

+
+
+
    +
  • +

    Package berack96.lib.graph.view

    +
      +
    • + + +

      Class berack96.lib.graph.view.GraphInfo extends javax.swing.JPanel implements Serializable

      +
      +
      serialVersionUID:
      +
      1L
      +
      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          visits

          +
          java.util.Map<K,V> visits
          +
        • +
        +
      • +
      +
    • +
    • + + +

      Class berack96.lib.graph.view.GraphPanel extends java.awt.Component implements Serializable

      +
      +
      serialVersionUID:
      +
      1L
      +
      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          vertexRender

          +
          GraphicalView<O> vertexRender
          +
        • +
        • +

          edgeRender

          +
          GraphicalView<O> edgeRender
          +
        • +
        • +

          classV

          +
          java.lang.Class<T> classV
          +
        • +
        • +

          classW

          +
          java.lang.Class<T> classW
          +
        • +
        • +

          vertices

          +
          java.awt.Container vertices
          +
        • +
        • +

          edges

          +
          java.awt.Container edges
          +
        • +
        • +

          graph

          +
          Graph<V,W extends java.lang.Number> graph
          +
        • +
        • +

          observers

          +
          java.util.Set<E> observers
          +
        • +
        • +

          old

          +
          GraphListener old
          +
        • +
        +
      • +
      +
    • +
    • + + +

      Class berack96.lib.graph.view.GraphWindow extends javax.swing.JFrame implements Serializable

      +
      +
      serialVersionUID:
      +
      1L
      +
      +
        +
      • +

        Serialized Fields

        +
          +
        • +

          graphPanel

          +
          GraphPanel<V,W extends java.lang.Number> graphPanel
          +
        • +
        • +

          infoPanel

          +
          GraphInfo<V,W extends java.lang.Number> infoPanel
          +
        • +
        +
      • +
      +
    • +
    +
  • +
  • +

    Package berack96.lib.graph.view.edge

    + +
  • +
  • +

    Package berack96.lib.graph.view.stuff

    + +
  • +
  • +

    Package berack96.lib.graph.view.vertex

    + +
  • +
+
+ +
+ + + + + + + +
+ + + + diff --git a/doc/stylesheet.css b/doc/stylesheet.css new file mode 100644 index 0000000..b8dad08 --- /dev/null +++ b/doc/stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/jar/graph.jar b/jar/graph.jar new file mode 100644 index 0000000000000000000000000000000000000000..d2ffd6c414dbdfd02fd1567be3e6391eb58a991d GIT binary patch literal 437648 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 IG2-BzaGubhuA;s5eA>ZX1O2h%J!8`t6@ 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

y!ys27~RC&r1`~0jzqz5+!36i-OX&0XK`P%Bt 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%0A~t+;SN_{}7@pR{JD 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�z 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≫X56GBnPhzKp(dc|I4 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 extends Iterable { */ boolean isDAG(); + /** + * Check if the vertex passed is contained in the graph or not.
+ * The vertex V1 is contained in the graph G, if and only if:
+ * exist V2 in G such that V2.equals(V1) + * + * @param vertex the vertex to check + * @return true if the vertex is contained, false otherwise + * @throws NullPointerException if the vertex is null + */ + boolean contains(V vertex) throws NullPointerException; + /** * Get an instance of the vertex linked with this graph.
* For more info see {@link Vertex} @@ -72,7 +83,7 @@ public interface Graph extends Iterable { /** * Add the specified vertex to the graph only if the graph doesn't contains it.
- * The graph contains a vertex only if the method {@link #contains(V)} returns true. + * The graph contains a vertex only if the method {@link #contains(Object)} returns true. * * @param vertex the vertex to add * @return true if the vertex is added, false if the graph contains the vertex and therefore the new one is not added @@ -107,16 +118,15 @@ public interface Graph extends Iterable { void removeAllVertex(); /** - * Check if the vertex passed is contained in the graph or not.
- * The vertex V1 is contained in the graph G, if and only if:
- * exist V2 in G such that V2.equals(V1) - * - * @param vertex the vertex to check - * @return true if the vertex is contained, false otherwise - * @throws NullPointerException if the vertex is null + * Get all the marks of this graph.
+ * Specifically it will return a collection of marks where every mark
+ * as associated at least one vertex of the graph.
+ * If the graph doesn't have vertex marked then it is returned an empty collection. + * + * @return a collection of marks */ - boolean contains(V vertex) throws NullPointerException; - + Collection marks(); + /** * Add to the specified vertex the mark passed.
* A vertex can have multiple marker. @@ -469,6 +479,7 @@ public interface Graph extends Iterable { * @param source the source vertex of the visit * @param strategy the algorithm for visiting the graph * @param visit the function to apply at each vertex + * @return an info of the visit * @throws NullPointerException if one of the parameter is null (except the consumer) * @throws IllegalArgumentException if the vertex is not in the graph */ @@ -477,8 +488,8 @@ public interface Graph extends Iterable { /** * This method will create a new Graph that is the transposed version of the original.
* At the end of this method the new graph will have all the edges inverted in orientation.
- * Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, - * the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges. + * Example: if the graph G contains (V1, V2, V3) as vertex, and (V1->V2, V3->V2) as edges, + * the transpose graph G' will contain (V1, V2, V3) as vertex, and (V2->V1, V2->V3) as edges. * * @return a transposed graph of this instance */ @@ -510,7 +521,7 @@ public interface Graph extends Iterable { * Of course the sub-graph will contain the edges that link the vertices, but only the one selected. * * @param source the source vertex - * @param depth the maximum depth (must be a positive number, if >=0 a graph containing only the source is returned) + * @param depth the maximum depth (must be a positive number, if >=0 a graph containing only the source is returned) * @return a sub-graph of the original * @throws NullPointerException if the vertex is null * @throws IllegalArgumentException if the vertex is not contained @@ -555,7 +566,8 @@ public interface Graph extends Iterable { * Save the Graph passed as input to a file inserted as parameter.
* The resulting file is a Json string representing all the graph.
* If the directory for getting through the file do not exist,
- * then it is created. + * then it is created.
+ * For now the marks are not included. * * @param graph the graph to save * @param file the name of the file @@ -570,6 +582,7 @@ public interface Graph extends Iterable { * The resulting file is a Json string representing all the graph.
* If the directory for getting through the file do not exist,
* then it is created.
+ * For now the marks are not included.
* The additional parameter is used if you want to save other as well as the graph. * * @param graph the graph to save diff --git a/src/berack96/lib/graph/impl/AdjGraph.java b/src/berack96/lib/graph/impl/AdjGraph.java index 55caa81..de3d4fa 100644 --- a/src/berack96/lib/graph/impl/AdjGraph.java +++ b/src/berack96/lib/graph/impl/AdjGraph.java @@ -57,7 +57,7 @@ public class AdjGraph implements Graph { } @Override - public void removeVertex(V vertex) throws IllegalArgumentException { + public void removeVertex(V vertex) throws NullPointerException, IllegalArgumentException { // TODO Auto-generated method stub } @@ -74,6 +74,12 @@ public class AdjGraph implements Graph { return false; } + @Override + public Collection marks() { + // TODO Auto-generated method stub + return null; + } + @Override public void mark(V vertex, Object mark) throws NullPointerException, IllegalArgumentException { // TODO Auto-generated method stub @@ -309,5 +315,5 @@ public class AdjGraph implements Graph { // TODO Auto-generated method stub return null; } - + } diff --git a/src/berack96/lib/graph/impl/MapGraph.java b/src/berack96/lib/graph/impl/MapGraph.java index 08487bb..6718030 100644 --- a/src/berack96/lib/graph/impl/MapGraph.java +++ b/src/berack96/lib/graph/impl/MapGraph.java @@ -108,6 +108,17 @@ public class MapGraph implements Graph { checkNull(vertex); return edges.containsKey(vertex); } + + @Override + public Collection marks() { + Collection ret = new HashSet<>(); + markers.forEach((m, v) -> { + if(v.size() > 0) + ret.add(m); + }); + + return ret; + } @Override public void mark(V vertex, Object mark) throws NullPointerException, IllegalArgumentException { diff --git a/src/berack96/lib/graph/impl/MatrixGraph.java b/src/berack96/lib/graph/impl/MatrixGraph.java index 0094373..896cf96 100644 --- a/src/berack96/lib/graph/impl/MatrixGraph.java +++ b/src/berack96/lib/graph/impl/MatrixGraph.java @@ -57,7 +57,7 @@ public class MatrixGraph implements Graph { } @Override - public void removeVertex(V vertex) throws IllegalArgumentException { + public void removeVertex(V vertex) throws NullPointerException, IllegalArgumentException { // TODO Auto-generated method stub } @@ -74,6 +74,12 @@ public class MatrixGraph implements Graph { return false; } + @Override + public Collection marks() { + // TODO Auto-generated method stub + return null; + } + @Override public void mark(V vertex, Object mark) throws NullPointerException, IllegalArgumentException { // TODO Auto-generated method stub @@ -309,5 +315,5 @@ public class MatrixGraph implements Graph { // TODO Auto-generated method stub return null; } - + } diff --git a/src/berack96/lib/graph/view/GraphWindow.java b/src/berack96/lib/graph/view/GraphWindow.java index efc6f79..2d9e23b 100644 --- a/src/berack96/lib/graph/view/GraphWindow.java +++ b/src/berack96/lib/graph/view/GraphWindow.java @@ -1,22 +1,19 @@ package berack96.lib.graph.view; -import berack96.lib.graph.view.edge.EdgeIntListener; +import java.awt.BorderLayout; +import java.util.LinkedHashSet; +import java.util.Set; + +import javax.swing.JFrame; + import berack96.lib.graph.view.edge.EdgeListener; -import berack96.lib.graph.view.edge.EdgeView; -import berack96.lib.graph.view.vertex.VertexIntListener; import berack96.lib.graph.view.vertex.VertexListener; -import berack96.lib.graph.view.vertex.VertexView; -import berack96.lib.graph.visit.*; +import berack96.lib.graph.visit.VisitStrategy; import berack96.lib.graph.visit.impl.BFS; import berack96.lib.graph.visit.impl.DFS; import berack96.lib.graph.visit.impl.Dijkstra; import berack96.lib.graph.visit.impl.Tarjan; -import javax.swing.*; -import java.awt.*; -import java.util.LinkedHashSet; -import java.util.Set; - /** * This class is the Window that appear for building the graph and playing around with it * @@ -26,22 +23,10 @@ public class GraphWindow extends JFrame { private static final long serialVersionUID = 1L; - public static void main(String[] args) { - GraphPanel panel = new GraphPanel<>(new VertexView<>(), new EdgeView<>(), Integer.class, Integer.class); - GraphWindow win = new GraphWindow<>(panel, new VertexIntListener(panel), new EdgeIntListener<>(panel)); - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); // full screen - dim.setSize(dim.width / 2, dim.height / 2); - win.setSize(dim); - win.setLocationRelativeTo(null); //centered - win.visitRefresh(500); - - win.setVisible(true); - } - private final GraphPanel graphPanel; private final GraphInfo infoPanel; - private GraphWindow(GraphPanel graphPanel, VertexListener vListener, EdgeListener eListener) { + public GraphWindow(GraphPanel graphPanel, VertexListener vListener, EdgeListener eListener) { this.setTitle("Grafo"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); diff --git a/src/berack96/lib/graph/view/Main.java b/src/berack96/lib/graph/view/Main.java new file mode 100644 index 0000000..669bcb4 --- /dev/null +++ b/src/berack96/lib/graph/view/Main.java @@ -0,0 +1,25 @@ +package berack96.lib.graph.view; + +import java.awt.Dimension; +import java.awt.Toolkit; + +import berack96.lib.graph.view.edge.EdgeIntListener; +import berack96.lib.graph.view.edge.EdgeView; +import berack96.lib.graph.view.vertex.VertexIntListener; +import berack96.lib.graph.view.vertex.VertexView; + +public class Main { + + + public static void main(String[] args) { + GraphPanel panel = new GraphPanel<>(new VertexView<>(), new EdgeView<>(), Integer.class, Integer.class); + GraphWindow win = new GraphWindow<>(panel, new VertexIntListener(panel), new EdgeIntListener<>(panel)); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); // full screen + dim.setSize(dim.width / 2, dim.height / 2); + win.setSize(dim); + win.setLocationRelativeTo(null); //centered + win.visitRefresh(500); + + win.setVisible(true); + } +} diff --git a/test/berack96/test/lib/TestGraph.java b/test/berack96/test/lib/TestGraph.java index 7795dea..b636e0b 100644 --- a/test/berack96/test/lib/TestGraph.java +++ b/test/berack96/test/lib/TestGraph.java @@ -980,13 +980,17 @@ public class TestGraph { shouldThrow(notException, () -> graph.getMarks("hw7389")); shouldContain(graph.getMarks("1")); + shouldContain(graph.marks()); graph.mark("1", "red"); shouldContain(graph.getMarks("1"), "red"); + shouldContain(graph.marks(), "red"); graph.mark("1", "yellow"); + shouldContain(graph.marks(), "red", "yellow"); graph.mark("1", "blue"); shouldContain(graph.getMarks("1"), "red", "yellow", "blue"); graph.mark("1", "red"); shouldContain(graph.getMarks("1"), "red", "yellow", "blue"); + shouldContain(graph.marks(), "red", "yellow", "blue"); shouldContain(graph.getMarks("2")); graph.mark("2", "red"); @@ -994,11 +998,14 @@ public class TestGraph { graph.mark("8", "blue"); shouldContain(graph.getMarks("2"), "red"); shouldContain(graph.getMarks("8"), "blue"); + shouldContain(graph.marks(), "red", "yellow", "blue"); - graph.unMark("2"); - shouldContain(graph.getMarks("2")); graph.unMark("1"); shouldContain(graph.getMarks("1")); + shouldContain(graph.marks(), "red", "blue"); + graph.unMark("2"); + shouldContain(graph.getMarks("2")); + shouldContain(graph.marks(), "blue"); graph.mark("2", "red"); graph.mark("2", "blue"); @@ -1007,8 +1014,10 @@ public class TestGraph { shouldContain(graph.getMarks("4"), "green"); graph.mark("5", "green"); shouldContain(graph.getMarks("5"), "green"); + shouldContain(graph.marks(), "red", "blue", "green"); graph.unMarkAll(); + shouldContain(graph.marks()); shouldContain(graph.getMarks("1")); shouldContain(graph.getMarks("2")); shouldContain(graph.getMarks("3")); @@ -1019,10 +1028,15 @@ public class TestGraph { shouldContain(graph.getMarks("8")); graph.mark("1", "mark"); + shouldContain(graph.marks(), "mark"); graph.mark("2", "mark"); + shouldContain(graph.marks(), "mark"); graph.mark("3", "mark2"); + shouldContain(graph.marks(), "mark", "mark2"); graph.mark("1", "mark2"); + shouldContain(graph.marks(), "mark", "mark2"); graph.mark("1", 3); + shouldContain(graph.marks(), "mark", "mark2", 3); shouldContain(graph.getMarks("1"), "mark", "mark2", 3); shouldContain(graph.getMarks("2"), "mark"); shouldContain(graph.getMarks("3"), "mark2"); @@ -1031,6 +1045,7 @@ public class TestGraph { shouldContain(graph.getMarkedWith(3), "1"); graph.unMark("1", "mark"); + shouldContain(graph.marks(), "mark", "mark2", 3); shouldContain(graph.getMarks("1"), "mark2", 3); shouldContain(graph.getMarks("2"), "mark"); shouldContain(graph.getMarks("3"), "mark2"); @@ -1039,6 +1054,7 @@ public class TestGraph { shouldContain(graph.getMarkedWith(3), "1"); graph.unMarkAll("mark2"); + shouldContain(graph.marks(), "mark", 3); shouldContain(graph.getMarks("1"), 3); shouldContain(graph.getMarks("2"), "mark"); shouldContain(graph.getMarks("3")); @@ -1048,6 +1064,7 @@ public class TestGraph { graph.unMark("1", "mark"); graph.unMark("2", "mark2"); + shouldContain(graph.marks(), "mark", 3); shouldContain(graph.getMarks("1"), 3); shouldContain(graph.getMarks("2"), "mark"); shouldContain(graph.getMarks("3")); @@ -1056,6 +1073,7 @@ public class TestGraph { shouldContain(graph.getMarkedWith(3), "1"); graph.unMark("2", "mark"); + shouldContain(graph.marks(), 3); shouldContain(graph.getMarks("1"), 3); shouldContain(graph.getMarks("2")); shouldContain(graph.getMarks("3")); @@ -1064,6 +1082,7 @@ public class TestGraph { shouldContain(graph.getMarkedWith(3), "1"); graph.unMarkAll(3); + shouldContain(graph.marks()); shouldContain(graph.getMarks("1")); shouldContain(graph.getMarks("2")); shouldContain(graph.getMarks("3"));