2020-12-28 22:33:40 +01:00
|
|
|
#lang scribble/manual
|
|
|
|
|
2022-01-01 16:42:43 +01:00
|
|
|
@(require (for-label (only-in typed/racket
|
|
|
|
require/typed require/typed/provide
|
|
|
|
Any Boolean Void Sequenceof Listof List U False
|
|
|
|
Mutable-HashTable Immutable-HashTable))
|
2022-01-01 23:48:53 +01:00
|
|
|
(for-label (only-in math/matrix Matrix))
|
2022-01-01 17:59:49 +01:00
|
|
|
(for-label (only-in graph (matrix-graph? g:matrix-graph?)))
|
2021-12-23 11:50:06 +01:00
|
|
|
(for-label typed/graph))
|
2020-12-28 22:53:19 +01:00
|
|
|
|
2020-12-28 22:57:45 +01:00
|
|
|
@title{Typed Interface for the Generic Graph Library}
|
2020-12-28 22:33:40 +01:00
|
|
|
|
|
|
|
@author[@author+email["Sergiu Ivanov" "sivanov@colimite.fr"]]
|
|
|
|
|
|
|
|
@defmodule[typed/graph]
|
|
|
|
|
2021-10-10 17:30:21 +02:00
|
|
|
This library provides an incomplete typed interface to the
|
2020-12-28 22:33:40 +01:00
|
|
|
@hyperlink["https://docs.racket-lang.org/graph/index.html"]{generic graph
|
2021-12-21 22:10:30 +01:00
|
|
|
library}. The following parts are @bold{not currently covered}:
|
2020-12-28 22:33:40 +01:00
|
|
|
|
2021-12-21 22:10:30 +01:00
|
|
|
@itemlist[
|
|
|
|
@item{generic graph interface,}
|
|
|
|
@item{generic queues (from the package @racket[gen-queue-lib]),}
|
|
|
|
@item{macros.}
|
|
|
|
]
|
|
|
|
|
|
|
|
I may work on adding these in the future, but it is low priority for me as of
|
|
|
|
2021-12-21. Feel free to contribute!
|
2021-08-06 00:16:48 +02:00
|
|
|
|
2020-12-28 22:33:40 +01:00
|
|
|
@section{Bug reporting}
|
|
|
|
|
2021-10-10 17:35:06 +02:00
|
|
|
If you find a bug, first try running your code directly with the graph library,
|
|
|
|
in untyped Racket. If the bug persists, you should probably report it to the
|
|
|
|
maintainer of the graph library directly. If unsure, report the bug to me.
|
2020-12-28 22:33:40 +01:00
|
|
|
|
|
|
|
@section{Contributing}
|
|
|
|
|
|
|
|
As of 2021, GitHub is owned by Microsoft, so I prefer keeping this library on
|
|
|
|
a different platform.
|
|
|
|
|
|
|
|
Do feel free to submit patches to me by E-mail: I will try my best to review
|
2021-12-21 22:10:30 +01:00
|
|
|
and apply them within a reasonable time frame. More details on contributing in
|
|
|
|
the
|
|
|
|
@hyperlink["https://git.marvid.fr/scolobb/typed-graph/src/branch/master/README.md#submitting-patches"]{README}.
|
2020-12-28 22:33:40 +01:00
|
|
|
|
2020-12-28 22:53:19 +01:00
|
|
|
@section{Technical details}
|
|
|
|
|
|
|
|
Typed Racket includes very useful primitives @racket[require/typed] and
|
|
|
|
@racket[require/typed/provide]. However, we cannot use this technique with the
|
|
|
|
graph library. The solution which works consists in wrapping the opaque graph
|
|
|
|
structure into another structure, which will therefore be a uniform container
|
|
|
|
for all kinds of graph implementations provided by the library.
|
|
|
|
|
|
|
|
This solution comes from Alex Knauth's answer
|
|
|
|
@hyperlink["https://stackoverflow.com/a/65416020"]{answer on Stack Overflow}.
|
|
|
|
This page also contains a technical explanation of the issue.
|
|
|
|
|
2021-12-23 11:50:06 +01:00
|
|
|
@section{Exported types}
|
|
|
|
|
|
|
|
This section lists the types this library gives to re-exported functions.
|
|
|
|
The subsections correspond to the sections of the documentation of the generic
|
|
|
|
graph library.
|
|
|
|
|
|
|
|
@defidform[Graph]{
|
|
|
|
|
2022-01-01 17:56:17 +01:00
|
|
|
The type wrapping the kinds of graphs the generic graph library deals with.
|
2021-12-23 11:50:06 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-01-01 17:59:49 +01:00
|
|
|
@defidform[Matrix-Graph]{
|
|
|
|
|
|
|
|
The opaque type corresponding to the predicate @racketlink[g:matrix-graph? "matrix-graph?"].
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-12-23 11:50:06 +01:00
|
|
|
@subsection{Generic Graph Interface}
|
|
|
|
@defproc[(has-vertex? [g Graph] [v Any]) Boolean]{}
|
2022-01-01 16:42:43 +01:00
|
|
|
@defproc[(has-edge? [g Graph] [u Any] [v Any]) Boolean]{}
|
|
|
|
@defproc[(vertex=? [g Graph] [u Any] [v Any]) Boolean]{}
|
|
|
|
@defproc[(add-vertex! [g Graph] [v Any]) Void]{}
|
|
|
|
@defproc[(remove-vertex! [g Graph] [v Any]) Void]{}
|
|
|
|
@defproc[(rename-vertex! [g Graph] [old Any] [new Any]) Void]{}
|
|
|
|
@defproc[(add-edge! [g Graph] [u Any] [v Any] [weight Any 'default-value]) Void]{}
|
|
|
|
@defproc[(add-directed-edge! [g Graph] [u Any] [v Any] [weight Any 'default-value]) Void]{}
|
|
|
|
@defproc[(remove-edge! [g Graph] [u Any] [v Any]) Void]{}
|
|
|
|
@defproc[(remove-directed-edge! [g Graph] [u Any] [v Any]) Void]{}
|
|
|
|
@defproc[(get-vertices [g Graph]) (Listof Any)]{}
|
|
|
|
@defproc[(in-vertices [g Graph]) (Sequenceof Any)]{}
|
|
|
|
@defproc[(get-neighbors [g Graph] [v Any]) (Listof Any)]{}
|
|
|
|
@defproc[(in-neighbors [g Graph] [v Any]) (Sequenceof Any)]{}
|
|
|
|
@defproc[(get-edges [g Graph]) (U (Listof (List Any Any)) (Listof (List Any Any Any)))]{}
|
|
|
|
@defproc[(in-edges [g Graph]) (Sequenceof (U (List Any Any) (List Any Any Any)))]{}
|
|
|
|
@defproc[(edge-weight [g Graph] [u Any] [v Any] [#:default default Any +inf.0]) Any]{}
|
|
|
|
@defproc[(transpose [g Graph]) Graph]{}
|
|
|
|
@defproc[(graph-copy [g Graph]) Graph]{}
|
|
|
|
@defproc[(graph-union! [g Graph] [other Graph]) Void]{}
|
2021-12-23 11:50:06 +01:00
|
|
|
|
2022-01-01 16:55:25 +01:00
|
|
|
@subsection{Graph Constructors}
|
|
|
|
@defproc[(unweighted-graph? [g Graph]) Boolean]{}
|
|
|
|
@defproc[(unweighted-graph/undirected [edges (Listof (List Any Any))]) Graph]{}
|
|
|
|
@defproc[(unweighted-graph/directed [edges (Listof (List Any Any))]) Graph]{}
|
|
|
|
@defproc[(unweighted-graph/adj [edges (Listof (Listof Any))]) Graph]{}
|
|
|
|
|
|
|
|
@defproc[(weighted-graph? [g Graph]) Boolean]{}
|
|
|
|
@defproc[(weighted-graph/undirected [edges (Listof (List Any Any Any))]) Graph]{}
|
|
|
|
@defproc[(weighted-graph/directed [edges (Listof (List Any Any Any))]) Graph]{}
|
|
|
|
@defproc[(undirected-graph [edges (Listof (List Any Any))] [wgts (Listof Any) #f]) Graph]{}
|
|
|
|
@defproc[(directed-graph [edges (Listof (List Any Any))] [wgts (Listof Any) #f]) Graph]{}
|
|
|
|
|
2022-01-01 23:48:53 +01:00
|
|
|
@defproc[(matrix->matrix-graph [mtx (Matrix Any)]) Matrix-Graph]{}
|
|
|
|
@defproc[(matrix-graph->graph [g Matrix-Graph]) Graph]{
|
|
|
|
|
|
|
|
An explicit conversion between @racket[Matrix-Graph] and @racket[Graph].
|
|
|
|
This is necessary to use the general functions of the typed interface with
|
|
|
|
matrix graphs.
|
|
|
|
|
|
|
|
}
|
2021-12-23 11:50:06 +01:00
|
|
|
|
2020-12-28 22:33:40 +01:00
|
|
|
@section{License}
|
|
|
|
|
|
|
|
Like the generic graph library, this library is licensed under the Apache
|
|
|
|
License, Version 2.0 (the "License"); you may not use this file except in
|
|
|
|
compliance with the License. You may obtain a copy of the License at
|
|
|
|
|
|
|
|
@hyperlink["http://www.apache.org/licenses/LICENSE-2.0"]{http://www.apache.org/licenses/LICENSE-2.0}
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software distributed
|
|
|
|
under the License is distributed on an @bold{"as is" basis, without warranties
|
|
|
|
or conditions of any kind}, either express or implied. See the License for the
|
|
|
|
specific language governing permissions and limitations under the License.
|