WAGS.Validation
- Package
- purescript-wags
- Repository
- mikesol/purescript-wags
Validation algorithms for audio graphs.
Validation includes making sure the graph is renderable by the web audio API and retrieving information about valid graphs, like their terminal node (ie a loudspeaker).
#GraphIsRenderable Source
class GraphIsRenderable (graph :: Graph) Asserts that an audio graph is renderable.
Every time that makeScene is called, we assert that the graph is
renderable. This means that it can be played by the WebAudio API
without any runtime errors. Note that this assertion is a
compile time assertion and not a runtime assertion. This means that,
when your program is compiled, it is guaranteed to be renderable by
the WebAudio API assuming that it is within the memory constraints
of a given browser and computer. Usually, these memory limits are not
hit unless one has hundreds of active nodes.
Instances
(NoNodesAreDuplicated graph, AllEdgesPointToNodes graph, NoParallelEdges graph, HasSourceNodes graph, UniqueTerminus graph terminus, NodeIsOutputDevice terminus, AllNodesAreSaturated graph) => GraphIsRenderable graph
#TerminalNode Source
class TerminalNode (g :: Graph) (ptr :: Ptr) | g -> ptrRetrieves the terminal node from an audio grpah. This is almost always a speaker or recording, but if the graph is at an intermediary stage of construction, this could be another top-level node, ie a gain node.
Instances
(UniqueTerminus g t, GetAudioUnit t u, GetPointer u ptr) => TerminalNode g ptr
#TerminalIdentityEdge Source
class TerminalIdentityEdge (u :: Graph) (prof :: EdgeProfile) | u -> profRetrieves the terminal node from an audio grpah as an edge profile - in this case, a single edge into the terminal node.
Instances
(TerminalNode i ptr) => TerminalIdentityEdge i (SingleEdge ptr)
#LookupNL Source
class LookupNL (accumulator :: NodeList) (ptr :: Ptr) (graph :: NodeList) (node :: NodeList) | accumulator ptr graph -> nodeTail recursive lookup of a node in a node list.
accumulator: the accumulator for tail recursion that should start atNodeListNil.ptr: the pointer of the node we are trying retrieve.graph: the list of nodes to iterate over.node: a list of nodes that have this pointer.
Instances
LookupNL accumulator ptr NodeListNil accumulator(GetAudioUnit head headAU, GetPointer headAU maybePtr, BinEq maybePtr ptr tf, Gate tf (NodeListCons head NodeListNil) NodeListNil toComp, NodeListKeepSingleton toComp accumulator acc, LookupNL acc ptr tail o) => LookupNL accumulator ptr (NodeListCons head tail) o
#NodeNotInNodeList Source
class NodeNotInNodeList (node :: Node) (nodeList :: NodeList) Assertion that node is not present in nodeList.
Instances
NodeNotInNodeList node NodeListNil(GetAudioUnit node nodeAu, GetAudioUnit head headAu, AudioUnitEq nodeAu headAu False, NodeNotInNodeList node tail) => NodeNotInNodeList node (NodeListCons head tail)
#NoNodesAreDuplicatedInNodeList Source
class NoNodesAreDuplicatedInNodeList (nodeList :: NodeList) Assertion that there are no duplicate nodes in nodeList.
Instances
NoNodesAreDuplicatedInNodeList NodeListNil(NodeNotInNodeList head tail, NoNodesAreDuplicatedInNodeList tail) => NoNodesAreDuplicatedInNodeList (NodeListCons head tail)
#NoNodesAreDuplicated Source
class NoNodesAreDuplicated (graph :: Graph) Assertion that there are no duplicate nodes in graph.
Instances
(GraphToNodeList graph nodeList, NoNodesAreDuplicatedInNodeList nodeList) => NoNodesAreDuplicated graph
#PtrInPtrList Source
class PtrInPtrList (foundPtr :: Type) (ptr :: Ptr) (ptrList :: PtrList) (output :: Type) | foundPtr ptr ptrList -> outputTail-recursive check that a pointer is in a pointer list.
foundPtr: an accumulator indicating whether we've found the ptr or not. Starts as False.ptr: is this ptr in the pointer list?ptrList: a list of pointersoutput:Trueif the pointer is in the list,Falseotherwise.
Instances
PtrInPtrList True a b TruePtrInPtrList False a PtrListNil False(BinEq ptr head foundNode, PtrInPtrList foundNode ptr tail o) => PtrInPtrList False ptr (PtrListCons head tail) o
#AudioUnitInAudioUnitList Source
class AudioUnitInAudioUnitList (foundAU :: Type) (audioUnit :: AudioUnit) (audioUnitList :: AudioUnitList) (output :: Type) | foundAU audioUnit audioUnitList -> outputTail-recursive check that an audio unit is in an audio unit list.
foundPtr: an accumulator indicating whether we've found the audio unit or not. Starts as False.audioUnit: is this audioUnit in the audio unit list?audioUnitList: a list of audio unitsoutput:Trueif the audio unit is in the list,Falseotherwise.
Instances
AudioUnitInAudioUnitList True a b TrueAudioUnitInAudioUnitList False a AudioUnitNil False(AudioUnitEq au head foundAU, AudioUnitInAudioUnitList foundAU au tail o) => AudioUnitInAudioUnitList False au (AudioUnitCons head tail) o
#AllPtrsInNodeList Source
class AllPtrsInNodeList (pointers :: PtrList) (nodeList :: NodeList) Assertion that all pointers are present in a nodeList.
Instances
AllPtrsInNodeList PtrListNil haystack(LookupNL NodeListNil head haystack (NodeListCons x NodeListNil), AllPtrsInNodeList tail haystack) => AllPtrsInNodeList (PtrListCons head tail) haystack
#GetEdgesAsPtrList Source
class GetEdgesAsPtrList (node :: Node) (ptrList :: PtrList) | node -> ptrListFor a given node, get all of its incoming edges as a ptrList.
Instances
GetEdgesAsPtrList (NodeC x NoEdge) PtrListNilGetEdgesAsPtrList (NodeC x (SingleEdge e)) (PtrListCons e PtrListNil)GetEdgesAsPtrList (NodeC x (ManyEdges e l)) (PtrListCons e l)
#AllEdgesInNodeList Source
class AllEdgesInNodeList (needles :: NodeList) (haystack :: NodeList) For a given set of nodes called needles, assert that all of them are present in at least one incoming edge of the nodes called haystack.
Instances
AllEdgesInNodeList NodeListNil haystack(GetEdgesAsPtrList head ptrList, AllPtrsInNodeList ptrList haystack, AllEdgesInNodeList tail haystack) => AllEdgesInNodeList (NodeListCons head tail) haystack
#AllEdgesPointToNodes Source
class AllEdgesPointToNodes (graph :: Graph) Assertion that all edges in the graph point to a node in the graph.
Instances
(GraphToNodeList graph nodeList, AllEdgesInNodeList nodeList nodeList) => AllEdgesPointToNodes graph
#PtrNotInPtrList Source
class PtrNotInPtrList (ptr :: Ptr) (ptrList :: PtrList) Assertion that ptr is not in ptrList.
Instances
PtrNotInPtrList ptr PtrListNil(BinEq ptr head False, PtrNotInPtrList ptr tail) => PtrNotInPtrList ptr (PtrListCons head tail)
#NoPtrsAreDuplicatedInPtrList Source
class NoPtrsAreDuplicatedInPtrList (ptrList :: PtrList) Assertion that not pointers are duplicated in ptrList.
Instances
NoPtrsAreDuplicatedInPtrList PtrListNil(PtrNotInPtrList head tail, NoPtrsAreDuplicatedInPtrList tail) => NoPtrsAreDuplicatedInPtrList (PtrListCons head tail)
#NoParallelEdgesNL Source
class NoParallelEdgesNL (nodeList :: NodeList) Assertion that nodeList contains no parallel edges. Parallel edges are two or more edges from node1 to node2 in a list of nodes.
Instances
NoParallelEdgesNL NodeListNil(NoParallelEdgesNL tail) => NoParallelEdgesNL (NodeListCons (NodeC n NoEdge) tail)(NoParallelEdgesNL tail) => NoParallelEdgesNL (NodeListCons (NodeC n (SingleEdge e)) tail)(NoPtrsAreDuplicatedInPtrList (PtrListCons e l), NoParallelEdgesNL tail) => NoParallelEdgesNL (NodeListCons (NodeC n (ManyEdges e l)) tail)
#NoParallelEdges Source
class NoParallelEdges (graph :: Graph) Assertion that graph contains no parallel edges. Parallel edges are two or more edges from node1 to node2 in a list of nodes.
Instances
(GraphToNodeList graph nodeList, NoParallelEdgesNL nodeList) => NoParallelEdges graph
#SourceNodesNL Source
class SourceNodesNL (accumulator :: NodeList) (nodeList :: NodeList) (output :: NodeList) | accumulator nodeList -> outputTail-recursive lookup of all nodes in a graph without incoming edges.
accumulatoris the accumulator that will be returned.nodeListis the list of nodes that will be searched over.outputcontains all nodes without incoming edges.
Instances
SourceNodesNL accumulator NodeListNil accumulator(SourceNodesNL (NodeListCons (NodeC i NoEdge) accumulator) tail o) => SourceNodesNL accumulator (NodeListCons (NodeC i NoEdge) tail) o(SourceNodesNL accumulator tail o) => SourceNodesNL accumulator (NodeListCons (NodeC i (SingleEdge x)) tail) o(SourceNodesNL accumulator tail o) => SourceNodesNL accumulator (NodeListCons (NodeC i (ManyEdges x l)) tail) o
#SourceNodes Source
class SourceNodes (graph :: Graph) (nodeList :: NodeList) | graph -> nodeListLookup of all nodes in graph without incoming edges and return them as nodeList.
Instances
(GraphToNodeList graph nodeList, SourceNodesNL NodeListNil nodeList sourceNodes) => SourceNodes graph sourceNodes
#HasSourceNodes Source
class HasSourceNodes (graph :: Graph) Assertion that a graph has source nodes. Source nodes are nodes without incoming edges.
Instances
(SourceNodes graph (NodeListCons a b)) => HasSourceNodes graph
#AudioUnitInNodeList Source
class AudioUnitInNodeList (foundNode :: Type) (audioUnit :: AudioUnit) (nodeList :: NodeList) (output :: Type) | foundNode audioUnit nodeList -> outputTail-recursive lookup of audio unit in node list.
foundNode: an accumulator indicating whether we've found the node or not. Starts as False.audioUnit: is this audioUnit in the node list?nodeList: a list of nodesoutput:Trueif the audio unit is in the list,Falseotherwise.
Instances
AudioUnitInNodeList True a b TrueAudioUnitInNodeList False a NodeListNil False(GetAudioUnit head headAu, AudioUnitEq au headAu foundNode, AudioUnitInNodeList foundNode au tail o) => AudioUnitInNodeList False au (NodeListCons head tail) o
#RemoveDuplicates Source
class RemoveDuplicates (accumulator :: NodeList) (maybeWithDuplicates :: NodeList) (output :: NodeList) | accumulator maybeWithDuplicates -> outputTail-recursive removal of duplicate nodes from a node list.
accumulator: the accumulating deduped list. Starts at NodeListNil.maybeWithDuplicates: a node list that potentially has duplicates.output: the final deduped list
Instances
RemoveDuplicates accumulator NodeListNil accumulator(GetAudioUnit head au, AudioUnitInNodeList False au accumulator tf, Gate tf accumulator (NodeListCons head accumulator) acc, RemoveDuplicates acc tail o) => RemoveDuplicates accumulator (NodeListCons head tail) o
#NodeInNodeList Source
class NodeInNodeList (foundNode :: Type) (node :: Node) (nodeList :: NodeList) (output :: Type) | foundNode node nodeList -> outputTail-recursive lookup of node in a node list.
foundNode: an accumulator indicating whether we've found the node or not. Starts as False.node: is this node in the node list?nodeList: a list of nodesoutput:Trueif the node is in the list,Falseotherwise.
Instances
NodeInNodeList True a b TrueNodeInNodeList False a NodeListNil False(GetAudioUnit head headAu, GetAudioUnit node nodeAu, AudioUnitEq nodeAu headAu foundNode, NodeInNodeList foundNode node tail o) => NodeInNodeList False node (NodeListCons head tail) o
#UnvisitedNodes Source
class UnvisitedNodes (visited :: NodeList) (accumulator :: NodeList) (candidates :: NodeList) (unvisited :: NodeList) | visited accumulator candidates -> unvisitedTail-recursive algorithm to find nodes we have not visited yet.
visitednodes that we have visitedaccumulatoraccumulates unvisited nodescandidatesare nodes that have potentially not been visited yet and will be cross-referenced againstvisited.unvisitedis a list of unvisited nodes.
Instances
UnvisitedNodes visited accumulator NodeListNil accumulator(NodeInNodeList False head visited tf, Gate tf accumulator (NodeListCons head accumulator) acc, UnvisitedNodes visited acc tail o) => UnvisitedNodes visited accumulator (NodeListCons head tail) o
#ToVisitSingle Source
class ToVisitSingle (accumulator :: NodeList) (graph :: NodeList) (findMeInAnEdge :: Node) (candidates :: NodeList) | accumulator graph findMeInAnEdge -> candidatesIn the node-visiting algorithm, this is a single step where we look for a node in a given list of edges. This step is repeated until all of the nodes have been visited.
accumulator- the running accumulator of nodes we are visitinggraph- the entire graph. if we were using an env comonad, this would be the environmentfindMeInAnEdge- this is the node we want to find in edgescandidates- these are all of the nodes that havefindMeInAnEdgeas an incoming connection
Instances
ToVisitSingle accumulator NodeListNil findMeInAnEdge accumulator(GetEdgesAsPtrList head edgeList, GetAudioUnit findMeInAnEdge au, GetPointer au ptr, PtrInPtrList False ptr edgeList tf, Gate tf (NodeListCons head accumulator) accumulator acc, ToVisitSingle acc tail findMeInAnEdge o) => ToVisitSingle accumulator (NodeListCons head tail) findMeInAnEdge o
#NodeListAppend Source
class NodeListAppend (l :: NodeList) (r :: NodeList) (o :: NodeList) | l r -> oThis appends node list l and r to produce the result o.
Instances
NodeListAppend NodeListNil NodeListNil NodeListNilNodeListAppend NodeListNil (NodeListCons x y) (NodeListCons x y)NodeListAppend (NodeListCons x y) NodeListNil (NodeListCons x y)(NodeListAppend b (NodeListCons c d) o) => NodeListAppend (NodeListCons a b) (NodeListCons c d) (NodeListCons a o)
#PtrListAppend Source
class PtrListAppend (l :: PtrList) (r :: PtrList) (o :: PtrList) | l r -> oThis appends pointer list l and r to produce the result o.
Instances
PtrListAppend PtrListNil PtrListNil PtrListNilPtrListAppend PtrListNil (PtrListCons x y) (PtrListCons x y)PtrListAppend (PtrListCons x y) PtrListNil (PtrListCons x y)(PtrListAppend b (PtrListCons c d) o) => PtrListAppend (PtrListCons a b) (PtrListCons c d) (PtrListCons a o)
#AltEdgeProfile Source
class AltEdgeProfile (a :: EdgeProfile) (b :: EdgeProfile) (c :: EdgeProfile) | a b -> cThis is the equivalent of Alt for edge profiles. NoEdge always loses.
Instances
AltEdgeProfile NoEdge b bAltEdgeProfile a NoEdge a
#IsNodeListEmpty Source
class IsNodeListEmpty (nodeList :: NodeList) (tf :: Type) | nodeList -> tfAsks is nodeList empty and replies with True or False as tf.
Instances
#ToVisit Source
class ToVisit (candidatesAccumulator :: NodeList) (parentlessAccumulator :: NodeList) (graph :: NodeList) (findMeInAnEdge :: NodeList) (candidates :: NodeList) (parentless :: NodeList) | candidatesAccumulator parentlessAccumulator graph findMeInAnEdge -> candidates parentlessIn the visiting algorithm, obtains a list of nodes to visit as well as parentless or "sink" nodes.
candidatesAccumulatoran accumulator of candidates to visitparentlessAccumulatoran accumulator of parentless or "sink" nodesgraph- the entire graph. if we were using an env comonad, this would be the environmentfindMeInAnEdge- a list of nodes remaining to find in edges. This starts as the whole graph and whittles down to no nodes as the algorithm runs.candidatesreturn value of candidates for the next stepparentlessreturn value of parentless nodes in the graph
Instances
ToVisit candidatesAccumulator parentlessAccumulator graph NodeListNil candidatesAccumulator parentlessAccumulator(ToVisitSingle NodeListNil graph findMeInAnEdge o, IsNodeListEmpty o tf, Gate tf (NodeListCons findMeInAnEdge parentlessAccumulator) parentlessAccumulator pA, NodeListAppend candidatesAccumulator o cA, ToVisit cA pA graph tail ccA ppA) => ToVisit candidatesAccumulator parentlessAccumulator graph (NodeListCons findMeInAnEdge tail) ccA ppA
#TerminusLoop Source
class TerminusLoop (graph :: NodeList) (visited :: NodeList) (visiting :: NodeList) (accumulator :: NodeList) (output :: NodeList) | graph visited visiting accumulator -> outputThe algorithm that finds the terminal nodes of a graph.
graph- the entire graph. if we were using an env comonad, this would be the environmentvisited- nodes we have visited so far in the aglorithmvisiting- nodes we are currently visiting in the aglorithmaccumulator- accumulator for tail-recursion that builds outputoutput- terminal nodes of the graph
Instances
TerminusLoop graph visited NodeListNil accumulator accumulator(ToVisit NodeListNil NodeListNil graph (NodeListCons a b) candidatesDup parentless, RemoveDuplicates NodeListNil candidatesDup candidates, UnvisitedNodes visited NodeListNil candidates unvisited, NodeListAppend unvisited visited newVisited, NodeListAppend accumulator parentless newAccumulator, TerminusLoop graph newVisited unvisited newAccumulator o) => TerminusLoop graph visited (NodeListCons a b) accumulator o
#UniqueTerminus Source
class UniqueTerminus (graph :: Graph) (node :: Node) | graph -> nodeAssertion that graph has the unique terminus node. Note that,
due to the fundep, the assertion also finds the unique terminus
if it exists.
Instances
(SourceNodes graph source, GraphToNodeList graph graphAsNodeList, TerminusLoop graphAsNodeList NodeListNil source NodeListNil terminii, RemoveDuplicates NodeListNil terminii (NodeListCons node NodeListNil)) => UniqueTerminus graph node
#HasUniqueTerminus Source
class HasUniqueTerminus (graph :: Graph) Assertion that graph has a unique terminus.
Instances
(UniqueTerminus graph node) => HasUniqueTerminus graph
#AllNodesAreSaturatedNL Source
class AllNodesAreSaturatedNL (graph :: NodeList) Asserts that all nodes in graph are saturated.
"Saturation" for audio nodes is similar to the concept of saturation
in types, namely that they have all the information necessary to
render. In doing so, it also fails the assertion on degenerate nodes,
ie sine-wave oscillators with input (which wouldn't make sense).
Instances
AllNodesAreSaturatedNL NodeListNil(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TAllpass a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TBandpass a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TConstant a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TConvolver a name) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TDelay a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TDynamicsCompressor a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TGain a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TGain a) (ManyEdges e l)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (THighpass a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (THighshelf a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TLoopBuf a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TLowpass a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TLowshelf a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TMicrophone a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TNotch a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TPeaking a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TPeriodicOsc a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TPlayBuf a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TRecorder a name) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TSawtoothOsc a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TSinOsc a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TSpeaker a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TSpeaker a) (ManyEdges e l)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TSquareOsc a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TStereoPanner a) (SingleEdge e)) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TTriangleOsc a) NoEdge) tail)(AllNodesAreSaturatedNL tail) => AllNodesAreSaturatedNL (NodeListCons (NodeC (TWaveShaper a name) (SingleEdge e)) tail)
#AllNodesAreSaturated Source
class AllNodesAreSaturated (graph :: Graph) Asserts that all nodes in graph are saturated. This is
the same as the node-list algorithm, but for a graph.
Instances
(GraphToNodeList graph nodeList, AllNodesAreSaturatedNL nodeList) => AllNodesAreSaturated graph
#NodeIsOutputDevice Source
class NodeIsOutputDevice (node :: Node) Asserts the node is an output device. Currently, in the web-audio API, this is a loudspeaker or recorder.
Instances
NodeIsOutputDevice (NodeC (TSpeaker a) x)NodeIsOutputDevice (NodeC (TRecorder a name) x)
- Modules
- FRP.
Event. MIDI - WAGS.
Change - WAGS.
Connect - WAGS.
Control. Functions - WAGS.
Control. MemoizedState - WAGS.
Control. Qualified - WAGS.
Control. Thunkable - WAGS.
Control. Types - WAGS.
Create - WAGS.
Cursor - WAGS.
Debug - WAGS.
Destroy - WAGS.
Disconnect - WAGS.
Graph. Constructors - WAGS.
Graph. Decorators - WAGS.
Graph. Getter - WAGS.
Graph. Optionals - WAGS.
Graph. Parameter - WAGS.
Interpret - WAGS.
Move - WAGS.
MoveNode - WAGS.
Rebase - WAGS.
Rendered - WAGS.
Run - WAGS.
Universe. AudioUnit - WAGS.
Universe. Bin - WAGS.
Universe. BinN - WAGS.
Universe. EdgeProfile - WAGS.
Universe. Graph - WAGS.
Universe. Node - WAGS.
Universe. Skolems - WAGS.
Universe. Universe - WAGS.
Util - WAGS.
Validation